[421998] FeatureProvider does not work with upper case model fields

Change-Id: If41f906e6872398ea52e1e5c36165416da4dba9d
diff --git a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/EmfParsleyActivator.java b/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/EmfParsleyActivator.java
index 8b41a63..d315d79 100644
--- a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/EmfParsleyActivator.java
+++ b/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/EmfParsleyActivator.java
@@ -56,7 +56,11 @@
 	}
 
 	public static void log(Status status) {
-		getDefault().getLog().log(status);
+		EmfParsleyActivator p = getDefault();
+		if (p != null)
+			p.getLog().log(status);
+		else
+			System.err.println(status.toString());
 	}
 
 	public static void logError(String errorMessage) {
diff --git a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/EmfParsleyGuiceModule.java b/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/EmfParsleyGuiceModule.java
index 3ee49b9..440f04e 100644
--- a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/EmfParsleyGuiceModule.java
+++ b/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/EmfParsleyGuiceModule.java
@@ -13,6 +13,7 @@
 import org.eclipse.emf.parsley.binding.ProposalCreator;
 import org.eclipse.emf.parsley.builders.TableViewerBuilder;
 import org.eclipse.emf.parsley.builders.TableViewerColumnBuilder;
+import org.eclipse.emf.parsley.ecore.FeatureResolver;
 import org.eclipse.emf.parsley.edit.EditingDomainFinder;
 import org.eclipse.emf.parsley.edit.IEditingStrategy;
 import org.eclipse.emf.parsley.edit.OnTheFlyEditingStrategy;
@@ -183,6 +184,10 @@
 		return FeaturesProvider.class;
 	}
 
+	public Class<? extends FeatureResolver> bindFeatureResolver() {
+		return FeatureResolver.class;
+	}
+
 	public Class<? extends FeaturesColumnProvider> bindFeaturesColumnProvider() {
 		return FeaturesColumnProvider.class;
 	}
diff --git a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/ecore/FeatureResolver.java b/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/ecore/FeatureResolver.java
index 0febc70..128cee9 100644
--- a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/ecore/FeatureResolver.java
+++ b/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/ecore/FeatureResolver.java
@@ -53,8 +53,15 @@
 		EStructuralFeature feature = eClass.getEStructuralFeature(featureName);
 		if (feature != null)
 			return feature;
-		else
-			EmfParsleyActivator.logError("cannot find feature '"
+		
+		// try to search for the feature ignoring the case
+		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=421998
+		for (EStructuralFeature f : eClass.getEAllStructuralFeatures()) {
+			if (f.getName().equalsIgnoreCase(featureName))
+				return f;
+		}
+		
+		EmfParsleyActivator.logError("cannot find feature '"
 					+ featureName + "' in EClass '" + eClass.getName() + "'");
 		return null;
 	}
diff --git a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/ui/provider/FeaturesProvider.java b/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/ui/provider/FeaturesProvider.java
index 2fd1180..0936b53 100644
--- a/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/ui/provider/FeaturesProvider.java
+++ b/plugins/org.eclipse.emf.parsley.common/src/org/eclipse/emf/parsley/ui/provider/FeaturesProvider.java
@@ -14,8 +14,10 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.parsley.EmfParsleyActivator;
+import org.eclipse.emf.parsley.ecore.FeatureResolver;
 
 import com.google.common.collect.Lists;
+import com.google.inject.Inject;
 
 /**
  * Provides the list of {@link EStructuralFeature} of an {@link EClass}. The
@@ -28,6 +30,17 @@
  * 
  */
 public class FeaturesProvider {
+	
+	@Inject
+	private FeatureResolver featureResolver;
+
+	public FeatureResolver getFeatureResolver() {
+		return featureResolver;
+	}
+
+	public void setFeatureResolver(FeatureResolver featureResolver) {
+		this.featureResolver = featureResolver;
+	}
 
 	public static class EClassToEStructuralFeatureMap extends
 			HashMap<EClass, List<EStructuralFeature>> {
@@ -86,8 +99,7 @@
 		LinkedList<EStructuralFeature> result = new LinkedList<EStructuralFeature>();
 
 		for (String featureName : list) {
-			EStructuralFeature feature = eClass
-					.getEStructuralFeature(featureName);
+			EStructuralFeature feature = featureResolver.getFeature(eClass, featureName);
 			if (feature != null)
 				result.add(feature);
 			else
diff --git a/tests/org.eclipse.emf.parsley.tests.swtbot/META-INF/MANIFEST.MF b/tests/org.eclipse.emf.parsley.tests.swtbot/META-INF/MANIFEST.MF
index 163edb4..505c230 100644
--- a/tests/org.eclipse.emf.parsley.tests.swtbot/META-INF/MANIFEST.MF
+++ b/tests/org.eclipse.emf.parsley.tests.swtbot/META-INF/MANIFEST.MF
@@ -20,7 +20,8 @@
  org.eclipse.emf.parsley.examples.fowlerdsl.ui,
  org.eclipse.emf.parsley.dsl.ui,
  org.eclipse.emf.parsley.views,
- org.eclipse.emf.parsley.editors
+ org.eclipse.emf.parsley.editors,
+ org.eclipse.emf.parsley.tests.models
 Bundle-Activator: org.eclipse.emf.parsley.tests.EmfParsleyTestsActivator
 Export-Package: org.eclipse.emf.parsley.tests,
  org.eclipse.emf.parsley.tests.editors,
diff --git a/tests/org.eclipse.emf.parsley.tests.swtbot/src/org/eclipse/emf/parsley/tests/EmfParsleyProvidersTests.java b/tests/org.eclipse.emf.parsley.tests.swtbot/src/org/eclipse/emf/parsley/tests/EmfParsleyProvidersTests.java
index c0fbab9..7311957 100644
--- a/tests/org.eclipse.emf.parsley.tests.swtbot/src/org/eclipse/emf/parsley/tests/EmfParsleyProvidersTests.java
+++ b/tests/org.eclipse.emf.parsley.tests.swtbot/src/org/eclipse/emf/parsley/tests/EmfParsleyProvidersTests.java
@@ -23,6 +23,7 @@
 import org.eclipse.emf.parsley.examples.library.Writer;
 import org.eclipse.emf.parsley.tests.factories.CustomElementsContentProviderLibraryModule;
 import org.eclipse.emf.parsley.tests.labeling.CustomLibraryFormFeatureCaptionProvider;
+import org.eclipse.emf.parsley.tests.models.testmodels.TestmodelsPackage;
 import org.eclipse.emf.parsley.tests.providers.CustomElementsLibraryViewerContentProvider;
 import org.eclipse.emf.parsley.tests.providers.CustomLibraryViewerContentProvider;
 import org.eclipse.emf.parsley.tests.providers.LibraryEStructuralFeaturesAsStringsProvider;
@@ -155,6 +156,14 @@
 	}
 
 	@Test
+	public void testFeaturesWithUppercaseName() {
+		FeaturesProvider provider = getInjector().getInstance(
+				FeaturesProvider.class);
+		assertFeatureNames("UpperCaseNameFeature",
+				provider.getFeatures(TestmodelsPackage.Literals.TEST_ECLASS));
+	}
+
+	@Test
 	public void testCustomViewerContentProvider() throws IOException {
 		Library library = localLibrary("My2.extlibrary");
 		ViewerContentProvider viewerContentProvider = getInjector()
diff --git a/tests/org.eclipse.emf.parsley.tests.swtbot/src/org/eclipse/emf/parsley/tests/providers/TestFeaturesProvider.java b/tests/org.eclipse.emf.parsley.tests.swtbot/src/org/eclipse/emf/parsley/tests/providers/TestFeaturesProvider.java
index 58b9a1d..670a429 100644
--- a/tests/org.eclipse.emf.parsley.tests.swtbot/src/org/eclipse/emf/parsley/tests/providers/TestFeaturesProvider.java
+++ b/tests/org.eclipse.emf.parsley.tests.swtbot/src/org/eclipse/emf/parsley/tests/providers/TestFeaturesProvider.java
@@ -3,15 +3,17 @@
  */
 package org.eclipse.emf.parsley.tests.providers;
 
-import static org.eclipse.emf.parsley.examples.library.EXTLibraryPackage.Literals.*;
+import static org.eclipse.emf.parsley.examples.library.EXTLibraryPackage.Literals.LENDABLE;
+import static org.eclipse.emf.parsley.examples.library.EXTLibraryPackage.Literals.LENDABLE__COPIES;
 
 import org.eclipse.emf.parsley.examples.library.Periodical;
+import org.eclipse.emf.parsley.tests.models.testmodels.TestmodelsPackage;
 import org.eclipse.emf.parsley.ui.provider.EClassToEStructuralFeatureAsStringsMap;
 import org.eclipse.emf.parsley.ui.provider.FeaturesProvider;
 
 
 /**
- * @author bettini
+ * @author Lorenzo Bettini
  * 
  */
 public class TestFeaturesProvider extends FeaturesProvider {
@@ -27,5 +29,9 @@
 			EClassToEStructuralFeatureAsStringsMap stringMap) {
 		super.buildStringMap(stringMap);
 		stringMap.mapTo(Periodical.class.getName(), "title");
+		// the actual feature's name is UpperCaseNameFeature
+		// but we specify it with the initial lowercase
+		addToStringMap(TestmodelsPackage.eINSTANCE.getTestEClass(), 
+				"upperCaseNameFeature");
 	}
 }
diff --git a/tests/org.eclipse.emf.parsley.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.emf.parsley.tests/META-INF/MANIFEST.MF
index aa7cf2b..7624125 100644
--- a/tests/org.eclipse.emf.parsley.tests/META-INF/MANIFEST.MF
+++ b/tests/org.eclipse.emf.parsley.tests/META-INF/MANIFEST.MF
@@ -9,7 +9,8 @@
  org.eclipse.emf.parsley.examples.library,
  org.eclipse.emf.parsley,
  org.eclipse.xtext.xbase.lib,
- org.eclipse.xtend.standalone;resolution:=optional
+ org.eclipse.xtend.standalone;resolution:=optional,
+ org.eclipse.emf.parsley.tests.models
 Import-Package: org.junit;version="4.5.0",
  org.junit.runner;version="4.5.0",
  org.junit.runner.manipulation;version="4.5.0",
diff --git a/tests/org.eclipse.emf.parsley.tests/src/org/eclipse/emf/parsley/tests/FeatureResolverTest.xtend b/tests/org.eclipse.emf.parsley.tests/src/org/eclipse/emf/parsley/tests/FeatureResolverTest.xtend
index 84f7196..7f75b16 100644
--- a/tests/org.eclipse.emf.parsley.tests/src/org/eclipse/emf/parsley/tests/FeatureResolverTest.xtend
+++ b/tests/org.eclipse.emf.parsley.tests/src/org/eclipse/emf/parsley/tests/FeatureResolverTest.xtend
@@ -10,6 +10,7 @@
 import static extension org.junit.Assert.*
 import org.eclipse.emf.ecore.EClass
 import org.eclipse.emf.parsley.examples.library.EXTLibraryPackage
+import org.eclipse.emf.parsley.tests.models.testmodels.TestmodelsPackage
 
 class FeatureResolverTest {
 	
@@ -71,6 +72,16 @@
 		EXTLibraryPackage::eINSTANCE.employee.
 			assertFeatureList(paths, "firstName, lastName, firstName, lastName, firstName, lastName")
 	}
+
+	@Test def void testResolveFeatureWithLowerCaseName() {
+		TestmodelsPackage.eINSTANCE.testEClass.
+			assertFeature("lowercaseNameFeature", "lowercaseNameFeature")
+	}
+
+	@Test def void testResolveFeatureWithUpperCaseName() {
+		TestmodelsPackage.eINSTANCE.testEClass.
+			assertFeature("upperCaseNameFeature", "UpperCaseNameFeature")
+	}
 	
 	def createModel() {
 		eINSTANCE.createLibrary => [
@@ -115,4 +126,11 @@
 	def assertFeatureList(List<EStructuralFeature> features, CharSequence expected) {
 		expected.toString.assertEquals(features.map[name].join(", "))
 	}
+
+	def assertFeature(EClass eClass, String queryName, String realName) {
+		resolver.getFeature(eClass, queryName) => [
+			assertNotNull
+			realName.assertEquals(name)
+		]
+	}
 }
\ No newline at end of file
diff --git a/tests/org.eclipse.emf.parsley.tests/src/org/eclipse/emf/parsley/tests/FeaturesProviderTest.xtend b/tests/org.eclipse.emf.parsley.tests/src/org/eclipse/emf/parsley/tests/FeaturesProviderTest.xtend
index 9d4a2e3..b2615e4 100644
--- a/tests/org.eclipse.emf.parsley.tests/src/org/eclipse/emf/parsley/tests/FeaturesProviderTest.xtend
+++ b/tests/org.eclipse.emf.parsley.tests/src/org/eclipse/emf/parsley/tests/FeaturesProviderTest.xtend
@@ -9,6 +9,8 @@
 import org.junit.Test
 
 import static extension org.junit.Assert.*
+import org.eclipse.emf.parsley.tests.models.testmodels.TestmodelsPackage
+import org.eclipse.emf.parsley.ecore.FeatureResolver
 
 class FeaturesProviderTest {
 	
@@ -17,6 +19,7 @@
 	@Before
 	def void setUp() {
 		featuresProvider = new FeaturesProvider
+		featuresProvider.featureResolver = new FeatureResolver
 	}
 	
 	def private void buildStringMap(EClass eClass, String...featuresNames) {
@@ -36,6 +39,13 @@
 			assertFeatureList("firstName, manager")
 		]
 	}
+
+	@Test def void testUpperCaseFeatureNames() {
+		TestmodelsPackage::eINSTANCE.testEClass => [
+			buildStringMap("lowercaseNameFeature", "upperCaseNameFeature")
+			assertFeatureList("lowercaseNameFeature, UpperCaseNameFeature")
+		]
+	}
 	
 	def assertFeatureList(EClass eClass, CharSequence expected) {
 		featuresProvider.getFeatures(eClass).assertFeatureList(expected)