L'esecuzione di una trasformazione di associazione modello-a-modello genera un modello in memoria temporaneo. Se il contenuto di questo modello è diverso da quello di un modello di destinazione esistente nel file system, i modelli vengono uniti durante la post-elaborazione della trasformazione. La procedura di unione predefinita, che è una regola di trasformazione fornita nel framework di trasformazione modello-a-modello, carica il modello di destinazione esistente nella memoria e utilizza la funzionalità di unione strutturale per combinarlo con il modello in memoria generato. Il modello ottenuto dall'unione strutturale sostituisce il modello di destinazione esistente.
I modelli spesso contengono riferimenti a oggetti presenti in altri modelli. Ad esempio, un modello UML potrebbe contenere riferimenti a stereotipi che sono definiti nei profili UML oppure potrebbe contenere riferimenti ai tipi primitive che sono definiti nelle librerie UML. L'unione strutturale rileva che i riferimenti ai modelli incrociati fanno riferimento allo stesso oggetto solo se fanno riferimento alla stessa istanza in memoria di quell'oggetto.
Ad esempio, si supponga che lo stereotipo «Prospettiva», che è definito nel profilo UML denominato Predefinito, sia applicato al package ExamplePackage in un modello in memoria generato e anche allo stesso package nel modello di destinazione esistente. Quando il modello di destinazione esistente viene caricato in memoria per l'unione strutturale, il riferimento allo stereotipo «Prospettiva» viene risolto. Se l'unione strutturale non identifica esattamente la stessa istanza dell'oggetto stereotipo in memoria cui fa riferimento il modello in memoria generato, l'unione strutturale non può rilevare che ad entrambe le versioni del package ExamplePackage è applicato lo stesso stereotipo. Per impostazione predefinita, l'unione strutturale si interrompe quando rileva istanze duplicate dello stesso modello quali, ad esempio, il profilo Predefinito UML di questo esempio, che sono caricate e a cui fanno riferimento i modelli di cui si sta eseguendo l'unione.
Per impedire istanze in memoria duplicate di un modello, assicurarsi che l'insieme di risorse che contiene i modelli in memoria abbia solo un'istanza di ciascun modello.
Queste regole si trovano nel package denominato com.ibm.xtools.transform.authoring. Per ulteriori informazioni su queste regole, consultare il manuale Rational Transformation Authoring Developer Guide API Reference. La trasformazione in questo esempio utilizza entrambe queste regole. Esaminare il codice sorgente della trasformazione generata per osservare la creazione di istanze nelle sezioni del codice sorgente della trasformazione che è possibile personalizzare.
I successivi frammenti di codice mostrano come utilizzare la regola denominata UMLDefaultLibrariesAddRule.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
private void addTransformElements(Registry registry) {
// You may add more transform element before the generated ones here
// Remember to remove the @generated tag or add NOT to it
addGeneratedTransformElements(registry);
// You may add more transform element after the generated ones here
// Remember to remove the @generated tag or add NOT to it
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
private void addTransformElements(Registry registry) {
add(new UMLDefaultLibrariesAddRule());
// You may add more transform element before the generated ones here
// Remember to remove the @generated tag or add NOT to it
addGeneratedTransformElements(registry);
// You may add more transform element after the generated ones here
// Remember to remove the @generated tag or add NOT to it
}
/**
* Creates a root transformation. You may add more rules to the transformation here
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param transform The root transformation
* @generated
*/
protected RootTransformation createRootTransformation(ITransformationDescriptor descriptor) {
// Create and return an instance of a class that extends RootTransformation
// and handles source objects of type = (resource) and target objects of type = (resource)
// and remove the @generated tag. The default implementation provided here is
// for source and target objects of type = (resource).
return new RootTransformation(descriptor, new MainTransform()){
protected void addPostProcessingRules() {
add(new UMLProfilesConsistencyCheckRule());
super.addPostProcessingRules();
}};
}
/**
* Creates a root transformation. You may add more rules to the transformation here
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param transform The root transformation
* @generated NOT
*/
protected RootTransformation createRootTransformation(ITransformationDescriptor descriptor) {
// Create and return an instance of a class that extends RootTransformation
// and handles source objects of type = (resource) and target objects of type = (resource)
// and remove the @generated tag. The default implementation provided here is
// for source and target objects of type = (resource).
return new RootTransformation(descriptor, new MainTransform()){
protected void addPostProcessingRules() {
add(new CrossModelReferenceCheckRule());
add(new UMLProfilesConsistencyCheckRule());
super.addPostProcessingRules();
}};
}