[205841] Innerclasses not resolving properly
diff --git a/plugins/org.eclipse.jst.j2ee.core/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.j2ee.core/META-INF/MANIFEST.MF
index ac4420e..6dc914b 100644
--- a/plugins/org.eclipse.jst.j2ee.core/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.jst.j2ee.core/META-INF/MANIFEST.MF
@@ -107,6 +107,8 @@
  com.ibm.icu;bundle-version="[3.4.4,4.0.0)",
  org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.modulecore
+ org.eclipse.wst.common.modulecore,
+ org.eclipse.jdt.core,
+ org.eclipse.wst.common.emfworkbench.integration
 Eclipse-LazyStart: true
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.jst.j2ee.core/mofj2ee/org/eclipse/jst/j2ee/ejb/internal/impl/EnterpriseBeanImpl.java b/plugins/org.eclipse.jst.j2ee.core/mofj2ee/org/eclipse/jst/j2ee/ejb/internal/impl/EnterpriseBeanImpl.java
index d875425..0f5c914 100644
--- a/plugins/org.eclipse.jst.j2ee.core/mofj2ee/org/eclipse/jst/j2ee/ejb/internal/impl/EnterpriseBeanImpl.java
+++ b/plugins/org.eclipse.jst.j2ee.core/mofj2ee/org/eclipse/jst/j2ee/ejb/internal/impl/EnterpriseBeanImpl.java
@@ -146,9 +146,9 @@
 		for (int i = 0; i < size; i++) {
 			signature = (String) signatures.get(i);
 			me = (MethodElement) getEjbFactory().create((EClass)getEjbPackage().getEClassifier(meTypeName));
-			me.initializeFromSignature(signature);
 			me.setEnterpriseBean(this);
 			me.setType((MethodElementKind)aType);
+			me.initializeFromSignature(signature);
 			methodElements.add(me);
 		}
 		return methodElements;
diff --git a/plugins/org.eclipse.jst.j2ee.core/mofj2ee/org/eclipse/jst/j2ee/ejb/internal/impl/MethodElementImpl.java b/plugins/org.eclipse.jst.j2ee.core/mofj2ee/org/eclipse/jst/j2ee/ejb/internal/impl/MethodElementImpl.java
index e85627d..5618a9a 100644
--- a/plugins/org.eclipse.jst.j2ee.core/mofj2ee/org/eclipse/jst/j2ee/ejb/internal/impl/MethodElementImpl.java
+++ b/plugins/org.eclipse.jst.j2ee.core/mofj2ee/org/eclipse/jst/j2ee/ejb/internal/impl/MethodElementImpl.java
@@ -16,6 +16,7 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 import org.eclipse.emf.common.util.EList;
@@ -25,10 +26,20 @@
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.emf.ecore.xmi.XMIResource;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.search.IJavaSearchConstants;
+import org.eclipse.jdt.core.search.IJavaSearchScope;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.core.search.SearchPattern;
+import org.eclipse.jdt.core.search.TypeNameRequestor;
 import org.eclipse.jem.java.JavaClass;
 import org.eclipse.jem.java.JavaHelpers;
 import org.eclipse.jem.java.JavaParameter;
 import org.eclipse.jem.java.Method;
+import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.jst.j2ee.common.Description;
 import org.eclipse.jst.j2ee.common.internal.impl.J2EEEObjectImpl;
 import org.eclipse.jst.j2ee.ejb.EjbPackage;
@@ -37,6 +48,7 @@
 import org.eclipse.jst.j2ee.ejb.MethodElementKind;
 import org.eclipse.jst.j2ee.ejb.Session;
 import org.eclipse.jst.j2ee.ejb.internal.util.MethodElementHelper;
+import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
 
 import com.ibm.icu.util.StringTokenizer;
 
@@ -635,46 +647,92 @@
 	}
 	return true;
 }
-/**
- * Parse @aSignature setting the name and the params.
- * A signature example:  setTwoParamMethod(java.lang.String, java.lang.String)
- */
-protected void parseSignature(String aSignature) {
-	int index = aSignature.indexOf(RIGHT_PAREN);
+	/**
+	 * Parse @aSignature setting the name and the params.
+	 * A signature example:  setTwoParamMethod(java.lang.String, java.lang.String)
+	 */
+	protected void parseSignature(String aSignature) {
+		int index = aSignature.indexOf(RIGHT_PAREN);
 
-	int endIndex = aSignature.indexOf(LEFT_PAREN);
-	if (endIndex < 0)
-	{
-		endIndex = aSignature.length() - 1;	
-	}	
+		int endIndex = aSignature.indexOf(LEFT_PAREN);
+		if (endIndex < 0) {
+			endIndex = aSignature.length() - 1;
+		}
 
-	if (index < 0){
-		setName(aSignature);
-		setParms(null); //There are no parameters in the sig so set to null
-	}
-	else {
-		String sigName = aSignature.substring(0, index);
+		if (index < 0) {
+			setName(aSignature);
+			setParms(null); // There are no parameters in the sig so set to null
+		} else {
+			String sigName = aSignature.substring(0, index);
 
-		setName(sigName);
-		String sigParms = aSignature.substring(index + 1, endIndex);
+			setName(sigName);
+			String sigParms = aSignature.substring(index + 1, endIndex);
 
-		if (sigParms.length() > 0) {
-			char commaChar = COMMA.charAt(0);
-			char[] sigParmsChars = sigParms.toCharArray();
-			StringBuffer buf = new StringBuffer();
-			for (int i = 0; i < sigParmsChars.length; i++) {
-				if (sigParmsChars[i] != commaChar) {
-					buf.append(sigParmsChars[i]);
-				} else {
-					addMethodParams(buf.toString());
-					buf = new StringBuffer();
+			if (sigParms.lastIndexOf(".") != -1) { //$NON-NLS-1$
+				String testParent = sigParms.substring(0, sigParms.lastIndexOf(".")); //$NON-NLS-1$
+				if (!Character.isLowerCase(testParent.substring(testParent.lastIndexOf(".") + 1, testParent.length()).charAt(0))) { //$NON-NLS-1$
+					class MyTypeNameRequestor extends TypeNameRequestor {
+						boolean isNested = false;
+
+						public void acceptType(int modifiers, char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path) {
+							isNested = true;
+						}
+
+						public boolean isNested() {
+							return isNested;
+						}
+					}
+					IJavaProject javaProject = JavaCore.create(WorkbenchResourceHelper.getProject(getEnterpriseBean().eResource()));
+					IJavaElement javaElements[] = new IJavaElement[] { javaProject };
+					final IJavaSearchScope scope = SearchEngine.createJavaSearchScope(javaElements, true);
+		
+					String newString = sigParms.substring(sigParms.lastIndexOf(".") + 1, sigParms.length()); //$NON-NLS-1$
+
+					while (testParent.length() > 0) {
+						String temp = null;
+						temp = testParent.substring(testParent.lastIndexOf(".") + 1, testParent.length()); //$NON-NLS-1$
+								
+						MyTypeNameRequestor requestor = new MyTypeNameRequestor();
+						int matchMode = SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE;
+						try {
+							new SearchEngine().searchAllTypeNames(null, matchMode, temp.toCharArray(), matchMode, IJavaSearchConstants.TYPE, scope, requestor,
+									IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, new NullProgressMonitor());
+							if (requestor.isNested()) {
+								newString = temp + "$" + newString; //$NON-NLS-1$
+							} else {
+								newString = temp + "." + newString; //$NON-NLS-1$
+							}
+							if (testParent.lastIndexOf(".") != -1) //$NON-NLS-1$
+								testParent = testParent.substring(0, testParent.lastIndexOf(".")); //$NON-NLS-1$
+							else
+								testParent = ""; //$NON-NLS-1$
+
+						} catch (JavaModelException e) {
+							Logger.getLogger().logError(e);
+						}
+					}
+					sigParms = newString;
 				}
+
 			}
-			addMethodParams(buf.toString());
-		} else
-			applyZeroParams();
+
+			if (sigParms.length() > 0) {
+				char commaChar = COMMA.charAt(0);
+				char[] sigParmsChars = sigParms.toCharArray();
+				StringBuffer buf = new StringBuffer();
+				for (int i = 0; i < sigParmsChars.length; i++) {
+					if (sigParmsChars[i] != commaChar) {
+						buf.append(sigParmsChars[i]);
+					} else {
+						addMethodParams(buf.toString());
+						buf = new StringBuffer();
+					}
+				}
+				addMethodParams(buf.toString());
+			} else
+				applyZeroParams();
+		}
 	}
-}
 public void removeMethodParams(String param) { 
 	String myParams = getParms();
 	if (myParams == null || myParams.length() == 0) {