[Fix] Clone element in AbstractTransaction.findElement() but only if readonly
This commit is contained in:
parent
b37c83eea1
commit
637ffd970c
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue