http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/20351253/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java deleted file mode 100755 index 5163412..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java +++ /dev/null @@ -1,421 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.olingo.commons.core.serialization; - -import java.io.IOException; -import java.io.InputStream; -import java.util.AbstractMap.SimpleEntry; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.lang3.StringUtils; -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.ODataError; -import org.apache.olingo.commons.api.ODataPropertyType; -import org.apache.olingo.commons.api.data.Annotatable; -import org.apache.olingo.commons.api.data.Annotation; -import org.apache.olingo.commons.api.data.ComplexValue; -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.EntityCollection; -import org.apache.olingo.commons.api.data.Link; -import org.apache.olingo.commons.api.data.Linked; -import org.apache.olingo.commons.api.data.Property; -import org.apache.olingo.commons.api.data.ResWrap; -import org.apache.olingo.commons.api.data.Valuable; -import org.apache.olingo.commons.api.data.ValueType; -import org.apache.olingo.commons.api.edm.EdmPrimitiveType; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; -import org.apache.olingo.commons.api.edm.geo.Geospatial; -import org.apache.olingo.commons.api.serialization.ODataDeserializer; -import org.apache.olingo.commons.api.serialization.ODataDeserializerException; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; - -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.ObjectCodec; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; - -public class JsonDeserializer implements ODataDeserializer { - - protected final Pattern CUSTOM_ANNOTATION = Pattern.compile("(.+)@(.+)\\.(.+)"); - - protected final boolean serverMode; - - private JsonGeoValueDeserializer geoDeserializer; - - private JsonParser parser; - - public JsonDeserializer(final boolean serverMode) { - this.serverMode = serverMode; - } - - private JsonGeoValueDeserializer getGeoDeserializer() { - if (geoDeserializer == null) { - geoDeserializer = new JsonGeoValueDeserializer(); - } - return geoDeserializer; - } - - protected String getJSONAnnotation(final String string) { - return StringUtils.prependIfMissing(string, "@"); - } - - protected String getTitle(final Map.Entry<String, JsonNode> entry) { - return entry.getKey().substring(0, entry.getKey().indexOf('@')); - } - - protected String setInline(final String name, final String suffix, final JsonNode tree, - final ObjectCodec codec, final Link link) throws IOException { - - final String entityNamePrefix = name.substring(0, name.indexOf(suffix)); - if (tree.has(entityNamePrefix)) { - final JsonNode inline = tree.path(entityNamePrefix); - JsonEntityDeserializer entityDeserializer = new JsonEntityDeserializer(serverMode); - - if (inline instanceof ObjectNode) { - link.setType(Constants.ENTITY_NAVIGATION_LINK_TYPE); - link.setInlineEntity(entityDeserializer.doDeserialize(inline.traverse(codec)).getPayload()); - - } else if (inline instanceof ArrayNode) { - link.setType(Constants.ENTITY_SET_NAVIGATION_LINK_TYPE); - - final EntityCollection entitySet = new EntityCollection(); - for (final Iterator<JsonNode> entries = inline.elements(); entries.hasNext();) { - entitySet.getEntities().add(entityDeserializer.doDeserialize(entries.next().traverse(codec)).getPayload()); - } - - link.setInlineEntitySet(entitySet); - } - } - return entityNamePrefix; - } - - protected void links(final Map.Entry<String, JsonNode> field, final Linked linked, final Set<String> toRemove, - final JsonNode tree, final ObjectCodec codec) throws IOException { - if (serverMode) { - serverLinks(field, linked, toRemove, tree, codec); - } else { - clientLinks(field, linked, toRemove, tree, codec); - } - } - - private void clientLinks(final Map.Entry<String, JsonNode> field, final Linked linked, final Set<String> toRemove, - final JsonNode tree, final ObjectCodec codec) throws IOException { - - if (field.getKey().endsWith(Constants.JSON_NAVIGATION_LINK)) { - final Link link = new Link(); - link.setTitle(getTitle(field)); - link.setRel(Constants.NS_NAVIGATION_LINK_REL + getTitle(field)); - - if (field.getValue().isValueNode()) { - link.setHref(field.getValue().textValue()); - link.setType(Constants.ENTITY_NAVIGATION_LINK_TYPE); - } - - linked.getNavigationLinks().add(link); - - toRemove.add(field.getKey()); - toRemove.add(setInline(field.getKey(), Constants.JSON_NAVIGATION_LINK, tree, codec, link)); - } else if (field.getKey().endsWith(Constants.JSON_ASSOCIATION_LINK)) { - final Link link = new Link(); - link.setTitle(getTitle(field)); - link.setRel(Constants.NS_ASSOCIATION_LINK_REL + getTitle(field)); - link.setHref(field.getValue().textValue()); - link.setType(Constants.ASSOCIATION_LINK_TYPE); - linked.getAssociationLinks().add(link); - - toRemove.add(field.getKey()); - } - } - - private void serverLinks(final Map.Entry<String, JsonNode> field, final Linked linked, final Set<String> toRemove, - final JsonNode tree, final ObjectCodec codec) throws IOException { - - if (field.getKey().endsWith(Constants.JSON_BIND_LINK_SUFFIX) - || field.getKey().endsWith(Constants.JSON_NAVIGATION_LINK)) { - - if (field.getValue().isValueNode()) { - final String suffix = field.getKey().replaceAll("^.*@", "@"); - - final Link link = new Link(); - link.setTitle(getTitle(field)); - link.setRel(Constants.NS_NAVIGATION_LINK_REL + getTitle(field)); - link.setHref(field.getValue().textValue()); - link.setType(Constants.ENTITY_NAVIGATION_LINK_TYPE); - linked.getNavigationLinks().add(link); - - toRemove.add(setInline(field.getKey(), suffix, tree, codec, link)); - } else if (field.getValue().isArray()) { - for (final Iterator<JsonNode> itor = field.getValue().elements(); itor.hasNext();) { - final JsonNode node = itor.next(); - - final Link link = new Link(); - link.setTitle(getTitle(field)); - link.setRel(Constants.NS_NAVIGATION_LINK_REL + getTitle(field)); - link.setHref(node.asText()); - link.setType(Constants.ENTITY_SET_NAVIGATION_LINK_TYPE); - linked.getNavigationLinks().add(link); - toRemove.add(setInline(field.getKey(), Constants.JSON_BIND_LINK_SUFFIX, tree, codec, link)); - } - } - toRemove.add(field.getKey()); - } - } - - private Map.Entry<ODataPropertyType, EdmTypeInfo> guessPropertyType(final JsonNode node) { - ODataPropertyType type; - String typeExpression = null; - - if (node.isValueNode() || node.isNull()) { - type = ODataPropertyType.PRIMITIVE; - typeExpression = guessPrimitiveTypeKind(node).getFullQualifiedName().toString(); - } else if (node.isArray()) { - type = ODataPropertyType.COLLECTION; - if (node.has(0) && node.get(0).isValueNode()) { - typeExpression = "Collection(" + guessPrimitiveTypeKind(node.get(0)) + ')'; - } - } else if (node.isObject()) { - if (node.has(Constants.ATTR_TYPE)) { - type = ODataPropertyType.PRIMITIVE; - typeExpression = "Edm.Geography" + node.get(Constants.ATTR_TYPE).asText(); - } else { - type = ODataPropertyType.COMPLEX; - } - } else { - type = ODataPropertyType.EMPTY; - } - - final EdmTypeInfo typeInfo = typeExpression == null ? null : - new EdmTypeInfo.Builder().setTypeExpression(typeExpression).build(); - return new SimpleEntry<ODataPropertyType, EdmTypeInfo>(type, typeInfo); - } - - private EdmPrimitiveTypeKind guessPrimitiveTypeKind(final JsonNode node) { - return node.isShort() ? EdmPrimitiveTypeKind.Int16 : - node.isInt() ? EdmPrimitiveTypeKind.Int32 : - node.isLong() ? EdmPrimitiveTypeKind.Int64 : - node.isBoolean() ? EdmPrimitiveTypeKind.Boolean : - node.isFloat() ? EdmPrimitiveTypeKind.Single : - node.isDouble() ? EdmPrimitiveTypeKind.Double : - node.isBigDecimal() ? EdmPrimitiveTypeKind.Decimal : - EdmPrimitiveTypeKind.String; - } - - protected void populate(final Annotatable annotatable, final List<Property> properties, - final ObjectNode tree, final ObjectCodec codec) - throws IOException, EdmPrimitiveTypeException { - - String type = null; - Annotation annotation = null; - for (final Iterator<Map.Entry<String, JsonNode>> itor = tree.fields(); itor.hasNext();) { - final Map.Entry<String, JsonNode> field = itor.next(); - final Matcher customAnnotation = CUSTOM_ANNOTATION.matcher(field.getKey()); - - if (field.getKey().charAt(0) == '@') { - final Annotation entityAnnot = new Annotation(); - entityAnnot.setTerm(field.getKey().substring(1)); - - value(entityAnnot, field.getValue(), codec); - if (annotatable != null) { - annotatable.getAnnotations().add(entityAnnot); - } - } else if (type == null && field.getKey().endsWith(getJSONAnnotation(Constants.JSON_TYPE))) { - type = field.getValue().asText(); - } else if (annotation == null && customAnnotation.matches() && !"odata".equals(customAnnotation.group(2))) { - annotation = new Annotation(); - annotation.setTerm(customAnnotation.group(2) + "." + customAnnotation.group(3)); - value(annotation, field.getValue(), codec); - } else { - final Property property = new Property(); - property.setName(field.getKey()); - property.setType(type == null - ? null - : new EdmTypeInfo.Builder().setTypeExpression(type).build().internal()); - type = null; - - value(property, field.getValue(), codec); - properties.add(property); - - if (annotation != null) { - property.getAnnotations().add(annotation); - annotation = null; - } - } - } - } - - private Object fromPrimitive(final JsonNode node, final EdmTypeInfo typeInfo) throws EdmPrimitiveTypeException { - return node.isNull() ? null - : typeInfo == null ? node.asText() - : typeInfo.getPrimitiveTypeKind().isGeospatial() - ? getGeoDeserializer().deserialize(node, typeInfo) - : ((EdmPrimitiveType) typeInfo.getType()) - .valueOfString(node.asText(), true, null, - Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, true, - ((EdmPrimitiveType) typeInfo.getType()).getDefaultType()); - } - - private Object fromComplex(final ObjectNode node, final ObjectCodec codec) - throws IOException, EdmPrimitiveTypeException { - - final ComplexValue complexValue = new ComplexValue(); - final Set<String> toRemove = new HashSet<String>(); - for (final Iterator<Map.Entry<String, JsonNode>> itor = node.fields(); itor.hasNext();) { - final Map.Entry<String, JsonNode> field = itor.next(); - - links(field, complexValue, toRemove, node, codec); - } - node.remove(toRemove); - - populate(complexValue, complexValue.getValue(), node, codec); - return complexValue; - } - - private void fromCollection(final Valuable valuable, final Iterator<JsonNode> nodeItor, final EdmTypeInfo typeInfo, - final ObjectCodec codec) throws IOException, EdmPrimitiveTypeException { - - final List<Object> values = new ArrayList<Object>(); - ValueType valueType = ValueType.COLLECTION_PRIMITIVE; - - final EdmTypeInfo type = typeInfo == null ? null - : new EdmTypeInfo.Builder().setTypeExpression(typeInfo.getFullQualifiedName().toString()).build(); - - while (nodeItor.hasNext()) { - final JsonNode child = nodeItor.next(); - - if (child.isValueNode()) { - if (typeInfo == null || typeInfo.isPrimitiveType()) { - final Object value = fromPrimitive(child, type); - valueType = value instanceof Geospatial ? ValueType.COLLECTION_GEOSPATIAL : ValueType.COLLECTION_PRIMITIVE; - values.add(value); - } else { - valueType = ValueType.COLLECTION_ENUM; - values.add(child.asText()); - } - } else if (child.isContainerNode()) { - if (child.has(Constants.JSON_TYPE)) { - ((ObjectNode) child).remove(Constants.JSON_TYPE); - } - final Object value = fromComplex((ObjectNode) child, codec); - valueType = ValueType.COLLECTION_COMPLEX; - values.add(value); - } - } - valuable.setValue(valueType, values); - } - - protected void value(final Valuable valuable, final JsonNode node, final ObjectCodec codec) - throws IOException, EdmPrimitiveTypeException { - - EdmTypeInfo typeInfo = StringUtils.isBlank(valuable.getType()) ? null - : new EdmTypeInfo.Builder().setTypeExpression(valuable.getType()).build(); - - final Map.Entry<ODataPropertyType, EdmTypeInfo> guessed = guessPropertyType(node); - if (typeInfo == null) { - typeInfo = guessed.getValue(); - } - - final ODataPropertyType propType = typeInfo == null ? guessed.getKey() - : typeInfo.isCollection() ? ODataPropertyType.COLLECTION - : typeInfo.isPrimitiveType() ? ODataPropertyType.PRIMITIVE - : node.isValueNode() ? ODataPropertyType.ENUM : ODataPropertyType.COMPLEX; - - switch (propType) { - case COLLECTION: - fromCollection(valuable, node.elements(), typeInfo, codec); - break; - - case COMPLEX: - if (node.has(Constants.JSON_TYPE)) { - valuable.setType(node.get(Constants.JSON_TYPE).asText()); - ((ObjectNode) node).remove(Constants.JSON_TYPE); - } - final Object value = fromComplex((ObjectNode) node, codec); - valuable.setValue(ValueType.COMPLEX, value); - break; - - case ENUM: - valuable.setValue(ValueType.ENUM, node.asText()); - break; - - case PRIMITIVE: - if (valuable.getType() == null && typeInfo != null) { - valuable.setType(typeInfo.getFullQualifiedName().toString()); - } - final Object primitiveValue = fromPrimitive(node, typeInfo); - valuable.setValue(primitiveValue instanceof Geospatial ? ValueType.GEOSPATIAL : ValueType.PRIMITIVE, - primitiveValue); - break; - - case EMPTY: - default: - valuable.setValue(ValueType.PRIMITIVE, StringUtils.EMPTY); - } - } - - @Override - public ResWrap<EntityCollection> toEntitySet(final InputStream input) throws ODataDeserializerException { - try { - parser = new JsonFactory(new ObjectMapper()).createParser(input); - return new JsonEntitySetDeserializer(serverMode).doDeserialize(parser); - } catch (final IOException e) { - throw new ODataDeserializerException(e); - } - } - - @Override - public ResWrap<Entity> toEntity(final InputStream input) throws ODataDeserializerException { - try { - parser = new JsonFactory(new ObjectMapper()).createParser(input); - return new JsonEntityDeserializer(serverMode).doDeserialize(parser); - } catch (final IOException e) { - throw new ODataDeserializerException(e); - } - } - - @Override - public ResWrap<Property> toProperty(final InputStream input) throws ODataDeserializerException { - try { - parser = new JsonFactory(new ObjectMapper()).createParser(input); - return new JsonPropertyDeserializer(serverMode).doDeserialize(parser); - } catch (final IOException e) { - throw new ODataDeserializerException(e); - } - } - - @Override - public ODataError toError(final InputStream input) throws ODataDeserializerException { - try { - parser = new JsonFactory(new ObjectMapper()).createParser(input); - return new JsonODataErrorDeserializer(serverMode).doDeserialize(parser); - } catch (final IOException e) { - throw new ODataDeserializerException(e); - } - } -}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/20351253/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntityDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntityDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntityDeserializer.java deleted file mode 100644 index 10cc3bb..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntityDeserializer.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.olingo.commons.core.serialization; - -import java.io.IOException; -import java.net.URI; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Matcher; - -import org.apache.commons.lang3.StringUtils; -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.data.Annotation; -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.Link; -import org.apache.olingo.commons.api.data.Operation; -import org.apache.olingo.commons.api.data.ResWrap; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; - -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; - -/** - * Reads JSON string into an entity. - * <br/> - * If metadata information is available, the corresponding entity fields and content will be populated. - */ -public class JsonEntityDeserializer extends JsonDeserializer { - - public JsonEntityDeserializer(final boolean serverMode) { - super(serverMode); - } - - protected ResWrap<Entity> doDeserialize(final JsonParser parser) throws IOException { - - final ObjectNode tree = parser.getCodec().readTree(parser); - - if (tree.has(Constants.VALUE) && tree.get(Constants.VALUE).isArray()) { - throw new JsonParseException("Expected OData Entity, found EntitySet", parser.getCurrentLocation()); - } - - final Entity entity = new Entity(); - - final URI contextURL; - if (tree.hasNonNull(Constants.JSON_CONTEXT)) { - contextURL = URI.create(tree.get(Constants.JSON_CONTEXT).textValue()); - tree.remove(Constants.JSON_CONTEXT); - } else if (tree.hasNonNull(Constants.JSON_METADATA)) { - contextURL = URI.create(tree.get(Constants.JSON_METADATA).textValue()); - tree.remove(Constants.JSON_METADATA); - } else { - contextURL = null; - } - if (contextURL != null) { - entity.setBaseURI(URI.create(StringUtils.substringBefore(contextURL.toASCIIString(), Constants.METADATA))); - } - - final String metadataETag; - if (tree.hasNonNull(Constants.JSON_METADATA_ETAG)) { - metadataETag = tree.get(Constants.JSON_METADATA_ETAG).textValue(); - tree.remove(Constants.JSON_METADATA_ETAG); - } else { - metadataETag = null; - } - - if (tree.hasNonNull(Constants.JSON_ETAG)) { - entity.setETag(tree.get(Constants.JSON_ETAG).textValue()); - tree.remove(Constants.JSON_ETAG); - } - - if (tree.hasNonNull(Constants.JSON_TYPE)) { - entity.setType(new EdmTypeInfo.Builder().setTypeExpression(tree.get(Constants.JSON_TYPE).textValue()).build() - .internal()); - tree.remove(Constants.JSON_TYPE); - } - - if (tree.hasNonNull(Constants.JSON_ID)) { - entity.setId(URI.create(tree.get(Constants.JSON_ID).textValue())); - tree.remove(Constants.JSON_ID); - } - - if (tree.hasNonNull(Constants.JSON_READ_LINK)) { - final Link link = new Link(); - link.setRel(Constants.SELF_LINK_REL); - link.setHref(tree.get(Constants.JSON_READ_LINK).textValue()); - entity.setSelfLink(link); - - tree.remove(Constants.JSON_READ_LINK); - } - - if (tree.hasNonNull(Constants.JSON_EDIT_LINK)) { - final Link link = new Link(); - if (serverMode) { - link.setRel(Constants.EDIT_LINK_REL); - } - link.setHref(tree.get(Constants.JSON_EDIT_LINK).textValue()); - entity.setEditLink(link); - - tree.remove(Constants.JSON_EDIT_LINK); - } - - if (tree.hasNonNull(Constants.JSON_MEDIA_READ_LINK)) { - entity.setMediaContentSource(URI.create(tree.get(Constants.JSON_MEDIA_READ_LINK).textValue())); - tree.remove(Constants.JSON_MEDIA_READ_LINK); - } - if (tree.hasNonNull(Constants.JSON_MEDIA_EDIT_LINK)) { - entity.setMediaContentSource(URI.create(tree.get(Constants.JSON_MEDIA_EDIT_LINK).textValue())); - tree.remove(Constants.JSON_MEDIA_EDIT_LINK); - } - if (tree.hasNonNull(Constants.JSON_MEDIA_CONTENT_TYPE)) { - entity.setMediaContentType(tree.get(Constants.JSON_MEDIA_CONTENT_TYPE).textValue()); - tree.remove(Constants.JSON_MEDIA_CONTENT_TYPE); - } - if (tree.hasNonNull(Constants.JSON_MEDIA_ETAG)) { - entity.setMediaETag(tree.get(Constants.JSON_MEDIA_ETAG).textValue()); - tree.remove(Constants.JSON_MEDIA_ETAG); - } - - final Set<String> toRemove = new HashSet<String>(); - - final Map<String, List<Annotation>> annotations = new HashMap<String, List<Annotation>>(); - for (final Iterator<Map.Entry<String, JsonNode>> itor = tree.fields(); itor.hasNext();) { - final Map.Entry<String, JsonNode> field = itor.next(); - final Matcher customAnnotation = CUSTOM_ANNOTATION.matcher(field.getKey()); - - links(field, entity, toRemove, tree, parser.getCodec()); - if (field.getKey().endsWith(getJSONAnnotation(Constants.JSON_MEDIA_EDIT_LINK))) { - final Link link = new Link(); - link.setTitle(getTitle(field)); - link.setRel(Constants.NS_MEDIA_EDIT_LINK_REL + getTitle(field)); - link.setHref(field.getValue().textValue()); - link.setType(Constants.MEDIA_EDIT_LINK_TYPE); - entity.getMediaEditLinks().add(link); - - if (tree.has(link.getTitle() + getJSONAnnotation(Constants.JSON_MEDIA_ETAG))) { - link.setMediaETag(tree.get(link.getTitle() + getJSONAnnotation(Constants.JSON_MEDIA_ETAG)).asText()); - toRemove.add(link.getTitle() + getJSONAnnotation(Constants.JSON_MEDIA_ETAG)); - } - - toRemove.add(field.getKey()); - toRemove.add(setInline(field.getKey(), getJSONAnnotation(Constants.JSON_MEDIA_EDIT_LINK), tree, parser - .getCodec(), link)); - } else if (field.getKey().endsWith(getJSONAnnotation(Constants.JSON_MEDIA_CONTENT_TYPE))) { - final String linkTitle = getTitle(field); - for (Link link : entity.getMediaEditLinks()) { - if (linkTitle.equals(link.getTitle())) { - link.setType(field.getValue().asText()); - } - } - toRemove.add(field.getKey()); - } else if (field.getKey().charAt(0) == '#') { - final Operation operation = new Operation(); - operation.setMetadataAnchor(field.getKey()); - - final ObjectNode opNode = (ObjectNode) tree.get(field.getKey()); - operation.setTitle(opNode.get(Constants.ATTR_TITLE).asText()); - operation.setTarget(URI.create(opNode.get(Constants.ATTR_TARGET).asText())); - - entity.getOperations().add(operation); - - toRemove.add(field.getKey()); - } else if (customAnnotation.matches() && !"odata".equals(customAnnotation.group(2))) { - final Annotation annotation = new Annotation(); - annotation.setTerm(customAnnotation.group(2) + "." + customAnnotation.group(3)); - try { - value(annotation, field.getValue(), parser.getCodec()); - } catch (final EdmPrimitiveTypeException e) { - throw new IOException(e); - } - - if (!annotations.containsKey(customAnnotation.group(1))) { - annotations.put(customAnnotation.group(1), new ArrayList<Annotation>()); - } - annotations.get(customAnnotation.group(1)).add(annotation); - } - } - - for (Link link : entity.getNavigationLinks()) { - if (annotations.containsKey(link.getTitle())) { - link.getAnnotations().addAll(annotations.get(link.getTitle())); - for (Annotation annotation : annotations.get(link.getTitle())) { - toRemove.add(link.getTitle() + "@" + annotation.getTerm()); - } - } - } - for (Link link : entity.getMediaEditLinks()) { - if (annotations.containsKey(link.getTitle())) { - link.getAnnotations().addAll(annotations.get(link.getTitle())); - for (Annotation annotation : annotations.get(link.getTitle())) { - toRemove.add(link.getTitle() + "@" + annotation.getTerm()); - } - } - } - - tree.remove(toRemove); - - try { - populate(entity, entity.getProperties(), tree, parser.getCodec()); - } catch (final EdmPrimitiveTypeException e) { - throw new IOException(e); - } - - return new ResWrap<Entity>(contextURL, metadataETag, entity); - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/20351253/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySerializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySerializer.java deleted file mode 100644 index ddb789d..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySerializer.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.olingo.commons.core.serialization; - -import java.io.IOException; - -import org.apache.commons.lang3.StringUtils; -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.data.Annotation; -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.Link; -import org.apache.olingo.commons.api.data.Operation; -import org.apache.olingo.commons.api.data.Property; -import org.apache.olingo.commons.api.data.ResWrap; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; -import org.apache.olingo.commons.api.format.ODataFormat; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; - -import com.fasterxml.jackson.core.JsonGenerator; - -/** - * Writes out JSON string from an entity. - */ -public class JsonEntitySerializer extends JsonSerializer { - - public JsonEntitySerializer(final boolean serverMode) { - super(serverMode); - } - - public JsonEntitySerializer(final boolean serverMode, final ODataFormat format) { - super(serverMode, format); - } - - protected void doSerialize(final Entity entity, final JsonGenerator jgen) - throws IOException, EdmPrimitiveTypeException { - - doContainerSerialize(new ResWrap<Entity>(null, null, entity), jgen); - } - - protected void doContainerSerialize(final ResWrap<Entity> container, final JsonGenerator jgen) - throws IOException, EdmPrimitiveTypeException { - - final Entity entity = container.getPayload(); - - jgen.writeStartObject(); - - if (serverMode) { - if (container.getContextURL() != null) { - jgen.writeStringField(Constants.JSON_CONTEXT, container.getContextURL().toASCIIString()); - } - if (StringUtils.isNotBlank(container.getMetadataETag())) { - jgen.writeStringField(Constants.JSON_METADATA_ETAG, container.getMetadataETag()); - } - - if (StringUtils.isNotBlank(entity.getETag())) { - jgen.writeStringField(Constants.JSON_ETAG, entity.getETag()); - } - } - - if (StringUtils.isNotBlank(entity.getType()) && format != ODataFormat.JSON_NO_METADATA) { - jgen.writeStringField(Constants.JSON_TYPE, - new EdmTypeInfo.Builder().setTypeExpression(entity.getType()).build().external()); - } - - if (entity.getId() != null && format != ODataFormat.JSON_NO_METADATA) { - jgen.writeStringField(Constants.JSON_ID, entity.getId().toASCIIString()); - } - - for (Annotation annotation : entity.getAnnotations()) { - valuable(jgen, annotation, "@" + annotation.getTerm()); - } - - for (Property property : entity.getProperties()) { - valuable(jgen, property, property.getName()); - } - - if (serverMode && entity.getEditLink() != null && StringUtils.isNotBlank(entity.getEditLink().getHref())) { - jgen.writeStringField(Constants.JSON_EDIT_LINK, - entity.getEditLink().getHref()); - - if (entity.isMediaEntity()) { - jgen.writeStringField(Constants.JSON_MEDIA_READ_LINK, - entity.getEditLink().getHref() + "/$value"); - } - } - - if (format != ODataFormat.JSON_NO_METADATA) { - links(entity, jgen); - } - - for (Link link : entity.getMediaEditLinks()) { - if (link.getTitle() == null) { - jgen.writeStringField(Constants.JSON_MEDIA_EDIT_LINK, link.getHref()); - } - - if (link.getInlineEntity() != null) { - jgen.writeObjectField(link.getTitle(), link.getInlineEntity()); - } - if (link.getInlineEntitySet() != null) { - jgen.writeArrayFieldStart(link.getTitle()); - for (Entity subEntry : link.getInlineEntitySet().getEntities()) { - jgen.writeObject(subEntry); - } - jgen.writeEndArray(); - } - } - - if (serverMode) { - for (Operation operation : entity.getOperations()) { - jgen.writeObjectFieldStart("#" + StringUtils.substringAfterLast(operation.getMetadataAnchor(), "#")); - jgen.writeStringField(Constants.ATTR_TITLE, operation.getTitle()); - jgen.writeStringField(Constants.ATTR_TARGET, operation.getTarget().toASCIIString()); - jgen.writeEndObject(); - } - } - - jgen.writeEndObject(); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/20351253/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySetDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySetDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySetDeserializer.java deleted file mode 100644 index 354d4dd..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySetDeserializer.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.olingo.commons.core.serialization; - -import java.io.IOException; -import java.net.URI; -import java.util.Iterator; -import java.util.Map; - -import org.apache.commons.lang3.StringUtils; -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.data.Annotation; -import org.apache.olingo.commons.api.data.EntityCollection; -import org.apache.olingo.commons.api.data.ResWrap; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; - -/** - * Reads JSON string into an entity set. - * <br/> - * If metadata information is available, the corresponding entity fields and content will be populated. - */ -public class JsonEntitySetDeserializer extends JsonDeserializer { - - public JsonEntitySetDeserializer(final boolean serverMode) { - super(serverMode); - } - - protected ResWrap<EntityCollection> doDeserialize(final JsonParser parser) throws IOException { - - final ObjectNode tree = (ObjectNode) parser.getCodec().readTree(parser); - - if (!tree.has(Constants.VALUE)) { - return null; - } - - final EntityCollection entitySet = new EntityCollection(); - - URI contextURL; - if (tree.hasNonNull(Constants.JSON_CONTEXT)) { - contextURL = URI.create(tree.get(Constants.JSON_CONTEXT).textValue()); - tree.remove(Constants.JSON_CONTEXT); - } else if (tree.hasNonNull(Constants.JSON_METADATA)) { - contextURL = URI.create(tree.get(Constants.JSON_METADATA).textValue()); - tree.remove(Constants.JSON_METADATA); - } else { - contextURL = null; - } - if (contextURL != null) { - entitySet.setBaseURI(URI.create(StringUtils.substringBefore(contextURL.toASCIIString(), Constants.METADATA))); - } - - final String metadataETag; - if (tree.hasNonNull(Constants.JSON_METADATA_ETAG)) { - metadataETag = tree.get(Constants.JSON_METADATA_ETAG).textValue(); - tree.remove(Constants.JSON_METADATA_ETAG); - } else { - metadataETag = null; - } - - if (tree.hasNonNull(Constants.JSON_COUNT)) { - entitySet.setCount(tree.get(Constants.JSON_COUNT).asInt()); - tree.remove(Constants.JSON_COUNT); - } - if (tree.hasNonNull(Constants.JSON_NEXT_LINK)) { - entitySet.setNext(URI.create(tree.get(Constants.JSON_NEXT_LINK).textValue())); - tree.remove(Constants.JSON_NEXT_LINK); - } - if (tree.hasNonNull(Constants.JSON_DELTA_LINK)) { - entitySet.setDeltaLink(URI.create(tree.get(Constants.JSON_DELTA_LINK).textValue())); - tree.remove(Constants.JSON_DELTA_LINK); - } - - if (tree.hasNonNull(Constants.VALUE)) { - final JsonEntityDeserializer entityDeserializer = new JsonEntityDeserializer(serverMode); - for (JsonNode jsonNode : tree.get(Constants.VALUE)) { - entitySet.getEntities().add( - entityDeserializer.doDeserialize(jsonNode.traverse(parser.getCodec())).getPayload()); - } - tree.remove(Constants.VALUE); - } - - // any remaining entry is supposed to be an annotation or is ignored - for (final Iterator<Map.Entry<String, JsonNode>> itor = tree.fields(); itor.hasNext();) { - final Map.Entry<String, JsonNode> field = itor.next(); - if (field.getKey().charAt(0) == '@') { - final Annotation annotation = new Annotation(); - annotation.setTerm(field.getKey().substring(1)); - - try { - value(annotation, field.getValue(), parser.getCodec()); - } catch (final EdmPrimitiveTypeException e) { - throw new IOException(e); - } - entitySet.getAnnotations().add(annotation); - } - } - - return new ResWrap<EntityCollection>(contextURL, metadataETag, entitySet); - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/20351253/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySetSerializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySetSerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySetSerializer.java deleted file mode 100644 index b7a21da..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySetSerializer.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.olingo.commons.core.serialization; - -import java.io.IOException; - -import org.apache.commons.lang3.StringUtils; -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.data.Annotation; -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.EntityCollection; -import org.apache.olingo.commons.api.data.ResWrap; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; - -import com.fasterxml.jackson.core.JsonGenerator; - -public class JsonEntitySetSerializer extends JsonSerializer { - - public JsonEntitySetSerializer(final boolean serverMode) { - super(serverMode); - } - - protected void doSerialize(final EntityCollection entitySet, final JsonGenerator jgen) - throws IOException, EdmPrimitiveTypeException { - doContainerSerialize(new ResWrap<EntityCollection>(null, null, entitySet), jgen); - } - - protected void doContainerSerialize(final ResWrap<EntityCollection> container, final JsonGenerator jgen) - throws IOException, EdmPrimitiveTypeException { - - final EntityCollection entitySet = container.getPayload(); - - jgen.writeStartObject(); - - if (serverMode) { - if (container.getContextURL() != null) { - jgen.writeStringField(Constants.JSON_CONTEXT, container.getContextURL().toASCIIString()); - } - - if (StringUtils.isNotBlank(container.getMetadataETag())) { - jgen.writeStringField( - Constants.JSON_METADATA_ETAG, - container.getMetadataETag()); - } - } - - if (entitySet.getId() != null) { - jgen.writeStringField(Constants.JSON_ID, entitySet.getId().toASCIIString()); - } - jgen.writeNumberField(Constants.JSON_COUNT, - entitySet.getCount() == null ? entitySet.getEntities().size() : entitySet.getCount()); - if (serverMode) { - if (entitySet.getNext() != null) { - jgen.writeStringField(Constants.JSON_NEXT_LINK, - entitySet.getNext().toASCIIString()); - } - if (entitySet.getDeltaLink() != null) { - jgen.writeStringField(Constants.JSON_DELTA_LINK, - entitySet.getDeltaLink().toASCIIString()); - } - } - - for (Annotation annotation : entitySet.getAnnotations()) { - valuable(jgen, annotation, "@" + annotation.getTerm()); - } - - jgen.writeArrayFieldStart(Constants.VALUE); - final JsonEntitySerializer entitySerializer = new JsonEntitySerializer(serverMode); - for (Entity entity : entitySet.getEntities()) { - entitySerializer.doSerialize(entity, jgen); - } - jgen.writeEndArray(); - - jgen.writeEndObject(); - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/20351253/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonGeoValueDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonGeoValueDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonGeoValueDeserializer.java deleted file mode 100644 index 6bd3d7e..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonGeoValueDeserializer.java +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.olingo.commons.core.serialization; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.data.GeoUtils; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; -import org.apache.olingo.commons.api.edm.geo.Geospatial; -import org.apache.olingo.commons.api.edm.geo.GeospatialCollection; -import org.apache.olingo.commons.api.edm.geo.LineString; -import org.apache.olingo.commons.api.edm.geo.MultiLineString; -import org.apache.olingo.commons.api.edm.geo.MultiPoint; -import org.apache.olingo.commons.api.edm.geo.MultiPolygon; -import org.apache.olingo.commons.api.edm.geo.Point; -import org.apache.olingo.commons.api.edm.geo.Polygon; -import org.apache.olingo.commons.api.edm.geo.SRID; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDouble; - -import com.fasterxml.jackson.databind.JsonNode; - -class JsonGeoValueDeserializer { - - private Point point(final Iterator<JsonNode> itor, final EdmPrimitiveTypeKind type, final SRID srid) { - Point point = null; - - if (itor.hasNext()) { - point = new Point(GeoUtils.getDimension(type), srid); - try { - point.setX(EdmDouble.getInstance().valueOfString(itor.next().asText(), null, null, - Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null, Double.class)); - point.setY(EdmDouble.getInstance().valueOfString(itor.next().asText(), null, null, - Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null, Double.class)); - } catch (EdmPrimitiveTypeException e) { - throw new IllegalArgumentException("While deserializing point coordinates as double", e); - } - } - - return point; - } - - private MultiPoint multipoint(final Iterator<JsonNode> itor, final EdmPrimitiveTypeKind type, final SRID srid) { - final MultiPoint multiPoint; - - if (itor.hasNext()) { - final List<Point> points = new ArrayList<Point>(); - while (itor.hasNext()) { - final Iterator<JsonNode> mpItor = itor.next().elements(); - points.add(point(mpItor, type, srid)); - } - multiPoint = new MultiPoint(GeoUtils.getDimension(type), srid, points); - } else { - multiPoint = new MultiPoint(GeoUtils.getDimension(type), srid, Collections.<Point> emptyList()); - } - - return multiPoint; - } - - private LineString lineString(final Iterator<JsonNode> itor, final EdmPrimitiveTypeKind type, final SRID srid) { - final LineString lineString; - - if (itor.hasNext()) { - final List<Point> points = new ArrayList<Point>(); - while (itor.hasNext()) { - final Iterator<JsonNode> mpItor = itor.next().elements(); - points.add(point(mpItor, type, srid)); - } - lineString = new LineString(GeoUtils.getDimension(type), srid, points); - } else { - lineString = new LineString(GeoUtils.getDimension(type), srid, Collections.<Point> emptyList()); - } - - return lineString; - } - - private MultiLineString multiLineString(final Iterator<JsonNode> itor, final EdmPrimitiveTypeKind type, - final SRID srid) { - - final MultiLineString multiLineString; - - if (itor.hasNext()) { - final List<LineString> lineStrings = new ArrayList<LineString>(); - while (itor.hasNext()) { - final Iterator<JsonNode> mlsItor = itor.next().elements(); - lineStrings.add(lineString(mlsItor, type, srid)); - } - multiLineString = new MultiLineString(GeoUtils.getDimension(type), srid, lineStrings); - } else { - multiLineString = new MultiLineString(GeoUtils.getDimension(type), srid, Collections.<LineString> emptyList()); - } - - return multiLineString; - } - - private Polygon polygon(final Iterator<JsonNode> itor, final EdmPrimitiveTypeKind type, final SRID srid) { - List<Point> extPoints = null; - if (itor.hasNext()) { - final Iterator<JsonNode> extItor = itor.next().elements(); - if (extItor.hasNext()) { - extPoints = new ArrayList<Point>(); - while (extItor.hasNext()) { - final Iterator<JsonNode> mpItor = extItor.next().elements(); - extPoints.add(point(mpItor, type, srid)); - } - } - } - - List<Point> intPoints = null; - if (itor.hasNext()) { - final Iterator<JsonNode> intItor = itor.next().elements(); - if (intItor.hasNext()) { - intPoints = new ArrayList<Point>(); - while (intItor.hasNext()) { - final Iterator<JsonNode> mpItor = intItor.next().elements(); - intPoints.add(point(mpItor, type, srid)); - } - } - } - - return new Polygon(GeoUtils.getDimension(type), srid, intPoints, extPoints); - } - - private MultiPolygon multiPolygon(final Iterator<JsonNode> itor, final EdmPrimitiveTypeKind type, final SRID srid) { - final MultiPolygon multiPolygon; - - if (itor.hasNext()) { - final List<Polygon> polygons = new ArrayList<Polygon>(); - while (itor.hasNext()) { - final Iterator<JsonNode> mpItor = itor.next().elements(); - polygons.add(polygon(mpItor, type, srid)); - } - multiPolygon = new MultiPolygon(GeoUtils.getDimension(type), srid, polygons); - } else { - multiPolygon = new MultiPolygon(GeoUtils.getDimension(type), srid, Collections.<Polygon> emptyList()); - } - - return multiPolygon; - } - - private GeospatialCollection collection(final Iterator<JsonNode> itor, final EdmPrimitiveTypeKind type, - final SRID srid) { - - final GeospatialCollection collection; - - if (itor.hasNext()) { - final List<Geospatial> geospatials = new ArrayList<Geospatial>(); - - while (itor.hasNext()) { - final JsonNode geo = itor.next(); - final String collItemType = geo.get(Constants.ATTR_TYPE).asText(); - final String callAsType; - if (EdmPrimitiveTypeKind.GeographyCollection.name().equals(collItemType) - || EdmPrimitiveTypeKind.GeometryCollection.name().equals(collItemType)) { - - callAsType = collItemType; - } else { - callAsType = (type == EdmPrimitiveTypeKind.GeographyCollection ? "Geography" : "Geometry") - + collItemType; - } - - geospatials.add(deserialize(geo, new EdmTypeInfo.Builder().setTypeExpression(callAsType).build())); - } - - collection = new GeospatialCollection(GeoUtils.getDimension(type), srid, geospatials); - } else { - collection = new GeospatialCollection(GeoUtils.getDimension(type), srid, Collections.<Geospatial> emptyList()); - } - - return collection; - } - - public Geospatial deserialize(final JsonNode node, final EdmTypeInfo typeInfo) { - final EdmPrimitiveTypeKind actualType; - if ((typeInfo.getPrimitiveTypeKind() == EdmPrimitiveTypeKind.Geography - || typeInfo.getPrimitiveTypeKind() == EdmPrimitiveTypeKind.Geometry) - && node.has(Constants.ATTR_TYPE)) { - - String nodeType = node.get(Constants.ATTR_TYPE).asText(); - if (nodeType.startsWith("Geo")) { - final int yIdx = nodeType.indexOf('y'); - nodeType = nodeType.substring(yIdx + 1); - } - actualType = EdmPrimitiveTypeKind.valueOfFQN(typeInfo.getFullQualifiedName().toString() + nodeType); - } else { - actualType = typeInfo.getPrimitiveTypeKind(); - } - - final Iterator<JsonNode> cooItor = node.has(Constants.JSON_COORDINATES) - ? node.get(Constants.JSON_COORDINATES).elements() - : Collections.<JsonNode> emptyList().iterator(); - - SRID srid = null; - if (node.has(Constants.JSON_CRS)) { - srid = SRID.valueOf( - node.get(Constants.JSON_CRS).get(Constants.PROPERTIES).get(Constants.JSON_NAME).asText().split(":")[1]); - } - - Geospatial value = null; - switch (actualType) { - case GeographyPoint: - case GeometryPoint: - value = point(cooItor, actualType, srid); - break; - - case GeographyMultiPoint: - case GeometryMultiPoint: - value = multipoint(cooItor, actualType, srid); - break; - - case GeographyLineString: - case GeometryLineString: - value = lineString(cooItor, actualType, srid); - break; - - case GeographyMultiLineString: - case GeometryMultiLineString: - value = multiLineString(cooItor, actualType, srid); - break; - - case GeographyPolygon: - case GeometryPolygon: - value = polygon(cooItor, actualType, srid); - break; - - case GeographyMultiPolygon: - case GeometryMultiPolygon: - value = multiPolygon(cooItor, actualType, srid); - break; - - case GeographyCollection: - case GeometryCollection: - value = collection(node.get(Constants.JSON_GEOMETRIES).elements(), actualType, srid); - break; - - default: - } - - return value; - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/20351253/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonGeoValueSerializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonGeoValueSerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonGeoValueSerializer.java deleted file mode 100644 index 7cd382b..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonGeoValueSerializer.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.olingo.commons.core.serialization; - -import java.io.IOException; - -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; -import org.apache.olingo.commons.api.edm.geo.ComposedGeospatial; -import org.apache.olingo.commons.api.edm.geo.Geospatial; -import org.apache.olingo.commons.api.edm.geo.GeospatialCollection; -import org.apache.olingo.commons.api.edm.geo.LineString; -import org.apache.olingo.commons.api.edm.geo.MultiLineString; -import org.apache.olingo.commons.api.edm.geo.MultiPoint; -import org.apache.olingo.commons.api.edm.geo.MultiPolygon; -import org.apache.olingo.commons.api.edm.geo.Point; -import org.apache.olingo.commons.api.edm.geo.Polygon; -import org.apache.olingo.commons.api.edm.geo.SRID; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDouble; - -import com.fasterxml.jackson.core.JsonGenerator; - -class JsonGeoValueSerializer { - - private void srid(final JsonGenerator jgen, final SRID srid) throws IOException { - jgen.writeObjectFieldStart(Constants.JSON_CRS); - jgen.writeStringField(Constants.ATTR_TYPE, Constants.JSON_NAME); - jgen.writeObjectFieldStart(Constants.PROPERTIES); - jgen.writeStringField(Constants.JSON_NAME, "EPSG:" + srid.toString()); - jgen.writeEndObject(); - jgen.writeEndObject(); - } - - private void point(final JsonGenerator jgen, final Point point) throws IOException { - try { - jgen.writeNumber(EdmDouble.getInstance().valueToString(point.getX(), null, null, - Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)); - jgen.writeNumber(EdmDouble.getInstance().valueToString(point.getY(), null, null, - Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)); - } catch (EdmPrimitiveTypeException e) { - throw new IllegalArgumentException("While serializing point coordinates as double", e); - } - } - - private void multipoint(final JsonGenerator jgen, final MultiPoint multiPoint) throws IOException { - for (Point point : multiPoint) { - jgen.writeStartArray(); - point(jgen, point); - jgen.writeEndArray(); - } - } - - private void lineString(final JsonGenerator jgen, final ComposedGeospatial<Point> lineString) throws IOException { - for (Point point : lineString) { - jgen.writeStartArray(); - point(jgen, point); - jgen.writeEndArray(); - } - } - - private void multiLineString(final JsonGenerator jgen, final MultiLineString multiLineString) throws IOException { - for (LineString lineString : multiLineString) { - jgen.writeStartArray(); - lineString(jgen, lineString); - jgen.writeEndArray(); - } - } - - private void polygon(final JsonGenerator jgen, final Polygon polygon) throws IOException { - if (!polygon.getExterior().isEmpty()) { - jgen.writeStartArray(); - lineString(jgen, polygon.getExterior()); - jgen.writeEndArray(); - } - if (!polygon.getInterior().isEmpty()) { - jgen.writeStartArray(); - lineString(jgen, polygon.getInterior()); - jgen.writeEndArray(); - } - } - - private void multiPolygon(final JsonGenerator jgen, final MultiPolygon multiPolygon) throws IOException { - for (Polygon polygon : multiPolygon) { - jgen.writeStartArray(); - polygon(jgen, polygon); - jgen.writeEndArray(); - } - } - - private void collection(final JsonGenerator jgen, final GeospatialCollection collection) throws IOException { - jgen.writeArrayFieldStart(Constants.JSON_GEOMETRIES); - for (Geospatial geospatial : collection) { - jgen.writeStartObject(); - serialize(jgen, geospatial); - jgen.writeEndObject(); - } - jgen.writeEndArray(); - } - - public void serialize(final JsonGenerator jgen, final Geospatial value) throws IOException { - if (value.getEdmPrimitiveTypeKind().equals(EdmPrimitiveTypeKind.GeographyCollection) - || value.getEdmPrimitiveTypeKind().equals(EdmPrimitiveTypeKind.GeometryCollection)) { - - jgen.writeStringField(Constants.ATTR_TYPE, EdmPrimitiveTypeKind.GeometryCollection.name()); - } else { - final int yIdx = value.getEdmPrimitiveTypeKind().name().indexOf('y'); - final String itemType = value.getEdmPrimitiveTypeKind().name().substring(yIdx + 1); - jgen.writeStringField(Constants.ATTR_TYPE, itemType); - } - - switch (value.getEdmPrimitiveTypeKind()) { - case GeographyPoint: - case GeometryPoint: - jgen.writeArrayFieldStart(Constants.JSON_COORDINATES); - point(jgen, (Point) value); - jgen.writeEndArray(); - break; - - case GeographyMultiPoint: - case GeometryMultiPoint: - jgen.writeArrayFieldStart(Constants.JSON_COORDINATES); - multipoint(jgen, (MultiPoint) value); - jgen.writeEndArray(); - break; - - case GeographyLineString: - case GeometryLineString: - jgen.writeArrayFieldStart(Constants.JSON_COORDINATES); - lineString(jgen, (LineString) value); - jgen.writeEndArray(); - break; - - case GeographyMultiLineString: - case GeometryMultiLineString: - jgen.writeArrayFieldStart(Constants.JSON_COORDINATES); - multiLineString(jgen, (MultiLineString) value); - jgen.writeEndArray(); - break; - - case GeographyPolygon: - case GeometryPolygon: - jgen.writeArrayFieldStart(Constants.JSON_COORDINATES); - polygon(jgen, (Polygon) value); - jgen.writeEndArray(); - break; - - case GeographyMultiPolygon: - case GeometryMultiPolygon: - jgen.writeArrayFieldStart(Constants.JSON_COORDINATES); - multiPolygon(jgen, (MultiPolygon) value); - jgen.writeEndArray(); - break; - - case GeographyCollection: - case GeometryCollection: - collection(jgen, (GeospatialCollection) value); - break; - - default: - } - - if (value.getSrid() != null && value.getSrid().isNotDefault()) { - srid(jgen, value.getSrid()); - } - } - -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/20351253/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonODataErrorDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonODataErrorDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonODataErrorDeserializer.java deleted file mode 100644 index 3636db6..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonODataErrorDeserializer.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.olingo.commons.core.serialization; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; - -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.ODataError; -import org.apache.olingo.commons.api.ODataErrorDetail; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; - -public class JsonODataErrorDeserializer extends JsonDeserializer { - - public JsonODataErrorDeserializer(final boolean serverMode) { - super(serverMode); - } - - protected ODataError doDeserialize(final JsonParser parser) throws IOException { - - final ODataError error = new ODataError(); - - final ObjectNode tree = parser.getCodec().readTree(parser); - if (tree.has(Constants.JSON_ERROR)) { - final JsonNode errorNode = tree.get(Constants.JSON_ERROR); - - if (errorNode.has(Constants.ERROR_CODE)) { - error.setCode(errorNode.get(Constants.ERROR_CODE).textValue()); - } - if (errorNode.has(Constants.ERROR_MESSAGE)) { - final JsonNode message = errorNode.get(Constants.ERROR_MESSAGE); - if (message.isValueNode()) { - error.setMessage(message.textValue()); - } else if (message.isObject()) { - error.setMessage(message.get(Constants.VALUE).asText()); - } - } - if (errorNode.has(Constants.ERROR_TARGET)) { - error.setTarget(errorNode.get(Constants.ERROR_TARGET).textValue()); - } - if (errorNode.hasNonNull(Constants.ERROR_DETAILS)) { - List<ODataErrorDetail> details = new ArrayList<ODataErrorDetail>(); - JsonODataErrorDetailDeserializer detailDeserializer = new JsonODataErrorDetailDeserializer(serverMode); - for (JsonNode jsonNode : errorNode.get(Constants.ERROR_DETAILS)) { - details.add(detailDeserializer.doDeserialize(jsonNode.traverse(parser.getCodec())) - .getPayload()); - } - - error.setDetails(details); - } - if (errorNode.hasNonNull(Constants.ERROR_INNERERROR)) { - HashMap<String, String> innerErrorMap = new HashMap<String, String>(); - final JsonNode innerError = errorNode.get(Constants.ERROR_INNERERROR); - for (final Iterator<String> itor = innerError.fieldNames(); itor.hasNext();) { - final String keyTmp = itor.next(); - final String val = innerError.get(keyTmp).toString(); - innerErrorMap.put(keyTmp, val); - } - error.setInnerError(innerErrorMap); - } - } - - return error; - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/20351253/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonODataErrorDetailDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonODataErrorDetailDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonODataErrorDetailDeserializer.java deleted file mode 100644 index 1c6a187..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonODataErrorDetailDeserializer.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.olingo.commons.core.serialization; - -import java.io.IOException; -import java.net.URI; - -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.ODataErrorDetail; -import org.apache.olingo.commons.api.data.ResWrap; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.JsonNode; - -public class JsonODataErrorDetailDeserializer extends JsonDeserializer { - - public JsonODataErrorDetailDeserializer(final boolean serverMode) { - super(serverMode); - } - - protected ResWrap<ODataErrorDetail> doDeserialize(final JsonParser parser) throws IOException { - - final ODataErrorDetail error = new ODataErrorDetail(); - final JsonNode errorNode = parser.getCodec().readTree(parser); - if (errorNode.has(Constants.ERROR_CODE)) { - error.setCode(errorNode.get(Constants.ERROR_CODE).textValue()); - } - if (errorNode.has(Constants.ERROR_MESSAGE)) { - final JsonNode message = errorNode.get(Constants.ERROR_MESSAGE); - if (message.isValueNode()) { - error.setMessage(message.textValue()); - } else if (message.isObject()) { - error.setMessage(message.get(Constants.VALUE).asText()); - } - } - if (errorNode.has(Constants.ERROR_TARGET)) { - error.setTarget(errorNode.get(Constants.ERROR_TARGET).textValue()); - } - - return new ResWrap<ODataErrorDetail>((URI) null, null, error); - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/20351253/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertyDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertyDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertyDeserializer.java deleted file mode 100644 index 8738dd5..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertyDeserializer.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.olingo.commons.core.serialization; - -import java.io.IOException; -import java.net.URI; -import java.util.Iterator; -import java.util.Map; - -import org.apache.commons.lang3.StringUtils; -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.data.Annotation; -import org.apache.olingo.commons.api.data.Property; -import org.apache.olingo.commons.api.data.ResWrap; -import org.apache.olingo.commons.api.data.ValueType; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; - -/** - * Parse JSON string into <tt>Property</tt>. - */ -public class JsonPropertyDeserializer extends JsonDeserializer { - - public JsonPropertyDeserializer(final boolean serverMode) { - super(serverMode); - } - - protected ResWrap<Property> doDeserialize(final JsonParser parser) throws IOException { - - final ObjectNode tree = parser.getCodec().readTree(parser); - - final String metadataETag; - final URI contextURL; - final Property property = new Property(); - - if (tree.hasNonNull(Constants.JSON_METADATA_ETAG)) { - metadataETag = tree.get(Constants.JSON_METADATA_ETAG).textValue(); - tree.remove(Constants.JSON_METADATA_ETAG); - } else { - metadataETag = null; - } - - if (tree.hasNonNull(Constants.JSON_CONTEXT)) { - contextURL = URI.create(tree.get(Constants.JSON_CONTEXT).textValue()); - property.setName(StringUtils.substringAfterLast(contextURL.toASCIIString(), "/")); - tree.remove(Constants.JSON_CONTEXT); - } else if (tree.hasNonNull(Constants.JSON_METADATA)) { - contextURL = URI.create(tree.get(Constants.JSON_METADATA).textValue()); - property.setType(new EdmTypeInfo.Builder(). - setTypeExpression(StringUtils.substringAfterLast(contextURL.toASCIIString(), "#")).build().internal()); - tree.remove(Constants.JSON_METADATA); - } else { - contextURL = null; - } - - if (tree.has(Constants.JSON_TYPE)) { - property.setType(new EdmTypeInfo.Builder().setTypeExpression(tree.get(Constants.JSON_TYPE).textValue()).build() - .internal()); - tree.remove(Constants.JSON_TYPE); - } - - if (tree.has(Constants.JSON_NULL) && tree.get(Constants.JSON_NULL).asBoolean()) { - property.setValue(ValueType.PRIMITIVE, null); - tree.remove(Constants.JSON_NULL); - } - - if (property.getValue() == null) { - try { - value(property, tree.has(Constants.VALUE) ? tree.get(Constants.VALUE) : tree, parser.getCodec()); - } catch (final EdmPrimitiveTypeException e) { - throw new IOException(e); - } - tree.remove(Constants.VALUE); - } - - // any remaining entry is supposed to be an annotation or is ignored - for (final Iterator<Map.Entry<String, JsonNode>> itor = tree.fields(); itor.hasNext();) { - final Map.Entry<String, JsonNode> field = itor.next(); - if (field.getKey().charAt(0) == '@') { - final Annotation annotation = new Annotation(); - annotation.setTerm(field.getKey().substring(1)); - - try { - value(annotation, field.getValue(), parser.getCodec()); - } catch (final EdmPrimitiveTypeException e) { - throw new IOException(e); - } - property.getAnnotations().add(annotation); - } - } - - return new ResWrap<Property>(contextURL, metadataETag, property); - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/20351253/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertySerializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertySerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertySerializer.java deleted file mode 100644 index cd2227f..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertySerializer.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.olingo.commons.core.serialization; - -import java.io.IOException; -import java.net.URI; - -import org.apache.commons.lang3.StringUtils; -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.data.Annotation; -import org.apache.olingo.commons.api.data.Property; -import org.apache.olingo.commons.api.data.ResWrap; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; - -import com.fasterxml.jackson.core.JsonGenerator; - -/** - * Writes out JSON string from <tt>PropertyImpl</tt>. - */ -public class JsonPropertySerializer extends JsonSerializer { - - public JsonPropertySerializer(final boolean serverMode) { - super(serverMode); - } - - protected void doSerialize(final Property property, final JsonGenerator jgen) - throws IOException, EdmPrimitiveTypeException { - doContainerSerialize(new ResWrap<Property>((URI) null, null, property), jgen); - } - - protected void doContainerSerialize(final ResWrap<Property> container, final JsonGenerator jgen) - throws IOException, EdmPrimitiveTypeException { - - final Property property = container.getPayload(); - - jgen.writeStartObject(); - - if (serverMode && container.getContextURL() != null) { - jgen.writeStringField(Constants.JSON_CONTEXT, container.getContextURL().toASCIIString()); - } - - if (StringUtils.isNotBlank(property.getType())) { - jgen.writeStringField(Constants.JSON_TYPE, - new EdmTypeInfo.Builder().setTypeExpression(property.getType()).build().external()); - } - - for (Annotation annotation : property.getAnnotations()) { - valuable(jgen, annotation, "@" + annotation.getTerm()); - } - - if (property.isNull()) { - jgen.writeBooleanField(Constants.JSON_NULL, true); - } else if (property.isGeospatial() || property.isCollection()) { - valuable(jgen, property, Constants.VALUE); - } else if (property.isPrimitive()) { - final EdmTypeInfo typeInfo = property.getType() == null - ? null - : new EdmTypeInfo.Builder().setTypeExpression(property.getType()).build(); - - jgen.writeFieldName(Constants.VALUE); - primitiveValue(jgen, typeInfo, property.asPrimitive()); - } else if (property.isEnum()) { - jgen.writeStringField(Constants.VALUE, property.asEnum().toString()); - } else if (property.isComplex()) { - for (Property cproperty : property.asComplex().getValue()) { - valuable(jgen, cproperty, cproperty.getName()); - } - } else if (property.isComplex()) { - for (Property cproperty : property.asComplex().getValue()) { - valuable(jgen, cproperty, cproperty.getName()); - } - } - - jgen.writeEndObject(); - } -}
