diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/SecurityContextAwareCallable.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/SecurityContextAwareCallable.java index 9288fc10ecb..88a7afff409 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/SecurityContextAwareCallable.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/SecurityContextAwareCallable.java @@ -18,6 +18,9 @@ import com.evolveum.midpoint.security.api.SecurityEnforcer; import org.apache.commons.lang.Validate; +import org.apache.wicket.Application; +import org.apache.wicket.Session; +import org.apache.wicket.ThreadContext; import org.springframework.security.core.Authentication; import java.util.concurrent.Callable; @@ -49,5 +52,14 @@ public final V call() throws Exception { } } + protected void setupContext(Application application, Session session) { + if (!Application.exists() && application != null) { + ThreadContext.setApplication(application); + } + if (!Session.exists() && session != null) { + ThreadContext.setSession(session); + } + } + public abstract V callWithContextPrepared() throws Exception; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/component/AsyncDashboardPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/component/AsyncDashboardPanel.java index 14d2eef5993..0801775bc3d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/component/AsyncDashboardPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/component/AsyncDashboardPanel.java @@ -22,8 +22,6 @@ import com.evolveum.midpoint.web.component.AsyncUpdatePanel; import com.evolveum.midpoint.web.component.util.CallableResult; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; - -import org.apache.commons.lang.StringUtils; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/RoleMemberPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/RoleMemberPanel.java index 400df148dc9..26314ccf1a4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/RoleMemberPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/RoleMemberPanel.java @@ -447,7 +447,7 @@ private ObjectQuery createQuery(boolean useNameFilter, boolean isNot) { List conditions = new ArrayList<>(); PrismReferenceValue roleRef = new PrismReferenceValue(); roleRef.setOid(roleId); - roleRef.setTargetType(RoleType.COMPLEX_TYPE); +// roleRef.setTargetType(RoleType.COMPLEX_TYPE); ObjectFilter roleFilter = RefFilter.createReferenceEqual( new ItemPath(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF), UserType.class, getPrismContext(), roleRef); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java index bc17156ff2d..b41cbf97272 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java @@ -140,7 +140,9 @@ public void detach() { }); add(linksPanel); + // TODO is this correct? [med] application = getApplication(); + final Session session = Session.get(); AsyncDashboardPanel> workItemsPanel = new AsyncDashboardPanel>(ID_WORK_ITEMS_PANEL, createStringResource("PageSelfDashboard.workItems"), @@ -155,9 +157,7 @@ protected SecurityContextAwareCallable>> create @Override public CallableResult> callWithContextPrepared() throws Exception { - if (!Application.exists()) { - ThreadContext.setApplication(application); - } + setupContext(application, session); // TODO is this correct? [med] return loadWorkItems(); } }; @@ -191,9 +191,7 @@ protected SecurityContextAwareCallable>> @Override public CallableResult> callWithContextPrepared() throws Exception { - if (!Application.exists()) { - ThreadContext.setApplication(application); - } + setupContext(application, session); return loadMyRequests(); } }; diff --git a/infra/prism/pom.xml b/infra/prism/pom.xml index 3632e37195c..7187d2a4567 100644 --- a/infra/prism/pom.xml +++ b/infra/prism/pom.xml @@ -55,6 +55,10 @@ org.apache.santuario xmlsec + + org.jetbrains + annotations-java5 + diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java new file mode 100644 index 00000000000..be5f31f3a4b --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode; +import com.evolveum.midpoint.util.logging.Trace; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author mederly + */ +public class ParsingContext { + + private XNodeProcessorEvaluationMode evaluationMode = XNodeProcessorEvaluationMode.STRICT; + private boolean allowMissingRefTypes; + private final List warnings = new ArrayList<>(); + + private ParsingContext() { + } + + private void setAllowMissingRefTypes(boolean allowMissingRefTypes) { + this.allowMissingRefTypes = allowMissingRefTypes; + } + + private void setEvaluationMode(XNodeProcessorEvaluationMode evaluationMode) { + this.evaluationMode = evaluationMode; + } + + public boolean isAllowMissingRefTypes() { + return allowMissingRefTypes; + } + + public XNodeProcessorEvaluationMode getEvaluationMode() { + return evaluationMode; + } + + public static ParsingContext forMode(XNodeProcessorEvaluationMode mode) { + ParsingContext pc = new ParsingContext(); + pc.setEvaluationMode(mode); + return pc; + } + + public static ParsingContext allowMissingRefTypes() { + ParsingContext pc = new ParsingContext(); + pc.setAllowMissingRefTypes(true); + return pc; + } + + public static ParsingContext createDefault() { + return new ParsingContext(); + } + + public boolean isCompat() { + return evaluationMode == XNodeProcessorEvaluationMode.COMPAT; + } + + public boolean isStrict() { + return evaluationMode == XNodeProcessorEvaluationMode.STRICT; + } + + public void warn(Trace logger, String message) { + logger.warn("{}", message); + warn(message); + } + + public void warn(String message) { + warnings.add(message); + } + + public List getWarnings() { + return warnings; + } + + public boolean hasWarnings() { + return !warnings.isEmpty(); + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index 9c982a231be..b84bc445a92 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -1111,7 +1111,7 @@ private PrismContainerValue parseRawElementsToNewValue(PrismContainerValue XNode origRawXnode = origCVal.rawXNode; if (origRawXnode != null) { XNodeProcessor xnodeProcessor = definition.getPrismContext().getXnodeProcessor(); - PrismContainerValue newCVal = xnodeProcessor.parsePrismContainerValue(origRawXnode, definition); + PrismContainerValue newCVal = xnodeProcessor.parsePrismContainerValue(origRawXnode, definition, ParsingContext.createDefault()); return newCVal; } @@ -1185,8 +1185,9 @@ public void applyDefinition(PrismContainerDefinition containerDef, boolean fo rawElements = null; } if (rawXNode != null) { - XNodeProcessor xnodeProcessor = valueDefinition.getPrismContext().getXnodeProcessor(); - PrismContainerValue newCVal = xnodeProcessor.parsePrismContainerValue(rawXNode, valueDefinition); + PrismContext prismContext = valueDefinition.getPrismContext(); + XNodeProcessor xnodeProcessor = prismContext.getXnodeProcessor(); + PrismContainerValue newCVal = xnodeProcessor.parsePrismContainerValue(rawXNode, valueDefinition, ParsingContext.createDefault()); // Maybe we need to manually reset parent on items? addAll(newCVal.getItems()); rawXNode = null; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 4a745629ce7..69987e0165f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -17,15 +17,7 @@ import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.parser.DomParser; -import com.evolveum.midpoint.prism.parser.JaxbDomHack; -import com.evolveum.midpoint.prism.parser.JsonParser; -import com.evolveum.midpoint.prism.parser.Parser; -import com.evolveum.midpoint.prism.parser.PrismBeanConverter; -import com.evolveum.midpoint.prism.parser.PrismBeanInspector; -import com.evolveum.midpoint.prism.parser.XNodeProcessor; -import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode; -import com.evolveum.midpoint.prism.parser.YamlParser; +import com.evolveum.midpoint.prism.parser.*; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.polystring.PrismDefaultPolyStringNormalizer; @@ -38,11 +30,7 @@ import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; -import com.evolveum.prism.xml.ns._public.types_3.ObjectType; import com.evolveum.prism.xml.ns._public.types_3.RawType; - -import org.apache.commons.lang.Validate; import org.springframework.beans.factory.annotation.Autowired; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -50,16 +38,10 @@ import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; - import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; /** @@ -79,7 +61,6 @@ public class PrismContext { private SchemaRegistry schemaRegistry; private XNodeProcessor xnodeProcessor; private PrismBeanConverter beanConverter; - private PrismBeanConverter compatModeBeanConverter; private SchemaDefinitionFactory definitionFactory; private PolyStringNormalizer defaultPolyStringNormalizer; private Map parserMap; @@ -103,7 +84,6 @@ public static PrismContext create(SchemaRegistry schemaRegistry) { prismContext.xnodeProcessor = new XNodeProcessor(prismContext); PrismBeanInspector inspector = new PrismBeanInspector(prismContext); prismContext.beanConverter = new PrismBeanConverter(prismContext, inspector); - prismContext.compatModeBeanConverter = new PrismBeanConverter(prismContext, inspector, XNodeProcessorEvaluationMode.COMPAT); prismContext.parserMap = new HashMap(); DomParser parserDom = new DomParser(schemaRegistry); @@ -165,10 +145,6 @@ public PrismBeanConverter getBeanConverter() { return beanConverter; } - public PrismBeanConverter getCompatModeBeanConverter() { - return compatModeBeanConverter; - } - public JaxbDomHack getJaxbDomHack() { return jaxbDomHack; } @@ -222,15 +198,15 @@ public void setDefaultProtector(Protector defaultProtector) { public PrismObject parseObject(File file) throws SchemaException, IOException { Parser parser = findParser(file); XNode xnode = parser.parse(file); - return xnodeProcessor.parseObject(xnode); + return xnodeProcessor.parseObject(xnode, newParsingContext()); } - + /** * Parses a file and creates a prism from it. */ public PrismObject parseObject(File file, String language) throws SchemaException, IOException { XNode xnode = parseToXNode(file, language); - return xnodeProcessor.parseObject(xnode); + return xnodeProcessor.parseObject(xnode, newParsingContext()); } /** @@ -238,7 +214,7 @@ public PrismObject parseObject(File file, String langu */ public PrismObject parseObject(InputStream stream, String language) throws SchemaException, IOException { XNode xnode = parseToXNode(stream, language); - return xnodeProcessor.parseObject(xnode); + return xnodeProcessor.parseObject(xnode, newParsingContext()); } /** @@ -248,7 +224,7 @@ public PrismObject parseObject(InputStream stream, Str public PrismObject parseObject(String dataString) throws SchemaException { Parser parser = findParser(dataString); XNode xnode = parser.parse(dataString); - return xnodeProcessor.parseObject(xnode); + return xnodeProcessor.parseObject(xnode, newParsingContext()); } /** @@ -258,8 +234,15 @@ public PrismObject parseObject(String dataString) thro public PrismObject parseObject(String dataString, XNodeProcessorEvaluationMode mode) throws SchemaException { Parser parser = findParser(dataString); XNode xnode = parser.parse(dataString); - XNodeProcessor myXnodeProcessor = new XNodeProcessor(xnodeProcessor.getPrismContext(), mode); - return myXnodeProcessor.parseObject(xnode); + XNodeProcessor myXnodeProcessor = new XNodeProcessor(this); + return myXnodeProcessor.parseObject(xnode, ParsingContext.forMode(mode)); + } + + public PrismObject parseObject(String dataString, ParsingContext parsingContext) throws SchemaException { + Parser parser = findParser(dataString); + XNode xnode = parser.parse(dataString); + XNodeProcessor myXnodeProcessor = new XNodeProcessor(this); + return myXnodeProcessor.parseObject(xnode, parsingContext); } /** @@ -267,7 +250,7 @@ public PrismObject parseObject(String dataString, XNod */ public PrismObject parseObject(String dataString, String language) throws SchemaException { XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseObject(xnode); + return xnodeProcessor.parseObject(xnode, newParsingContext()); } /** @@ -276,17 +259,17 @@ public PrismObject parseObject(String dataString, Stri @Deprecated public PrismObject parseObject(Element objectElement) throws SchemaException { RootXNode xroot = parserDom.parseElementAsRoot(objectElement); - return xnodeProcessor.parseObject(xroot); + return xnodeProcessor.parseObject(xroot, newParsingContext()); } public List> parseObjects(File file) throws SchemaException, IOException { Parser parser = findParser(file); Collection nodes = parser.parseCollection(file); Iterator nodesIterator = nodes.iterator(); - List> objects = new ArrayList>(); + List> objects = new ArrayList<>(); while (nodesIterator.hasNext()){ XNode node = nodesIterator.next(); - PrismObject object = xnodeProcessor.parseObject(node); + PrismObject object = xnodeProcessor.parseObject(node, newParsingContext()); objects.add(object); } return objects; @@ -310,22 +293,22 @@ public Collection parseObjects(InputStream stream, String language) throw //region Parsing prism containers public PrismContainer parseContainer(File file, Class type, String language) throws SchemaException, IOException { XNode xnode = parseToXNode(file, language); - return xnodeProcessor.parseContainer(xnode, type); + return xnodeProcessor.parseContainer(xnode, type, newParsingContext()); } public PrismContainer parseContainer(File file, PrismContainerDefinition containerDef, String language) throws SchemaException, IOException { XNode xnode = parseToXNode(file, language); - return xnodeProcessor.parseContainer(xnode, containerDef); + return xnodeProcessor.parseContainer(xnode, containerDef, newParsingContext()); } public PrismContainer parseContainer(String dataString, Class type, String language) throws SchemaException { XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseContainer(xnode, type); + return xnodeProcessor.parseContainer(xnode, type, newParsingContext()); } public PrismContainer parseContainer(String dataString, PrismContainerDefinition containerDef, String language) throws SchemaException { XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseContainer(xnode, containerDef); + return xnodeProcessor.parseContainer(xnode, containerDef, newParsingContext()); } /** @@ -339,7 +322,7 @@ public PrismContainer parseContainer(String dataStr */ public PrismContainer parseContainer(String dataString, String language) throws SchemaException { XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseContainer(xnode); + return xnodeProcessor.parseContainer(xnode, newParsingContext()); } //endregion @@ -349,22 +332,22 @@ public PrismContainer parseContainer(String dataStr */ public T parseAtomicValue(String dataString, QName typeName, String language) throws SchemaException { XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseAtomicValue(xnode, typeName); + return xnodeProcessor.parseAtomicValue(xnode, typeName, newParsingContext()); } public T parseAtomicValue(String dataString, QName typeName) throws SchemaException { XNode xnode = parseToXNode(dataString); - return xnodeProcessor.parseAtomicValue(xnode, typeName); + return xnodeProcessor.parseAtomicValue(xnode, typeName, newParsingContext()); } public T parseAtomicValue(File file, QName typeName, String language) throws SchemaException, IOException { XNode xnode = parseToXNode(file, language); - return xnodeProcessor.parseAtomicValue(xnode, typeName); + return xnodeProcessor.parseAtomicValue(xnode, typeName, newParsingContext()); } public T parseAtomicValue(File file, QName typeName) throws SchemaException, IOException { XNode xnode = parseToXNode(file); - return xnodeProcessor.parseAtomicValue(xnode, typeName); + return xnodeProcessor.parseAtomicValue(xnode, typeName, newParsingContext()); } //endregion @@ -377,52 +360,50 @@ public T parseAtomicValue(File file, QName typeName) throws SchemaException, * CAUTION: EXPERIMENTAL - Avoid using this method if at all possible. * Its result is not well defined, namely, whether it returns Item or a value. * - * @param node * @return either Item or an unmarshalled bean value * @throws SchemaException */ public Object parseAnyData(String dataString, String language) throws SchemaException { XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseAnyData(xnode); + return xnodeProcessor.parseAnyData(xnode, newParsingContext()); } public Object parseAnyData(File file) throws SchemaException, IOException { XNode xnode = parseToXNode(file); - return xnodeProcessor.parseAnyData(xnode); + return xnodeProcessor.parseAnyData(xnode, newParsingContext()); } /** * Emulates JAXB unmarshal method. * * TODO * - * @param node * @return * @throws SchemaException */ public T parseAnyValue(File file) throws SchemaException, IOException { XNode xnode = parseToXNode(file); - return xnodeProcessor.parseAnyValue(xnode); + return xnodeProcessor.parseAnyValue(xnode, newParsingContext()); } public T parseAnyValue(Element element) throws SchemaException { XNode xnode = parseToXNode(element); - return xnodeProcessor.parseAnyValue(xnode); + return xnodeProcessor.parseAnyValue(xnode, newParsingContext()); } public T parseAnyValue(InputStream inputStream, String language) throws SchemaException, IOException { XNode xnode = parseToXNode(inputStream, language); - return xnodeProcessor.parseAnyValue(xnode); + return xnodeProcessor.parseAnyValue(xnode, newParsingContext()); } public T parseAnyValue(String dataString, String language) throws SchemaException { XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseAnyValue(xnode); + return xnodeProcessor.parseAnyValue(xnode, newParsingContext()); } // experimental! public JAXBElement parseAnyValueAsJAXBElement(String dataString, String language) throws SchemaException { XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseAnyValueAsJAXBElement(xnode); + return xnodeProcessor.parseAnyValueAsJAXBElement(xnode, newParsingContext()); } //endregion @@ -657,7 +638,6 @@ public Element serializeValueToDom(PrismValue pval, QName elementName, Document /** * A bit of hack: serializes any Item into a RawType. * Currently used for serializing script output, until a better method is devised. - * @param value * @return */ public RawType toRawType(Item item) throws SchemaException { @@ -676,4 +656,8 @@ public PrismObject createObject(Class clazz) { public T createObjectable(Class clazz) { return createObject(clazz).asObjectable(); } + + protected ParsingContext newParsingContext() { + return ParsingContext.createDefault(); + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index 8b163dfb3b1..eb5f0e5f53c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -25,7 +25,6 @@ import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.util.CloneUtil; import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.DOMUtil; @@ -364,8 +363,9 @@ private PrismPropertyValue parseRawElementToNewValue(PrismPropertyValue or private T parseRawElementToNewRealValue(PrismPropertyValue prismPropertyValue, PrismPropertyDefinition definition) throws SchemaException { - XNodeProcessor xnodeProcessor = definition.getPrismContext().getXnodeProcessor(); - T value = xnodeProcessor.parsePrismPropertyRealValue(prismPropertyValue.rawElement, definition); + PrismContext prismContext = definition.getPrismContext(); + XNodeProcessor xnodeProcessor = prismContext.getXnodeProcessor(); + T value = xnodeProcessor.parsePrismPropertyRealValue(prismPropertyValue.rawElement, definition, ParsingContext.createDefault()); return value; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JaxbDomHack.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JaxbDomHack.java index c17cd843b47..ada0f6dc4f5 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JaxbDomHack.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JaxbDomHack.java @@ -15,66 +15,27 @@ */ package com.evolveum.midpoint.prism.parser; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.Unmarshaller; import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.schema.SchemaDescription; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.util.logging.LoggingUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.w3c.dom.Document; import org.w3c.dom.Element; -import org.w3c.dom.Node; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismReference; -import com.evolveum.midpoint.prism.PrismReferenceDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.Referencable; -import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.prism.xml.DynamicNamespacePrefixMapper; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; -import com.evolveum.midpoint.prism.xnode.ListXNode; import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; -import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -233,7 +194,7 @@ public // DOM Element DomParser domParser = prismContext.getParserDom(); XNode xnode = domParser.parseElementContent((Element)element); - subItem = (Item) prismContext.getXnodeProcessor().parseItem(xnode, elementName, itemDefinition); + subItem = (Item) prismContext.getXnodeProcessor().parseItem(xnode, elementName, itemDefinition, ParsingContext.createDefault()); } else if (element instanceof JAXBElement) { // JAXB Element JAXBElement jaxbElement = (JAXBElement)element; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java index 30b1dc77831..6ca6b2249e0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java @@ -15,12 +15,7 @@ */ package com.evolveum.midpoint.prism.parser; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.Raw; -import com.evolveum.midpoint.prism.Revivable; -import com.evolveum.midpoint.prism.SerializationContext; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.parser.util.XNodeProcessorUtil; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; @@ -85,19 +80,11 @@ public class PrismBeanConverter { private PrismContext prismContext; - // Not fully implemented yet. - private XNodeProcessorEvaluationMode mode; - public PrismBeanConverter(PrismContext prismContext, PrismBeanInspector inspector) { - this(prismContext, inspector, XNodeProcessorEvaluationMode.STRICT); - } - - public PrismBeanConverter(PrismContext prismContext, PrismBeanInspector inspector, XNodeProcessorEvaluationMode mode) { this.prismContext = prismContext; this.inspector = inspector; - this.mode = mode; } - + public PrismContext getPrismContext() { return prismContext; } @@ -125,40 +112,40 @@ public QName determineTypeForClass(Class clazz) { return inspector.determineTypeForClass(clazz); } - public T unmarshall(MapXNode xnode, QName typeQName) throws SchemaException { + public T unmarshall(MapXNode xnode, QName typeQName, ParsingContext pc) throws SchemaException { Class classType = getSchemaRegistry().determineCompileTimeClass(typeQName); - return unmarshall(xnode, classType); + return unmarshall(xnode, classType, pc); } - public T unmarshall(XNode xnode, Class beanClass) throws SchemaException{ + public T unmarshall(XNode xnode, Class beanClass, ParsingContext pc) throws SchemaException{ if (xnode instanceof PrimitiveXNode){ - return unmarshallPrimitive((PrimitiveXNode) xnode, beanClass); + return unmarshallPrimitive((PrimitiveXNode) xnode, beanClass, pc); } else if (xnode instanceof MapXNode){ - return unmarshall((MapXNode) xnode, beanClass); + return unmarshall((MapXNode) xnode, beanClass, pc); } else if (xnode instanceof RootXNode){ - return unmarshall(((RootXNode) xnode).getSubnode(), beanClass); + return unmarshall(((RootXNode) xnode).getSubnode(), beanClass, pc); } else throw new IllegalStateException("Unexpected xnode " + xnode +". Could not unmarshall value"); } - public T unmarshall(MapXNode xnode, Class beanClass) throws SchemaException { + public T unmarshall(MapXNode xnode, Class beanClass, ParsingContext pc) throws SchemaException { if (PolyStringType.class.equals(beanClass)) { PolyString polyString = unmarshalPolyString(xnode); return (T) polyString; // violates the method interface but ... TODO fix it } else if (ProtectedStringType.class.equals(beanClass)) { ProtectedStringType protectedType = new ProtectedStringType(); - XNodeProcessorUtil.parseProtectedType(protectedType, xnode, prismContext); + XNodeProcessorUtil.parseProtectedType(protectedType, xnode, prismContext, pc); return (T) protectedType; } else if (ProtectedByteArrayType.class.equals(beanClass)) { ProtectedByteArrayType protectedType = new ProtectedByteArrayType(); - XNodeProcessorUtil.parseProtectedType(protectedType, xnode, prismContext); + XNodeProcessorUtil.parseProtectedType(protectedType, xnode, prismContext, pc); return (T) protectedType; } else if (SchemaDefinitionType.class.equals(beanClass)) { SchemaDefinitionType schemaDefType = unmarshalSchemaDefinitionType(xnode); return (T) schemaDefType; } else if (prismContext.getSchemaRegistry().determineDefinitionFromClass(beanClass) != null) { - return (T) prismContext.getXnodeProcessor().parseObject(xnode).asObjectable(); + return (T) prismContext.getXnodeProcessor().parseObject(xnode, pc).asObjectable(); } else if (XmlAsStringType.class.equals(beanClass)) { // reading a string represented a XML-style content // used e.g. when reading report templates (embedded XML) @@ -178,7 +165,7 @@ public T unmarshall(MapXNode xnode, Class beanClass) throws SchemaExcepti Set keysToParse; // only these keys will be parsed (null if all) if (SearchFilterType.class.isAssignableFrom(beanClass)) { keysToParse = Collections.singleton("condition"); // TODO fix this BRUTAL HACK - it is here because of c:ConditionalSearchFilterType - bean = (T) unmarshalSearchFilterType(xnode, (Class) beanClass); + bean = (T) unmarshalSearchFilterType(xnode, (Class) beanClass, pc); } else { keysToParse = null; try { @@ -199,7 +186,7 @@ public T unmarshall(MapXNode xnode, Class beanClass) throws SchemaExcepti } else{ throw new SchemaException("Unexpected subtype of protected data type: " + bean.getClass()); } - XNodeProcessorUtil.parseProtectedType(protectedDataType, xnode, prismContext); + XNodeProcessorUtil.parseProtectedType(protectedDataType, xnode, prismContext, pc); return (T) protectedDataType; } @@ -229,14 +216,14 @@ public T unmarshall(MapXNode xnode, Class beanClass) throws SchemaExcepti elementMethod = inspector.findAnyMethod(beanClass); if (elementMethod == null) { String m = "No field "+propName+" in class "+beanClass+" (and no element method in object factory too)"; - if (mode == XNodeProcessorEvaluationMode.COMPAT) { - LOGGER.warn("{}", m); + if (pc.isCompat()) { + pc.warn(LOGGER, m); continue; } else { throw new SchemaException(m); } } - unmarshallToAny(bean, elementMethod, key, xsubnode); + unmarshallToAny(bean, elementMethod, key, xsubnode, pc); continue; } @@ -248,18 +235,18 @@ public T unmarshall(MapXNode xnode, Class beanClass) throws SchemaExcepti elementMethod = inspector.findAnyMethod(beanClass); if (elementMethod == null) { String m = "No field "+propName+" in class "+beanClass+" (and no element method in object factory too)"; - if (mode == XNodeProcessorEvaluationMode.COMPAT) { - LOGGER.warn("{}", m); + if (pc.isCompat()) { + pc.warn(LOGGER, m); continue; } else { throw new SchemaException(m); } } - unmarshallToAny(bean, elementMethod, key, xsubnode); + unmarshallToAny(bean, elementMethod, key, xsubnode, pc); continue; // throw new SchemaException("No field "+propName+" in class "+beanClass+" (no suitable substitution and no 'any' field)"); } - unmarshallToAny(bean, field, key, xsubnode); + unmarshallToAny(bean, field, key, xsubnode, pc); continue; } } @@ -290,8 +277,8 @@ public T unmarshall(MapXNode xnode, Class beanClass) throws SchemaExcepti getter = inspector.findPropertyGetter(beanClass, fieldName); if (getter == null) { String m = "Cannot find setter or getter for field " + fieldName + " in " + beanClass; - if (mode == XNodeProcessorEvaluationMode.COMPAT) { - LOGGER.warn("{}", m); + if (pc.isCompat()) { + pc.warn(LOGGER, m); continue; } else { throw new SchemaException(m); @@ -431,32 +418,32 @@ public T unmarshall(MapXNode xnode, Class beanClass) throws SchemaExcepti ListXNode xlist = (ListXNode)xsubnode; if (setter != null) { try { - propValue = convertSinglePropValue(xsubnode, fieldName, paramType, storeAsRawType, beanClass, paramNamespace); + propValue = convertSinglePropValue(xsubnode, fieldName, paramType, storeAsRawType, beanClass, paramNamespace, pc); } catch (SchemaException e) { - problem = processSchemaException(e, xsubnode); + problem = processSchemaException(e, xsubnode, pc); } } else { // No setter, we have to use collection getter propValues = new ArrayList<>(xlist.size()); for (XNode xsubsubnode: xlist) { try { - propValues.add(convertSinglePropValue(xsubsubnode, fieldName, paramType, storeAsRawType, beanClass, paramNamespace)); + propValues.add(convertSinglePropValue(xsubsubnode, fieldName, paramType, storeAsRawType, beanClass, paramNamespace, pc)); } catch (SchemaException e) { - problem = processSchemaException(e, xsubsubnode); + problem = processSchemaException(e, xsubsubnode, pc); } } } } else { try { - propValue = convertSinglePropValue(xsubnode, fieldName, paramType, storeAsRawType, beanClass, paramNamespace); + propValue = convertSinglePropValue(xsubnode, fieldName, paramType, storeAsRawType, beanClass, paramNamespace, pc); } catch (SchemaException e) { - problem = processSchemaException(e, xsubnode); + problem = processSchemaException(e, xsubnode, pc); } } if (setter != null) { try { - setter.invoke(bean, prepareValueToBeStored(propValue, wrapInJaxbElement, objectFactory, elementMethod, propName, beanClass)); + setter.invoke(bean, prepareValueToBeStored(propValue, wrapInJaxbElement, objectFactory, elementMethod, propName, beanClass, pc)); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { throw new SystemException("Cannot invoke setter "+setter+" on bean of type "+beanClass+": "+e.getMessage(), e); } @@ -474,15 +461,15 @@ public T unmarshall(MapXNode xnode, Class beanClass) throws SchemaExcepti throw new SystemException("Getter "+getter+" on bean of type "+beanClass+" returned "+getterReturn+" instead of collection"); } if (propValue != null) { - col.add(prepareValueToBeStored(propValue, wrapInJaxbElement, objectFactory, elementMethod, propName, beanClass)); + col.add(prepareValueToBeStored(propValue, wrapInJaxbElement, objectFactory, elementMethod, propName, beanClass, pc)); } else if (propValues != null) { for (Object propVal: propValues) { - col.add(prepareValueToBeStored(propVal, wrapInJaxbElement, objectFactory, elementMethod, propName, beanClass)); + col.add(prepareValueToBeStored(propVal, wrapInJaxbElement, objectFactory, elementMethod, propName, beanClass, pc)); } } else if (!problem) { throw new IllegalStateException("Strange. Multival property "+propName+" in "+beanClass+" produced null values list, parsed from "+xnode); } - checkJaxbElementConsistence(col); + checkJaxbElementConsistence(col, pc); } else { throw new IllegalStateException("Uh? No setter nor getter."); } @@ -506,7 +493,7 @@ public T unmarshall(MapXNode xnode, Class beanClass) throws SchemaExcepti * * Because it cannot be reasonably serialized in XNode ( gets changed to