blob: 604306bf10ca3247bdad80051953eb8499ae5e11 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2005 IBM Corporation and others.
* 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
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jem.internal.beaninfo.adapters;
/*
*/
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.xmi.XMIResource;
import org.eclipse.jem.java.JavaClass;
import org.eclipse.jem.java.adapters.IJavaReflectionKey;
import org.eclipse.jem.java.adapters.IJavaReflectionKeyExtension;
/**
* Java Reflection Key extension to retrieve keys for beaninfo creations.
*
* Handles attributes and behaviors.
*
* @version 1.0
* @author R. L. Kulp
*/
public class BeaninfoJavaReflectionKeyExtension implements IJavaReflectionKeyExtension {
// The format of the keys are:
// behaviors: "classname/behavior/behaviorname"
// structural features: "classname/featurename"
public static final String
BEHAVIOR = "/operation/", // Piece in key that indicates this is a behavior. //$NON-NLS-1$
EVENT = "/event/", // Piece in key that indicates this is an event. //$NON-NLS-1$
FEATURE = "/"; // Piece in key that indicates this is an attribute. //$NON-NLS-1$
/**
* Get the object for this key.
*/
public Object getObject(String key, IJavaReflectionKey reflectionKey) {
if (key != null) {
int ibehave = key.indexOf(BEHAVIOR);
if (ibehave > -1) {
// We have a possible behavior.
String classname = key.substring(0, ibehave);
int ibehaveName = ibehave+BEHAVIOR.length();
if (ibehaveName < key.length()) {
JavaClass javaclass = getJavaClass(reflectionKey, classname);
if (javaclass != null) {
javaclass.getEOperations(); // Get the list introspected and populated if not already.
return reflectionKey.primGet(key); // It should now be there,
}
}
} else {
int ievent = key.indexOf(EVENT);
if (ievent > -1) {
// We have a possible event.
String classname = key.substring(0, ievent);
int ieventName = ievent+EVENT.length();
if (ieventName < key.length()) {
JavaClass javaclass = getJavaClass(reflectionKey, classname);
if (javaclass != null) {
javaclass.getEvents(); // Get the list introspected and populated if not already.
return reflectionKey.primGet(key); // It should now be there,
}
}
} else {
int ifeature = key.indexOf(FEATURE);
if (ifeature > -1) {
// We have a possible feature.
String classname = key.substring(0, ifeature);
int ifeatureName = ifeature+FEATURE.length();
if (ifeatureName < key.length()) {
String feature = key.substring(ifeatureName);
JavaClass javaclass = getJavaClass(reflectionKey, classname);
if (javaclass != null) {
// This is just a hack until we can get ID situation straightened out.
// Need to cause introspection of the attributes and references.
javaclass.getEStructuralFeatures();
Object result = reflectionKey.primGet(key); // See if it now got added as an id.
if (result == null) {
// Well, it could of been added by the diff merge, which as of now can't handle ids.
// So we will find it within the attributes/references.
result = findFeature(feature, javaclass.getEReferences());
if (result == null)
result = findFeature(feature, javaclass.getEAttributes());
if (result instanceof EStructuralFeature) {
// Need to add it as an id so next time won't come through here.
((XMIResource) javaclass.eResource()).setID((EObject) result, key); // So next time it will find it directly.
}
}
return result;
}
}
}
}
}
}
return null;
}
private EStructuralFeature findFeature(String featureName, List featureList) {
Iterator itr = featureList.iterator();
while (itr.hasNext()) {
EStructuralFeature feature = (EStructuralFeature) itr.next();
if (featureName.equals(feature.getName())) {
return feature;
}
}
return null;
}
protected JavaClass getJavaClass(IJavaReflectionKey reflectionKey, String classname) {
Object eclass = reflectionKey.primGet(classname);
if (eclass == null)
eclass = reflectionKey.getJavaType(classname); // Let it create it.
if (eclass instanceof JavaClass)
return (JavaClass) eclass;
else
return null;
}
}