blob: c4e8940bd71c3ceaba77f8a489219e415331d470 [file] [log] [blame]
/**
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-v2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Thales Corporate Services S.A.S - initial API and implementation
*/
package org.eclipse.egf.core.epackage;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import org.eclipse.egf.common.helper.EMFHelper;
import org.eclipse.egf.common.loader.IClassLoader;
import org.eclipse.egf.core.genmodel.IPlatformGenModel;
import org.eclipse.egf.core.internal.epackage.ProxyEClass;
import org.eclipse.egf.core.internal.epackage.ProxyEClassifier;
import org.eclipse.egf.core.internal.epackage.ProxyEDataType;
import org.eclipse.egf.core.internal.epackage.ProxyEPackage;
import org.eclipse.egf.core.internal.epackage.ProxyERoot;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.util.EcoreUtil;
/**
* @author Xavier Maysonnave
*
*/
public class ProxyFactory {
private ProxyFactory() {
// Prevent Instantiation
}
public static IProxyERoot buildIProxyERoot(IPlatformGenModel genModel) {
if (genModel == null) {
return null;
}
// EPackage
EPackage ePackage = genModel.getEPackage();
if (ePackage == null) {
return null;
}
// ProxyERoot
ProxyERoot root = new ProxyERoot(genModel.getNsURI());
// ProxyEPackage
ProxyEPackage proxy = new ProxyEPackage(root, ePackage.getName(), genModel.getGeneratedPackage(), genModel.getNsURI());
root.addChildren(proxy);
// Process EClassifiers
for (EClassifier eClassifier : ePackage.getEClassifiers()) {
proxy.addChildren(buildProxyEClassifier(proxy, eClassifier));
}
return root;
}
protected static ProxyEClassifier buildProxyEClassifier(IProxyEPackage proxy, EClassifier eClassifier) {
if (eClassifier instanceof EClass) {
return new ProxyEClass(proxy, eClassifier.getName(), eClassifier.getInstanceClassName(), EcoreUtil.getURI(eClassifier));
}
return new ProxyEDataType(proxy, eClassifier.getName(), eClassifier.getInstanceClassName(), EcoreUtil.getURI(eClassifier));
}
@SuppressWarnings("rawtypes")
public static IProxyERoot buildIProxyERoot(IClassLoader loader, IPlatformGenModel genModel) throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException {
// EPackage
Class<?> clazz = loader.loadClass(genModel.getGeneratedPackage());
Field field = clazz.getField("eINSTANCE"); //$NON-NLS-1$
Object object = field.get(null);
Method method = clazz.getMethod("getNsURI", new Class[] {}); //$NON-NLS-1$
String nsURI = (String) method.invoke(object);
method = clazz.getMethod("getName", new Class[] {}); //$NON-NLS-1$
String name = (String) method.invoke(object);
// ProxyERoot
ProxyERoot root = new ProxyERoot(URI.createURI(nsURI));
// ProxyEPackage
URI NsURI = URI.createURI(nsURI);
ProxyEPackage proxy = new ProxyEPackage(root, name, genModel.getGeneratedPackage(), NsURI);
root.addChildren(proxy);
// EClassifiers
method = clazz.getMethod("getEClassifiers", new Class[] {}); //$NON-NLS-1$
for (Object innerObject : (List) method.invoke(object)) {
innerObject = buildProxyEClassifier(loader, proxy, innerObject);
if (innerObject != null) {
proxy.addChildren((ProxyEClassifier) innerObject);
}
}
return root;
}
protected static ProxyEClassifier buildProxyEClassifier(IClassLoader loader, IProxyEPackage proxy, Object object) throws IllegalArgumentException, IllegalAccessException, SecurityException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException {
Method getName = object.getClass().getMethod("getName", new Class[] {}); //$NON-NLS-1$
String name = (String) getName.invoke(object);
// Solve EClassifier URI against EcoreUtil
Class<?> ecoreUtil = loader.loadClass("org.eclipse.emf.ecore.util.EcoreUtil"); //$NON-NLS-1$
Class<?> eObject = loader.loadClass("org.eclipse.emf.ecore.EObject"); //$NON-NLS-1$
Method getUri = ecoreUtil.getMethod("getURI", new Class[] { eObject}); //$NON-NLS-1$
Object innerObject = getUri.invoke(ecoreUtil, eObject.cast(object));
if (innerObject == null) {
return null;
}
// Build proxy
URI uri = URI.createURI(innerObject.toString());
if ("org.eclipse.emf.ecore.impl.EClassImpl".equals(object.getClass().getName())) { //$NON-NLS-1$
return new ProxyEClass(proxy, name, EMFHelper.getInstanceClassName(loader, object, uri), uri);
}
return new ProxyEDataType(proxy, name, EMFHelper.getInstanceClassName(loader, object, uri), uri);
}
}