2010-12-03 47 views
0

我已经写了下面的示例应用程序创建一个EJB刻板的将其应用到TimeEntry类:如何在独立应用程序中使用EMF创建和应用UML2立体声类型?

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; 
    } 
} 

但是运行的应用程序,我在控制台中此错误消息:

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) 

任何想法我的代码可能有什么问题,以及如何解决这个问题?该应用程序是一个在Eclipse之外运行的命令行应用程序。

回答

0

陈规定型不与EMF同步。我的意思是你需要在你的项目中加载你的配置文件,以便能够应用刻板印象。这不能通过代码而是通过使用其他插件来完成!

我也注意到,刻板印象是由EMF第一次转型后会丢失,因此不会花太多时间,因为这一块的EMF代码是不是:-)稳定

0

的路径映射在一个插件通过通常给予org.eclipse.emf.ecore.uri_mapping扩展点。由于您没有运行插件,因此您需要手动执行org.eclipse.emf.ecore所采取的操作。

我一直在挖掘插件,但无法找到这个扩展点的消费者匆忙。祝你好运!

+0

也许您可以尝试在无头Equinox运行时内将您的命令行应用程序作为OSGi包运行。通过这种方式,您将获得像这里提到的plugin.xml贡献的所有优点,并仍然在Eclipse UI之外运行。 – 2010-12-07 10:25:16