[Fix] Clone element in AbstractTransaction.findElement() but only if readonly

This commit is contained in:
Robert von Burg 2020-04-20 08:49:57 +02:00
parent b37c83eea1
commit 637ffd970c
1 changed files with 14 additions and 12 deletions

View File

@ -453,47 +453,49 @@ public abstract class AbstractTransaction implements StrolchTransaction {
} }
List<String> elements = locator.getPathElements(); List<String> elements = locator.getPathElements();
GroupedParameterizedElement groupedParameterizedElement; StrolchRootElement rootElement;
String objectClassType = elements.get(0); String objectClassType = elements.get(0);
String type = elements.get(1); String type = elements.get(1);
String id = elements.get(2); String id = elements.get(2);
switch (objectClassType) { switch (objectClassType) {
case Tags.RESOURCE: case Tags.RESOURCE:
groupedParameterizedElement = getResourceBy(type, id).getClone(true); rootElement = getResourceBy(type, id);
break; break;
case Tags.ORDER: case Tags.ORDER:
groupedParameterizedElement = getOrderBy(type, id).getClone(true); rootElement = getOrderBy(type, id);
break; break;
case Tags.ACTIVITY: case Tags.ACTIVITY:
groupedParameterizedElement = getActivityBy(type, id).getClone(true); rootElement = getActivityBy(type, id);
break; break;
default: default:
throw new StrolchModelException( throw new StrolchModelException(
MessageFormat.format("Unknown object class {0}", objectClassType)); //$NON-NLS-1$ MessageFormat.format("Unknown object class {0}", objectClassType)); //$NON-NLS-1$
} }
if (groupedParameterizedElement == null) { if (rootElement == null) {
if (allowNull) if (allowNull)
return null; return null;
String msg = "No top level object could be found with locator {0}"; //$NON-NLS-1$ String msg = "No top level object could be found with locator {0}"; //$NON-NLS-1$
throw new StrolchModelException(MessageFormat.format(msg, locator)); throw new StrolchModelException(MessageFormat.format(msg, locator));
} }
if (rootElement.isReadOnly())
rootElement = rootElement.getClone(true);
if (elements.size() == 3) if (elements.size() == 3)
return (T) groupedParameterizedElement; return (T) rootElement;
// state or bag // state or bag
String stateOrBagOrActivity = elements.get(3); String stateOrBagOrActivity = elements.get(3);
if (stateOrBagOrActivity.equals(Tags.BAG)) { if (stateOrBagOrActivity.equals(Tags.BAG)) {
String parameterBagId = elements.get(4); String parameterBagId = elements.get(4);
ParameterBag bag = groupedParameterizedElement.getParameterBag(parameterBagId); ParameterBag bag = rootElement.getParameterBag(parameterBagId);
if (bag == null) { if (bag == null) {
if (allowNull) if (allowNull)
return null; return null;
String msg = "Could not find ParameterBag for locator {0} on element {1}"; //$NON-NLS-1$ String msg = "Could not find ParameterBag for locator {0} on element {1}"; //$NON-NLS-1$
throw new StrolchModelException( throw new StrolchModelException(MessageFormat.format(msg, locator, rootElement.getLocator()));
MessageFormat.format(msg, locator, groupedParameterizedElement.getLocator()));
} }
if (elements.size() == 5) if (elements.size() == 5)
@ -517,15 +519,15 @@ public abstract class AbstractTransaction implements StrolchTransaction {
} }
@SuppressWarnings("ConstantConditions") @SuppressWarnings("ConstantConditions")
Resource resource = (Resource) groupedParameterizedElement; Resource resource = (Resource) rootElement;
String stateId = elements.get(4); String stateId = elements.get(4);
StrolchTimedState<IValue<?>> timedState = resource.getTimedState(stateId); StrolchTimedState<IValue<?>> timedState = resource.getTimedState(stateId);
return (T) timedState; return (T) timedState;
} else if (groupedParameterizedElement instanceof Activity) { } else if (rootElement instanceof Activity) {
Activity activity = (Activity) groupedParameterizedElement; Activity activity = (Activity) rootElement;
Iterator<String> iter = elements.subList(3, elements.size()).iterator(); Iterator<String> iter = elements.subList(3, elements.size()).iterator();
IActivityElement element = activity; IActivityElement element = activity;