[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)