Bug 512411: Content assist is not working for custom classes

  added usage of a global classloader for resolving user classes.

Change-Id: Ia40c60f1fa2d514ee1f7d5fd3ca2722131bdff74
diff --git a/plugins/org.eclipse.ease.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.ease.ui/META-INF/MANIFEST.MF
index b36850b..2fcae7b 100644
--- a/plugins/org.eclipse.ease.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.ease.ui/META-INF/MANIFEST.MF
@@ -26,7 +26,8 @@
  org.objectweb.asm;bundle-version="[3.3.1,6.0.0)",
  org.eclipse.ui;bundle-version="[3.105.0,4.0.0)",
  org.eclipse.equinox.security;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.ease
+ org.eclipse.ease,
+ org.eclipse.ease.classloader
 Bundle-ActivationPolicy: lazy
 Bundle-Activator: org.eclipse.ease.ui.Activator
 Export-Package: org.eclipse.ease.ui,
diff --git a/plugins/org.eclipse.ease.ui/src/org/eclipse/ease/ui/completion/CompletionContext.java b/plugins/org.eclipse.ease.ui/src/org/eclipse/ease/ui/completion/CompletionContext.java
index 3182bb8..dceb40f 100644
--- a/plugins/org.eclipse.ease.ui/src/org/eclipse/ease/ui/completion/CompletionContext.java
+++ b/plugins/org.eclipse.ease.ui/src/org/eclipse/ease/ui/completion/CompletionContext.java
@@ -25,6 +25,7 @@
 
 import org.eclipse.ease.ICompletionContext;
 import org.eclipse.ease.IScriptEngine;
+import org.eclipse.ease.classloader.EaseClassLoader;
 import org.eclipse.ease.modules.EnvironmentModule;
 import org.eclipse.ease.modules.ModuleDefinition;
 import org.eclipse.ease.modules.ModuleHelper;
@@ -69,6 +70,9 @@
 	private int fOffset;
 	private int fSelectionRange;
 
+	/** Global classloader to resolve unknown java classes (lazily loaded). */
+	private EaseClassLoader fGlobalClassLoader = null;
+
 	/**
 	 * Context constructor. A context is bound to a given script engine or script type.
 	 *
@@ -370,13 +374,13 @@
 		sources.add(getOriginalCode());
 		sources.addAll(getIncludedResources().values());
 
-		final Pattern pattern = Pattern.compile("@type\\s([a-zA-Z\\.]+)\\s*$\\s*.*?" + Pattern.quote(name) + "\\s*=", Pattern.MULTILINE);
+		final Pattern pattern = Pattern.compile("@type\\s([a-zA-Z0-9_\\.]+)\\s*$\\s*.*?" + Pattern.quote(name) + "\\s*=", Pattern.MULTILINE);
 
 		for (final String source : sources) {
 			final Matcher matcher = pattern.matcher(source);
 			if (matcher.find()) {
 				try {
-					return CompletionContext.class.getClassLoader().loadClass(matcher.group(1));
+					return getGlobalClassLoader().loadClass(matcher.group(1));
 				} catch (final ClassNotFoundException e) {
 					// did not work, invalid definition, giving up
 					return null;
@@ -388,6 +392,18 @@
 	}
 
 	/**
+	 * Return a classloader that can access all files avaliable in the RCP application.
+	 *
+	 * @return global classloader
+	 */
+	private EaseClassLoader getGlobalClassLoader() {
+		if (fGlobalClassLoader == null)
+			fGlobalClassLoader = new EaseClassLoader();
+
+		return fGlobalClassLoader;
+	}
+
+	/**
 	 * Retrieve a method definition from loaded modules.
 	 *
 	 * @param code