From 07085f8aa0d3742c7800381b268b43353069774f Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Thu, 21 Aug 2014 17:42:37 +0200 Subject: [PATCH] [Major] added missing parsing of StrolchTimedState and fixed locators Locators are now a bit different, to handle finding StrolchTimedState as well, the Locator has the form: Resource///State/ Resource///Bag// --- .../li/strolch/agent/impl/CachedOrderMap.java | 6 +- .../strolch/agent/impl/CachedResourceMap.java | 6 +- .../agent/impl/TransactionalOrderMap.java | 6 +- .../agent/impl/TransactionalResourceMap.java | 6 +- .../persistence/api/AbstractTransaction.java | 58 ++++++++++++++----- .../query/inmemory/FindByLocatorTest.java | 43 ++++++++++---- .../transienttest/data/Resources.xml | 26 +++++++++ 7 files changed, 112 insertions(+), 39 deletions(-) diff --git a/src/main/java/li/strolch/agent/impl/CachedOrderMap.java b/src/main/java/li/strolch/agent/impl/CachedOrderMap.java index bde60f8d9..2641b50dd 100644 --- a/src/main/java/li/strolch/agent/impl/CachedOrderMap.java +++ b/src/main/java/li/strolch/agent/impl/CachedOrderMap.java @@ -1,13 +1,13 @@ package li.strolch.agent.impl; -import static li.strolch.runtime.StrolchConstants.INTERPRETATION_ORDER_REF; +import static li.strolch.model.StrolchModelConstants.INTERPRETATION_ORDER_REF; +import static li.strolch.model.StrolchModelConstants.UOM_NONE; import java.text.MessageFormat; import li.strolch.agent.api.OrderMap; import li.strolch.exception.StrolchException; import li.strolch.model.Order; -import li.strolch.model.parameter.Parameter; import li.strolch.model.parameter.StringParameter; import li.strolch.persistence.api.OrderDao; import li.strolch.persistence.api.StrolchTransaction; @@ -22,7 +22,7 @@ public class CachedOrderMap extends CachedElementMap implements OrderMap throw new StrolchException(MessageFormat.format(msg, refP.getLocator(), INTERPRETATION_ORDER_REF)); } - if (refP.getUom().equals(Parameter.UOM_NONE)) { + if (refP.getUom().equals(UOM_NONE)) { String msg = "{0} is not an Order reference as its UOM is not set to a type!"; //$NON-NLS-1$ throw new StrolchException(MessageFormat.format(msg, refP.getLocator())); } diff --git a/src/main/java/li/strolch/agent/impl/CachedResourceMap.java b/src/main/java/li/strolch/agent/impl/CachedResourceMap.java index e73ea8a69..a45b22948 100644 --- a/src/main/java/li/strolch/agent/impl/CachedResourceMap.java +++ b/src/main/java/li/strolch/agent/impl/CachedResourceMap.java @@ -1,13 +1,13 @@ package li.strolch.agent.impl; -import static li.strolch.runtime.StrolchConstants.INTERPRETATION_RESOURCE_REF; +import static li.strolch.model.StrolchModelConstants.INTERPRETATION_RESOURCE_REF; +import static li.strolch.model.StrolchModelConstants.UOM_NONE; import java.text.MessageFormat; import li.strolch.agent.api.ResourceMap; import li.strolch.exception.StrolchException; import li.strolch.model.Resource; -import li.strolch.model.parameter.Parameter; import li.strolch.model.parameter.StringParameter; import li.strolch.persistence.api.ResourceDao; import li.strolch.persistence.api.StrolchTransaction; @@ -23,7 +23,7 @@ public class CachedResourceMap extends CachedElementMap implements Res throw new StrolchException(msg); } - if (refP.getUom().equals(Parameter.UOM_NONE)) { + if (refP.getUom().equals(UOM_NONE)) { String msg = MessageFormat.format("{0} is not an Resource reference as its UOM is not set to a type!", //$NON-NLS-1$ refP.getLocator()); throw new StrolchException(msg); diff --git a/src/main/java/li/strolch/agent/impl/TransactionalOrderMap.java b/src/main/java/li/strolch/agent/impl/TransactionalOrderMap.java index 01db3e58d..d029747ae 100644 --- a/src/main/java/li/strolch/agent/impl/TransactionalOrderMap.java +++ b/src/main/java/li/strolch/agent/impl/TransactionalOrderMap.java @@ -1,13 +1,13 @@ package li.strolch.agent.impl; -import static li.strolch.runtime.StrolchConstants.INTERPRETATION_ORDER_REF; +import static li.strolch.model.StrolchModelConstants.INTERPRETATION_ORDER_REF; +import static li.strolch.model.StrolchModelConstants.UOM_NONE; import java.text.MessageFormat; import li.strolch.agent.api.OrderMap; import li.strolch.exception.StrolchException; import li.strolch.model.Order; -import li.strolch.model.parameter.Parameter; import li.strolch.model.parameter.StringParameter; import li.strolch.persistence.api.OrderDao; import li.strolch.persistence.api.StrolchTransaction; @@ -22,7 +22,7 @@ public class TransactionalOrderMap extends TransactionalElementMap implem throw new StrolchException(MessageFormat.format(msg, refP.getLocator(), INTERPRETATION_ORDER_REF)); } - if (refP.getUom().equals(Parameter.UOM_NONE)) { + if (refP.getUom().equals(UOM_NONE)) { String msg = "{0} is not an Order reference as its UOM is not set to a type!"; //$NON-NLS-1$ throw new StrolchException(MessageFormat.format(msg, refP.getLocator())); } diff --git a/src/main/java/li/strolch/agent/impl/TransactionalResourceMap.java b/src/main/java/li/strolch/agent/impl/TransactionalResourceMap.java index a4820ee71..531def58b 100644 --- a/src/main/java/li/strolch/agent/impl/TransactionalResourceMap.java +++ b/src/main/java/li/strolch/agent/impl/TransactionalResourceMap.java @@ -1,13 +1,13 @@ package li.strolch.agent.impl; -import static li.strolch.runtime.StrolchConstants.INTERPRETATION_RESOURCE_REF; +import static li.strolch.model.StrolchModelConstants.INTERPRETATION_RESOURCE_REF; +import static li.strolch.model.StrolchModelConstants.UOM_NONE; import java.text.MessageFormat; import li.strolch.agent.api.ResourceMap; import li.strolch.exception.StrolchException; import li.strolch.model.Resource; -import li.strolch.model.parameter.Parameter; import li.strolch.model.parameter.StringParameter; import li.strolch.persistence.api.ResourceDao; import li.strolch.persistence.api.StrolchTransaction; @@ -22,7 +22,7 @@ public class TransactionalResourceMap extends TransactionalElementMap throw new StrolchException(MessageFormat.format(msg, refP.getLocator(), INTERPRETATION_RESOURCE_REF)); } - if (refP.getUom().equals(Parameter.UOM_NONE)) { + if (refP.getUom().equals(UOM_NONE)) { String msg = "{0} is not an Resource reference as its UOM is not set to a type!"; //$NON-NLS-1$ throw new StrolchException(MessageFormat.format(msg, refP.getLocator())); } diff --git a/src/main/java/li/strolch/persistence/api/AbstractTransaction.java b/src/main/java/li/strolch/persistence/api/AbstractTransaction.java index b908c6108..5fdfc3e58 100644 --- a/src/main/java/li/strolch/persistence/api/AbstractTransaction.java +++ b/src/main/java/li/strolch/persistence/api/AbstractTransaction.java @@ -40,6 +40,8 @@ import li.strolch.model.parameter.Parameter; import li.strolch.model.parameter.StringParameter; import li.strolch.model.query.OrderQuery; import li.strolch.model.query.ResourceQuery; +import li.strolch.model.timedstate.StrolchTimedState; +import li.strolch.model.timevalue.IValue; import li.strolch.model.visitor.NoStrategyOrderVisitor; import li.strolch.model.visitor.NoStrategyResourceVisitor; import li.strolch.persistence.inmemory.InMemoryTransaction; @@ -194,15 +196,18 @@ public abstract class AbstractTransaction implements StrolchTransaction { @Override public T findElement(Locator locator) { + // Resource// + // Resource///Bag/ + // Resource///Bag// + // Resource///State/ + // Order// + // Order///Bag/ + // Order///Bag// + if (locator.getSize() < 3) { String msg = "The locator is invalid as it does not have at least three path elements (e.g. Resource/MyType/@id): {0}"; //$NON-NLS-1$ msg = MessageFormat.format(msg, locator.toString()); throw new StrolchException(msg); - } else if (locator.getSize() > 5) { - // TODO handle state variables, which will probably be separated by an additional part so we can differentiate between parameters and state variables on a parameter bag - String msg = "The locator is invalid as it has more than 5 parts. The fifth part references a Parameter, which is the deepest fetchable entry: {0}"; //$NON-NLS-1$ - msg = MessageFormat.format(msg, locator.toString()); - throw new StrolchException(msg); } List elements = locator.getPathElements(); @@ -229,19 +234,40 @@ public abstract class AbstractTransaction implements StrolchTransaction { if (elements.size() == 3) return (T) groupedParameterizedElement; - String parameterBagId = elements.get(3); - ParameterBag bag = groupedParameterizedElement.getParameterBag(parameterBagId); - if (bag == null) { - String msg = "Could not find ParameterBag for locator {0} on element {1}"; //$NON-NLS-1$ - throw new StrolchException(MessageFormat.format(msg, locator, groupedParameterizedElement.getLocator())); + // state or bag + String stateOrBag = elements.get(3); + if (stateOrBag.equals(Tags.BAG)) { + + String parameterBagId = elements.get(4); + ParameterBag bag = groupedParameterizedElement.getParameterBag(parameterBagId); + if (bag == null) { + String msg = "Could not find ParameterBag for locator {0} on element {1}"; //$NON-NLS-1$ + throw new StrolchException(MessageFormat.format(msg, locator, groupedParameterizedElement.getLocator())); + } + + if (elements.size() == 5) + return (T) bag; + + String parameterId = elements.get(5); + Parameter parameter = bag.getParameter(parameterId); + return (T) parameter; + + } else if (stateOrBag.equals(Tags.STATE)) { + + if (elements.size() != 5) { + String msg = "Missing state Id on locator {0}"; //$NON-NLS-1$ + throw new StrolchException(MessageFormat.format(msg, locator)); + } + + Resource resource = (Resource) groupedParameterizedElement; + String stateId = elements.get(4); + + StrolchTimedState> timedState = resource.getTimedState(stateId); + return (T) timedState; } - if (elements.size() == 4) - return (T) bag; - - String parameterId = elements.get(4); - Parameter parameter = bag.getParameter(parameterId); - return (T) parameter; + String msg = "Invalid locator {0} on with part {1}"; //$NON-NLS-1$ + throw new StrolchException(MessageFormat.format(msg, locator, stateOrBag)); } @Override diff --git a/src/test/java/li/strolch/runtime/query/inmemory/FindByLocatorTest.java b/src/test/java/li/strolch/runtime/query/inmemory/FindByLocatorTest.java index 0487baabc..c09bdbdb1 100644 --- a/src/test/java/li/strolch/runtime/query/inmemory/FindByLocatorTest.java +++ b/src/test/java/li/strolch/runtime/query/inmemory/FindByLocatorTest.java @@ -24,6 +24,7 @@ import li.strolch.model.ParameterBag; import li.strolch.model.Resource; import li.strolch.model.parameter.FloatParameter; import li.strolch.model.parameter.StringParameter; +import li.strolch.model.timedstate.IntegerTimedState; import li.strolch.persistence.api.StrolchTransaction; import li.strolch.runtime.StrolchConstants; @@ -45,21 +46,41 @@ public class FindByLocatorTest { ComponentContainer container = agent.getContainer(); try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) { - Locator locResStringParam = Locator.valueOf("Resource/TestType/MyTestResource/@bag01/@param5"); - StringParameter resStringParam = tx.findElement(locResStringParam); - assertNotNull("Should have found a StringParameter with the locator " + locResStringParam, resStringParam); - - Locator locOrderFloatParam = Locator.valueOf("Order/TestType/MyTestOrder/@bag01/@param2"); - FloatParameter orderFloatP = tx.findElement(locOrderFloatParam); - assertNotNull("Should have found a FloatParameter with the locator " + locOrderFloatParam, orderFloatP); - - Locator locOrderBag = Locator.valueOf("Order/TestType/MyTestOrder/@bag01"); - ParameterBag orderBag = tx.findElement(locOrderBag); - assertNotNull("Should have found a FloatParameter with the locator " + locOrderBag, orderBag); + // Resource Locator locResource = Locator.valueOf("Resource/TestType/MyTestResource"); Resource resource = tx.findElement(locResource); assertNotNull("Should have found a FloatParameter with the locator " + locResource, resource); + + // Order + Locator locOrderBag = Locator.valueOf("Order/TestType/MyTestOrder/Bag/@bag01"); + ParameterBag orderBag = tx.findElement(locOrderBag); + assertNotNull("Should have found a FloatParameter with the locator " + locOrderBag, orderBag); + + // Bag on Resource + Locator locResBag = Locator.valueOf("Resource/TestType/MyTestResource/Bag/@bag01"); + ParameterBag resBag = tx.findElement(locResBag); + assertNotNull("Should have found a ParameterBag with the locator " + locResBag, resBag); + + // Bag on Order + Locator locOrdBag = Locator.valueOf("Order/TestType/MyTestOrder/Bag/@bag01"); + ParameterBag ordBag = tx.findElement(locOrdBag); + assertNotNull("Should have found a ParameterBag with the locator " + ordBag, locOrdBag); + + // Parameter on Resource + Locator locResStringParam = Locator.valueOf("Resource/TestType/MyTestResource/Bag/@bag01/@param5"); + StringParameter resStringParam = tx.findElement(locResStringParam); + assertNotNull("Should have found a StringParameter with the locator " + locResStringParam, resStringParam); + + // Parameter on Order + Locator locOrderFloatParam = Locator.valueOf("Order/TestType/MyTestOrder/Bag/@bag01/@param2"); + FloatParameter orderFloatP = tx.findElement(locOrderFloatParam); + assertNotNull("Should have found a FloatParameter with the locator " + locOrderFloatParam, orderFloatP); + + // TimedState on Resource + Locator locResIntegerState = Locator.valueOf("Resource/TestType/MyTestResource/State/@integerState"); + IntegerTimedState integerS = tx.findElement(locResIntegerState); + assertNotNull("Should have found a IntegerTimedState with the locator " + locResIntegerState, integerS); } } } diff --git a/src/test/resources/transienttest/data/Resources.xml b/src/test/resources/transienttest/data/Resources.xml index e6259cb83..135f9a943 100644 --- a/src/test/resources/transienttest/data/Resources.xml +++ b/src/test/resources/transienttest/data/Resources.xml @@ -10,5 +10,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +