Skip to content

Commit

Permalink
Partially refactored BeanMarshaller. A couple of fixes (prism and sch…
Browse files Browse the repository at this point in the history
…ema pass).
  • Loading branch information
mederly committed Oct 26, 2016
1 parent 2906066 commit b3f248c
Show file tree
Hide file tree
Showing 26 changed files with 993 additions and 889 deletions.
Expand Up @@ -52,7 +52,7 @@ public class PrismContextImpl implements PrismContext {
private static final Trace LOGGER = TraceManager.getTrace(PrismContextImpl.class);

private static boolean allowSchemalessSerialization = true;
private static boolean extraValidation = false; // TODO replace by something serious
private static boolean extraValidation = true; // TODO replace by something serious

@NotNull private final SchemaRegistryImpl schemaRegistry;
@NotNull private final LexicalProcessorRegistry lexicalProcessorRegistry;
Expand Down
Expand Up @@ -29,6 +29,7 @@
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
Expand Down Expand Up @@ -333,7 +334,7 @@ private <T> PrimitiveXNode<T> parsePrimitiveElement(final Element element) throw

private static <T> T parsePrimitiveElementValue(Element element, QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException {
try {
if (ItemPath.XSD_TYPE.equals(typeName)) {
if (ItemPathType.COMPLEX_TYPE.equals(typeName)) {
return (T) parsePath(element);
} else if (DOMUtil.XSD_QNAME.equals(typeName)) {
return (T) DOMUtil.getQNameValue(element);
Expand Down Expand Up @@ -384,9 +385,10 @@ private static <T> T parsePrimitiveAttrValue(Attr attr, QName typeName, XNodePro
}
}

private static ItemPath parsePath(Element element) {
@NotNull
private static ItemPathType parsePath(Element element) {
XPathHolder holder = new XPathHolder(element);
return holder.toItemPath();
return new ItemPathType(holder.toItemPath());
}

private SchemaXNode parseSchemaElement(Element schemaElement) {
Expand Down
Expand Up @@ -29,6 +29,7 @@
import com.evolveum.midpoint.prism.xnode.XNode;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.w3c.dom.DOMException;
Expand Down Expand Up @@ -238,13 +239,14 @@ private void serializePrimitiveElementOrAttribute(PrimitiveXNode<?> xprim, Eleme

Element element = null;

if (typeQName.equals(ItemPath.XSD_TYPE)) {
ItemPath itemPath = (ItemPath)xprim.getValue();
if (itemPath != null) {
if (ItemPathType.COMPLEX_TYPE.equals(typeQName)) {
//ItemPathType itemPathType = //ItemPathType.asItemPathType(xprim.getValue()); // TODO fix this hack
ItemPathType itemPathType = (ItemPathType) xprim.getValue();
if (itemPathType != null) {
if (asAttribute) {
throw new UnsupportedOperationException("Serializing ItemPath as an attribute is not supported yet");
}
XPathHolder holder = new XPathHolder(itemPath);
XPathHolder holder = new XPathHolder(itemPathType.getItemPath());
element = holder.toElement(elementOrAttributeName, parentElement.getOwnerDocument());
parentElement.appendChild(element);
}
Expand All @@ -262,7 +264,7 @@ private void serializePrimitiveElementOrAttribute(PrimitiveXNode<?> xprim, Eleme
parentElement.appendChild(element);
}

if (typeQName.equals(DOMUtil.XSD_QNAME)) {
if (DOMUtil.XSD_QNAME.equals(typeQName)) {
QName value = (QName) xprim.getParsedValueWithoutRecording(DOMUtil.XSD_QNAME);
value = setQNamePrefixExplicitIfNeeded(value);
if (asAttribute) {
Expand Down
Expand Up @@ -10,22 +10,20 @@
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;

public class ItemPathSerializer extends JsonSerializer<ItemPath>{
public class ItemPathSerializer extends JsonSerializer<ItemPath> {

@Override
public void serialize(ItemPath value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
XPathHolder xpath = new XPathHolder(value);
String path = xpath.getXPathWithDeclarations(true);
// value.
jgen.writeObject(path);

}

@Override
public void serializeWithType(ItemPath value, JsonGenerator jgen, SerializerProvider provider,
TypeSerializer typeSer) throws IOException, JsonProcessingException {
// TODO Auto-generated method stub
serialize(value, jgen, provider);
}

Expand Down
@@ -0,0 +1,44 @@
/*
* 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.lex.json;

import com.evolveum.midpoint.prism.marshaller.XPathHolder;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;

public class ItemPathTypeSerializer extends JsonSerializer<ItemPathType> {

@Override
public void serialize(@NotNull ItemPathType value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
XPathHolder xpath = new XPathHolder(value.getItemPath());
String path = xpath.getXPathWithDeclarations(true);
jgen.writeObject(path);

}

@Override
public void serializeWithType(@NotNull ItemPathType value, JsonGenerator jgen, SerializerProvider provider,
TypeSerializer typeSer) throws IOException {
serialize(value, jgen, provider);
}
}
Expand Up @@ -21,6 +21,7 @@
import com.evolveum.midpoint.prism.xnode.PrimitiveXNode;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
Expand Down Expand Up @@ -103,6 +104,7 @@ private Module createSerializerModule(){
module.addSerializer(QName.class, new QNameSerializer());
module.addSerializer(PolyString.class, new PolyStringSerializer());
module.addSerializer(ItemPath.class, new ItemPathSerializer());
module.addSerializer(ItemPathType.class, new ItemPathTypeSerializer());
// module.addSerializer(Element.class, new DomElementJsonSerializer());
// module.addSerializer(JAXBElement.class, new JaxbElementSerializer());
return module;
Expand Down
Expand Up @@ -10,7 +10,7 @@
import com.fasterxml.jackson.databind.ext.CoreXMLSerializers.XMLGregorianCalendarSerializer;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;

public class XmlGregorialCalendarSerializer extends XMLGregorianCalendarSerializer{
public class XmlGregorianCalendarSerializer extends XMLGregorianCalendarSerializer{

@Override
public void serializeWithType(XMLGregorianCalendar value, JsonGenerator jgen,
Expand Down
Expand Up @@ -25,6 +25,7 @@
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonGenerator;
Expand Down Expand Up @@ -89,10 +90,13 @@ private ObjectMapper configureMapperForSerialization(){
// mapper.configure(SerializationFeaCture.);
// mapper.setSerializationInclusion(Include.NON_NULL);
mapper.registerModule(createSerializerModule());
mapper.enableDefaultTyping(DefaultTyping.NON_CONCRETE_AND_ARRAYS);
mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.EXISTING_PROPERTY);
//mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.EXTERNAL_PROPERTY);
mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY);

mapper.disableDefaultTyping();

// mapper.enableDefaultTyping(DefaultTyping.NON_CONCRETE_AND_ARRAYS);
// mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.EXISTING_PROPERTY);
// //mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.EXTERNAL_PROPERTY);
// mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY);

return mapper;
}
Expand All @@ -102,8 +106,9 @@ private Module createSerializerModule(){
module.addSerializer(QName.class, new QNameSerializer());
module.addSerializer(PolyString.class, new PolyStringSerializer());
module.addSerializer(ItemPath.class, new ItemPathSerializer());
module.addSerializer(ItemPathType.class, new ItemPathTypeSerializer());
// module.addSerializer(JAXBElement.class, new JaxbElementSerializer());
module.addSerializer(XMLGregorianCalendar.class, new XmlGregorialCalendarSerializer());
module.addSerializer(XMLGregorianCalendar.class, new XmlGregorianCalendarSerializer());
module.addSerializer(Element.class, new DomElementSerializer());
return module;
}
Expand Down
Expand Up @@ -13,6 +13,8 @@

public class MidpointYAMLFactory extends YAMLFactory {



@Override
protected MidpointYAMLGenerator _createGenerator(Writer out, IOContext ctxt) throws IOException {
int feats = _yamlGeneratorFeatures;
Expand Down

0 comments on commit b3f248c

Please sign in to comment.