2010-12-03 49 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