http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/b15439ff/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONPropertyDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONPropertyDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONPropertyDeserializer.java deleted file mode 100644 index 465250a..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONPropertyDeserializer.java +++ /dev/null @@ -1,104 +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.data; - -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.edm.constants.ODataServiceVersion; -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 ODataServiceVersion version, final boolean serverMode) { - super(version, serverMode); - } - - protected ResWrap<Property> doDeserialize(final JsonParser parser) throws IOException { - - final ObjectNode tree = (ObjectNode) parser.getCodec().readTree(parser); - - final String metadataETag; - final URI contextURL; - final PropertyImpl property = new PropertyImpl(); - - 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(jsonType)) { - property.setType(new EdmTypeInfo.Builder().setTypeExpression(tree.get(jsonType).textValue()).build().internal()); - tree.remove(jsonType); - } - - if (tree.has(Constants.JSON_NULL) && tree.get(Constants.JSON_NULL).asBoolean()) { - property.setValue(new NullValueImpl()); - tree.remove(Constants.JSON_NULL); - } - - if (property.getValue() == null) { - value(property, tree.has(Constants.VALUE) ? tree.get(Constants.VALUE) : tree, parser.getCodec()); - 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 AnnotationImpl(); - annotation.setTerm(field.getKey().substring(1)); - - value(annotation, field.getValue(), parser.getCodec()); - property.getAnnotations().add(annotation); - } - } - - return new ResWrap<Property>(contextURL, metadataETag, property); - } -}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/b15439ff/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONPropertySerializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONPropertySerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONPropertySerializer.java deleted file mode 100644 index 1a82a3b..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONPropertySerializer.java +++ /dev/null @@ -1,90 +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.data; - -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.constants.ODataServiceVersion; -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 ODataServiceVersion version, final boolean serverMode) { - super(version, serverMode); - } - - protected void doSerialize(final Property property, final JsonGenerator jgen) throws IOException { - doContainerSerialize(new ResWrap<Property>((URI) null, null, property), jgen); - } - - protected void doContainerSerialize(final ResWrap<Property> container, final JsonGenerator jgen) - throws IOException { - - final Property property = container.getPayload(); - - jgen.writeStartObject(); - - if (serverMode && container.getContextURL() != null) { - jgen.writeStringField(version.compareTo(ODataServiceVersion.V40) >= 0 - ? Constants.JSON_CONTEXT : Constants.JSON_METADATA, - container.getContextURL().getURI().toASCIIString()); - } - - if (StringUtils.isNotBlank(property.getType())) { - jgen.writeStringField(version.getJSONMap().get(ODataServiceVersion.JSON_TYPE), - new EdmTypeInfo.Builder().setTypeExpression(property.getType()).build().external(version)); - } - - for (Annotation annotation : property.getAnnotations()) { - valuable(jgen, annotation, "@" + annotation.getTerm()); - } - - if (property.getValue().isNull()) { - jgen.writeBooleanField(Constants.JSON_NULL, true); - } else if (property.getValue().isPrimitive()) { - final EdmTypeInfo typeInfo = property.getType() == null - ? null - : new EdmTypeInfo.Builder().setTypeExpression(property.getType()).build(); - - jgen.writeFieldName(Constants.VALUE); - primitiveValue(jgen, typeInfo, property.getValue().asPrimitive()); - } else if (property.getValue().isEnum()) { - jgen.writeStringField(Constants.VALUE, property.getValue().asEnum().get()); - } else if (property.getValue().isGeospatial() || property.getValue().isCollection()) { - valuable(jgen, property, Constants.VALUE); - } else if (property.getValue().isComplex()) { - for (Property cproperty : property.getValue().asComplex().get()) { - valuable(jgen, cproperty, cproperty.getName()); - } - } - - jgen.writeEndObject(); - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/b15439ff/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JsonDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JsonDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JsonDeserializer.java deleted file mode 100755 index 0ecd7f3..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JsonDeserializer.java +++ /dev/null @@ -1,463 +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.data; - -import java.io.IOException; -import java.io.InputStream; -import java.util.AbstractMap.SimpleEntry; -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.data.Annotatable; -import org.apache.olingo.commons.api.data.Annotation; -import org.apache.olingo.commons.api.data.CollectionValue; -import org.apache.olingo.commons.api.data.ComplexValue; -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.EntitySet; -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.Value; -import org.apache.olingo.commons.api.domain.ODataError; -import org.apache.olingo.commons.api.domain.ODataLinkType; -import org.apache.olingo.commons.api.domain.ODataPropertyType; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; -import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; -import org.apache.olingo.commons.api.op.ODataDeserializer; -import org.apache.olingo.commons.api.op.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 ODataServiceVersion version; - protected final boolean serverMode; - - protected String jsonType; - protected String jsonId; - protected String jsonETag; - protected String jsonReadLink; - protected String jsonEditLink; - protected String jsonMediaEditLink; - protected String jsonMediaReadLink; - protected String jsonMediaContentType; - protected String jsonMediaETag; - protected String jsonAssociationLink; - protected String jsonNavigationLink; - protected String jsonCount; - protected String jsonNextLink; - protected String jsonDeltaLink; - protected String jsonError; - - private JSONGeoValueDeserializer geoDeserializer; - - private JsonParser parser; - - public JsonDeserializer(final ODataServiceVersion version, final boolean serverMode) { - this.version = version; - this.serverMode = serverMode; - - jsonType = version.getJSONMap().get(ODataServiceVersion.JSON_TYPE); - jsonId = version.getJSONMap().get(ODataServiceVersion.JSON_ID); - jsonETag = version.getJSONMap().get(ODataServiceVersion.JSON_ETAG); - jsonReadLink = version.getJSONMap().get(ODataServiceVersion.JSON_READ_LINK); - jsonEditLink = version.getJSONMap().get(ODataServiceVersion.JSON_EDIT_LINK); - jsonMediaReadLink = version.getJSONMap().get(ODataServiceVersion.JSON_MEDIAREAD_LINK); - jsonMediaEditLink = version.getJSONMap().get(ODataServiceVersion.JSON_MEDIAEDIT_LINK); - jsonMediaContentType = version.getJSONMap().get(ODataServiceVersion.JSON_MEDIA_CONTENT_TYPE); - jsonMediaETag = version.getJSONMap().get(ODataServiceVersion.JSON_MEDIA_ETAG); - jsonAssociationLink = version.getJSONMap().get(ODataServiceVersion.JSON_ASSOCIATION_LINK); - jsonNavigationLink = version.getJSONMap().get(ODataServiceVersion.JSON_NAVIGATION_LINK); - jsonCount = version.getJSONMap().get(ODataServiceVersion.JSON_COUNT); - jsonNextLink = version.getJSONMap().get(ODataServiceVersion.JSON_NEXT_LINK); - jsonDeltaLink = version.getJSONMap().get(ODataServiceVersion.JSON_DELTA_LINK); - jsonError = version.getJSONMap().get(ODataServiceVersion.JSON_ERROR); -} - - private JSONGeoValueDeserializer getGeoDeserializer() { - if (geoDeserializer == null) { - geoDeserializer = new JSONGeoValueDeserializer(version); - } - 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 LinkImpl 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(version, serverMode); - - if (inline instanceof ObjectNode) { - link.setType(ODataLinkType.ENTITY_NAVIGATION.toString()); - link.setInlineEntity(entityDeserializer.doDeserialize(inline.traverse(codec)).getPayload()); - - } else if (inline instanceof ArrayNode) { - link.setType(ODataLinkType.ENTITY_SET_NAVIGATION.toString()); - - EntitySet entitySet = new EntitySetImpl(); - Iterator<JsonNode> entries = ((ArrayNode) inline).elements(); - while (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(jsonNavigationLink)) { - final LinkImpl link = new LinkImpl(); - link.setTitle(getTitle(field)); - link.setRel(version.getNamespaceMap().get(ODataServiceVersion.NAVIGATION_LINK_REL) + getTitle(field)); - - if (field.getValue().isValueNode()) { - link.setHref(field.getValue().textValue()); - link.setType(ODataLinkType.ENTITY_NAVIGATION.toString()); - } - - linked.getNavigationLinks().add(link); - - toRemove.add(field.getKey()); - toRemove.add(setInline(field.getKey(), jsonNavigationLink, tree, codec, link)); - } else if (field.getKey().endsWith(jsonAssociationLink)) { - final LinkImpl link = new LinkImpl(); - link.setTitle(getTitle(field)); - link.setRel(version.getNamespaceMap().get(ODataServiceVersion.ASSOCIATION_LINK_REL) + getTitle(field)); - link.setHref(field.getValue().textValue()); - link.setType(ODataLinkType.ASSOCIATION.toString()); - 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(jsonNavigationLink)) { - - if (field.getValue().isValueNode()) { - final String suffix = field.getKey().replaceAll("^.*@", "@"); - - final LinkImpl link = new LinkImpl(); - link.setTitle(getTitle(field)); - link.setRel(version.getNamespaceMap().get(ODataServiceVersion.NAVIGATION_LINK_REL) + getTitle(field)); - link.setHref(field.getValue().textValue()); - link.setType(ODataLinkType.ENTITY_NAVIGATION.toString()); - 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 LinkImpl link = new LinkImpl(); - link.setTitle(getTitle(field)); - link.setRel(version.getNamespaceMap().get(ODataServiceVersion.NAVIGATION_LINK_REL) + getTitle(field)); - link.setHref(node.asText()); - link.setType(ODataLinkType.ENTITY_SET_NAVIGATION.toString()); - 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; - EdmTypeInfo typeInfo = null; - - if (node.isValueNode() || node.isNull()) { - type = ODataPropertyType.PRIMITIVE; - - EdmPrimitiveTypeKind kind = EdmPrimitiveTypeKind.String; - if (node.isShort()) { - kind = EdmPrimitiveTypeKind.Int16; - } else if (node.isInt()) { - kind = EdmPrimitiveTypeKind.Int32; - } else if (node.isLong()) { - kind = EdmPrimitiveTypeKind.Int64; - } else if (node.isBoolean()) { - kind = EdmPrimitiveTypeKind.Boolean; - } else if (node.isFloat()) { - kind = EdmPrimitiveTypeKind.Single; - } else if (node.isDouble()) { - kind = EdmPrimitiveTypeKind.Double; - } else if (node.isBigDecimal()) { - kind = EdmPrimitiveTypeKind.Decimal; - } - typeInfo = new EdmTypeInfo.Builder().setTypeExpression(kind.getFullQualifiedName().toString()).build(); - } else if (node.isArray()) { - type = ODataPropertyType.COLLECTION; - } else if (node.isObject()) { - if (node.has(Constants.ATTR_TYPE)) { - type = ODataPropertyType.PRIMITIVE; - typeInfo = new EdmTypeInfo.Builder(). - setTypeExpression("Edm.Geography" + node.get(Constants.ATTR_TYPE).asText()).build(); - } else { - type = ODataPropertyType.COMPLEX; - } - } else { - type = ODataPropertyType.EMPTY; - } - - return new SimpleEntry<ODataPropertyType, EdmTypeInfo>(type, typeInfo); - } - - protected void populate(final Annotatable annotatable, final List<Property> properties, - final ObjectNode tree, final ObjectCodec codec) throws IOException { - - 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 AnnotationImpl(); - 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(jsonType))) { - type = field.getValue().asText(); - } else if (annotation == null && customAnnotation.matches() && !"odata".equals(customAnnotation.group(2))) { - annotation = new AnnotationImpl(); - annotation.setTerm(customAnnotation.group(2) + "." + customAnnotation.group(3)); - value(annotation, field.getValue(), codec); - } else { - final PropertyImpl property = new PropertyImpl(); - 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 Value fromPrimitive(final JsonNode node, final EdmTypeInfo typeInfo) { - final Value value; - - if (node.isNull()) { - value = new NullValueImpl(); - } else { - if (typeInfo != null && typeInfo.getPrimitiveTypeKind().isGeospatial()) { - value = new GeospatialValueImpl(getGeoDeserializer().deserialize(node, typeInfo)); - } else { - value = new PrimitiveValueImpl(node.asText()); - } - } - - return value; - } - - private ComplexValue fromComplex(final ObjectNode node, final ObjectCodec codec) throws IOException { - final ComplexValue value = version.compareTo(ODataServiceVersion.V40) < 0 - ? new ComplexValueImpl() - : new LinkedComplexValueImpl(); - - if (value.isLinkedComplex()) { - 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, value.asLinkedComplex(), toRemove, node, codec); - } - node.remove(toRemove); - } - - populate(value.asLinkedComplex(), value.get(), node, codec); - - return value; - } - - private CollectionValue fromCollection(final Iterator<JsonNode> nodeItor, final EdmTypeInfo typeInfo, - final ObjectCodec codec) throws IOException { - - final CollectionValueImpl value = new CollectionValueImpl(); - - 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()) { - value.get().add(fromPrimitive(child, type)); - } else { - value.get().add(new EnumValueImpl(child.asText())); - } - } else if (child.isContainerNode()) { - if (child.has(jsonType)) { - ((ObjectNode) child).remove(jsonType); - } - value.get().add(fromComplex((ObjectNode) child, codec)); - } - } - - return value; - } - - protected void value(final Valuable valuable, final JsonNode node, final ObjectCodec codec) - throws IOException { - - 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: - valuable.setValue(fromCollection(node.elements(), typeInfo, codec)); - break; - - case COMPLEX: - if (node.has(jsonType)) { - valuable.setType(node.get(jsonType).asText()); - ((ObjectNode) node).remove(jsonType); - } - valuable.setValue(fromComplex((ObjectNode) node, codec)); - break; - - case ENUM: - valuable.setValue(new EnumValueImpl(node.asText())); - break; - - case PRIMITIVE: - if (valuable.getType() == null && typeInfo != null) { - valuable.setType(typeInfo.getFullQualifiedName().toString()); - } - valuable.setValue(fromPrimitive(node, typeInfo)); - break; - - case EMPTY: - default: - valuable.setValue(new PrimitiveValueImpl(StringUtils.EMPTY)); - } - } - - @Override - public ResWrap<EntitySet> toEntitySet(InputStream input) throws ODataDeserializerException { - try { - parser = new JsonFactory(new ObjectMapper()).createParser(input); - return new JSONEntitySetDeserializer(version, serverMode).doDeserialize(parser); - } catch (final IOException e) { - throw new ODataDeserializerException(e); - } - } - - @Override - public ResWrap<Entity> toEntity(InputStream input) throws ODataDeserializerException { - try { - parser = new JsonFactory(new ObjectMapper()).createParser(input); - return new JSONEntityDeserializer(version, serverMode).doDeserialize(parser); - } catch (final IOException e) { - throw new ODataDeserializerException(e); - } - } - - @Override - public ResWrap<Property> toProperty(InputStream input) throws ODataDeserializerException { - try { - parser = new JsonFactory(new ObjectMapper()).createParser(input); - return new JSONPropertyDeserializer(version, serverMode).doDeserialize(parser); - } catch (final IOException e) { - throw new ODataDeserializerException(e); - } - } - - @Override - public ODataError toError(InputStream input) throws ODataDeserializerException { - try { - parser = new JsonFactory(new ObjectMapper()).createParser(input); - return new JSONODataErrorDeserializer(version, serverMode).doDeserialize(parser); - } catch (final IOException e) { - throw new ODataDeserializerException(e); - } - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/b15439ff/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JsonSerializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JsonSerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JsonSerializer.java deleted file mode 100755 index bf1c19e..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JsonSerializer.java +++ /dev/null @@ -1,315 +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.data; - -import java.io.IOException; -import java.io.Writer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.math.NumberUtils; -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.data.Annotatable; -import org.apache.olingo.commons.api.data.Annotation; -import org.apache.olingo.commons.api.data.CollectionValue; -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.EntitySet; -import org.apache.olingo.commons.api.data.Link; -import org.apache.olingo.commons.api.data.Linked; -import org.apache.olingo.commons.api.data.PrimitiveValue; -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.Value; -import org.apache.olingo.commons.api.domain.ODataLinkType; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; -import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; -import org.apache.olingo.commons.api.op.ODataSerializer; -import org.apache.olingo.commons.api.op.ODataSerializerException; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; - -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; - -public class JsonSerializer implements ODataSerializer { - - protected ODataServiceVersion version; - protected boolean serverMode; - - private static final EdmPrimitiveTypeKind[] NUMBER_TYPES = { - EdmPrimitiveTypeKind.Byte, EdmPrimitiveTypeKind.SByte, - EdmPrimitiveTypeKind.Single, EdmPrimitiveTypeKind.Double, - EdmPrimitiveTypeKind.Int16, EdmPrimitiveTypeKind.Int32, EdmPrimitiveTypeKind.Int64, - EdmPrimitiveTypeKind.Decimal - }; - - private final JSONGeoValueSerializer geoSerializer = new JSONGeoValueSerializer(); - - public JsonSerializer(final ODataServiceVersion version, final boolean serverMode) { - this.version = version; - this.serverMode = serverMode; - } - - @Override - public <T> void write(Writer writer, T obj) throws ODataSerializerException { - try { - JsonGenerator json = new JsonFactory().createGenerator(writer); - if (obj instanceof EntitySet) { - new JSONEntitySetSerializer(version, serverMode).doSerialize((EntitySet) obj, json); - } else if (obj instanceof Entity) { - new JSONEntitySerializer(version, serverMode).doSerialize((Entity) obj, json); - } else if (obj instanceof Property) { - new JSONPropertySerializer(version, serverMode).doSerialize((Property) obj, json); - } else if (obj instanceof Link) { - link((Link) obj, json); - } - json.flush(); - } catch (final IOException e) { - throw new ODataSerializerException(e); - } - } - - @SuppressWarnings("unchecked") - @Override - public <T> void write(Writer writer, ResWrap<T> container) throws ODataSerializerException { - final T obj = container == null ? null : container.getPayload(); - - try { - JsonGenerator json = new JsonFactory().createGenerator(writer); - if (obj instanceof EntitySet) { - new JSONEntitySetSerializer(version, serverMode).doContainerSerialize((ResWrap<EntitySet>) container, json); - } else if (obj instanceof Entity) { - new JSONEntitySerializer(version, serverMode).doContainerSerialize((ResWrap<Entity>) container, json); - } else if (obj instanceof Property) { - new JSONPropertySerializer(version, serverMode).doContainerSerialize((ResWrap<Property>) container, json); - } else if (obj instanceof Link) { - link((Link) obj, json); - } - json.flush(); - } catch (final IOException e) { - throw new ODataSerializerException(e); - } - } - - protected void link(final Link link, JsonGenerator jgen) throws IOException { - jgen.writeStartObject(); - jgen.writeStringField(Constants.JSON_URL, link.getHref()); - jgen.writeEndObject(); - } - - protected void links(final Linked linked, final JsonGenerator jgen) throws IOException { - if (serverMode) { - serverLinks(linked, jgen); - } else { - clientLinks(linked, jgen); - } - } - - protected void clientLinks(final Linked linked, final JsonGenerator jgen) throws IOException { - final Map<String, List<String>> entitySetLinks = new HashMap<String, List<String>>(); - for (Link link : linked.getNavigationLinks()) { - for (Annotation annotation : link.getAnnotations()) { - valuable(jgen, annotation, link.getTitle() + "@" + annotation.getTerm()); - } - - ODataLinkType type = null; - try { - type = ODataLinkType.fromString(version, link.getRel(), link.getType()); - } catch (IllegalArgumentException e) { - // ignore - } - - if (type == ODataLinkType.ENTITY_SET_NAVIGATION) { - final List<String> uris; - if (entitySetLinks.containsKey(link.getTitle())) { - uris = entitySetLinks.get(link.getTitle()); - } else { - uris = new ArrayList<String>(); - entitySetLinks.put(link.getTitle(), uris); - } - if (StringUtils.isNotBlank(link.getHref())) { - uris.add(link.getHref()); - } - } else { - if (StringUtils.isNotBlank(link.getHref())) { - jgen.writeStringField(link.getTitle() + Constants.JSON_BIND_LINK_SUFFIX, link.getHref()); - } - } - - if (link.getInlineEntity() != null) { - jgen.writeFieldName(link.getTitle()); - new JSONEntitySerializer(version, serverMode).doSerialize(link.getInlineEntity(), jgen); - } else if (link.getInlineEntitySet() != null) { - jgen.writeArrayFieldStart(link.getTitle()); - JSONEntitySerializer entitySerializer = new JSONEntitySerializer(version, serverMode); - for (Entity subEntry : link.getInlineEntitySet().getEntities()) { - entitySerializer.doSerialize(subEntry, jgen); - } - jgen.writeEndArray(); - } - } - for (Map.Entry<String, List<String>> entitySetLink : entitySetLinks.entrySet()) { - if (!entitySetLink.getValue().isEmpty()) { - jgen.writeArrayFieldStart(entitySetLink.getKey() + Constants.JSON_BIND_LINK_SUFFIX); - for (String uri : entitySetLink.getValue()) { - jgen.writeString(uri); - } - jgen.writeEndArray(); - } - } - } - - protected void serverLinks(final Linked linked, final JsonGenerator jgen) throws IOException { - if (linked instanceof Entity) { - for (Link link : ((Entity) linked).getMediaEditLinks()) { - if (StringUtils.isNotBlank(link.getHref())) { - jgen.writeStringField( - link.getTitle() + StringUtils.prependIfMissing( - version.getJSONMap().get(ODataServiceVersion.JSON_MEDIAEDIT_LINK), "@"), - link.getHref()); - } - } - } - - for (Link link : linked.getAssociationLinks()) { - if (StringUtils.isNotBlank(link.getHref())) { - jgen.writeStringField( - link.getTitle() + version.getJSONMap().get(ODataServiceVersion.JSON_ASSOCIATION_LINK), - link.getHref()); - } - } - - for (Link link : linked.getNavigationLinks()) { - for (Annotation annotation : link.getAnnotations()) { - valuable(jgen, annotation, link.getTitle() + "@" + annotation.getTerm()); - } - - if (StringUtils.isNotBlank(link.getHref())) { - jgen.writeStringField( - link.getTitle() + version.getJSONMap().get(ODataServiceVersion.JSON_NAVIGATION_LINK), - link.getHref()); - } - - if (link.getInlineEntity() != null) { - jgen.writeFieldName(link.getTitle()); - new JSONEntitySerializer(version, serverMode).doSerialize(link.getInlineEntity(), jgen); - } else if (link.getInlineEntitySet() != null) { - jgen.writeArrayFieldStart(link.getTitle()); - JSONEntitySerializer entitySerializer = new JSONEntitySerializer(version, serverMode); - for (Entity subEntry : link.getInlineEntitySet().getEntities()) { - entitySerializer.doSerialize(subEntry, jgen); - } - jgen.writeEndArray(); - } - } - } - - private void collection(final JsonGenerator jgen, final String itemType, final CollectionValue value) - throws IOException { - - jgen.writeStartArray(); - for (Value item : value.get()) { - value(jgen, itemType, item); - } - jgen.writeEndArray(); - } - - protected void primitiveValue(final JsonGenerator jgen, final EdmTypeInfo typeInfo, final PrimitiveValue value) - throws IOException { - - final boolean isNumber = typeInfo == null - ? NumberUtils.isNumber(value.get()) - : ArrayUtils.contains(NUMBER_TYPES, typeInfo.getPrimitiveTypeKind()); - final boolean isBoolean = typeInfo == null - ? (value.get().equalsIgnoreCase(Boolean.TRUE.toString()) - || value.get().equalsIgnoreCase(Boolean.FALSE.toString())) - : typeInfo.getPrimitiveTypeKind() == EdmPrimitiveTypeKind.Boolean; - - if (isNumber) { - jgen.writeNumber(value.get()); - } else if (isBoolean) { - jgen.writeBoolean(BooleanUtils.toBoolean(value.get())); - } else { - jgen.writeString(value.get()); - } - } - - private void value(final JsonGenerator jgen, final String type, final Value value) throws IOException { - final EdmTypeInfo typeInfo = type == null - ? null - : new EdmTypeInfo.Builder().setTypeExpression(type).build(); - - if (value == null || value.isNull()) { - jgen.writeNull(); - } else if (value.isPrimitive()) { - primitiveValue(jgen, typeInfo, value.asPrimitive()); - } else if (value.isEnum()) { - jgen.writeString(value.asEnum().get()); - } else if (value.isGeospatial()) { - jgen.writeStartObject(); - geoSerializer.serialize(jgen, value.asGeospatial().get()); - jgen.writeEndObject(); - } else if (value.isCollection()) { - collection(jgen, typeInfo == null ? null : typeInfo.getFullQualifiedName().toString(), value.asCollection()); - } else if (value.isComplex()) { - jgen.writeStartObject(); - - if (typeInfo != null) { - jgen.writeStringField(version.getJSONMap().get(ODataServiceVersion.JSON_TYPE), typeInfo.external(version)); - } - - for (Property property : value.asComplex().get()) { - valuable(jgen, property, property.getName()); - } - if (value.isLinkedComplex()) { - links(value.asLinkedComplex(), jgen); - } - - jgen.writeEndObject(); - } - } - - protected void valuable(final JsonGenerator jgen, final Valuable valuable, final String name) throws IOException { - if (!Constants.VALUE.equals(name) && !(valuable instanceof Annotation) && !valuable.getValue().isComplex()) { - String type = valuable.getType(); - if (StringUtils.isBlank(type) && valuable.getValue().isPrimitive() || valuable.getValue().isNull()) { - type = EdmPrimitiveTypeKind.String.getFullQualifiedName().toString(); - } - if (StringUtils.isNotBlank(type)) { - jgen.writeFieldName( - name + StringUtils.prependIfMissing(version.getJSONMap().get(ODataServiceVersion.JSON_TYPE), "@")); - jgen.writeString(new EdmTypeInfo.Builder().setTypeExpression(type).build().external(version)); - } - } - - if (valuable instanceof Annotatable) { - for (Annotation annotation : ((Annotatable) valuable).getAnnotations()) { - valuable(jgen, annotation, name + "@" + annotation.getTerm()); - } - } - - jgen.writeFieldName(name); - value(jgen, valuable.getType(), valuable.getValue()); - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/b15439ff/lib/commons-core/src/main/java/org/apache/olingo/commons/core/op/AbstractODataDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/op/AbstractODataDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/op/AbstractODataDeserializer.java deleted file mode 100644 index 548d79d..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/op/AbstractODataDeserializer.java +++ /dev/null @@ -1,101 +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.op; - -import java.io.IOException; -import java.io.InputStream; - -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.EntitySet; -import org.apache.olingo.commons.api.data.Property; -import org.apache.olingo.commons.api.data.ResWrap; -import org.apache.olingo.commons.api.domain.ODataError; -import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; -import org.apache.olingo.commons.api.format.Format; -import org.apache.olingo.commons.api.format.ODataFormat; -import org.apache.olingo.commons.api.format.ODataPubFormat; -import org.apache.olingo.commons.api.op.ODataDeserializer; -import org.apache.olingo.commons.api.op.ODataDeserializerException; -import org.apache.olingo.commons.core.data.AtomDeserializer; -import org.apache.olingo.commons.core.data.JsonDeserializer; - -import com.fasterxml.aalto.stax.InputFactoryImpl; -import com.fasterxml.aalto.stax.OutputFactoryImpl; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.InjectableValues; -import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler; -import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule; -import com.fasterxml.jackson.dataformat.xml.XmlFactory; -import com.fasterxml.jackson.dataformat.xml.XmlMapper; - -public abstract class AbstractODataDeserializer { - - protected final ODataServiceVersion version; - protected final ODataDeserializer deserializer; - - public AbstractODataDeserializer(final ODataServiceVersion version, final boolean serverMode, final Format format) { - this.version = version; - if (format == ODataFormat.XML || format == ODataPubFormat.ATOM) { - deserializer = new AtomDeserializer(version); - } else { - deserializer = new JsonDeserializer(version, serverMode); - } - } - - public ResWrap<EntitySet> toEntitySet(final InputStream input) throws ODataDeserializerException { - return deserializer.toEntitySet(input); - } - - public ResWrap<Entity> toEntity(final InputStream input) throws ODataDeserializerException { - return deserializer.toEntity(input); - } - - public ResWrap<Property> toProperty(final InputStream input) throws ODataDeserializerException { - return deserializer.toProperty(input); - } - - public ODataError toError(final InputStream input) throws ODataDeserializerException { - return deserializer.toError(input); - } - - protected XmlMapper getXmlMapper() { - final XmlMapper xmlMapper = new XmlMapper( - new XmlFactory(new InputFactoryImpl(), new OutputFactoryImpl()), new JacksonXmlModule()); - - xmlMapper.setInjectableValues(new InjectableValues.Std(). - addValue(ODataServiceVersion.class, version). - addValue(Boolean.class, Boolean.FALSE)); - - xmlMapper.addHandler(new DeserializationProblemHandler() { - @Override - public boolean handleUnknownProperty(final DeserializationContext ctxt, final JsonParser jp, - final com.fasterxml.jackson.databind.JsonDeserializer<?> deserializer, - final Object beanOrClass, final String propertyName) - throws IOException, JsonProcessingException { - - // skip any unknown property - ctxt.getParser().skipChildren(); - return true; - } - }); - return xmlMapper; - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/b15439ff/lib/commons-core/src/main/java/org/apache/olingo/commons/core/op/InjectableSerializerProvider.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/op/InjectableSerializerProvider.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/op/InjectableSerializerProvider.java deleted file mode 100644 index 1fed74a..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/op/InjectableSerializerProvider.java +++ /dev/null @@ -1,42 +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.op; - -import com.fasterxml.jackson.databind.SerializationConfig; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider; -import com.fasterxml.jackson.databind.ser.SerializerFactory; - -public class InjectableSerializerProvider extends DefaultSerializerProvider { - - private static final long serialVersionUID = 3432260063063739646L; - - public InjectableSerializerProvider( - final SerializerProvider src, final SerializationConfig config, final SerializerFactory factory) { - - super(src, config, factory); - } - - @Override - public InjectableSerializerProvider createInstance( - final SerializationConfig config, final SerializerFactory factory) { - - return this; - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/b15439ff/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AbstractAtomDealer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AbstractAtomDealer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AbstractAtomDealer.java new file mode 100644 index 0000000..5bf98d3 --- /dev/null +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AbstractAtomDealer.java @@ -0,0 +1,137 @@ +/* + * 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 javax.xml.XMLConstants; +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; +import org.apache.commons.lang3.StringUtils; +import org.apache.olingo.commons.api.Constants; +import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; + +abstract class AbstractAtomDealer { + + protected static final String TYPE_TEXT = "text"; + + protected final ODataServiceVersion version; + + protected final QName etagQName; + + protected final QName metadataEtagQName; + + protected final QName inlineQName; + + protected final QName actionQName; + + protected final QName propertiesQName; + + protected final QName typeQName; + + protected final QName nullQName; + + protected final QName elementQName; + + protected final QName countQName; + + protected final QName uriQName; + + protected final QName nextQName; + + protected final QName annotationQName; + + protected final QName contextQName; + + protected final QName entryRefQName; + + protected final QName propertyValueQName; + + protected final QName deletedEntryQName; + + protected final QName reasonQName; + + protected final QName linkQName; + + protected final QName deletedLinkQName; + + protected final QName errorCodeQName; + + protected final QName errorMessageQName; + + protected final QName errorTargetQName; + + public AbstractAtomDealer(final ODataServiceVersion version) { + this.version = version; + + this.etagQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ATOM_ATTR_ETAG); + this.metadataEtagQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ATOM_ATTR_METADATAETAG); + this.inlineQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ATOM_ELEM_INLINE); + this.actionQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ATOM_ELEM_ACTION); + this.propertiesQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.PROPERTIES); + this.typeQName = new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ATTR_TYPE); + this.nullQName = new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ATTR_NULL); + this.elementQName = version.compareTo(ODataServiceVersion.V40) < 0 + ? new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_DATASERVICES), Constants.ELEM_ELEMENT) + : new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ELEM_ELEMENT); + this.countQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ATOM_ELEM_COUNT); + this.uriQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_DATASERVICES), Constants.ELEM_URI); + this.nextQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_DATASERVICES), Constants.NEXT_LINK_REL); + this.annotationQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ANNOTATION); + this.contextQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.CONTEXT); + this.entryRefQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ATOM_ELEM_ENTRY_REF); + this.propertyValueQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.VALUE); + + this.deletedEntryQName = new QName(Constants.NS_ATOM_TOMBSTONE, Constants.ATOM_ELEM_DELETED_ENTRY); + this.reasonQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ELEM_REASON); + this.linkQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ATOM_ELEM_LINK); + this.deletedLinkQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ELEM_DELETED_LINK); + + this.errorCodeQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ERROR_CODE); + this.errorMessageQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ERROR_MESSAGE); + this.errorTargetQName = + new QName(version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ERROR_TARGET); + } + + protected void namespaces(final XMLStreamWriter writer) throws XMLStreamException { + writer.writeNamespace(StringUtils.EMPTY, Constants.NS_ATOM); + writer.writeNamespace(XMLConstants.XML_NS_PREFIX, XMLConstants.XML_NS_URI); + writer.writeNamespace(Constants.PREFIX_METADATA, version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA)); + writer.writeNamespace( + Constants.PREFIX_DATASERVICES, version.getNamespaceMap().get(ODataServiceVersion.NS_DATASERVICES)); + writer.writeNamespace(Constants.PREFIX_GML, Constants.NS_GML); + writer.writeNamespace(Constants.PREFIX_GEORSS, Constants.NS_GEORSS); + } +}
