【问题标题】:How to create and apply a UML2 stereo-type using EMF in a standalone app?如何在独立应用程序中使用 EMF 创建和应用 UML2 立体类型?
【发布时间】:2010-12-03 06:25:58
【问题描述】:

我编写了下面的示例应用程序来创建EJB 原型并将其应用于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;
  }
}

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

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 之外运行的命令行应用程序。

【问题讨论】:

    标签: eclipse uml eclipse-emf stereotype


    【解决方案1】:

    刻板印象不会与 EMF 实时同步。我的意思是你需要在你的项目中加载你的个人资料才能应用一个刻板印象。这不能仅通过代码来完成,而是通过使用其他插件来完成!

    我还注意到,EMF 在第一次转换后会丢失刻板印象,因此不要花太多时间,因为这段 EMF 代码不稳定:-)

    【讨论】:

      【解决方案2】:

      路径图通常通过org.eclipse.emf.ecore.uri_mapping 扩展点在插件中给出。由于您没有运行插件,因此您需要手动执行org.eclipse.emf.ecore 执行的操作。

      我一直在插件中四处挖掘,但不能着急找到这个扩展点的使用者。祝你好运!

      【讨论】:

      • 也许您可以尝试在无头 Equinox 运行时中将命令行应用程序作为 OSGi 包运行。通过这种方式,您将获得这里提到的 plugin.xml 贡献之类的所有好处,并且仍然可以在 Eclipse UI 之外运行。
      【解决方案3】:

      我在 EMF/UML2 论坛上找到了这个问题的答案:Getting null for the meta model

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-04
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 2012-08-11
        • 1970-01-01
        相关资源
        最近更新 更多