/// <summary> /// Does the validate. /// </summary> /// <param name="objectToValidate">The object to validate.</param> /// <param name="currentTarget">The current target.</param> /// <param name="key">The key.</param> /// <param name="validationResults">The validation results.</param> protected override void DoValidate(ModelBusReference objectToValidate, object currentTarget, string key, ValidationResults validationResults) { ModelElement currentElement = currentTarget as ModelElement; Debug.Assert(currentElement != null); if (!validationResults.IsValid) { return; } if (objectToValidate != null) { using (ModelBusReferenceResolver resolver = new ModelBusReferenceResolver()) { ModelElement referenced = resolver.Resolve(objectToValidate); // Check if we are not in the same model and we had visited this model before if (!currentElement.Store.Id.Equals(referenced.Store.Id) && Visited(referenced.Store.Id)) { this.LogValidationResult(validationResults, String.Format(CultureInfo.CurrentUICulture, this.MessageTemplate, ValidatorUtility.GetTargetName(currentTarget), objectToValidate.ElementDisplayName, objectToValidate.ModelDisplayName), currentTarget, key); return; } } // store the current model to compare with references // If referenced model == current model implies that we have a circular ref. alreadyVisited.Add(currentElement.Store.Id); } }
protected override string GetMessage(object objectToValidate, string key) { return(ValidatorUtility.ShowFormattedMessage( this.MessageTemplate, ValidatorUtility.GetTargetName(currentTarget), this.maxLength, base.GetMessage(objectToValidate, key))); }
/// <summary> /// Does the validate. /// </summary> /// <param name="objectToValidate">The object to validate.</param> /// <param name="currentTarget">The current target.</param> /// <param name="key">The key.</param> /// <param name="validationResults">The validation results.</param> protected override void DoValidate(ModelBusReference objectToValidate, object currentTarget, string key, ValidationResults validationResults) { // store default message (in case the error comes from a DC element) and set our new message dcModelMessageTemplate = this.MessageTemplate; this.MessageTemplate = currentMessageTemplate; // Validate cross model references base.DoValidate(objectToValidate, currentTarget, key, validationResults); if (!validationResults.IsValid) { return; } using (ModelBusReferenceResolver resolver = new ModelBusReferenceResolver()) { ModelElement referencedElement = resolver.Resolve(objectToValidate); if (referencedElement != null) { DataContractModel dcm = referencedElement.Store.ElementDirectory.FindElements <DataContractModel>()[0]; if (dcm.ImplementationTechnology == null || String.IsNullOrWhiteSpace(dcm.ProjectMappingTable) || !dcm.ImplementationTechnology.Name.Equals(GetItName(currentTarget), StringComparison.OrdinalIgnoreCase)) { validationResults.AddResult( new ValidationResult(String.Format(CultureInfo.CurrentUICulture, this.dcModelMessageTemplate, ValidatorUtility.GetTargetName(currentTarget)), currentTarget, key, String.Empty, this)); } } } }
private static string GetElementName(ModelElement element) { return(element != null? ValidatorUtility.GetTargetName(element) : Guid.NewGuid().ToString()); }
// MBR format: // modelbus://logicalAdapterId/model display name/element display name/adapter reference data. // V3 format: // mel://[DSLNAMESPACE]\[MODELELEMENTTYPE]\[MODELELEMENT]@[PROJECT]\[MODELFILE] private object ConvertToModelBusReference <T>(SerializationContext serializationContext, string input) { if (serializationContext == null) { throw new ArgumentNullException("serializationContext"); } if (string.IsNullOrWhiteSpace(input) || !typeof(ModelBusReference).IsAssignableFrom(typeof(T))) { return(default(T)); } // filter out the schema part input = input.Replace(MelSchema, string.Empty); string[] data = input.Split(new string[] { "@" }, StringSplitOptions.RemoveEmptyEntries); if (data.Length != 2) { serializationContext.Result.AddMessage(BuildSerializationMessage(Properties.Resources.InvalidMoniker, input)); return(default(T)); } string[] modelData = data[0].Split(new string[] { "\\" }, StringSplitOptions.RemoveEmptyEntries); if (modelData.Length != 3) { serializationContext.Result.AddMessage(BuildSerializationMessage(Properties.Resources.InvalidMoniker, input)); return(default(T)); } string[] locationData = data[1].Split(new string[] { "\\" }, StringSplitOptions.RemoveEmptyEntries); if (locationData.Length != 2) { serializationContext.Result.AddMessage(BuildSerializationMessage(Properties.Resources.InvalidMoniker, input)); return(default(T)); } // set full path to model file if (!Path.IsPathRooted(locationData[1])) { locationData[1] = Path.Combine(Path.GetDirectoryName(serializationContext.Location), locationData[1]); } ModelBusReference result = null; IModelBus bus = serializationContext[ModelBusReferencePropertySerializer.ModelBusLoadContextKey] as IModelBus; if (bus != null) { using (ModelBusAdapterManager manager = bus.GetAdapterManager(LogicalAdapterId)) { ModelBusReference reference = null; if (manager.TryCreateReference(out reference, Path.ChangeExtension(locationData[1], FileExtension))) { using (ModelBusAdapter adapter = manager.CreateAdapter(reference)) { IModelingAdapterWithStore storeAdapter = adapter as IModelingAdapterWithStore; if (storeAdapter.Store != null) { foreach (ModelElement mel in FilterElementsByType(storeAdapter.Store, modelData[1])) { if (ValidatorUtility.GetTargetName(mel).Equals(modelData[2], StringComparison.OrdinalIgnoreCase)) { return(adapter.GetElementReference(mel)); } } // If we are still here, we could not find any match so try will all mels foreach (ModelElement mel in FilterElementsByType(storeAdapter.Store, string.Empty)) { if (ValidatorUtility.GetTargetName(mel).Equals(modelData[2], StringComparison.OrdinalIgnoreCase)) { return(adapter.GetElementReference(mel)); } } } } } } } serializationContext.Result.AddMessage(BuildSerializationMessage(Properties.Resources.ReferenceElementNotFound, input)); return(result); }
/// <summary> /// Does the validate. /// </summary> /// <param name="objectToValidate">The object to validate.</param> /// <param name="currentTarget">The current target.</param> /// <param name="key">The key.</param> /// <param name="validationResults">The validation results.</param> protected override void DoValidate(ModelBusReference objectToValidate, object currentTarget, string key, ValidationResults validationResults) { this.MessageTemplate = currentMessageTemplate; base.DoValidate(objectToValidate, currentTarget, key, validationResults); if (!validationResults.IsValid) { return; } ServiceReference serviceReference = currentTarget as ServiceReference; if (serviceReference == null) { return; } using (ModelBusReferenceResolver resolver = new ModelBusReferenceResolver()) { ModelElement referencedElement = resolver.Resolve(objectToValidate); if (referencedElement != null) { ServiceContractModel dcm = referencedElement.Store.ElementDirectory.FindElements <ServiceContractModel>()[0]; if (dcm.ImplementationTechnology == null || String.IsNullOrWhiteSpace(dcm.ProjectMappingTable) || !dcm.ImplementationTechnology.Name.Equals(GetItName(currentTarget), StringComparison.OrdinalIgnoreCase)) { validationResults.AddResult( new ValidationResult(String.Format(CultureInfo.CurrentUICulture, this.MessageTemplate, ValidatorUtility.GetTargetName(currentTarget)), currentTarget, key, String.Empty, this)); } } } }