Repository: olingo-odata4 Updated Branches: refs/heads/master 8955af75c -> 394d0f816
[OLINGO-575] Merge abstract with single impl classes Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/394d0f81 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/394d0f81 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/394d0f81 Branch: refs/heads/master Commit: 394d0f8169cb647eb51bd005078c3b9b564cd7bf Parents: 8955af7 Author: Michael Bolz <[email protected]> Authored: Mon Feb 23 15:24:02 2015 +0100 Committer: Michael Bolz <[email protected]> Committed: Mon Feb 23 15:24:02 2015 +0100 ---------------------------------------------------------------------- .../domain/AbstractODataCollectionValue.java | 112 -------- .../core/domain/AbstractODataComplexValue.java | 114 -------- .../core/domain/AbstractODataEntity.java | 276 ------------------- .../core/domain/AbstractODataObjectFactory.java | 46 ---- .../domain/AbstractODataPrimitiveValue.java | 212 -------------- .../core/domain/AbstractODataProperty.java | 136 --------- .../core/domain/ODataCollectionValueImpl.java | 63 ++++- .../core/domain/ODataComplexValueImpl.java | 61 +++- .../commons/core/domain/ODataEntityImpl.java | 241 +++++++++++++++- .../core/domain/ODataObjectFactoryImpl.java | 18 +- .../core/domain/ODataPrimitiveValueImpl.java | 179 +++++++++++- .../commons/core/domain/ODataPropertyImpl.java | 94 ++++++- 12 files changed, 628 insertions(+), 924 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/394d0f81/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataCollectionValue.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataCollectionValue.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataCollectionValue.java deleted file mode 100644 index 8b72681..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataCollectionValue.java +++ /dev/null @@ -1,112 +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.domain; - -import org.apache.olingo.commons.api.domain.AbstractODataValue; -import org.apache.olingo.commons.api.domain.ODataCollectionValue; -import org.apache.olingo.commons.api.domain.ODataValue; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; - -/** - * OData collection property value. - * - * @param <OV> The actual ODataValue interface. - */ -public abstract class AbstractODataCollectionValue<OV extends ODataValue> - extends AbstractODataValue implements ODataCollectionValue<OV> { - - /** - * Values. - */ - protected final List<OV> values = new ArrayList<OV>(); - - /** - * Constructor. - * - * @param typeName type name. - */ - public AbstractODataCollectionValue(final String typeName) { - super(typeName == null || typeName.startsWith("Collection(") ? typeName : "Collection(" + typeName + ")"); - } - - protected abstract ODataCollectionValue<OV> getThis(); - - /** - * Adds a value to the collection. - * - * @param value value to be added. - */ - @Override - @SuppressWarnings("unchecked") - public ODataCollectionValue<OV> add(final ODataValue value) { - values.add((OV) value); - return getThis(); - } - - /** - * Value iterator. - * - * @return value iterator. - */ - @Override - public Iterator<OV> iterator() { - return values.iterator(); - } - - /** - * Gets collection size. - * - * @return collection size. - */ - @Override - public int size() { - return values.size(); - } - - /** - * Checks if collection is empty. - * - * @return 'TRUE' if empty; 'FALSE' otherwise. - */ - @Override - public boolean isEmpty() { - return values.isEmpty(); - } - - @Override - public Collection<Object> asJavaCollection() { - final List<Object> result = new ArrayList<Object>(); - for (OV value : values) { - if (value.isPrimitive()) { - result.add(value.asPrimitive().toValue()); - } else if (value.isComplex()) { - result.add(value.asComplex().asJavaMap()); - } else if (value.isCollection()) { - result.add(value.asCollection().asJavaCollection()); - } - } - - return result; - } - -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/394d0f81/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataComplexValue.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataComplexValue.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataComplexValue.java deleted file mode 100644 index 71dc49f..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataComplexValue.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.domain; - -import org.apache.olingo.commons.api.domain.AbstractODataValue; -import org.apache.olingo.commons.api.domain.ODataProperty; -import org.apache.olingo.commons.api.domain.ODataComplexValue; - -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * OData complex property value. - * - * @param <OP> The actual ODataProperty interface. - */ -public abstract class AbstractODataComplexValue<OP extends ODataProperty> - extends AbstractODataValue implements ODataComplexValue<OP> { - - /** - * Complex type fields. - */ - protected final Map<String, OP> fields = new LinkedHashMap<String, OP>(); - - /** - * Constructor. - * - * @param typeName type name. - */ - public AbstractODataComplexValue(final String typeName) { - super(typeName); - } - - protected abstract ODataComplexValue<OP> getThis(); - - /** - * Adds field to the complex type. - * - * @param field field to be added. - */ - @Override - @SuppressWarnings("unchecked") - public ODataComplexValue<OP> add(final ODataProperty field) { - fields.put(field.getName(), (OP) field); - return getThis(); - } - - /** - * Gets field. - * - * @param name name of the field to be retrieved. - * @return requested field. - */ - @Override - public OP get(final String name) { - return fields.get(name); - } - - /** - * Complex property fields iterator. - * - * @return fields iterator. - */ - @Override - public Iterator<OP> iterator() { - return fields.values().iterator(); - } - - /** - * Gets number of fields. - * - * @return number of fields. - */ - @Override - public int size() { - return fields.size(); - } - - @Override - public Map<String, Object> asJavaMap() { - final Map<String, Object> result = new LinkedHashMap<String, Object>(); - for (Map.Entry<String, OP> entry : fields.entrySet()) { - Object value = null; - if (entry.getValue().hasPrimitiveValue()) { - value = entry.getValue().getPrimitiveValue().toValue(); - } else if (entry.getValue().hasComplexValue()) { - value = entry.getValue().getValue().asComplex().asJavaMap(); - } else if (entry.getValue().hasCollectionValue()) { - value = entry.getValue().getValue().asCollection().asJavaCollection(); - } - - result.put(entry.getKey(), value); - } - - return result; - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/394d0f81/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataEntity.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataEntity.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataEntity.java deleted file mode 100644 index e7cebbb..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataEntity.java +++ /dev/null @@ -1,276 +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.domain; - -import org.apache.commons.lang3.StringUtils; -import org.apache.olingo.commons.api.domain.AbstractODataPayload; -import org.apache.olingo.commons.api.domain.ODataEntity; -import org.apache.olingo.commons.api.domain.ODataProperty; -import org.apache.olingo.commons.api.domain.ODataLink; -import org.apache.olingo.commons.api.domain.ODataOperation; -import org.apache.olingo.commons.api.edm.FullQualifiedName; - -import java.net.URI; -import java.util.ArrayList; -import java.util.List; - -/** - * OData entity. - */ -public abstract class AbstractODataEntity extends AbstractODataPayload implements ODataEntity { - - private final FullQualifiedName typeName; - - /** - * ETag. - */ - private String eTag; - - /** - * Media entity flag. - */ - private boolean mediaEntity = false; - - /** - * In case of media entity, media content type. - */ - private String mediaContentType; - - /** - * In case of media entity, media content source. - */ - private URI mediaContentSource; - - /** - * Media ETag. - */ - private String mediaETag; - - /** - * Edit link. - */ - private URI editLink; - - /** - * Navigation links (might contain in-line entities or entity sets). - */ - private final List<ODataLink> navigationLinks = new ArrayList<ODataLink>(); - - /** - * Association links. - */ - private final List<ODataLink> associationLinks = new ArrayList<ODataLink>(); - - /** - * Media edit links. - */ - private final List<ODataLink> mediaEditLinks = new ArrayList<ODataLink>(); - - /** - * Operations (legacy, functions, actions). - */ - private final List<ODataOperation> operations = new ArrayList<ODataOperation>(); - - public AbstractODataEntity(final FullQualifiedName typeName) { - super(typeName == null ? null : typeName.toString()); - this.typeName = typeName; - } - - @Override - public FullQualifiedName getTypeName() { - return typeName; - } - - @Override - public String getETag() { - return eTag; - } - - @Override - public void setETag(final String eTag) { - this.eTag = eTag; - } - - @Override - public ODataOperation getOperation(final String title) { - ODataOperation result = null; - for (ODataOperation operation : operations) { - if (title.equals(operation.getTitle())) { - result = operation; - } - } - - return result; - } - - /** - * Gets operations. - * - * @return operations. - */ - @Override - public List<ODataOperation> getOperations() { - return operations; - } - - @Override - public ODataProperty getProperty(final String name) { - ODataProperty result = null; - - if (StringUtils.isNotBlank(name)) { - for (ODataProperty property : getProperties()) { - if (name.equals(property.getName())) { - result = property; - } - } - } - - return result; - } - - @Override - public boolean addLink(final ODataLink link) { - boolean result = false; - - switch (link.getType()) { - case ASSOCIATION: - result = associationLinks.contains(link) ? false : associationLinks.add(link); - break; - - case ENTITY_NAVIGATION: - case ENTITY_SET_NAVIGATION: - result = navigationLinks.contains(link) ? false : navigationLinks.add(link); - break; - - case MEDIA_EDIT: - result = mediaEditLinks.contains(link) ? false : mediaEditLinks.add(link); - break; - - default: - } - - return result; - } - - @Override - public boolean removeLink(final ODataLink link) { - return associationLinks.remove(link) || navigationLinks.remove(link); - } - - private ODataLink getLink(final List<ODataLink> links, final String name) { - ODataLink result = null; - for (ODataLink link : links) { - if (name.equals(link.getName())) { - result = link; - } - } - - return result; - } - - @Override - public ODataLink getNavigationLink(final String name) { - return getLink(navigationLinks, name); - } - - @Override - public List<ODataLink> getNavigationLinks() { - return navigationLinks; - } - - @Override - public ODataLink getAssociationLink(final String name) { - return getLink(associationLinks, name); - } - - @Override - public List<ODataLink> getAssociationLinks() { - return associationLinks; - } - - @Override - public ODataLink getMediaEditLink(final String name) { - return getLink(mediaEditLinks, name); - } - - @Override - public List<ODataLink> getMediaEditLinks() { - return mediaEditLinks; - } - - @Override - public URI getEditLink() { - return editLink; - } - - @Override - public void setEditLink(final URI editLink) { - this.editLink = editLink; - } - - @Override - public URI getLink() { - return super.getLink() == null ? getEditLink() : super.getLink(); - } - - @Override - public boolean isReadOnly() { - return super.getLink() != null; - } - - @Override - public boolean isMediaEntity() { - return mediaEntity; - } - - @Override - public void setMediaEntity(final boolean isMediaEntity) { - mediaEntity = isMediaEntity; - } - - @Override - public String getMediaContentType() { - return mediaContentType; - } - - @Override - public void setMediaContentType(final String mediaContentType) { - this.mediaContentType = mediaContentType; - } - - @Override - public URI getMediaContentSource() { - return mediaContentSource; - } - - @Override - public void setMediaContentSource(final URI mediaContentSource) { - this.mediaContentSource = mediaContentSource; - } - - @Override - public String getMediaETag() { - return mediaETag; - } - - @Override - public void setMediaETag(final String eTag) { - mediaETag = eTag; - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/394d0f81/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java deleted file mode 100644 index f54f957..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java +++ /dev/null @@ -1,46 +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.domain; - -import org.apache.olingo.commons.api.domain.ODataEntity; -import org.apache.olingo.commons.api.domain.ODataEntitySet; -import org.apache.olingo.commons.api.domain.ODataObjectFactory; -import org.apache.olingo.commons.api.domain.ODataInlineEntity; -import org.apache.olingo.commons.api.domain.ODataInlineEntitySet; -import org.apache.olingo.commons.api.domain.ODataLinkType; -import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; - -public abstract class AbstractODataObjectFactory implements ODataObjectFactory { - - protected final ODataServiceVersion version; - - public AbstractODataObjectFactory(final ODataServiceVersion version) { - this.version = version; - } - - @Override - public ODataInlineEntitySet newDeepInsertEntitySet(final String name, final ODataEntitySet entitySet) { - return new ODataInlineEntitySet(version, null, ODataLinkType.ENTITY_SET_NAVIGATION, name, entitySet); - } - - @Override - public ODataInlineEntity newDeepInsertEntity(final String name, final ODataEntity entity) { - return new ODataInlineEntity(version, null, ODataLinkType.ENTITY_NAVIGATION, name, entity); - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/394d0f81/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataPrimitiveValue.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataPrimitiveValue.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataPrimitiveValue.java deleted file mode 100644 index 2c97507..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataPrimitiveValue.java +++ /dev/null @@ -1,212 +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.domain; - -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.domain.AbstractODataValue; -import org.apache.olingo.commons.api.domain.ODataPrimitiveValue; -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.EdmType; -import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; -import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; -import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; - -import java.util.UUID; - -public abstract class AbstractODataPrimitiveValue extends AbstractODataValue implements ODataPrimitiveValue { - - public static abstract class AbstractBuilder implements Builder { - - private final ODataServiceVersion version; - - public AbstractBuilder(final ODataServiceVersion version) { - this.version = version; - } - - protected abstract AbstractODataPrimitiveValue getInstance(); - - @Override - public AbstractBuilder setType(final EdmType type) { - EdmPrimitiveTypeKind primitiveTypeKind = null; - if (type != null) { - if (type.getKind() != EdmTypeKind.PRIMITIVE) { - throw new IllegalArgumentException(String.format("Provided type %s is not primitive", type)); - } - primitiveTypeKind = EdmPrimitiveTypeKind.valueOf(type.getName()); - } - return setType(primitiveTypeKind); - } - - @Override - public AbstractBuilder setType(final EdmPrimitiveTypeKind type) { - if (type != null && !type.getSupportedVersions().contains(version)) { - throw new IllegalArgumentException(String.format( - "Type %s not supported by OData version %s", type.toString(), version)); - } - if (type == EdmPrimitiveTypeKind.Stream) { - throw new IllegalArgumentException(String.format( - "Cannot build a primitive value for %s", EdmPrimitiveTypeKind.Stream.toString())); - } - if (type == EdmPrimitiveTypeKind.Geography || type == EdmPrimitiveTypeKind.Geometry) { - throw new IllegalArgumentException( - type + "is not an instantiable type. " - + "An entity can declare a property to be of type Geometry. " - + "An instance of an entity MUST NOT have a value of type Geometry. " - + "Each value MUST be of some subtype."); - } - - getInstance().typeKind = type == null ? EdmPrimitiveTypeKind.String : type; - getInstance().type = EdmPrimitiveTypeFactory.getInstance(getInstance().typeKind); - - return this; - } - - @Override - public AbstractBuilder setValue(final Object value) { - getInstance().value = value; - return this; - } - - @Override - public ODataPrimitiveValue build() { - if (getInstance().type == null) { - setType(EdmPrimitiveTypeKind.String); - } - return getInstance(); - } - - @Override - public ODataPrimitiveValue buildBoolean(final Boolean value) { - return setType(EdmPrimitiveTypeKind.Boolean).setValue(value).build(); - } - - @Override - public ODataPrimitiveValue buildInt16(final Short value) { - return setType(EdmPrimitiveTypeKind.Int16).setValue(value).build(); - } - - @Override - public ODataPrimitiveValue buildInt32(final Integer value) { - return setType(EdmPrimitiveTypeKind.Int32).setValue(value).build(); - } - - @Override - public ODataPrimitiveValue buildInt64(final Long value) { - return setType(EdmPrimitiveTypeKind.Int64).setValue(value).build(); - } - - @Override - public ODataPrimitiveValue buildSingle(final Float value) { - return setType(EdmPrimitiveTypeKind.Single).setValue(value).build(); - } - - @Override - public ODataPrimitiveValue buildDouble(final Double value) { - return setType(EdmPrimitiveTypeKind.Double).setValue(value).build(); - } - - @Override - public ODataPrimitiveValue buildString(final String value) { - return setType(EdmPrimitiveTypeKind.String).setValue(value).build(); - } - - @Override - public ODataPrimitiveValue buildGuid(final UUID value) { - return setType(EdmPrimitiveTypeKind.Guid).setValue(value).build(); - } - - @Override - public ODataPrimitiveValue buildBinary(final byte[] value) { - return setType(EdmPrimitiveTypeKind.Binary).setValue(value).build(); - } - - } - - /** - * Type kind. - */ - private EdmPrimitiveTypeKind typeKind; - - /** - * Type. - */ - private EdmPrimitiveType type; - - /** - * Actual value. - */ - private Object value; - - protected AbstractODataPrimitiveValue() { - super(null); - } - - @Override - public String getTypeName() { - return typeKind.getFullQualifiedName().toString(); - } - - @Override - public EdmPrimitiveTypeKind getTypeKind() { - return typeKind; - } - - @Override - public EdmPrimitiveType getType() { - return type; - } - - @Override - public Object toValue() { - return value; - } - - @Override - public <T> T toCastValue(final Class<T> reference) throws EdmPrimitiveTypeException { - if (value == null) { - return null; - } else if (typeKind.isGeospatial()) { - return reference.cast(value); - } else { - // TODO: set facets - return type.valueOfString(type.valueToString(value, - null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), - null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null, reference); - } - } - - @Override - public String toString() { - if (value == null) { - return ""; - } else if (typeKind.isGeospatial()) { - return value.toString(); - } else { - try { - // TODO: set facets - return type.valueToString(value, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null); - } catch (EdmPrimitiveTypeException e) { - throw new IllegalArgumentException(e); - } - } - } - -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/394d0f81/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataProperty.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataProperty.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataProperty.java deleted file mode 100644 index 71274cf..0000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataProperty.java +++ /dev/null @@ -1,136 +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.domain; - -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.apache.commons.lang3.builder.ReflectionToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import org.apache.olingo.commons.api.domain.ODataProperty; -import org.apache.olingo.commons.api.domain.ODataPrimitiveValue; -import org.apache.olingo.commons.api.domain.ODataValue; - -public abstract class AbstractODataProperty implements ODataProperty { - - /** - * Property name. - */ - private final String name; - - /** - * Property value. - */ - private final ODataValue value; - - /** - * Constructor. - * - * @param name property name. - * @param value property value. - */ - public AbstractODataProperty(final String name, final ODataValue value) { - this.name = name; - this.value = value; - } - - /** - * Returns property name. - * - * @return property name. - */ - @Override - public String getName() { - return name; - } - - /** - * Returns property value. - * - * @return property value. - */ - @Override - public ODataValue getValue() { - return value; - } - - /** - * Checks if has null value. - * - * @return 'TRUE' if has null value; 'FALSE' otherwise. - */ - @Override - public boolean hasNullValue() { - return value == null || value.isPrimitive() && value.asPrimitive().toValue() == null; - } - - /** - * Checks if has primitive value. - * - * @return 'TRUE' if has primitive value; 'FALSE' otherwise. - */ - @Override - public boolean hasPrimitiveValue() { - return !hasNullValue() && value.isPrimitive(); - } - - /** - * Gets primitive value. - * - * @return primitive value if exists; null otherwise. - */ - @Override - public ODataPrimitiveValue getPrimitiveValue() { - return hasPrimitiveValue() ? value.asPrimitive() : null; - } - - /** - * Checks if has complex value. - * - * @return 'TRUE' if has complex value; 'FALSE' otherwise. - */ - @Override - public boolean hasComplexValue() { - return !hasNullValue() && value.isComplex(); - } - - /** - * Checks if has collection value. - * - * @return 'TRUE' if has collection value; 'FALSE' otherwise. - */ - @Override - public boolean hasCollectionValue() { - return !hasNullValue() && value.isCollection(); - } - - @Override - public boolean equals(final Object obj) { - return EqualsBuilder.reflectionEquals(this, obj); - } - - @Override - public int hashCode() { - return HashCodeBuilder.reflectionHashCode(this); - } - - @Override - public String toString() { - return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE); - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/394d0f81/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataCollectionValueImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataCollectionValueImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataCollectionValueImpl.java index 6f519f8..90486f6 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataCollectionValueImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataCollectionValueImpl.java @@ -18,21 +18,29 @@ */ package org.apache.olingo.commons.core.domain; +import org.apache.olingo.commons.api.domain.AbstractODataValue; +import org.apache.olingo.commons.api.domain.ODataCollectionValue; import org.apache.olingo.commons.api.domain.ODataEnumValue; import org.apache.olingo.commons.api.domain.ODataLinkedComplexValue; import org.apache.olingo.commons.api.domain.ODataValue; import java.util.ArrayList; import java.util.Collection; +import java.util.Iterator; import java.util.List; -public class ODataCollectionValueImpl extends AbstractODataCollectionValue<ODataValue> implements ODataValue { +public class ODataCollectionValueImpl<OV extends ODataValue> extends AbstractODataValue + implements ODataCollectionValue<OV>, ODataValue { + /** + * Constructor. + * + * @param typeName type name. + */ public ODataCollectionValueImpl(final String typeName) { - super(typeName); + super(typeName == null || typeName.startsWith("Collection(") ? typeName : "Collection(" + typeName + ")"); } - @Override protected ODataCollectionValueImpl getThis() { return this; } @@ -74,4 +82,53 @@ public class ODataCollectionValueImpl extends AbstractODataCollectionValue<OData return result; } + + /** + * Values. + */ + protected final List<OV> values = new ArrayList<OV>(); + + /** + * Adds a value to the collection. + * + * @param value value to be added. + */ + @Override + @SuppressWarnings("unchecked") + public ODataCollectionValue<OV> add(final ODataValue value) { + values.add((OV) value); + return getThis(); + } + + /** + * Value iterator. + * + * @return value iterator. + */ + @Override + public Iterator<OV> iterator() { + return values.iterator(); + } + + /** + * Gets collection size. + * + * @return collection size. + */ + @Override + public int size() { + return values.size(); + } + + /** + * Checks if collection is empty. + * + * @return 'TRUE' if empty; 'FALSE' otherwise. + */ + @Override + public boolean isEmpty() { + return values.isEmpty(); + } + + } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/394d0f81/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataComplexValueImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataComplexValueImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataComplexValueImpl.java index bd148b2..9c96ace 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataComplexValueImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataComplexValueImpl.java @@ -18,6 +18,7 @@ */ package org.apache.olingo.commons.core.domain; +import org.apache.olingo.commons.api.domain.AbstractODataValue; import org.apache.olingo.commons.api.domain.ODataAnnotation; import org.apache.olingo.commons.api.domain.ODataComplexValue; import org.apache.olingo.commons.api.domain.ODataEnumValue; @@ -26,11 +27,13 @@ import org.apache.olingo.commons.api.domain.ODataLinkedComplexValue; import org.apache.olingo.commons.api.domain.ODataProperty; import java.util.ArrayList; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -public class ODataComplexValueImpl extends AbstractODataComplexValue<ODataProperty> implements ODataLinkedComplexValue { +public class ODataComplexValueImpl extends AbstractODataValue implements ODataComplexValue<ODataProperty>, + ODataLinkedComplexValue { /** * Navigation links (might contain in-line entities or entity sets). @@ -44,11 +47,21 @@ public class ODataComplexValueImpl extends AbstractODataComplexValue<ODataProper private final List<ODataAnnotation> annotations = new ArrayList<ODataAnnotation>(); + /** + * Complex type fields. + */ + private final Map<String, ODataProperty> fields = new LinkedHashMap<String, ODataProperty>(); + + /** + * Constructor. + * + * @param typeName type name. + */ public ODataComplexValueImpl(final String typeName) { super(typeName); } - @Override + protected ODataComplexValue<ODataProperty> getThis() { return this; } @@ -158,4 +171,48 @@ public class ODataComplexValueImpl extends AbstractODataComplexValue<ODataProper return annotations; } + + + /** + * Adds field to the complex type. + * + * @param field field to be added. + */ + @Override + @SuppressWarnings("unchecked") + public ODataComplexValue<ODataProperty> add(final ODataProperty field) { + fields.put(field.getName(), field); + return getThis(); + } + + /** + * Gets field. + * + * @param name name of the field to be retrieved. + * @return requested field. + */ + @Override + public ODataProperty get(final String name) { + return fields.get(name); + } + + /** + * Complex property fields iterator. + * + * @return fields iterator. + */ + @Override + public Iterator<ODataProperty> iterator() { + return fields.values().iterator(); + } + + /** + * Gets number of fields. + * + * @return number of fields. + */ + @Override + public int size() { + return fields.size(); + } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/394d0f81/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataEntityImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataEntityImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataEntityImpl.java index 84bba6d..ab6ddec 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataEntityImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataEntityImpl.java @@ -22,39 +22,265 @@ import java.net.URI; import java.util.ArrayList; import java.util.List; +import org.apache.commons.lang3.StringUtils; +import org.apache.olingo.commons.api.domain.AbstractODataPayload; import org.apache.olingo.commons.api.domain.ODataAnnotation; +import org.apache.olingo.commons.api.domain.ODataEntity; +import org.apache.olingo.commons.api.domain.ODataLink; +import org.apache.olingo.commons.api.domain.ODataOperation; import org.apache.olingo.commons.api.domain.ODataProperty; import org.apache.olingo.commons.api.domain.ODataSingleton; import org.apache.olingo.commons.api.edm.FullQualifiedName; -public class ODataEntityImpl extends AbstractODataEntity implements ODataSingleton { +public class ODataEntityImpl extends AbstractODataPayload implements ODataEntity, ODataSingleton { /** * Entity id. */ private URI id; + /** + * ETag. + */ + private String eTag; + /** + * Media entity flag. + */ + private boolean mediaEntity = false; + /** + * In case of media entity, media content type. + */ + private String mediaContentType; + /** + * In case of media entity, media content source. + */ + private URI mediaContentSource; + /** + * Media ETag. + */ + private String mediaETag; + /** + * Edit link. + */ + private URI editLink; private final List<ODataProperty> properties = new ArrayList<ODataProperty>(); private final List<ODataAnnotation> annotations = new ArrayList<ODataAnnotation>(); + private final FullQualifiedName typeName; + /** + * Navigation links (might contain in-line entities or entity sets). + */ + private final List<ODataLink> navigationLinks = new ArrayList<ODataLink>(); + /** + * Association links. + */ + private final List<ODataLink> associationLinks = new ArrayList<ODataLink>(); + /** + * Media edit links. + */ + private final List<ODataLink> mediaEditLinks = new ArrayList<ODataLink>(); + /** + * Operations (legacy, functions, actions). + */ + private final List<ODataOperation> operations = new ArrayList<ODataOperation>(); + public ODataEntityImpl(final FullQualifiedName typeName) { - super(typeName); + super(typeName == null ? null : typeName.toString()); + this.typeName = typeName; } @Override - public URI getId() { - return id; + public FullQualifiedName getTypeName() { + return typeName; } @Override - public void setId(final URI id) { - this.id = id; + public String getETag() { + return eTag; + } + + @Override + public void setETag(final String eTag) { + this.eTag = eTag; + } + + @Override + public ODataOperation getOperation(final String title) { + ODataOperation result = null; + for (ODataOperation operation : operations) { + if (title.equals(operation.getTitle())) { + result = operation; + } + } + + return result; + } + + /** + * Gets operations. + * + * @return operations. + */ + @Override + public List<ODataOperation> getOperations() { + return operations; } + @Override public ODataProperty getProperty(final String name) { - return (ODataProperty) super.getProperty(name); + ODataProperty result = null; + + if (StringUtils.isNotBlank(name)) { + for (ODataProperty property : getProperties()) { + if (name.equals(property.getName())) { + result = property; + } + } + } + + return result; + } + + @Override + public boolean addLink(final ODataLink link) { + boolean result = false; + + switch (link.getType()) { + case ASSOCIATION: + result = associationLinks.contains(link) ? false : associationLinks.add(link); + break; + + case ENTITY_NAVIGATION: + case ENTITY_SET_NAVIGATION: + result = navigationLinks.contains(link) ? false : navigationLinks.add(link); + break; + + case MEDIA_EDIT: + result = mediaEditLinks.contains(link) ? false : mediaEditLinks.add(link); + break; + + default: + } + + return result; + } + + @Override + public boolean removeLink(final ODataLink link) { + return associationLinks.remove(link) || navigationLinks.remove(link); + } + + private ODataLink getLink(final List<ODataLink> links, final String name) { + ODataLink result = null; + for (ODataLink link : links) { + if (name.equals(link.getName())) { + result = link; + } + } + + return result; + } + + @Override + public ODataLink getNavigationLink(final String name) { + return getLink(navigationLinks, name); + } + + @Override + public List<ODataLink> getNavigationLinks() { + return navigationLinks; + } + + @Override + public ODataLink getAssociationLink(final String name) { + return getLink(associationLinks, name); + } + + @Override + public List<ODataLink> getAssociationLinks() { + return associationLinks; + } + + @Override + public ODataLink getMediaEditLink(final String name) { + return getLink(mediaEditLinks, name); + } + + @Override + public List<ODataLink> getMediaEditLinks() { + return mediaEditLinks; + } + + @Override + public URI getEditLink() { + return editLink; + } + + @Override + public void setEditLink(final URI editLink) { + this.editLink = editLink; + } + + @Override + public URI getLink() { + return super.getLink() == null ? getEditLink() : super.getLink(); + } + + @Override + public boolean isReadOnly() { + return super.getLink() != null; + } + + @Override + public boolean isMediaEntity() { + return mediaEntity; + } + + @Override + public void setMediaEntity(final boolean isMediaEntity) { + mediaEntity = isMediaEntity; + } + + @Override + public String getMediaContentType() { + return mediaContentType; + } + + @Override + public void setMediaContentType(final String mediaContentType) { + this.mediaContentType = mediaContentType; + } + + @Override + public URI getMediaContentSource() { + return mediaContentSource; + } + + @Override + public void setMediaContentSource(final URI mediaContentSource) { + this.mediaContentSource = mediaContentSource; + } + + @Override + public String getMediaETag() { + return mediaETag; + } + + @Override + public void setMediaETag(final String eTag) { + mediaETag = eTag; + } + + @Override + public URI getId() { + return id; + } + + @Override + public void setId(final URI id) { + this.id = id; } @Override @@ -66,5 +292,4 @@ public class ODataEntityImpl extends AbstractODataEntity implements ODataSinglet public List<ODataAnnotation> getAnnotations() { return annotations; } - } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/394d0f81/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataObjectFactoryImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataObjectFactoryImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataObjectFactoryImpl.java index 629b05d..590e292 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataObjectFactoryImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataObjectFactoryImpl.java @@ -18,6 +18,8 @@ */ package org.apache.olingo.commons.core.domain; +import org.apache.olingo.commons.api.domain.ODataInlineEntity; +import org.apache.olingo.commons.api.domain.ODataInlineEntitySet; import org.apache.olingo.commons.api.domain.ODataProperty; import org.apache.olingo.commons.api.domain.ODataCollectionValue; import org.apache.olingo.commons.api.domain.ODataComplexValue; @@ -37,10 +39,22 @@ import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; import java.net.URI; -public class ODataObjectFactoryImpl extends AbstractODataObjectFactory implements ODataObjectFactory { +public class ODataObjectFactoryImpl implements ODataObjectFactory { + + protected final ODataServiceVersion version; public ODataObjectFactoryImpl(final ODataServiceVersion version) { - super(version); + this.version = version; + } + + @Override + public ODataInlineEntitySet newDeepInsertEntitySet(final String name, final ODataEntitySet entitySet) { + return new ODataInlineEntitySet(version, null, ODataLinkType.ENTITY_SET_NAVIGATION, name, entitySet); + } + + @Override + public ODataInlineEntity newDeepInsertEntity(final String name, final ODataEntity entity) { + return new ODataInlineEntity(version, null, ODataLinkType.ENTITY_NAVIGATION, name, entity); } @Override http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/394d0f81/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataPrimitiveValueImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataPrimitiveValueImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataPrimitiveValueImpl.java index e50d8ad..4658201 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataPrimitiveValueImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataPrimitiveValueImpl.java @@ -18,32 +18,199 @@ */ package org.apache.olingo.commons.core.domain; +import org.apache.olingo.commons.api.Constants; +import org.apache.olingo.commons.api.domain.AbstractODataValue; import org.apache.olingo.commons.api.domain.ODataEnumValue; import org.apache.olingo.commons.api.domain.ODataLinkedComplexValue; +import org.apache.olingo.commons.api.domain.ODataPrimitiveValue; import org.apache.olingo.commons.api.domain.ODataValue; +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.EdmType; +import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; +import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; -public class ODataPrimitiveValueImpl extends AbstractODataPrimitiveValue implements ODataValue { +import java.util.UUID; - public static class BuilderImpl extends AbstractBuilder { +public class ODataPrimitiveValueImpl extends AbstractODataValue implements ODataValue, ODataPrimitiveValue { + + public static class BuilderImpl implements Builder { private final ODataPrimitiveValueImpl instance; public BuilderImpl(final ODataServiceVersion version) { - super(version); + this.version = version; instance = new ODataPrimitiveValueImpl(); } + private final ODataServiceVersion version; + + @Override + public BuilderImpl setType(final EdmType type) { + EdmPrimitiveTypeKind primitiveTypeKind = null; + if (type != null) { + if (type.getKind() != EdmTypeKind.PRIMITIVE) { + throw new IllegalArgumentException(String.format("Provided type %s is not primitive", type)); + } + primitiveTypeKind = EdmPrimitiveTypeKind.valueOf(type.getName()); + } + return setType(primitiveTypeKind); + } + + @Override + public BuilderImpl setType(final EdmPrimitiveTypeKind type) { + if (type != null && !type.getSupportedVersions().contains(version)) { + throw new IllegalArgumentException(String.format( + "Type %s not supported by OData version %s", type.toString(), version)); + } + if (type == EdmPrimitiveTypeKind.Stream) { + throw new IllegalArgumentException(String.format( + "Cannot build a primitive value for %s", EdmPrimitiveTypeKind.Stream.toString())); + } + if (type == EdmPrimitiveTypeKind.Geography || type == EdmPrimitiveTypeKind.Geometry) { + throw new IllegalArgumentException( + type + "is not an instantiable type. " + + "An entity can declare a property to be of type Geometry. " + + "An instance of an entity MUST NOT have a value of type Geometry. " + + "Each value MUST be of some subtype."); + } + + instance.typeKind = type == null ? EdmPrimitiveTypeKind.String : type; + instance.type = EdmPrimitiveTypeFactory.getInstance(instance.typeKind); + + return this; + } + + @Override + public BuilderImpl setValue(final Object value) { + instance.value = value; + return this; + } + @Override - protected AbstractODataPrimitiveValue getInstance() { + public ODataPrimitiveValue build() { + if (instance.type == null) { + setType(EdmPrimitiveTypeKind.String); + } return instance; } @Override - public ODataPrimitiveValueImpl build() { - return (ODataPrimitiveValueImpl) super.build(); + public ODataPrimitiveValue buildBoolean(final Boolean value) { + return setType(EdmPrimitiveTypeKind.Boolean).setValue(value).build(); + } + + @Override + public ODataPrimitiveValue buildInt16(final Short value) { + return setType(EdmPrimitiveTypeKind.Int16).setValue(value).build(); + } + + @Override + public ODataPrimitiveValue buildInt32(final Integer value) { + return setType(EdmPrimitiveTypeKind.Int32).setValue(value).build(); + } + + @Override + public ODataPrimitiveValue buildInt64(final Long value) { + return setType(EdmPrimitiveTypeKind.Int64).setValue(value).build(); + } + + @Override + public ODataPrimitiveValue buildSingle(final Float value) { + return setType(EdmPrimitiveTypeKind.Single).setValue(value).build(); + } + + @Override + public ODataPrimitiveValue buildDouble(final Double value) { + return setType(EdmPrimitiveTypeKind.Double).setValue(value).build(); + } + + @Override + public ODataPrimitiveValue buildString(final String value) { + return setType(EdmPrimitiveTypeKind.String).setValue(value).build(); } + @Override + public ODataPrimitiveValue buildGuid(final UUID value) { + return setType(EdmPrimitiveTypeKind.Guid).setValue(value).build(); + } + + @Override + public ODataPrimitiveValue buildBinary(final byte[] value) { + return setType(EdmPrimitiveTypeKind.Binary).setValue(value).build(); + } + + } + + /** + * Type kind. + */ + private EdmPrimitiveTypeKind typeKind; + + /** + * Type. + */ + private EdmPrimitiveType type; + + /** + * Actual value. + */ + private Object value; + + protected ODataPrimitiveValueImpl() { + super(null); + } + + @Override + public String getTypeName() { + return typeKind.getFullQualifiedName().toString(); + } + + @Override + public EdmPrimitiveTypeKind getTypeKind() { + return typeKind; + } + + @Override + public EdmPrimitiveType getType() { + return type; + } + + @Override + public Object toValue() { + return value; + } + + @Override + public <T> T toCastValue(final Class<T> reference) throws EdmPrimitiveTypeException { + if (value == null) { + return null; + } else if (typeKind.isGeospatial()) { + return reference.cast(value); + } else { + // TODO: set facets + return type.valueOfString(type.valueToString(value, + null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), + null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null, reference); + } + } + + @Override + public String toString() { + if (value == null) { + return ""; + } else if (typeKind.isGeospatial()) { + return value.toString(); + } else { + try { + // TODO: set facets + return type.valueToString(value, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null); + } catch (EdmPrimitiveTypeException e) { + throw new IllegalArgumentException(e); + } + } } @Override http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/394d0f81/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataPropertyImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataPropertyImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataPropertyImpl.java index d383af4..bb84f7d 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataPropertyImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataPropertyImpl.java @@ -18,6 +18,9 @@ */ package org.apache.olingo.commons.core.domain; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.olingo.commons.api.domain.ODataPrimitiveValue; import org.apache.olingo.commons.api.domain.ODataProperty; import org.apache.olingo.commons.api.domain.ODataAnnotatable; import org.apache.olingo.commons.api.domain.ODataAnnotation; @@ -31,20 +34,98 @@ import org.apache.olingo.commons.api.domain.ODataValue; import java.util.ArrayList; import java.util.List; -public class ODataPropertyImpl extends AbstractODataProperty implements ODataProperty, ODataAnnotatable, ODataValuable { +public class ODataPropertyImpl implements ODataProperty, ODataAnnotatable, ODataValuable { - private final ODataValuable valuable; private final List<ODataAnnotation> annotations = new ArrayList<ODataAnnotation>(); + private final String name; + private final ODataValue value; + private final ODataValuable valuable; - public ODataPropertyImpl(final String name, final org.apache.olingo.commons.api.domain.ODataValue value) { - super(name, value); - valuable = new ODataValuableImpl((ODataValue) value); + public ODataPropertyImpl(final String name, final ODataValue value) { + this.name = name; + this.value = value; + this.valuable = new ODataValuableImpl(value); } + /** + * Returns property name. + * + * @return property name. + */ + @Override + public String getName() { + return name; + } + + /** + * Returns property value. + * + * @return property value. + */ @Override public ODataValue getValue() { - return valuable.getValue(); + return value; + } + + /** + * Checks if has null value. + * + * @return 'TRUE' if has null value; 'FALSE' otherwise. + */ + @Override + public boolean hasNullValue() { + return value == null || value.isPrimitive() && value.asPrimitive().toValue() == null; + } + + /** + * Checks if has primitive value. + * + * @return 'TRUE' if has primitive value; 'FALSE' otherwise. + */ + @Override + public boolean hasPrimitiveValue() { + return !hasNullValue() && value.isPrimitive(); + } + + /** + * Gets primitive value. + * + * @return primitive value if exists; null otherwise. + */ + @Override + public ODataPrimitiveValue getPrimitiveValue() { + return hasPrimitiveValue() ? value.asPrimitive() : null; + } + + /** + * Checks if has complex value. + * + * @return 'TRUE' if has complex value; 'FALSE' otherwise. + */ + @Override + public boolean hasComplexValue() { + return !hasNullValue() && value.isComplex(); + } + + /** + * Checks if has collection value. + * + * @return 'TRUE' if has collection value; 'FALSE' otherwise. + */ + @Override + public boolean hasCollectionValue() { + return !hasNullValue() && value.isCollection(); + } + + @Override + public boolean equals(final Object obj) { + return EqualsBuilder.reflectionEquals(this, obj); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this); } @Override @@ -85,5 +166,4 @@ public class ODataPropertyImpl extends AbstractODataProperty implements ODataPro + ", annotations=" + annotations + '}'; } - }
