package org.reuseware.air.algebra;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.reuseware.air.algebra.fragment.FragmentSystem;
import org.reuseware.air.core.cm.IFragment;
public class GenericFragment extends CompositionAlgebra {
// context
public enum CONTEXT { ROOT, CONTAINER }
private List<EObject> fragments = null;
public GenericFragment() {
}
public boolean isLoaded() {
return (fragments != null);
}
/**
* Implementing IFragment interface
*
*/
public void setFragments(List<EObject> fragments) {
this.fragments = fragments;
}
/**
* Implementing IFragment interface
*
*/
public List<EObject> getFragments() {
return fragments;
}
/**
* Implementing IFragment interface
*
*/
public EObject getFragment() {
return fragments.get(0);
}
/**
* Load a fragment
*
*/
protected static void load(IFragment construct, String file) {
FragmentSystem fr = FragmentSystem.getInstance();
if (construct instanceof GenericFragment) {
GenericFragment gf = (GenericFragment)construct;
List<EObject> result = fr.load(gf.getType(), file);
gf.setFragments(result);
}
return;
}
/**
* Retrieves the content of the fragment
*
* @return
*/
public String toString() {
//TODO
if (isLoaded()) {
FragmentSystem fr = FragmentSystem.getInstance();
//return fr.printToString(getFragments()).trim();
}
return null;
}
/**
* Print fragment
*
* @param file
*/
public void print(String file) {
if (this instanceof GenericFragment) {
GenericFragment gf = (GenericFragment)this;
FragmentSystem fs = FragmentSystem.getInstance();
fs.print(gf.getFragments(), file);
}
}
/**
* Implementing IFragment interface
*
*/
public String getType() {
if (this instanceof IFragment) {
String type = this.getClass().getName();
// For example:
// "de.tudresden.reuseware.language.xcerpt.IVariableImpl"
// ->
// "Variable"
return type.substring(type.lastIndexOf('.') + 2, type.indexOf("Impl"));
}
// default
return null;
}
/**
*
*
* @return
*/
// public GenericFragment getRoot2() {
// if (this instanceof GenericFragment) {
// GenericFragment fragment = (GenericFragment)this;
// if (fragment.getFragment() != null) {
// // only get the first fragment
// EObject eFrgmt = fragment.getFragment();
// // get the root object
// EObject contextRoot = EcoreUtil.getRootContainer(eFrgmt);
// // repackage the root object in a fragment
// GenericFragment genRoot = new GenericFragment();
// LinkedList<EObject> list = new LinkedList<EObject>();
// list.add(contextRoot);
// genRoot.setFragments(list);
// return genRoot;
// }
// }
// // default
// return null;
// }
/**
*
*
* @return
*/
@SuppressWarnings("unchecked")
public EObject getContextObject(Enum<CONTEXT> context) {
if (this instanceof GenericFragment) {
GenericFragment fragment = (GenericFragment)this;
if (fragment.getFragment() != null) {
// only get the first fragment
EObject eFrgmt = fragment.getFragment();
// check context
EObject contextObj = null;
if (((Enum<CONTEXT>) context).compareTo(CONTEXT.ROOT) == 0) {
// get the root object
contextObj = EcoreUtil.getRootContainer(eFrgmt);
} else if (((Enum<CONTEXT>) context).compareTo(CONTEXT.CONTAINER) == 0) {
contextObj = eFrgmt.eContainer();
if (contextObj == null) {
contextObj = eFrgmt;
}
}
return contextObj;
}
}
// default
return null;
}
public static void getContextInstance(EObject contextObj, Object objOfRootCls) {
try {
List<EObject> list = new LinkedList<EObject>();
list.add(contextObj);
// get class with method
Class genClass = Class.forName("org.reuseware.air.algebra.GenericFragment");
Class[] types = new Class[] {java.util.List.class};
Method method = genClass.getDeclaredMethod("setFragments", types);
method.invoke(objOfRootCls, list);
// return objOfRootCls;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// default
return;
// return null;
}
/**
* Needs to be here due to inheritance, but is not used.
*
* @return
*/
public IFragment copy() {
// TODO Auto-generated method stub
return null;
}
}