package com.cimphony.cimtoole.buildlet; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Collections; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl; import com.cimphony.cimtoole.CimphonyCIMToolPlugin; import com.cimphony.cimtoole.ecore.EcoreGenerator; import com.cimphony.cimtoole.ecore.EcoreGenerator.Index; import au.com.langdale.cimtoole.builder.ProfileBuildlets.ProfileBuildlet; import au.com.langdale.cimtoole.project.Task; import au.com.langdale.kena.OntModel; public class EcoreBuildlet extends ProfileBuildlet { public EcoreBuildlet() { super("ecore"); } @Override protected void build(IFile result, IProgressMonitor monitor) throws CoreException { IFile file = Task.getRelated(result, "owl"); boolean preserveNS = Task.getPreferenceOption(Task.PRESERVE_NAMESPACES); String namespace = preserveNS? Task.getSchemaNamespace(file): Task.getProperty(file, Task.PROFILE_NAMESPACE); EcoreGenerator generator = getGenerator(Task.getProfileModel(file), Task.getBackgroundModel(file), namespace, Task.getProperty(file, Task.PROFILE_NAMESPACE), preserveNS, result.getProject()); generator.run(); // Use file name for top level package name. EPackage schema = generator.getResult(); if (schema.getName() == null) schema.setName(result.getName().split("\\.")[0]); ResourceSet metaResourceSet = new ResourceSetImpl(); // Register XML Factory implementation to handle .ecore files /*metaResourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( "ecore", new XMLResourceFactoryImpl()) */; // Create empty resource with the given URI org.eclipse.emf.ecore.resource.Resource metaResource = metaResourceSet.createResource(URI.createURI(result.getFullPath().toString())); metaResource.getContents().add(schema); ByteArrayOutputStream cache = new ByteArrayOutputStream(); try { metaResource.save(cache, Collections.EMPTY_MAP); } catch (IOException ex) { throw new CoreException(new Status(IStatus.ERROR, CimphonyCIMToolPlugin.PLUGIN_ID, "Error writing Cimphony Profile XML file", ex)); } if (!result.exists()) result.create(new ByteArrayInputStream(cache.toByteArray()), false, monitor); else result.setContents(new ByteArrayInputStream(cache.toByteArray()), false,true, monitor); } public static EcoreGenerator getGenerator(OntModel profileModel, OntModel backgroundModel, String namespace, String profileNamespace, boolean preserveNS, IProject project) throws CoreException { return new EcoreGenerator(profileModel, backgroundModel, namespace, profileNamespace, preserveNS, true, true, project); } }