using System; using System.Web; using System.Data; using System.IO; using System.Xml; using System.Xml.Schema; using System.Collections; using System.Web.Services; using System.Data.SqlClient; using System.Xml.Serialization; using System.Web.Services.Protocols; using UDDI; using UDDI.API; using UDDI.Diagnostics; using UDDI.API.Binding; using UDDI.API.Service; using UDDI.API.Business; using UDDI.API.ServiceType; namespace UDDI.API.Extensions { public class Constants { public const string Namespace = "urn:uddi-microsoft-com:api_v2_extensions"; } [XmlRoot( "resources", Namespace=UDDI.API.Extensions.Constants.Namespace )] public class Resources { [XmlElement( "tModelDetail", Namespace=UDDI.API.Constants.Namespace )] public TModelDetail TModelDetail; [XmlArray( "categorizationSchemes" ), XmlArrayItem( "categorizationScheme" )] public CategorizationSchemeCollection CategorizationSchemes = new CategorizationSchemeCollection(); [XmlElement( "businessDetail", Namespace=UDDI.API.Constants.Namespace )] public BusinessDetail BusinessDetail; [XmlElement( "serviceDetail", Namespace=UDDI.API.Constants.Namespace )] public ServiceDetail ServiceDetail; [XmlElement( "bindingDetail", Namespace=UDDI.API.Constants.Namespace )] public BindingDetail BindingDetail; public Resources() { } public static void Validate( Stream strm ) { Debug.VerifySetting( "InstallRoot" ); string installRoot = Config.GetString( "InstallRoot" ); string apiSchema = installRoot + "uddi_v2.xsd"; string resourceSchema = installRoot + "extensions.xsd"; Debug.Verify( File.Exists( apiSchema ), "TUDDI_ERROR_FATALERROR_UDDISCHEMANOTFOUND" ); Debug.Verify( File.Exists( resourceSchema ), "UDDI_ERROR_FATALERROR_UDDIRESOURCESCHEMANOTFOUND" ); XmlSchemaCollection xsc = new XmlSchemaCollection(); xsc.Add( UDDI.API.Constants.Namespace, apiSchema ); xsc.Add( UDDI.API.Extensions.Constants.Namespace, resourceSchema ); // // Rewind stream (to be safe) and validate // strm.Seek( 0, SeekOrigin.Begin ); // // Construct a validating reader to verify the document is kosher // XmlTextReader reader = new XmlTextReader( strm ); XmlValidatingReader vreader = new XmlValidatingReader( reader ); vreader.Schemas.Add( xsc ); while( vreader.Read()){} // // Rewind stream again, so someone else can use it // strm.Seek( 0, SeekOrigin.Begin ); } public void Save() { UDDI.Diagnostics.Debug.Enter(); if( null != TModelDetail ) { Debug.Write( SeverityType.Info, CategoryType.Data, "Importing tModels..." ); foreach( TModel tm in TModelDetail.TModels ) { tm.AuthorizedName = null; tm.Save(); } } if( null != CategorizationSchemes ) { Debug.Write( SeverityType.Info, CategoryType.Data, "Importing Categorization schemes..." ); foreach( CategorizationScheme cs in CategorizationSchemes ) { cs.Save(); } } if( null != BusinessDetail ) { Debug.Write( SeverityType.Info, CategoryType.Data, "Importing Providers..." ); foreach( BusinessEntity be in BusinessDetail.BusinessEntities ) { be.AuthorizedName = null; be.Save(); } } if( null != ServiceDetail ) { Debug.Write( SeverityType.Info, CategoryType.Data, "Importing Services..." ); foreach( BusinessService bs in ServiceDetail.BusinessServices ) { bs.Save(); } } if( null != BindingDetail ) { Debug.Write( SeverityType.Info, CategoryType.Data, "Importing bindings..." ); foreach( BindingTemplate bind in BindingDetail.BindingTemplates ) { bind.Save(); } } } } [SoapDocumentService( ParameterStyle=SoapParameterStyle.Bare, RoutingStyle=SoapServiceRoutingStyle.RequestElement )] [WebService( Namespace=UDDI.API.Extensions.Constants.Namespace )] public class CategoryMessages { public CategoryMessages(){} [WebMethod, SoapDocumentMethod( Action="\"\"", RequestElementName="get_relatedCategories" )] [UDDIExtension( messageType="get_relatedCategories" )] public CategoryList GetRelatedCategories( GetRelatedCategories message ) { Debug.Enter(); CategoryList list = null; try { list = message.Get(); } catch( Exception e ) { DispositionReport.Throw( e ); } Debug.Leave(); return list; } } [XmlType( Namespace=UDDI.API.Extensions.Constants.Namespace )] [XmlRoot( "get_relatedCategories", Namespace=UDDI.API.Extensions.Constants.Namespace )] public class GetRelatedCategories { public GetRelatedCategories(){} [XmlIgnore] public CategoryCollection Categories = new CategoryCollection(); [XmlElement( "category" )] public Category[] CategoriesSerialize { get { return Categories.ToArray(); } set { Categories.CopyTo( value ); } } public CategoryList Get() { // // For each category retrieve // the request stuff ( root, children, parents ) // CategoryList list = new CategoryList(); foreach( Category cat in Categories ) { CategoryInfo info = new CategoryInfo( cat.TModelKey, cat.KeyValue ); info.Get( cat.RelationshipQualifiers ); list.CategoryInfos.Add( info ); } return list; } } public class CategorizationScheme { // // TODO: Must tModel element must be optional with tModelKey element // private int CategorizationSchemeFlag = 1; [XmlAttribute( "checked" )] public XmlBoolType Checked { get { return ( 1 == CategorizationSchemeFlag ) ? XmlBoolType.True : XmlBoolType.False; } set { if( XmlBoolType.True == value ) CategorizationSchemeFlag = 1; else CategorizationSchemeFlag = 0;//changed from 2 to 0 to correctly implement bit flags } } [XmlElement( "tModel", Namespace=UDDI.API.Constants.Namespace )] public TModel TModel = null; [XmlElement( "tModelKey" )] public string TModelKey { get { return tModelKey; } set { if( null == value ) tModelKey = null; else tModelKey = value.Trim(); } } private string tModelKey = ""; [XmlElement( "categoryValue" )] public CategoryValueCollection CategoryValues { get { if( null == categoryvalues ) categoryvalues = new CategoryValueCollection(); return categoryvalues; } set { categoryvalues = value; } } private CategoryValueCollection categoryvalues; public CategorizationScheme(){} public void Delete() { Debug.Enter(); SqlCommand cmd = new SqlCommand( "net_taxonomy_delete", ConnectionManager.GetConnection() ); cmd.CommandType = CommandType.StoredProcedure; cmd.Transaction = ConnectionManager.GetTransaction(); cmd.Parameters.Add( new SqlParameter( "@tModelKey", SqlDbType.UniqueIdentifier ) ).Direction = ParameterDirection.Input; SqlParameterAccessor paramacc = new SqlParameterAccessor( cmd.Parameters ); paramacc.SetGuidFromKey( "@tModelKey", tModelKey ); cmd.ExecuteNonQuery(); Debug.Leave(); } public void Save() { string tmodelkey; Debug.Enter(); Debug.Write( SeverityType.Info, CategoryType.Data, "Importing categorization scheme..." ); if( null != TModel ) { TModel.AuthorizedName = null; TModel.Save(); } else { TModel = new TModel( TModelKey ); TModel.Get(); } // // If the TModel Provided is categorized with 'Browsing Intended' // Set the flag (0x0002) // //if( TModel.CategoryBag.Contains( new KeyedReference( "Browsing Intended","1","uuid:BE37F93E-87B4-4982-BF6D-992A8E44EDAB" ) ) ) foreach( KeyedReference kr in TModel.CategoryBag ) { if( kr.KeyValue=="1" && kr.TModelKey.ToUpper()=="UUID:BE37F93E-87B4-4982-BF6D-992A8E44EDAB" ) CategorizationSchemeFlag = CategorizationSchemeFlag | 0x0002; } // // Store the TModelKey // tmodelkey = TModel.TModelKey; // // Save the categorization scheme // SqlStoredProcedureAccessor sp = new SqlStoredProcedureAccessor(); sp.ProcedureName = "net_taxonomy_save"; sp.Parameters.Add( "@tModelKey", SqlDbType.UniqueIdentifier ); sp.Parameters.Add( "@flag", SqlDbType.Int ); sp.Parameters.Add( "@taxonomyID", SqlDbType.BigInt, ParameterDirection.InputOutput ); sp.Parameters.SetGuidFromKey( "@tModelKey", tmodelkey ); sp.Parameters.SetInt( "@flag", CategorizationSchemeFlag ); sp.ExecuteNonQuery(); int taxonomyID = sp.Parameters.GetInt( "@taxonomyID" ); // // Save the category values // foreach( CategoryValue cv in CategoryValues ) { cv.Save( tmodelkey ); } Debug.Leave(); } public void Get() { Debug.Enter(); // // Retrieve the taxonomy // SqlStoredProcedureAccessor sp = new SqlStoredProcedureAccessor( "net_taxonomy_get" ); sp.Parameters.Add( "@tModelKey", SqlDbType.UniqueIdentifier ); sp.Parameters.Add( "@flag", SqlDbType.Int, ParameterDirection.InputOutput ); sp.Parameters.SetGuidFromKey( "@tModelKey", tModelKey ); sp.Parameters.SetNull( "@flag" ); sp.ExecuteScalar(); // // Set the flag value // CategorizationSchemeFlag = sp.Parameters.GetInt( "@flag" ); // // Retrieve the taxonomy values // CategoryValues.Clear(); SqlStoredProcedureAccessor sp2 = new SqlStoredProcedureAccessor( "net_taxonomyValues_get" ); sp2.Parameters.Add( "@tModelKey", SqlDbType.UniqueIdentifier ); sp2.Parameters.SetGuidFromKey( "@tModelKey", tModelKey ); SqlDataReaderAccessor reader = sp2.ExecuteReader(); try { while( reader.Read() ) { CategoryValues.Add( reader.GetString( "keyName" ), reader.GetString( "keyValue" ), reader.GetString( "parentKeyValue"), ( ( reader.GetInt( "valid" ) == 1 ) ? true : false ) ); } } finally { reader.Close(); } Debug.Leave(); } } public enum ValidForCategorization { [XmlEnumAttribute( "false" )] False = 0, [XmlEnumAttribute( "true" )] True = 1, } public class CategorizationSchemeCollection : CollectionBase { public CategorizationSchemeCollection() { } public void Save() { Debug.Enter(); foreach( CategorizationScheme tax in this ) { tax.Save(); } Debug.Leave(); } public CategorizationScheme this[int index] { get { return (CategorizationScheme)List[index]; } set { List[index] = value; } } public int Add(CategorizationScheme value) { return List.Add(value); } public void Insert(int index, CategorizationScheme value) { List.Insert(index, value); } public int IndexOf( CategorizationScheme value ) { return List.IndexOf( value ); } public bool Contains( CategorizationScheme value ) { return List.Contains( value ); } public void Remove( CategorizationScheme value ) { List.Remove( value ); } public void CopyTo(CategorizationScheme[] array, int index) { List.CopyTo( array, index ); } public void CopyTo( CategorizationScheme[] array ) { foreach( CategorizationScheme tax in array ) Add( tax ); } public CategorizationScheme[] ToArray() { return (CategorizationScheme[]) InnerList.ToArray( typeof( CategorizationScheme ) ); } } public class Category { [XmlElement( "relationshipQualifier" )] public RelationshipQualifier[] RelationshipQualifiers; [XmlAttribute( "tModelKey" )] public string TModelKey; [XmlAttribute( "keyValue" )] public string KeyValue; } public enum RelationshipQualifier { root = 1, parent = 2, child = 3 } [XmlRoot( "categoryList", Namespace=UDDI.API.Extensions.Constants.Namespace )] public class CategoryList { [XmlAttribute( "truncated" )] public bool Truncated = false; [XmlAttribute( "operator" )] public string Operator = Config.GetString( "Operator" ); [XmlIgnore] public CategoryInfoCollection CategoryInfos = new CategoryInfoCollection(); [XmlElement( "categoryInfo" )] public CategoryInfo[] CategoryInfosSerialize { get { return CategoryInfos.ToArray(); } set { CategoryInfos.CopyTo( value ); } } public CategoryList(){} } public class CategoryInfo : CategoryValue { const int KeyValueIndex = 0; const int ParentKeyValueIndex = 1; const int KeyNameIndex = 2; const int IsValidIndex = 3; // -- 0 - Root information requested // -- 1 - Child information requested // -- 2 - Parent information requested // -- 3 - Current information requested public enum RelationType : int { Root = 0, Child = 1, Parent = 2, Current = 3 } [XmlArray( "rootRelationship" ), XmlArrayItem( "categoryValue" )] public CategoryValueCollection Roots = null; [XmlArray( "parentRelationship" ), XmlArrayItem( "categoryValue" )] public CategoryValueCollection Parents = null; [XmlArray( "childRelationship" ), XmlArrayItem( "categoryValue" )] public CategoryValueCollection Children = null; public CategoryInfo( string tmodelkey, string keyvalue ) : base( tmodelkey, keyvalue ) { } public SqlDataReader GetValues( RelationType relation ) { SqlCommand cmd = new SqlCommand( "net_taxonomyValue_get", ConnectionManager.GetConnection() ); cmd.Transaction = ConnectionManager.GetTransaction(); cmd.CommandType = CommandType.StoredProcedure; // // Add parameters and set values // SqlParameterAccessor populator = new SqlParameterAccessor( cmd.Parameters ); cmd.Parameters.Add( "@tModelKey", SqlDbType.UniqueIdentifier ); cmd.Parameters.Add( "@keyValue", SqlDbType.NVarChar, UDDI.Constants.Lengths.KeyValue ); cmd.Parameters.Add( "@relation", SqlDbType.Int ); populator.SetGuidFromKey( "@tModelKey", TModelKey ); populator.SetString( "@keyValue", KeyValue ); populator.SetInt( "@relation", (int) relation ); return cmd.ExecuteReader(); } public void Get( RelationshipQualifier[] relations ) { if( null != KeyValue ) { // // The request can ask for Root stuff with just the TModelKey // SqlDataReader rdr = GetValues( RelationType.Current ); try { SqlDataReaderAccessor dracc = new SqlDataReaderAccessor( rdr ); if( rdr.Read() ) { this.KeyName = dracc.GetString( KeyNameIndex ); this.IsValid = ( 1 == dracc.GetInt( IsValidIndex ) ); } else { throw new UDDIException( UDDI.ErrorType.E_invalidValue, "UDDI_ERROR_INVALIDVALUE_VALUENOTFOUND" ); } } finally { rdr.Close(); } } if( null != relations ) { foreach( RelationshipQualifier rq in relations ) { switch( rq ) { case RelationshipQualifier.root: GetRoots(); break; case RelationshipQualifier.child: GetChildren(); break; case RelationshipQualifier.parent: GetParents(); break; } } } } public void GetRoots() { Roots = new CategoryValueCollection(); SqlDataReader rdr = GetValues( RelationType.Root ); try { SqlDataReaderAccessor dracc = new SqlDataReaderAccessor( rdr ); while( rdr.Read() ) { Roots.Add( dracc.GetString( KeyNameIndex ), dracc.GetString( KeyValueIndex ), dracc.GetString( ParentKeyValueIndex ), ( 1 == dracc.GetInt( IsValidIndex ) ) ); } } finally { rdr.Close(); } } public void GetChildren() { Children = new CategoryValueCollection(); SqlDataReader rdr = GetValues( RelationType.Child ); try { SqlDataReaderAccessor dracc = new SqlDataReaderAccessor( rdr ); while( rdr.Read() ) { Children.Add( dracc.GetString( KeyNameIndex ), dracc.GetString( KeyValueIndex ), dracc.GetString( ParentKeyValueIndex ), ( 1 == dracc.GetInt( IsValidIndex ) ) ); } } finally { rdr.Close(); } } public void GetParents() { Parents = new CategoryValueCollection(); SqlDataReader rdr = GetValues( RelationType.Parent ); try { SqlDataReaderAccessor dracc = new SqlDataReaderAccessor( rdr ); while( rdr.Read() ) { Parents.Add( dracc.GetString( KeyNameIndex ), dracc.GetString( KeyValueIndex ), dracc.GetString( ParentKeyValueIndex ), ( 1 == dracc.GetInt( IsValidIndex ) ) ); } } finally { rdr.Close(); } } public CategoryInfo(){} } [XmlInclude( typeof( CategoryInfo ) )] public class CategoryValue { [XmlAttribute( "tModelKey" )] public string TModelKey = null; [XmlAttribute( "keyName" )] public string KeyName = null; [XmlAttribute( "keyValue" )] public string KeyValue = null; [XmlAttribute( "parentKeyValue" )] public string ParentKeyValue = null; [XmlAttribute( "isValid" )] public bool IsValid = false; public CategoryValue() { } public CategoryValue( string tmodelkey, string keyvalue ) { TModelKey = tmodelkey; KeyValue = keyvalue; } public CategoryValue( string keyname, string keyvalue, string parent, bool isvalid ) { KeyName = keyname; KeyValue = keyvalue; ParentKeyValue = parent; IsValid = isvalid; } public void Save( string TModelKey ) { Debug.Enter(); if( !Utility.StringEmpty( ParentKeyValue ) ) Debug.Verify( KeyValue != ParentKeyValue, "UDDI_ERROR_FATALERROR_PARENTKEYEQUALSVALUE", ErrorType.E_fatalError ); SqlStoredProcedureAccessor sp = new SqlStoredProcedureAccessor( "net_taxonomyValue_save" ); sp.Parameters.Add( "@tModelKey", SqlDbType.UniqueIdentifier ); sp.Parameters.Add( "@keyValue", SqlDbType.NVarChar, UDDI.Constants.Lengths.KeyValue ); sp.Parameters.Add( "@parentKeyValue", SqlDbType.NVarChar, UDDI.Constants.Lengths.KeyValue ); sp.Parameters.Add( "@keyName", SqlDbType.NVarChar, UDDI.Constants.Lengths.KeyName ); sp.Parameters.Add( "@valid", SqlDbType.Bit ); sp.Parameters.SetGuidFromKey( "@tModelKey", TModelKey ); sp.Parameters.SetString( "@keyValue", KeyValue ); sp.Parameters.SetString( "@parentKeyValue", ParentKeyValue ); sp.Parameters.SetString( "@keyName", KeyName ); sp.Parameters.SetBool( "@valid" , IsValid ); sp.ExecuteNonQuery(); Debug.Leave(); } } public class CategoryValueCollection : CollectionBase { public CategoryValueCollection() { } public CategoryValue this[int index] { get { return (CategoryValue)List[index]; } set { List[index] = value; } } public int Add( string keyname, string keyvalue, string parent, bool isvalid ) { return List.Add( new CategoryValue( keyname, keyvalue, parent, isvalid ) ); } public int Add(CategoryValue value) { return List.Add(value); } public void Insert(int index, CategoryValue value) { List.Insert(index, value); } public int IndexOf( CategoryValue value ) { return List.IndexOf( value ); } public bool Contains( CategoryValue value ) { return List.Contains( value ); } public void Remove( CategoryValue value ) { List.Remove( value ); } public void CopyTo(CategoryValue[] array, int index) { List.CopyTo( array, index ); } public void CopyTo( CategoryValue[] array ) { foreach( CategoryValue tax in array ) Add( tax ); } public CategoryValue[] ToArray() { return (CategoryValue[]) InnerList.ToArray( typeof( CategoryValue ) ); } } public class CategoryCollection : CollectionBase { public CategoryCollection() { } public Category this[int index] { get { return (Category)List[index]; } set { List[index] = value; } } public int Add(Category value) { return List.Add(value); } public void Insert(int index, Category value) { List.Insert(index, value); } public int IndexOf( Category value ) { return List.IndexOf( value ); } public bool Contains( Category value ) { return List.Contains( value ); } public void Remove( Category value ) { List.Remove( value ); } public void CopyTo(Category[] array, int index) { List.CopyTo( array, index ); } public void CopyTo( Category[] array ) { foreach( Category tax in array ) Add( tax ); } public Category[] ToArray() { return (Category[]) InnerList.ToArray( typeof( Category ) ); } } public class CategoryInfoCollection : CollectionBase { public CategoryInfoCollection() { } public CategoryInfo this[int index] { get { return (CategoryInfo)List[index]; } set { List[index] = value; } } public int Add(CategoryInfo value) { return List.Add(value); } public void Insert(int index, CategoryInfo value) { List.Insert(index, value); } public int IndexOf( CategoryInfo value ) { return List.IndexOf( value ); } public bool Contains( CategoryInfo value ) { return List.Contains( value ); } public void Remove( CategoryInfo value ) { List.Remove( value ); } public void CopyTo(CategoryInfo[] array, int index) { List.CopyTo( array, index ); } public void CopyTo( CategoryInfo[] array ) { foreach( CategoryInfo tax in array ) Add( tax ); } public CategoryInfo[] ToArray() { return (CategoryInfo[]) InnerList.ToArray( typeof( CategoryInfo ) ); } } }