Bug 201743 - [Contributions] Core Expressions: adapt element should
optionally use .getAdapter

If the adaptable class can see the requested class.
diff --git a/bundles/org.eclipse.core.expressions/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.expressions/META-INF/MANIFEST.MF
index 334fcae..6d10047 100644
--- a/bundles/org.eclipse.core.expressions/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.core.expressions/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.core.expressions; singleton:=true
-Bundle-Version: 3.4.401.qualifier
+Bundle-Version: 3.4.500.qualifier
 Bundle-ClassPath: .
 Bundle-Activator: org.eclipse.core.internal.expressions.ExpressionPlugin
 Bundle-Vendor: %providerName
diff --git a/bundles/org.eclipse.core.expressions/pom.xml b/bundles/org.eclipse.core.expressions/pom.xml
index 3a152a0..985db45 100644
--- a/bundles/org.eclipse.core.expressions/pom.xml
+++ b/bundles/org.eclipse.core.expressions/pom.xml
@@ -22,7 +22,7 @@
   </parent>
   <groupId>org.eclipse.platform.runtime</groupId>
   <artifactId>org.eclipse.core.expressions</artifactId>
-  <version>3.4.401-SNAPSHOT</version>
+  <version>3.4.500-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   <build>
     <plugins>
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/AdaptExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/AdaptExpression.java
index 5302ab9..95b45b1 100644
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/AdaptExpression.java
+++ b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/AdaptExpression.java
@@ -18,6 +18,7 @@
 
 import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IAdapterManager;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.Platform;
@@ -74,10 +75,23 @@
 		if (Expressions.isInstanceOf(var, fTypeName)) {
 			adapted= var;
 		} else {
-			if (!manager.hasAdapter(var, fTypeName))
-				return EvaluationResult.FALSE;
-
-			adapted= manager.getAdapter(var, fTypeName);
+			if (manager.hasAdapter(var, fTypeName)) {
+				adapted= manager.getAdapter(var, fTypeName);
+			} else {
+				// if the adapter manager doesn't have an adapter contributed, 
+				// try to see if the variable itself implements IAdaptable
+				if (var instanceof IAdaptable) {
+					try {
+						Class typeClazz= Class.forName(fTypeName, false, var.getClass().getClassLoader());
+						adapted= ((IAdaptable)var).getAdapter(typeClazz);
+					} catch (ClassNotFoundException e) {
+					}
+				}
+				if (adapted == null) {
+					// all attempts failed, return false
+					return EvaluationResult.FALSE;
+				}
+			}
 		}
 		// the adapted result is null but hasAdapter returned true check
 		// if the adapter is loaded.
diff --git a/tests/org.eclipse.core.expressions.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.core.expressions.tests/META-INF/MANIFEST.MF
index e53c828..849f208 100644
--- a/tests/org.eclipse.core.expressions.tests/META-INF/MANIFEST.MF
+++ b/tests/org.eclipse.core.expressions.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.core.expressions.tests; singleton:=true
-Bundle-Version: 3.4.100.qualifier
+Bundle-Version: 3.4.200.qualifier
 Bundle-ClassPath: expressionstests.jar
 Bundle-Activator: org.eclipse.core.internal.expressions.tests.ExpressionTestPlugin
 Bundle-ActivationPolicy: lazy
diff --git a/tests/org.eclipse.core.expressions.tests/pom.xml b/tests/org.eclipse.core.expressions.tests/pom.xml
index 1c772f3..ef2d913 100644
--- a/tests/org.eclipse.core.expressions.tests/pom.xml
+++ b/tests/org.eclipse.core.expressions.tests/pom.xml
@@ -21,6 +21,6 @@
   </parent>
   <groupId>org.eclipse.platform.runtime</groupId>
   <artifactId>org.eclipse.core.expressions.tests</artifactId>
-  <version>3.4.100-SNAPSHOT</version>
+  <version>3.4.200-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
 </project>
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/AdaptableAdaptee.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/AdaptableAdaptee.java
new file mode 100644
index 0000000..f95723f
--- /dev/null
+++ b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/AdaptableAdaptee.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Wind River Systems 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:
+ *     Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.core.internal.expressions.tests;
+
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * 
+ */
+public class AdaptableAdaptee implements IAdaptable {
+
+    private Adapter fAdapter = new Adapter();
+    
+    public Object getAdapter(Class adapter) {
+        if (adapter.isInstance(fAdapter)) {
+            return fAdapter;
+        }
+        return null;
+    }
+
+}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/Adapter.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/Adapter.java
index a738566..6e44153 100644
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/Adapter.java
+++ b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/Adapter.java
@@ -10,7 +10,6 @@
  *******************************************************************************/
 package org.eclipse.core.internal.expressions.tests;
 
-
 public class Adapter {
 
 }
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTests.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTests.java
index ad7c3d4..460c504 100644
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTests.java
+++ b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTests.java
@@ -170,6 +170,14 @@
 		assertTrue(result == EvaluationResult.TRUE);
 	}
 
+    public void testAdaptExpressionAdaptable() throws Exception {
+        AdaptExpression expression= new AdaptExpression("org.eclipse.core.internal.expressions.tests.Adapter"); //$NON-NLS-1$
+        expression.add(new InstanceofExpression("org.eclipse.core.internal.expressions.tests.Adapter")); //$NON-NLS-1$
+        EvaluationResult result= expression.evaluate(new EvaluationContext(null, new AdaptableAdaptee()));
+        assertTrue(result == EvaluationResult.TRUE);
+    }
+
+	
 	public void testAdaptExpressionNotEqual() throws Exception {
 		AdaptExpression expression1 = new AdaptExpression(
 				"org.eclipse.core.internal.expressions.tests.Adapter"); //$NON-NLS-1$