You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
451 lines
15 KiB
451 lines
15 KiB
using System;
|
|
using System.Data.SqlClient;
|
|
using System.Drawing;
|
|
using System.Collections;
|
|
using System.ComponentModel;
|
|
using System.Windows.Forms;
|
|
using System.Xml;
|
|
using System.Xml.Serialization;
|
|
using System.IO;
|
|
|
|
using UDDI;
|
|
using UDDI.API;
|
|
using UDDI.Replication;
|
|
using UDDI.API.Binding;
|
|
using UDDI.API.ServiceType;
|
|
|
|
namespace UDDI.Tools
|
|
{
|
|
public class CorrectionAdmin : UserControl, IAdminObject
|
|
{
|
|
private XmlSerializer changeRecordSerializer;
|
|
|
|
private System.Windows.Forms.Label usnLabel;
|
|
private System.Windows.Forms.TextBox usnTextBox;
|
|
private System.Windows.Forms.Button usnButton;
|
|
private System.Windows.Forms.GroupBox findGroupBox;
|
|
private System.Windows.Forms.GroupBox changeRecordGroupBox;
|
|
private System.Windows.Forms.TextBox changeRecordTextBox;
|
|
private System.Windows.Forms.GroupBox correctionGroupBox;
|
|
private System.Windows.Forms.TextBox correctionTextBox;
|
|
private System.Windows.Forms.Button correctionButton;
|
|
private XmlSerializer correctionSerializer;
|
|
|
|
public CorrectionAdmin()
|
|
{
|
|
changeRecordSerializer = new XmlSerializer( typeof( ChangeRecord ) );
|
|
correctionSerializer = new XmlSerializer( typeof( ChangeRecordCorrection ) );
|
|
}
|
|
|
|
public void Initialize( IAdminFrame parent )
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
public string GetNodeText()
|
|
{
|
|
return "Corrections";
|
|
}
|
|
|
|
public void Show( Control parentDisplay )
|
|
{
|
|
Parent = parentDisplay;
|
|
Size = parentDisplay.Size;
|
|
}
|
|
|
|
private void InitializeComponent()
|
|
{
|
|
this.usnLabel = new System.Windows.Forms.Label();
|
|
this.usnTextBox = new System.Windows.Forms.TextBox();
|
|
this.usnButton = new System.Windows.Forms.Button();
|
|
this.findGroupBox = new System.Windows.Forms.GroupBox();
|
|
this.changeRecordGroupBox = new System.Windows.Forms.GroupBox();
|
|
this.changeRecordTextBox = new System.Windows.Forms.TextBox();
|
|
this.correctionGroupBox = new System.Windows.Forms.GroupBox();
|
|
this.correctionButton = new System.Windows.Forms.Button();
|
|
this.correctionTextBox = new System.Windows.Forms.TextBox();
|
|
this.findGroupBox.SuspendLayout();
|
|
this.changeRecordGroupBox.SuspendLayout();
|
|
this.correctionGroupBox.SuspendLayout();
|
|
this.SuspendLayout();
|
|
//
|
|
// usnLabel
|
|
//
|
|
this.usnLabel.Location = new System.Drawing.Point(8, 24);
|
|
this.usnLabel.Name = "usnLabel";
|
|
this.usnLabel.Size = new System.Drawing.Size(48, 16);
|
|
this.usnLabel.TabIndex = 0;
|
|
this.usnLabel.Text = "USN:";
|
|
//
|
|
// usnTextBox
|
|
//
|
|
this.usnTextBox.Location = new System.Drawing.Point(56, 22);
|
|
this.usnTextBox.Name = "usnTextBox";
|
|
this.usnTextBox.Size = new System.Drawing.Size(112, 20);
|
|
this.usnTextBox.TabIndex = 1;
|
|
this.usnTextBox.Text = "";
|
|
//
|
|
// usnButton
|
|
//
|
|
this.usnButton.Location = new System.Drawing.Point(176, 21);
|
|
this.usnButton.Name = "usnButton";
|
|
this.usnButton.Size = new System.Drawing.Size(120, 23);
|
|
this.usnButton.TabIndex = 2;
|
|
this.usnButton.Text = "Get ChangeRecord";
|
|
this.usnButton.Click += new System.EventHandler(this.usnButton_Click);
|
|
//
|
|
// findGroupBox
|
|
//
|
|
this.findGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
|
| System.Windows.Forms.AnchorStyles.Right);
|
|
this.findGroupBox.Controls.AddRange(new System.Windows.Forms.Control[] {
|
|
this.usnLabel,
|
|
this.usnButton,
|
|
this.usnTextBox});
|
|
this.findGroupBox.Location = new System.Drawing.Point(8, 8);
|
|
this.findGroupBox.Name = "findGroupBox";
|
|
this.findGroupBox.Size = new System.Drawing.Size(568, 56);
|
|
this.findGroupBox.TabIndex = 3;
|
|
this.findGroupBox.TabStop = false;
|
|
this.findGroupBox.Text = "Find Change Record";
|
|
//
|
|
// changeRecordGroupBox
|
|
//
|
|
this.changeRecordGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
|
| System.Windows.Forms.AnchorStyles.Right);
|
|
this.changeRecordGroupBox.Controls.AddRange(new System.Windows.Forms.Control[] {
|
|
this.changeRecordTextBox});
|
|
this.changeRecordGroupBox.Location = new System.Drawing.Point(8, 72);
|
|
this.changeRecordGroupBox.Name = "changeRecordGroupBox";
|
|
this.changeRecordGroupBox.Size = new System.Drawing.Size(568, 280);
|
|
this.changeRecordGroupBox.TabIndex = 4;
|
|
this.changeRecordGroupBox.TabStop = false;
|
|
this.changeRecordGroupBox.Text = "Change Record";
|
|
//
|
|
// changeRecordTextBox
|
|
//
|
|
this.changeRecordTextBox.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
|
| System.Windows.Forms.AnchorStyles.Right);
|
|
this.changeRecordTextBox.Location = new System.Drawing.Point(8, 24);
|
|
this.changeRecordTextBox.Multiline = true;
|
|
this.changeRecordTextBox.Name = "changeRecordTextBox";
|
|
this.changeRecordTextBox.ReadOnly = true;
|
|
this.changeRecordTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
|
this.changeRecordTextBox.Size = new System.Drawing.Size(552, 240);
|
|
this.changeRecordTextBox.TabIndex = 0;
|
|
this.changeRecordTextBox.Text = "";
|
|
//
|
|
// correctionGroupBox
|
|
//
|
|
this.correctionGroupBox.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
|
| System.Windows.Forms.AnchorStyles.Left)
|
|
| System.Windows.Forms.AnchorStyles.Right);
|
|
this.correctionGroupBox.Controls.AddRange(new System.Windows.Forms.Control[] {
|
|
this.correctionButton,
|
|
this.correctionTextBox});
|
|
this.correctionGroupBox.Location = new System.Drawing.Point(8, 360);
|
|
this.correctionGroupBox.Name = "correctionGroupBox";
|
|
this.correctionGroupBox.Size = new System.Drawing.Size(568, 304);
|
|
this.correctionGroupBox.TabIndex = 5;
|
|
this.correctionGroupBox.TabStop = false;
|
|
this.correctionGroupBox.Text = "Proposed Correction";
|
|
//
|
|
// correctionButton
|
|
//
|
|
this.correctionButton.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left);
|
|
this.correctionButton.Enabled = false;
|
|
this.correctionButton.Location = new System.Drawing.Point(8, 272);
|
|
this.correctionButton.Name = "correctionButton";
|
|
this.correctionButton.Size = new System.Drawing.Size(112, 23);
|
|
this.correctionButton.TabIndex = 1;
|
|
this.correctionButton.Text = "Issue Correction";
|
|
this.correctionButton.Click += new System.EventHandler(this.correctionButton_Click);
|
|
//
|
|
// correctionTextBox
|
|
//
|
|
this.correctionTextBox.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
|
| System.Windows.Forms.AnchorStyles.Left)
|
|
| System.Windows.Forms.AnchorStyles.Right);
|
|
this.correctionTextBox.Location = new System.Drawing.Point(8, 24);
|
|
this.correctionTextBox.Multiline = true;
|
|
this.correctionTextBox.Name = "correctionTextBox";
|
|
this.correctionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
|
this.correctionTextBox.Size = new System.Drawing.Size(552, 240);
|
|
this.correctionTextBox.TabIndex = 0;
|
|
this.correctionTextBox.Text = "";
|
|
//
|
|
// CorrectionAdmin
|
|
//
|
|
this.Controls.AddRange(new System.Windows.Forms.Control[] {
|
|
this.correctionGroupBox,
|
|
this.changeRecordGroupBox,
|
|
this.findGroupBox});
|
|
this.Name = "CorrectionAdmin";
|
|
this.Size = new System.Drawing.Size(592, 680);
|
|
this.findGroupBox.ResumeLayout(false);
|
|
this.changeRecordGroupBox.ResumeLayout(false);
|
|
this.correctionGroupBox.ResumeLayout(false);
|
|
this.ResumeLayout(false);
|
|
|
|
}
|
|
|
|
void usnButton_Click(object sender, System.EventArgs e)
|
|
{
|
|
ShowChangeRecord();
|
|
}
|
|
|
|
private bool ValidatePublisher()
|
|
{
|
|
bool validPublisher = Context.User.IsRegistered;
|
|
|
|
//
|
|
// Make sure the user is a UDDI publisher.
|
|
//
|
|
if( false == validPublisher )
|
|
{
|
|
DialogResult dialogResult = MessageBox.Show( "You are not registered as a publisher on this UDDI Site? You must register before performing this operation. Would you like to register now?",
|
|
"UDDI",
|
|
MessageBoxButtons.YesNo );
|
|
|
|
if( DialogResult.Yes == dialogResult )
|
|
{
|
|
try
|
|
{
|
|
Context.User.Register();
|
|
validPublisher = Context.User.IsRegistered;
|
|
}
|
|
catch( Exception registrationException )
|
|
{
|
|
MessageBox.Show( "An exception occurred when trying to register:\r\n\r\n" + registrationException.ToString() );
|
|
}
|
|
}
|
|
}
|
|
|
|
return validPublisher;
|
|
}
|
|
|
|
private void correctionButton_Click(object sender, System.EventArgs e)
|
|
{
|
|
if( false == ValidatePublisher() )
|
|
{
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
ConnectionManager.BeginTransaction();
|
|
|
|
//
|
|
// Deserialize into a change record object
|
|
//
|
|
StringReader reader = new StringReader( correctionTextBox.Text );
|
|
|
|
ChangeRecordCorrection changeRecordCorrection = ( ChangeRecordCorrection ) correctionSerializer.Deserialize( reader );
|
|
|
|
//
|
|
// Validate what we created.
|
|
//
|
|
SchemaCollection.Validate( changeRecordCorrection );
|
|
|
|
//
|
|
// Create a new change record to hold the correction.
|
|
//
|
|
ChangeRecord changeRecord = new ChangeRecord( changeRecordCorrection );
|
|
changeRecord.Process();
|
|
ConnectionManager.Commit();
|
|
|
|
//
|
|
// If we made it this far, we were able to process the correction
|
|
//
|
|
MessageBox.Show( "Correction processed!" );
|
|
|
|
//
|
|
// Refresh our display.
|
|
//
|
|
ShowChangeRecord();
|
|
}
|
|
catch( Exception exception )
|
|
{
|
|
ConnectionManager.Abort();
|
|
|
|
MessageBox.Show( "An exception occurred when trying to process the correction:\r\n\r\n" + exception.ToString() );
|
|
}
|
|
}
|
|
|
|
void ShowChangeRecord()
|
|
{
|
|
try
|
|
{
|
|
//
|
|
// Get the USN the user entered.
|
|
//
|
|
int usn = Convert.ToInt32( usnTextBox.Text );
|
|
SqlDataReaderAccessor reader = null;
|
|
|
|
try
|
|
{
|
|
//
|
|
// Try to find the ChangeRecord by USN. We can only correct local change records, so always
|
|
// use the local operator key.
|
|
//
|
|
FindChangeRecords.SetRange( Config.GetString( "OperatorKey" ), usn, usn );
|
|
|
|
//
|
|
// Get the results; we should only have 1 result.
|
|
//
|
|
reader = FindChangeRecords.RetrieveResults( 1 );
|
|
|
|
//
|
|
// Construct a ChangeRecord from the results.
|
|
//
|
|
ChangeRecord changeRecord = CreateChangeRecord( reader );
|
|
|
|
if( null != changeRecord )
|
|
{
|
|
//
|
|
// If we found a change record, show its XML and show the XML for a
|
|
// proposed correction. The user will be allowed to edit the XML for the
|
|
// proposed correction.
|
|
//
|
|
DisplayChangeRecord( changeRecord );
|
|
DisplayCorrection( changeRecord );
|
|
|
|
correctionButton.Enabled = true;
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show( "No ChangeRecord matching that USN was found." );
|
|
}
|
|
}
|
|
catch( Exception innerException )
|
|
{
|
|
FindChangeRecords.CleanUp();
|
|
|
|
throw innerException;
|
|
|
|
}
|
|
finally
|
|
{
|
|
if( null != reader )
|
|
{
|
|
reader.Close();
|
|
}
|
|
}
|
|
}
|
|
catch( Exception exception )
|
|
{
|
|
correctionButton.Enabled = false;
|
|
MessageBox.Show( "Change Record for that USN could not be obtained\r\n\r\n:" + exception.ToString() );
|
|
}
|
|
}
|
|
|
|
ChangeRecord CreateChangeRecord( SqlDataReaderAccessor reader )
|
|
{
|
|
ChangeRecord changeRecord = null;
|
|
try
|
|
{
|
|
while( reader.Read() )
|
|
{
|
|
XmlSerializer serializer = null;
|
|
|
|
switch( (ChangeRecordPayloadType)reader.GetShort( "changeTypeID" ) )
|
|
{
|
|
case ChangeRecordPayloadType.ChangeRecordNull:
|
|
serializer = new XmlSerializer( typeof( ChangeRecordNull ) );
|
|
break;
|
|
|
|
case ChangeRecordPayloadType.ChangeRecordNewData:
|
|
serializer = new XmlSerializer( typeof( ChangeRecordNewData ) );
|
|
break;
|
|
|
|
case ChangeRecordPayloadType.ChangeRecordDelete:
|
|
serializer = new XmlSerializer( typeof( ChangeRecordDelete ) );
|
|
break;
|
|
|
|
case ChangeRecordPayloadType.ChangeRecordPublisherAssertion:
|
|
serializer = new XmlSerializer( typeof( ChangeRecordPublisherAssertion ) );
|
|
break;
|
|
|
|
case ChangeRecordPayloadType.ChangeRecordHide:
|
|
serializer = new XmlSerializer( typeof( ChangeRecordHide ) );
|
|
break;
|
|
|
|
case ChangeRecordPayloadType.ChangeRecordDeleteAssertion:
|
|
serializer = new XmlSerializer( typeof( ChangeRecordDeleteAssertion ) );
|
|
break;
|
|
|
|
case ChangeRecordPayloadType.ChangeRecordAcknowledgement:
|
|
serializer = new XmlSerializer( typeof( ChangeRecordAcknowledgement ) );
|
|
break;
|
|
|
|
case ChangeRecordPayloadType.ChangeRecordCorrection:
|
|
serializer = new XmlSerializer( typeof( ChangeRecordCorrection ) );
|
|
break;
|
|
}
|
|
|
|
StringReader stringReader = new StringReader( reader.GetString( "changeData" ) );
|
|
|
|
try
|
|
{
|
|
changeRecord = new ChangeRecord();
|
|
|
|
changeRecord.AcknowledgementRequested = ( reader.GetInt( "flag" ) & (int)ChangeRecordFlags.AcknowledgementRequested ) > 0;
|
|
changeRecord.ChangeID.NodeID = reader.GetString( "OperatorKey" );
|
|
changeRecord.ChangeID.OriginatingUSN = reader.GetLong( "USN" );
|
|
|
|
ChangeRecordBase changeRecordBase = ( ChangeRecordBase ) serializer.Deserialize( stringReader );
|
|
if( changeRecordBase is ChangeRecordCorrection )
|
|
{
|
|
//
|
|
// The query to find change records will do correction 'fixups'. That is, the changeData of this
|
|
// change record will be replaced with the changeData from the correction. The problem with this is
|
|
// that the original change data will now look like a correction. To distinguish these types of
|
|
// change records, we look to see if the OriginatingUSN's match. If the OriginatingUSN's match,
|
|
// we want they payload of the change record in this correction. This payload will contain the
|
|
// corrected data that we want.
|
|
//
|
|
ChangeRecordCorrection changeRecordCorrection = ( ChangeRecordCorrection ) changeRecordBase;
|
|
if( changeRecordCorrection.ChangeRecord.ChangeID.OriginatingUSN == changeRecord.ChangeID.OriginatingUSN )
|
|
{
|
|
changeRecordBase = changeRecordCorrection.ChangeRecord.Payload;
|
|
}
|
|
}
|
|
|
|
changeRecord.Payload = changeRecordBase;
|
|
}
|
|
finally
|
|
{
|
|
stringReader.Close();
|
|
}
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
reader.Close();
|
|
}
|
|
|
|
return changeRecord;
|
|
}
|
|
|
|
void DisplayChangeRecord( ChangeRecord changeRecord )
|
|
{
|
|
UTF8EncodedStringWriter writer = new UTF8EncodedStringWriter();
|
|
changeRecordSerializer.Serialize( writer, changeRecord );
|
|
writer.Close();
|
|
|
|
changeRecordTextBox.Text = writer.ToString();
|
|
}
|
|
|
|
void DisplayCorrection( ChangeRecord changeRecord )
|
|
{
|
|
ChangeRecordCorrection changeRecordCorrection = new ChangeRecordCorrection();
|
|
changeRecordCorrection.ChangeRecord = changeRecord;
|
|
|
|
UTF8EncodedStringWriter writer = new UTF8EncodedStringWriter();
|
|
correctionSerializer.Serialize( writer, changeRecordCorrection );
|
|
writer.Close();
|
|
|
|
correctionTextBox.Text = writer.ToString();
|
|
}
|
|
}
|
|
}
|