diff --git a/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/NameReferenceResolver.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/NameReferenceResolver.java index e7d5792fda94f738f23b9026d18b3554db53e95b..2ccf6b7ec6623477f9e9c19cf517bd3581de2fb5 100644 --- a/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/NameReferenceResolver.java +++ b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/NameReferenceResolver.java @@ -1,25 +1,25 @@ package tdt4250.servletsupport.impl; +import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.util.EcoreUtil; import org.osgi.service.component.annotations.Component; import tdt4250.servletsupport.IReferenceResolver; @Component -public class NameReferenceResolver implements IReferenceResolver { +public class NameReferenceResolver extends AbstractReferenceResolver implements IReferenceResolver { @Override - public EObject resolveReference(String reference, EObject context) { - for (EObject contained : context.eContents()) { - EStructuralFeature nameFeature = contained.eClass().getEStructuralFeature("name"); - if (nameFeature != null) { - Object name = contained.eGet(nameFeature); - if (reference.equals(String.valueOf(name))) { - return contained; - } + protected boolean isReferenced(String reference, EObject eObject) { + EStructuralFeature nameFeature = eObject.eClass().getEStructuralFeature("name"); + if (nameFeature instanceof EAttribute) { + Object name = eObject.eGet(nameFeature); + if (reference.equals(EcoreUtil.convertToString(((EAttribute) nameFeature).getEAttributeType(), name))) { + return true; } } - return null; + return false; } } diff --git a/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestSupport.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestSupport.java index e5a3fc10df41e45ad97c9331bcd0a4f8463c6ea1..cedad44bc6210a30fd61006ee66fd99312534ac9 100644 --- a/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestSupport.java +++ b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestSupport.java @@ -119,15 +119,14 @@ public class RequestSupport { } } if (count == 0) { + EList<EObject> selected = null; if (Character.isUpperCase(step.charAt(0))) { - objects = selectEClass(objects, step); - if (objects.isEmpty()) { - objects = selectKey(objects, step.split(",")); - } - } else { - objects = selectKey(objects, step.split(",")); + selected = selectEClass(objects, step); + } + if (selected == null || selected.isEmpty()) { + selected = selectKey(objects, step.split(",")); } - return objects; + return objects = selected; } if (values != null) { return objects = values; @@ -235,55 +234,49 @@ public class RequestSupport { } protected EList<EObject> selectRelation(Collection<?> objects, final String featureName, final String featureValueString, final String rel) { - return selectEObjects(objects, new EObjectFilter() { - @Override - public boolean accept(EObject eObject) { - EAttribute attr = findEStructuralFeature(featureName, eObject.eClass().getEAllAttributes()); - if (attr != null) { - Object featureValue1 = eObject.eGet(attr); - Object featureValue2 = EcoreUtil.createFromString(attr.getEAttributeType(), featureValueString); - if (rel == null || rel.equals("=")) { - if (featureValue1 == featureValue2 || (featureValue1 != null && featureValue1.equals(featureValue2))) { - return true; - } - } else if (featureValue1 instanceof Comparable<?>) { - try { - int comp = ((Comparable) featureValue1).compareTo(featureValue2); - return (rel.equals("==") && comp == 0) - || (rel.equals(">") && comp > 0) - || ((rel.equals(">=") || rel.equals("=>")) && comp >= 0) - || ((rel.equals("<=") || rel.equals("=<")) && comp <= 0) - || (rel.equals("<") && comp < 0) - || ((rel.equals("<>") || rel.equals("><")) && comp != 0); - } catch (RuntimeException e) { - } + return selectEObjects(objects, eObject -> { + EAttribute attr = findEStructuralFeature(featureName, eObject.eClass().getEAllAttributes()); + if (attr != null) { + Object featureValue1 = eObject.eGet(attr); + Object featureValue2 = EcoreUtil.createFromString(attr.getEAttributeType(), featureValueString); + if (rel == null || rel.equals("=")) { + if (featureValue1 == featureValue2 || (featureValue1 != null && featureValue1.equals(featureValue2))) { + return true; + } + } else if (featureValue1 instanceof Comparable<?>) { + try { + int comp = ((Comparable) featureValue1).compareTo(featureValue2); + return (rel.equals("==") && comp == 0) + || (rel.equals(">") && comp > 0) + || ((rel.equals(">=") || rel.equals("=>")) && comp >= 0) + || ((rel.equals("<=") || rel.equals("=<")) && comp <= 0) + || (rel.equals("<") && comp < 0) + || ((rel.equals("<>") || rel.equals("><")) && comp != 0); + } catch (RuntimeException e) { } } - return false; } + return false; }); } protected EList<EObject> selectKey(Collection<?> objects, final String[] keyValueStrings) { - return selectEObjects(objects, new EObjectFilter() { - @Override - public boolean accept(EObject eObject) { - EStructuralFeature containingFeature = eObject.eContainingFeature(); - if (containingFeature instanceof EReference) { - EList<EAttribute> keyAttributes = ((EReference) containingFeature).getEKeys(); - if (keyAttributes.size() == keyValueStrings.length) { - for (int i = 0; i < keyAttributes.size(); i++) { - EAttribute attr = keyAttributes.get(i); - Object value = EcoreUtil.createFromString(attr.getEAttributeType(), keyValueStrings[i]); - if (value == null || (! value.equals(eObject.eGet(attr)))) { - return false; - } + return selectEObjects(objects, eObject -> { + EStructuralFeature containingFeature = eObject.eContainingFeature(); + if (containingFeature instanceof EReference) { + EList<EAttribute> keyAttributes = ((EReference) containingFeature).getEKeys(); + if (keyAttributes.size() == keyValueStrings.length) { + for (int i = 0; i < keyAttributes.size(); i++) { + EAttribute attr = keyAttributes.get(i); + Object value = EcoreUtil.createFromString(attr.getEAttributeType(), keyValueStrings[i]); + if (value == null || (! value.equals(eObject.eGet(attr)))) { + return false; } - return true; } + return true; } - return false; } + return false; }); } diff --git a/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/ResourceProvider.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/ResourceProvider.java index c9da8760cc9cddee58f70817a0c6c69ef2b333c7..f6b3064e236d78840ae493290875908571287add 100644 --- a/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/ResourceProvider.java +++ b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/ResourceProvider.java @@ -10,11 +10,25 @@ import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; +import org.osgi.framework.BundleContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Modified; import tdt4250.servletsupport.IResourceProvider; +@Component( + configurationPid = ResourceProvider.FACTORY_PID, + configurationPolicy = ConfigurationPolicy.REQUIRE + ) public class ResourceProvider implements IResourceProvider { + public static final String FACTORY_PID = "tdt4250.servletsupport.impl.ResourceProvider"; + + public static final String RESOURCE_NAME_PROP = "resourceName"; + public static final String RESOURCE_URI_PROP = "resourceUri"; + private URI uri; private Resource resource; @@ -27,6 +41,26 @@ public class ResourceProvider implements IResourceProvider { public void setUri(URI uri) { this.uri = uri; } + + public @interface ResourceProviderConfig { + String name(); + String resourceUri(); + } + + @Activate + public void activate(BundleContext bc, ResourceProviderConfig config) { + update(bc, config); + } + + @Modified + public void modify(BundleContext bc, ResourceProviderConfig config) { + update(bc, config); + } + + protected void update(BundleContext bc, ResourceProviderConfig config) { + this.resource = null; + this.uri = URI.createURI(config.resourceUri()); + } public ResourceProvider(Resource resource) { this.resource = resource; diff --git a/emf-ws/tdt4250.emf.servletsupport/bnd.bnd b/emf-ws/tdt4250.emf.servletsupport/bnd.bnd index 60fbd43f239b38a0e7cf510356c17628ac34a288..c75f28ff45407dddc4ea7594225f76775f684feb 100644 --- a/emf-ws/tdt4250.emf.servletsupport/bnd.bnd +++ b/emf-ws/tdt4250.emf.servletsupport/bnd.bnd @@ -1,8 +1,7 @@ -Bundle-Version: 1.0.0.${tstamp} - --baseline: * -buildpath: \ + osgi.core;version=7.0.0,\ osgi.annotation;version=7.0.0,\ + osgi.cmpn;version=7.0.0,\ com.fasterxml.jackson.core.jackson-annotations,\ com.fasterxml.jackson.core.jackson-core,\ com.fasterxml.jackson.core.jackson-databind,\ @@ -11,4 +10,5 @@ Bundle-Version: 1.0.0.${tstamp} javac.source: 1.8 javac.target: 1.8 + -runrequires: bnd.identity;id='tdt4250.emf.servletsupport' \ No newline at end of file