Come creare e applicare un UML2 stereo di tipo utilizzando EMF in un'applicazione stand-alone?

StackOverflow https://stackoverflow.com/questions/4343022

Domanda

ho scritto l'applicazione di esempio di seguito per creare uno stereotipo EJB un applicarlo alla classe TimeEntry:

import java.io.File;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.Resource.Factory;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.uml2.uml.*;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.UMLPackage.Literals;
import org.eclipse.uml2.uml.resource.UMLResource;

public class SampleProfile
{

  private static final ResourceSet RESOURCE_SET = new ResourceSetImpl();

  public static void main( String[] args ) throws Exception
  {

    Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
      UMLResource.FILE_EXTENSION,
      UMLResource.Factory.INSTANCE
    );

    final Model umlMetamodel = (Model) loadPackage( UMLResource.UML_METAMODEL_URI );

    final Model sampleModel = UMLFactory.eINSTANCE.createModel();
    sampleModel.setName( "Sample Model" );

    final Profile sampleProfile = UMLFactory.eINSTANCE.createProfile();
    sampleProfile.setName( "Sample Profile" );

    final Stereotype ejbStereo = sampleProfile.createOwnedStereotype( "EJB" );
    extendMetaclass( umlMetamodel, sampleProfile, "Class", ejbStereo );

    sampleProfile.define();

    final Package samplePackage = sampleModel.createNestedPackage( "sample" );
    samplePackage.applyProfile( sampleProfile );

    final Class sampleClass = samplePackage.createOwnedClass( "TimeEntry", false );
    sampleClass.applyStereotype( ejbStereo );

    final File outputFile = new File( "sample_model.uml" );
    final URI outputUri = URI.createFileURI( outputFile.getAbsolutePath() );
    final Resource resource = RESOURCE_SET.createResource( outputUri );
    resource.getContents().add( sampleModel );
    resource.getContents().add( sampleProfile );
    resource.save( null );
  }

  private static Package loadPackage( final String uri )
  {
    System.out.println( "uri = " + uri );
    final Resource resource = RESOURCE_SET.getResource( URI.createURI( uri ), true );
    EcoreUtil.resolveAll( resource );
    return (org.eclipse.uml2.uml.Package) EcoreUtil.getObjectByType( resource.getContents(), Literals.PACKAGE );
  }

  private static void extendMetaclass( final Model umlMetamodel,
                                       final Profile profile,
                                       final String name,
                                       final Stereotype stereotype )
  {
    stereotype.createExtension( referenceMetaclass( umlMetamodel, profile, name ), true );
  }

  private static org.eclipse.uml2.uml.Class referenceMetaclass( final Model umlMetamodel,
                                                                final Profile profile,
                                                                final String name )
  {
    final Class metaclass = (Class) umlMetamodel.getOwnedType( name );
    profile.createMetaclassReference( metaclass );
    return metaclass;
  }
}

Tuttavia l'esecuzione dell'applicazione, ottengo questo messaggio di errore nella console:

uri = pathmap://UML_METAMODELS/UML.metamodel.uml
Exception in thread "main" org.eclipse.emf.ecore.resource.impl.ResourceSetImpl$1DiagnosticWrappedException: java.net.MalformedURLException: unknown protocol: pathmap
    at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.handleDemandLoadException(ResourceSetImpl.java:315)
    at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoadHelper(ResourceSetImpl.java:274)
    at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.getResource(ResourceSetImpl.java:397)

Tutte le idee che probabilmente è sbagliato con il mio codice e come questo problema può essere risolto? L'applicazione è un'applicazione a riga di comando che viene eseguito al di fuori di Eclipse.

È stato utile?

Soluzione 3

ho trovato la risposta a questa domanda sul forum EMF / UML2: Come nullo per il modello meta .

Altri suggerimenti

Gli stereotipi non sono in diretta sincronizzati con campi elettromagnetici. Voglio dire che è necessario caricare il profilo all'interno del vostro progetto, al fine di essere in grado di applicare uno stereotipo. Questo non può essere fatto da solo codice, ma utilizzando altri plugin !!

Ho anche notato che gli stereotipi sono persi da EMF dopo la prima trasformazione, quindi non spendere troppo tempo perché questo pezzo di codice campi elettromagnetici non è stabile: -)

I pathmaps sono di solito dato in un plugin attraverso il punto di estensione org.eclipse.emf.ecore.uri_mapping. Dal momento che non sta eseguendo i plugin, è necessario prendere manualmente le azioni che org.eclipse.emf.ecore prende.

Ho scavato in giro per il plug-in, ma non riusciva a trovare il consumatore di questo punto di estensione in fretta. Buona fortuna!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top