Skip to content

Commit

Permalink
Make XNodes copyable
Browse files Browse the repository at this point in the history
  • Loading branch information
tonydamage committed Feb 11, 2021
1 parent 81eaae3 commit 1820681
Show file tree
Hide file tree
Showing 11 changed files with 97 additions and 21 deletions.
Expand Up @@ -13,10 +13,14 @@
*
*/
public interface ListXNode extends XNode {
@Override
boolean isEmpty();
int size();
XNode get(int i);

// todo reconsider this
List<? extends XNode> asList();

@Override
ListXNode copy();
}
Expand Up @@ -24,8 +24,10 @@ public interface MapXNode extends XNode, MetadataAware {

XNode get(QName key);

@Override
boolean isEmpty();

@Override
@NotNull
MapXNode clone();

Expand All @@ -46,4 +48,7 @@ public interface MapXNode extends XNode, MetadataAware {
* @return Shallow clone of the node in the form of a map.
*/
Map<QName, ? extends XNode> toMap();

@Override
MapXNode copy();
}
Expand Up @@ -36,4 +36,8 @@ public interface PrimitiveXNode<T> extends XNode, MetadataAware {
ValueParser<T> getValueParser();

boolean isParsed();


@Override
PrimitiveXNode<T> copy();
}
Expand Up @@ -18,4 +18,7 @@ public interface RootXNode extends XNode {
XNode getSubnode();

MapXNode toMapXNode();

@Override
RootXNode copy();
}
Expand Up @@ -7,6 +7,7 @@

package com.evolveum.midpoint.prism.xnode;

import com.evolveum.midpoint.prism.Copyable;
import com.evolveum.midpoint.prism.Freezable;
import com.evolveum.midpoint.prism.PrismNamespaceContext;
import com.evolveum.midpoint.prism.Visitable;
Expand All @@ -19,7 +20,7 @@
/**
*
*/
public interface XNode extends DebugDumpable, Visitable<XNode>, Cloneable, Serializable, Freezable {
public interface XNode extends DebugDumpable, Visitable<XNode>, Cloneable, Copyable<XNode>, Serializable, Freezable {

boolean isEmpty();

Expand All @@ -32,6 +33,9 @@ public interface XNode extends DebugDumpable, Visitable<XNode>, Cloneable, Seria
@NotNull
XNode clone();

@Override
XNode copy();

Integer getMaxOccurs();

default boolean hasMetadata() {
Expand Down
Expand Up @@ -13,7 +13,8 @@

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ValueNode;

import org.apache.commons.lang3.Validate;
import org.jetbrains.annotations.NotNull;

Expand Down Expand Up @@ -110,10 +111,10 @@ private <T> PrimitiveXNodeImpl<T> parseToPrimitive() throws IOException, SchemaE
// as xsd:string, even if the schema would expect e.g. timestamp.
}

JsonNode jn = parser.readValueAs(JsonNode.class);
ValueNode jn = parser.readValueAs(ValueNode.class);
ValueParser<T> vp = new JsonValueParser<>(parser, jn, parentContext);
primitive.setValueParser(vp);

// FIXME: Materialize when possible
return primitive;
}

Expand All @@ -123,21 +124,4 @@ private <T> PrimitiveXNodeImpl<T> parseToEmptyPrimitive() {
return primitive;
}

// @SuppressWarnings("unused") // TODO remove if not needed
// private QName getCurrentTypeName(JsonReadingContext ctx) throws IOException, SchemaException {
// switch (parser.currentToken()) {
// case VALUE_NUMBER_INT:
// case VALUE_NUMBER_FLOAT:
// return AbstractReader.determineNumberType(parser.getNumberType());
// case VALUE_FALSE:
// case VALUE_TRUE:
// return DOMUtil.XSD_BOOLEAN;
// case VALUE_STRING:
// return DOMUtil.XSD_STRING;
// case VALUE_NULL:
// return null; // TODO?
// default:
// throw new SchemaException("Unexpected current token type: " + parser.currentToken() + "/" + parser.getText() + " at " + ctx.getPositionSuffix());
// }
// }
}
Expand Up @@ -218,4 +218,17 @@ public void performFreeze() {
}
super.performFreeze();
}

@Override
public ListXNode copy() {
if(isImmutable()) {
return this;
}
ListXNodeImpl ret = new ListXNodeImpl(namespaceContext());
copyCommonTo(ret);
for (XNodeImpl xNodeImpl : ret.subnodes) {
ret.add((XNodeImpl) xNodeImpl.copy());
}
return ret;
}
}
Expand Up @@ -7,6 +7,7 @@
package com.evolveum.midpoint.prism.impl.xnode;

import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;

import javax.xml.namespace.QName;
Expand Down Expand Up @@ -386,4 +387,22 @@ public void performFreeze() {
public void setMetadataNodes(@NotNull List<MapXNode> metadataNodes) {
this.metadataNodes = metadataNodes;
}

@Override
public MapXNode copy() {
if(isImmutable()) {
return this;
}
MapXNodeImpl ret = new MapXNodeImpl(namespaceContext());
for(Entry<QName, XNodeImpl> node : subnodes.entrySet()) {
ret.put(node.getKey(), node.getValue().clone());
}

List<MapXNode> metadata = new ArrayList<>(metadataNodes.size());
for (MapXNode mapXNode : metadataNodes) {
metadata.add(mapXNode.copy());
}
ret.setMetadataNodes(metadata);
return ret;
}
}
Expand Up @@ -419,6 +419,22 @@ public void performFreeze() {
super.performFreeze();
}

@Override
public PrimitiveXNode<T> copy() {
if(isImmutable()) {
return this;
}
PrimitiveXNodeImpl<T> ret = new PrimitiveXNodeImpl<>(namespaceContext());
copyCommonTo(ret);
if (value != null) {
ret.setValue(CloneUtil.clone(getValue()), getTypeQName());
}
if (valueParser != null) {
ret.setValueParser(getValueParser().freeze());
}
return ret;
}

@Override
public @NotNull List<MapXNode> getMetadataNodes() {
return metadata;
Expand Down
Expand Up @@ -177,4 +177,14 @@ public void performFreeze() {
}
super.performFreeze();
}

@Override
public RootXNode copy() {
if(isImmutable()) {
return this;
}
RootXNodeImpl ret = new RootXNodeImpl(rootElementName, namespaceContext());
copyCommonTo(ret).setSubnode((XNodeImpl) getSubnode().copy());
return ret;
}
}
Expand Up @@ -14,6 +14,7 @@

import com.evolveum.midpoint.prism.AbstractFreezable;
import com.evolveum.midpoint.prism.PrismNamespaceContext;
import com.evolveum.midpoint.prism.util.CloneUtil;
import com.evolveum.midpoint.prism.xnode.MapXNode;
import com.evolveum.midpoint.prism.xnode.XNode;
import com.evolveum.midpoint.util.DebugUtil;
Expand Down Expand Up @@ -279,4 +280,17 @@ boolean metadataEquals(@NotNull List<MapXNode> metadata1, @NotNull List<MapXNode
public PrismNamespaceContext namespaceContext() {
return namespaceContext;
}

protected <T extends XNodeImpl> T copyCommonTo(T target) {
target.setComment(getComment());
target.setElementName(getElementName());
target.setExplicitTypeDeclaration(isExplicitTypeDeclaration());
target.setLineNumber(getLineNumber());
target.setMaxOccurs(getMaxOccurs());
target.setOriginDescription(getOriginDescription());
target.setOriginFile(getOriginFile());
target.setParserData(CloneUtil.clone(getParserData()));
target.setTypeQName(getTypeQName());
return target;
}
}

0 comments on commit 1820681

Please sign in to comment.