/**
* Copyright (c) 2014-2017 by the respective copyright holders.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.smarthome.model.lazygen;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.LogFactory;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EPackage.Registry;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.mwe.core.ConfigurationException;
import org.eclipse.emf.mwe.core.WorkflowContext;
import org.eclipse.emf.mwe.core.issues.Issues;
import org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent2;
import org.eclipse.emf.mwe.core.monitor.ProgressMonitor;
import org.eclipse.emf.mwe.core.resources.ResourceLoaderFactory;
import org.eclipse.emf.mwe.utils.GenModelHelper;
import com.google.common.collect.Sets;
/**
*
* @author Holger Schill, Simon Kaufmann - Initial contribution and API
*
*/
public class LazyStandaloneSetup extends AbstractWorkflowComponent2 {
private static ResourceSet resourceSet = GlobalResourceSet.getINSTANCE();
private Registry registry = EPackage.Registry.INSTANCE;
Set<String> allgeneratedEPackages = Sets.newHashSet();
Set<String> allGenModelFiles = Sets.newHashSet();
Set<String> allEcoreFiles = Sets.newHashSet();
public void addGeneratedPackage(String packageName) {
allgeneratedEPackages.add(packageName);
}
public void addGenModelFile(String modelFile) {
allGenModelFiles.add(modelFile);
}
public void addEcoreModelFile(String modelFile) {
allEcoreFiles.add(modelFile);
}
@Override
protected void invokeInternal(WorkflowContext ctx, ProgressMonitor monitor, Issues issues) {
for (String generatedEPackage : allgeneratedEPackages) {
addRegisterGeneratedEPackage(generatedEPackage);
}
for (String genModelFile : allGenModelFiles) {
addRegisterGenModelFile(genModelFile);
}
for (String ecoreFile : allEcoreFiles) {
addRegisterEcoreFile(ecoreFile);
}
}
private org.apache.commons.logging.Log log = LogFactory.getLog(getClass());
private void addRegisterGeneratedEPackage(String interfacename) {
Class<?> clazz = ResourceLoaderFactory.createResourceLoader().loadClass(interfacename);
if (clazz == null)
throw new ConfigurationException("Couldn't find an interface " + interfacename);
try {
EPackage pack = (EPackage) clazz.getDeclaredField("eINSTANCE").get(null);
if (registry.get(pack.getNsURI()) == null) {
registry.put(pack.getNsURI(), pack);
log.info("Adding generated EPackage '" + interfacename + "'");
}
} catch (Exception e) {
throw new ConfigurationException("Couldn't register " + interfacename
+ ". Is it the generated EPackage interface? : " + e.getMessage());
}
}
private void addRegisterEcoreFile(String fileName) throws IllegalArgumentException, SecurityException {
Resource res = resourceSet.getResource(createURI(fileName), true);
if (res == null)
throw new ConfigurationException("Couldn't find resource under " + fileName);
if (!res.isLoaded()) {
try {
res.load(null);
} catch (IOException e) {
throw new ConfigurationException("Couldn't load resource under " + fileName + " : " + e.getMessage());
}
}
List<EObject> result = res.getContents();
for (EObject object : result) {
if (object instanceof EPackage) {
registerPackage(fileName, object);
}
for (final TreeIterator<EObject> it = object.eAllContents(); it.hasNext();) {
EObject child = it.next();
if (child instanceof EPackage) {
registerPackage(fileName, child);
}
}
}
}
private GenModelHelper createGenModelHelper() {
return new GenModelHelper();
}
private void addRegisterGenModelFile(String fileName) {
createGenModelHelper().registerGenModel(resourceSet, createURI(fileName));
}
private void registerPackage(String fileName, EObject object) {
String nsUri = ((EPackage) object).getNsURI();
if (registry.get(nsUri) == null) {
registry.put(nsUri, object);
log.info("Adding dynamic EPackage '" + nsUri + "' from '" + fileName + "'");
} else if (log.isDebugEnabled()) {
log.debug("Dynamic EPackage '" + nsUri + "' from '" + fileName + "' already in the registry!");
}
}
private URI createURI(String path) {
if (path == null)
throw new IllegalArgumentException();
URI uri = URI.createURI(path);
if (uri.isRelative()) {
URI resolvedURI = URI.createFileURI(new File(path).getAbsolutePath());
return resolvedURI;
}
return uri;
}
}