http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java index 5c9e2c1..a8bb8d9 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java @@ -18,25 +18,29 @@ */ package org.apache.olingo.commons.core.edm.provider; +import java.util.ArrayList; +import java.util.List; + import org.apache.olingo.commons.api.edm.Edm; import org.apache.olingo.commons.api.edm.EdmAnnotation; +import org.apache.olingo.commons.api.edm.EdmEntityType; +import org.apache.olingo.commons.api.edm.EdmException; +import org.apache.olingo.commons.api.edm.EdmNavigationProperty; import org.apache.olingo.commons.api.edm.EdmReferentialConstraint; +import org.apache.olingo.commons.api.edm.EdmStructuredType; import org.apache.olingo.commons.api.edm.EdmTerm; import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.edm.provider.NavigationProperty; import org.apache.olingo.commons.api.edm.provider.ReferentialConstraint; -import org.apache.olingo.commons.core.edm.AbstractEdmNavigationProperty; -import org.apache.olingo.commons.core.edm.EdmAnnotationHelper; - -import java.util.ArrayList; -import java.util.List; -public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty { +public class EdmNavigationPropertyImpl extends EdmElementImpl implements EdmNavigationProperty { private final FullQualifiedName structuredTypeName; private final NavigationProperty navigationProperty; private List<EdmReferentialConstraint> referentialConstraints; private final EdmAnnotationHelper helper; + private EdmEntityType typeImpl; + private EdmNavigationProperty partnerNavigationProperty; public EdmNavigationPropertyImpl( final Edm edm, final FullQualifiedName structuredTypeName, final NavigationProperty navigationProperty) { @@ -47,11 +51,6 @@ public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty { } @Override - protected FullQualifiedName getTypeFQN() { - return navigationProperty.getTypeFQN(); - } - - @Override public boolean isCollection() { return navigationProperty.isCollection(); } @@ -67,8 +66,36 @@ public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty { } @Override - protected String internatGetPartner() { - return navigationProperty.getPartner(); + public EdmEntityType getType() { + if (typeImpl == null) { + typeImpl = edm.getEntityType(navigationProperty.getTypeFQN()); + if (typeImpl == null) { + throw new EdmException("Cannot find type with name: " + navigationProperty.getTypeFQN()); + } + } + return typeImpl; + } + + @Override + public EdmNavigationProperty getPartner() { + if (partnerNavigationProperty == null) { + String partner = navigationProperty.getPartner(); + if (partner != null) { + EdmStructuredType type = getType(); + EdmNavigationProperty property = null; + final String[] split = partner.split("/"); + for (String element : split) { + property = type.getNavigationProperty(element); + if (property == null) { + throw new EdmException("Cannot find navigation property with name: " + element + + " at type " + type.getName()); + } + type = property.getType(); + } + partnerNavigationProperty = property; + } + } + return partnerNavigationProperty; } @Override @@ -91,8 +118,7 @@ public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty { referentialConstraints = new ArrayList<EdmReferentialConstraint>(); if (providerConstraints != null) { for (ReferentialConstraint constraint : providerConstraints) { - referentialConstraints.add( - new EdmReferentialConstraintImpl(edm, constraint)); + referentialConstraints.add(new EdmReferentialConstraintImpl(edm, constraint)); } } } @@ -100,6 +126,16 @@ public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty { } @Override + public TargetType getAnnotationsTargetType() { + return TargetType.NavigationProperty; + } + + @Override + public String getAnnotationsTargetPath() { + return getName(); + } + + @Override public FullQualifiedName getAnnotationsTargetFQN() { return structuredTypeName; }
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImpl.java index 009eadc..f8d69bf 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImpl.java @@ -19,23 +19,33 @@ package org.apache.olingo.commons.core.edm.provider; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import org.apache.olingo.commons.api.edm.Edm; import org.apache.olingo.commons.api.edm.EdmAnnotation; +import org.apache.olingo.commons.api.edm.EdmBindingTarget; +import org.apache.olingo.commons.api.edm.EdmEntitySet; +import org.apache.olingo.commons.api.edm.EdmException; +import org.apache.olingo.commons.api.edm.EdmOperation; import org.apache.olingo.commons.api.edm.EdmParameter; +import org.apache.olingo.commons.api.edm.EdmReturnType; import org.apache.olingo.commons.api.edm.EdmTerm; import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; import org.apache.olingo.commons.api.edm.provider.Operation; import org.apache.olingo.commons.api.edm.provider.Parameter; -import org.apache.olingo.commons.core.edm.AbstractEdmOperation; -import org.apache.olingo.commons.core.edm.EdmAnnotationHelper; -public abstract class EdmOperationImpl extends AbstractEdmOperation { +public abstract class EdmOperationImpl extends EdmTypeImpl implements EdmOperation { protected final Operation operation; protected final EdmAnnotationHelper helper; + private final Map<String, EdmParameter> parameters = new LinkedHashMap<String, EdmParameter>(); + private String entitySetPath; + private boolean isBound; + private EdmReturnType returnType; + private List<String> parameterNames; protected static <T extends EdmOperationImpl> T getInstance(final T instance) { final List<Parameter> providerParameters = instance.operation.getParameters(); @@ -68,6 +78,68 @@ public abstract class EdmOperationImpl extends AbstractEdmOperation { this.operation = operation; this.helper = new EdmAnnotationHelperImpl(edm, operation); } + + protected void setParameters(final List<EdmParameter> _parameters) { + for (EdmParameter parameter : _parameters) { + parameters.put(parameter.getName(), parameter); + } + } + + protected void setEntitySetPath(final String entitySetPath) { + this.entitySetPath = entitySetPath; + } + + protected void setIsBound(final boolean isBound) { + this.isBound = isBound; + } + + protected void setReturnType(final EdmReturnType returnType) { + this.returnType = returnType; + } + + @Override + public EdmParameter getParameter(final String name) { + return parameters.get(name); + } + + @Override + public List<String> getParameterNames() { + if (parameterNames == null) { + parameterNames = new ArrayList<String>(parameters.size()); + for (String parameterName : parameters.keySet()) { + parameterNames.add(parameterName); + } + } + return parameterNames; + } + + @Override + public EdmEntitySet getReturnedEntitySet(final EdmEntitySet bindingParameterEntitySet) { + EdmEntitySet returnedEntitySet = null; + if (bindingParameterEntitySet != null && entitySetPath != null) { + final EdmBindingTarget relatedBindingTarget = bindingParameterEntitySet.getRelatedBindingTarget(entitySetPath); + if (relatedBindingTarget == null) { + throw new EdmException("Cannot find entity set with path: " + entitySetPath); + } + if (relatedBindingTarget instanceof EdmEntitySet) { + returnedEntitySet = (EdmEntitySet) relatedBindingTarget; + } else { + throw new EdmException("BindingTarget with name: " + relatedBindingTarget.getName() + + " must be an entity set"); + } + } + return returnedEntitySet; + } + + @Override + public EdmReturnType getReturnType() { + return returnType; + } + + @Override + public boolean isBound() { + return isBound; + } @Override public FullQualifiedName getBindingParameterTypeFqn() { http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImportImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImportImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImportImpl.java index c55d525..ee5891d 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImportImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImportImpl.java @@ -18,26 +18,67 @@ */ package org.apache.olingo.commons.core.edm.provider; +import java.util.List; + import org.apache.olingo.commons.api.edm.Edm; import org.apache.olingo.commons.api.edm.EdmAnnotation; import org.apache.olingo.commons.api.edm.EdmEntityContainer; +import org.apache.olingo.commons.api.edm.EdmEntitySet; +import org.apache.olingo.commons.api.edm.EdmException; +import org.apache.olingo.commons.api.edm.EdmOperationImport; import org.apache.olingo.commons.api.edm.EdmTerm; +import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.edm.Target; import org.apache.olingo.commons.api.edm.provider.OperationImport; -import org.apache.olingo.commons.core.edm.AbstractEdmOperationImport; -import org.apache.olingo.commons.core.edm.EdmAnnotationHelper; -import java.util.List; - -public abstract class EdmOperationImportImpl extends AbstractEdmOperationImport { +public abstract class EdmOperationImportImpl extends EdmNamedImpl implements EdmOperationImport { + protected final EdmEntityContainer container; + private final Target entitySet; + private EdmEntitySet returnedEntitySet; private final EdmAnnotationHelper helper; - + public EdmOperationImportImpl(final Edm edm, final EdmEntityContainer container, final OperationImport operationImport) { - super(edm, container, operationImport.getName(), new Target.Builder(operationImport.getEntitySet(), container - ).build()); + super(edm, operationImport.getName()); + this.container = container; this.helper = new EdmAnnotationHelperImpl(edm, operationImport); + this.entitySet = new Target.Builder(operationImport.getEntitySet(), container).build(); + } + + @Override + public FullQualifiedName getFullQualifiedName() { + return new FullQualifiedName(container.getNamespace(), getName()); + } + + @Override + public EdmEntitySet getReturnedEntitySet() { + if (entitySet != null && returnedEntitySet == null) { + EdmEntityContainer entityContainer = edm.getEntityContainer(entitySet.getEntityContainer()); + if (entityContainer == null) { + throw new EdmException("Can´t find entity container with name: " + entitySet.getEntityContainer()); + } + returnedEntitySet = entityContainer.getEntitySet(entitySet.getTargetName()); + if (returnedEntitySet == null) { + throw new EdmException("Can´t find entity set with name: " + entitySet.getTargetName()); + } + } + return returnedEntitySet; + } + + @Override + public EdmEntityContainer getEntityContainer() { + return container; + } + + @Override + public FullQualifiedName getAnnotationsTargetFQN() { + return container.getFullQualifiedName(); + } + + @Override + public String getAnnotationsTargetPath() { + return getName(); } @Override http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmParameterImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmParameterImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmParameterImpl.java index e1d3229..f5a25fa 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmParameterImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmParameterImpl.java @@ -22,22 +22,26 @@ import java.util.List; import org.apache.olingo.commons.api.edm.Edm; import org.apache.olingo.commons.api.edm.EdmAnnotation; +import org.apache.olingo.commons.api.edm.EdmException; import org.apache.olingo.commons.api.edm.EdmMapping; +import org.apache.olingo.commons.api.edm.EdmParameter; import org.apache.olingo.commons.api.edm.EdmTerm; +import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.edm.geo.SRID; import org.apache.olingo.commons.api.edm.provider.Parameter; -import org.apache.olingo.commons.core.edm.AbstractEdmParameter; -import org.apache.olingo.commons.core.edm.EdmAnnotationHelper; -public class EdmParameterImpl extends AbstractEdmParameter { +public class EdmParameterImpl extends EdmElementImpl implements EdmParameter { private final Parameter parameter; private final EdmAnnotationHelper helper; + private final EdmTypeInfo typeInfo; + private EdmType typeImpl; public EdmParameterImpl(final Edm edm, final Parameter parameter) { - super(edm, parameter.getName(), parameter.getTypeFQN()); + super(edm, parameter.getName()); this.parameter = parameter; this.helper = new EdmAnnotationHelperImpl(edm, parameter); + this.typeInfo = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(parameter.getType()).build(); } @Override @@ -84,4 +88,16 @@ public class EdmParameterImpl extends AbstractEdmParameter { public List<EdmAnnotation> getAnnotations() { return helper.getAnnotations(); } + + @Override + public EdmType getType() { + if (typeImpl == null) { + typeImpl = typeInfo.getType(); + if (typeImpl == null) { + throw new EdmException("Cannot find type with name: " + typeInfo.getFullQualifiedName()); + } + } + + return typeImpl; + } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmPropertyImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmPropertyImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmPropertyImpl.java index 9f14925..61b6a22 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmPropertyImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmPropertyImpl.java @@ -22,21 +22,22 @@ import java.util.List; import org.apache.olingo.commons.api.edm.Edm; import org.apache.olingo.commons.api.edm.EdmAnnotation; +import org.apache.olingo.commons.api.edm.EdmException; import org.apache.olingo.commons.api.edm.EdmMapping; +import org.apache.olingo.commons.api.edm.EdmProperty; import org.apache.olingo.commons.api.edm.EdmTerm; +import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.edm.geo.SRID; import org.apache.olingo.commons.api.edm.provider.Property; -import org.apache.olingo.commons.core.edm.AbstractEdmProperty; -import org.apache.olingo.commons.core.edm.EdmAnnotationHelper; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; -public class EdmPropertyImpl extends AbstractEdmProperty { +public class EdmPropertyImpl extends EdmElementImpl implements EdmProperty { private final FullQualifiedName structuredTypeName; private final Property property; private final EdmTypeInfo typeInfo; private EdmAnnotationHelper helper; + private EdmType propertyType; public EdmPropertyImpl(final Edm edm, final FullQualifiedName structuredTypeName, final Property property) { super(edm, property.getName()); @@ -48,10 +49,17 @@ public class EdmPropertyImpl extends AbstractEdmProperty { } @Override - public EdmTypeInfo getTypeInfo() { - return typeInfo; + public EdmType getType() { + if (propertyType == null) { + propertyType = typeInfo.getType(); + if (propertyType == null) { + throw new EdmException("Cannot find type with name: " + typeInfo.getFullQualifiedName()); + } + } + + return propertyType; } - + @Override public boolean isCollection() { return property.isCollection(); @@ -103,6 +111,16 @@ public class EdmPropertyImpl extends AbstractEdmProperty { } @Override + public TargetType getAnnotationsTargetType() { + return TargetType.Property; + } + + @Override + public String getAnnotationsTargetPath() { + return getName(); + } + + @Override public FullQualifiedName getAnnotationsTargetFQN() { return structuredTypeName; } @@ -116,4 +134,9 @@ public class EdmPropertyImpl extends AbstractEdmProperty { public List<EdmAnnotation> getAnnotations() { return helper.getAnnotations(); } + + @Override + public boolean isPrimitive() { + return typeInfo.isPrimitiveType(); + } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReferentialConstraintImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReferentialConstraintImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReferentialConstraintImpl.java index 9cf07ab..e8dbc23 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReferentialConstraintImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReferentialConstraintImpl.java @@ -22,21 +22,32 @@ import java.util.List; import org.apache.olingo.commons.api.edm.Edm; import org.apache.olingo.commons.api.edm.EdmAnnotation; +import org.apache.olingo.commons.api.edm.EdmReferentialConstraint; import org.apache.olingo.commons.api.edm.EdmTerm; import org.apache.olingo.commons.api.edm.provider.ReferentialConstraint; -import org.apache.olingo.commons.core.edm.AbstractEdmReferentialConstraint; -import org.apache.olingo.commons.core.edm.EdmAnnotationHelper; -public class EdmReferentialConstraintImpl extends AbstractEdmReferentialConstraint { +public class EdmReferentialConstraintImpl implements EdmReferentialConstraint { private final EdmAnnotationHelper helper; + private final ReferentialConstraint constraint; + public EdmReferentialConstraintImpl(final Edm edm, final ReferentialConstraint constraint) { - super(constraint.getProperty(), constraint.getReferencedProperty()); + this.constraint = constraint; this.helper = new EdmAnnotationHelperImpl(edm, constraint); } @Override + public String getPropertyName() { + return constraint.getProperty(); + } + + @Override + public String getReferencedPropertyName() { + return constraint.getReferencedProperty(); + } + + @Override public EdmAnnotation getAnnotation(final EdmTerm term) { return helper.getAnnotation(term); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReturnTypeImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReturnTypeImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReturnTypeImpl.java index 80eef43..e2d9331 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReturnTypeImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReturnTypeImpl.java @@ -19,17 +19,22 @@ package org.apache.olingo.commons.core.edm.provider; import org.apache.olingo.commons.api.edm.Edm; +import org.apache.olingo.commons.api.edm.EdmException; +import org.apache.olingo.commons.api.edm.EdmReturnType; +import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.edm.geo.SRID; import org.apache.olingo.commons.api.edm.provider.ReturnType; -import org.apache.olingo.commons.core.edm.AbstractEdmReturnType; -public class EdmReturnTypeImpl extends AbstractEdmReturnType { +public class EdmReturnTypeImpl implements EdmReturnType { private final ReturnType returnType; - + private final EdmTypeInfo typeInfo; + private EdmType typeImpl; + + public EdmReturnTypeImpl(final Edm edm, final ReturnType returnType) { - super(edm, returnType.getTypeFQN()); this.returnType = returnType; + this.typeInfo = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(returnType.getType()).build(); } @Override @@ -61,4 +66,16 @@ public class EdmReturnTypeImpl extends AbstractEdmReturnType { public SRID getSrid() { return returnType.getSrid(); } + + @Override + public EdmType getType() { + if (typeImpl == null) { + typeImpl = typeInfo.getType(); + if (typeImpl == null) { + throw new EdmException("Cannot find type with name: " + typeInfo.getFullQualifiedName()); + } + } + + return typeImpl; + } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java index 2ef1c27..f31d5d8 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java @@ -19,6 +19,7 @@ package org.apache.olingo.commons.core.edm.provider; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.apache.olingo.commons.api.edm.Edm; @@ -30,6 +31,7 @@ import org.apache.olingo.commons.api.edm.EdmEntityContainer; import org.apache.olingo.commons.api.edm.EdmEntityType; import org.apache.olingo.commons.api.edm.EdmEnumType; import org.apache.olingo.commons.api.edm.EdmFunction; +import org.apache.olingo.commons.api.edm.EdmSchema; import org.apache.olingo.commons.api.edm.EdmTerm; import org.apache.olingo.commons.api.edm.EdmTypeDefinition; import org.apache.olingo.commons.api.edm.FullQualifiedName; @@ -44,22 +46,144 @@ import org.apache.olingo.commons.api.edm.provider.Function; import org.apache.olingo.commons.api.edm.provider.Schema; import org.apache.olingo.commons.api.edm.provider.Term; import org.apache.olingo.commons.api.edm.provider.TypeDefinition; -import org.apache.olingo.commons.core.edm.AbstractEdmSchema; -public class EdmSchemaImpl extends AbstractEdmSchema { +public class EdmSchemaImpl implements EdmSchema { private final Schema schema; private final Edm edm; private final EdmProvider provider; + + protected final String namespace; + private final String alias; + private List<EdmEnumType> enumTypes; + private List<EdmEntityType> entityTypes; + private List<EdmComplexType> complexTypes; + private List<EdmAction> actions; + private List<EdmFunction> functions; + private List<EdmTypeDefinition> typeDefinitions; + private List<EdmTerm> terms; + private List<EdmAnnotations> annotationGroups; + private List<EdmAnnotation> annotations; + private EdmEntityContainer entityContainer; public EdmSchemaImpl(final Edm edm, final EdmProvider provider, final Schema schema) { - super(schema.getNamespace(), schema.getAlias()); this.edm = edm; this.provider = provider; this.schema = schema; + this.namespace = schema.getNamespace(); + this.alias = schema.getAlias(); } @Override + public List<EdmEnumType> getEnumTypes() { + if (enumTypes == null) { + enumTypes = createEnumTypes(); + } + return enumTypes; + } + + @Override + public List<EdmEntityType> getEntityTypes() { + if (entityTypes == null) { + entityTypes = createEntityTypes(); + } + return entityTypes; + } + + @Override + public List<EdmComplexType> getComplexTypes() { + if (complexTypes == null) { + complexTypes = createComplexTypes(); + } + return complexTypes; + } + + @Override + public List<EdmAction> getActions() { + if (actions == null) { + actions = createActions(); + } + return actions; + } + + @Override + public List<EdmFunction> getFunctions() { + if (functions == null) { + functions = createFunctions(); + } + return functions; + } + + @Override + public List<EdmTypeDefinition> getTypeDefinitions() { + if (typeDefinitions == null) { + typeDefinitions = createTypeDefinitions(); + } + return typeDefinitions; + } + + @Override + public List<EdmTerm> getTerms() { + if (terms == null) { + terms = createTerms(); + } + return terms; + } + + @Override + public List<EdmAnnotations> getAnnotationGroups() { + if (annotationGroups == null) { + annotationGroups = createAnnotationGroups(); + } + return annotationGroups; + } + + @Override + public List<EdmAnnotation> getAnnotations() { + if (annotations == null) { + annotations = createAnnotations(); + } + return annotations; + } + + @Override + public EdmEntityContainer getEntityContainer() { + if (entityContainer == null) { + entityContainer = createEntityContainer(); + } + return entityContainer; + } + + @Override + public List<EdmEntityContainer> getEntityContainers() { + if (getEntityContainer() == null) { + return Collections.<EdmEntityContainer> emptyList(); + } else { + return Collections.singletonList(getEntityContainer()); + } + } + + @Override + public EdmEntityContainer getEntityContainer(final FullQualifiedName name) { + return getEntityContainer() == null + ? null + : name == null + ? getEntityContainer() + : name.equals(getEntityContainer().getFullQualifiedName()) + ? getEntityContainer() + : null; + } + + @Override + public String getNamespace() { + return namespace; + } + + @Override + public String getAlias() { + return alias; + } + protected EdmEntityContainer createEntityContainer() { if (schema.getEntityContainer() != null) { FullQualifiedName containerFQN = new FullQualifiedName(namespace, schema.getEntityContainer().getName()); @@ -68,7 +192,6 @@ public class EdmSchemaImpl extends AbstractEdmSchema { return null; } - @Override protected List<EdmTypeDefinition> createTypeDefinitions() { final List<EdmTypeDefinition> typeDefinitions = new ArrayList<EdmTypeDefinition>(); final List<TypeDefinition> providerTypeDefinitions = schema.getTypeDefinitions(); @@ -80,7 +203,6 @@ public class EdmSchemaImpl extends AbstractEdmSchema { return typeDefinitions; } - @Override protected List<EdmEnumType> createEnumTypes() { final List<EdmEnumType> enumTypes = new ArrayList<EdmEnumType>(); final List<EnumType> providerEnumTypes = schema.getEnumTypes(); @@ -92,7 +214,6 @@ public class EdmSchemaImpl extends AbstractEdmSchema { return enumTypes; } - @Override protected List<EdmEntityType> createEntityTypes() { final List<EdmEntityType> entityTypes = new ArrayList<EdmEntityType>(); final List<EntityType> providerEntityTypes = schema.getEntityTypes(); @@ -105,7 +226,6 @@ public class EdmSchemaImpl extends AbstractEdmSchema { return entityTypes; } - @Override protected List<EdmComplexType> createComplexTypes() { final List<EdmComplexType> complexTypes = new ArrayList<EdmComplexType>(); final List<ComplexType> providerComplexTypes = schema.getComplexTypes(); @@ -118,7 +238,6 @@ public class EdmSchemaImpl extends AbstractEdmSchema { return complexTypes; } - @Override protected List<EdmAction> createActions() { final List<EdmAction> actions = new ArrayList<EdmAction>(); final List<Action> providerActions = schema.getActions(); @@ -130,7 +249,6 @@ public class EdmSchemaImpl extends AbstractEdmSchema { return actions; } - @Override protected List<EdmFunction> createFunctions() { final List<EdmFunction> functions = new ArrayList<EdmFunction>(); final List<Function> providerFunctions = schema.getFunctions(); @@ -142,7 +260,6 @@ public class EdmSchemaImpl extends AbstractEdmSchema { return functions; } - @Override protected List<EdmTerm> createTerms() { final List<EdmTerm> terms = new ArrayList<EdmTerm>(); final List<Term> providerTerms = schema.getTerms(); @@ -154,7 +271,6 @@ public class EdmSchemaImpl extends AbstractEdmSchema { return terms; } - @Override protected List<EdmAnnotations> createAnnotationGroups() { final List<EdmAnnotations> annotationGroups = new ArrayList<EdmAnnotations>(); final List<Annotations> providerAnnotations = @@ -167,7 +283,6 @@ public class EdmSchemaImpl extends AbstractEdmSchema { return annotationGroups; } - @Override protected List<EdmAnnotation> createAnnotations() { final List<EdmAnnotation> annotations = new ArrayList<EdmAnnotation>(); final List<Annotation> providerAnnotations = http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmStructuredTypeHelper.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmStructuredTypeHelper.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmStructuredTypeHelper.java new file mode 100644 index 0000000..e00a28b --- /dev/null +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmStructuredTypeHelper.java @@ -0,0 +1,35 @@ +/* + * 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.edm.provider; + +import org.apache.olingo.commons.api.edm.EdmNavigationProperty; +import org.apache.olingo.commons.api.edm.EdmProperty; + +import java.util.Map; + +public interface EdmStructuredTypeHelper { + + Map<String, EdmProperty> getProperties(); + + Map<String, EdmNavigationProperty> getNavigationProperties(); + + boolean isOpenType(); + + boolean isAbstract(); +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmStructuredTypeHelperImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmStructuredTypeHelperImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmStructuredTypeHelperImpl.java index 1ec265d..f72eef1 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmStructuredTypeHelperImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmStructuredTypeHelperImpl.java @@ -25,7 +25,6 @@ import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.edm.provider.NavigationProperty; import org.apache.olingo.commons.api.edm.provider.Property; import org.apache.olingo.commons.api.edm.provider.StructuralType; -import org.apache.olingo.commons.core.edm.EdmStructuredTypeHelper; import java.util.LinkedHashMap; import java.util.Map; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmStructuredTypeImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmStructuredTypeImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmStructuredTypeImpl.java new file mode 100644 index 0000000..893f3dc --- /dev/null +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmStructuredTypeImpl.java @@ -0,0 +1,152 @@ +/* + * 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.edm.provider; + +import org.apache.olingo.commons.api.edm.Edm; +import org.apache.olingo.commons.api.edm.EdmElement; +import org.apache.olingo.commons.api.edm.EdmException; +import org.apache.olingo.commons.api.edm.EdmNavigationProperty; +import org.apache.olingo.commons.api.edm.EdmProperty; +import org.apache.olingo.commons.api.edm.EdmStructuredType; +import org.apache.olingo.commons.api.edm.EdmType; +import org.apache.olingo.commons.api.edm.FullQualifiedName; +import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public abstract class EdmStructuredTypeImpl extends EdmTypeImpl implements EdmStructuredType { + + protected EdmStructuredType baseType; + + protected FullQualifiedName baseTypeName; + + private List<String> propertyNames; + + private List<String> navigationPropertyNames; + + public EdmStructuredTypeImpl( + final Edm edm, + final FullQualifiedName typeName, + final EdmTypeKind kind, + final FullQualifiedName baseTypeName) { + + super(edm, typeName, kind); + this.baseTypeName = baseTypeName; + } + + protected abstract EdmStructuredType buildBaseType(FullQualifiedName baseTypeName); + + protected abstract Map<String, EdmProperty> getProperties(); + + protected abstract Map<String, EdmNavigationProperty> getNavigationProperties(); + + protected abstract void checkBaseType(); + + @Override + public List<String> getPropertyNames() { + if (propertyNames == null) { + propertyNames = new ArrayList<String>(); + checkBaseType(); + if (baseType != null) { + propertyNames.addAll(baseType.getPropertyNames()); + } + propertyNames.addAll(getProperties().keySet()); + } + return propertyNames; + } + + @Override + public List<String> getNavigationPropertyNames() { + if (navigationPropertyNames == null) { + navigationPropertyNames = new ArrayList<String>(); + checkBaseType(); + if (baseType != null) { + navigationPropertyNames.addAll(baseType.getNavigationPropertyNames()); + } + navigationPropertyNames.addAll(getNavigationProperties().keySet()); + } + return navigationPropertyNames; + } + + @Override + public EdmElement getProperty(final String name) { + EdmElement property = getStructuralProperty(name); + if (property == null) { + property = getNavigationProperty(name); + } + return property; + } + + @Override + public EdmProperty getStructuralProperty(final String name) { + EdmProperty property = null; + checkBaseType(); + if (baseType != null) { + property = baseType.getStructuralProperty(name); + } + if (property == null) { + property = getProperties().get(name); + } + return property; + } + + @Override + public EdmNavigationProperty getNavigationProperty(final String name) { + EdmNavigationProperty property = null; + checkBaseType(); + if (baseType != null) { + property = baseType.getNavigationProperty(name); + } + if (property == null) { + property = getNavigationProperties().get(name); + } + return property; + } + + @Override + public boolean compatibleTo(final EdmType targetType) { + EdmStructuredType sourceType = this; + if (targetType == null) { + throw new EdmException("Target type must not be null"); + } + while (!sourceType.getName().equals(targetType.getName()) + || !sourceType.getNamespace().equals(targetType.getNamespace())) { + + sourceType = sourceType.getBaseType(); + if (sourceType == null) { + return false; + } + } + + return true; + } + + @Override + public String getAnnotationsTargetPath() { + return null; + } + + @Override + public FullQualifiedName getAnnotationsTargetFQN() { + return getFullQualifiedName(); + } + +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTermImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTermImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTermImpl.java index e2b34a5..cc3f11f 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTermImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTermImpl.java @@ -30,9 +30,6 @@ import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.edm.geo.SRID; import org.apache.olingo.commons.api.edm.provider.Term; -import org.apache.olingo.commons.core.edm.EdmAnnotationHelper; -import org.apache.olingo.commons.core.edm.EdmNamedImpl; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTypeDefinitionImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTypeDefinitionImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTypeDefinitionImpl.java index 1e81179..d04f6dd 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTypeDefinitionImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTypeDefinitionImpl.java @@ -24,24 +24,27 @@ import org.apache.olingo.commons.api.edm.Edm; import org.apache.olingo.commons.api.edm.EdmAnnotation; import org.apache.olingo.commons.api.edm.EdmException; 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.EdmTerm; +import org.apache.olingo.commons.api.edm.EdmTypeDefinition; import org.apache.olingo.commons.api.edm.FullQualifiedName; +import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; import org.apache.olingo.commons.api.edm.geo.SRID; import org.apache.olingo.commons.api.edm.provider.TypeDefinition; -import org.apache.olingo.commons.core.edm.AbstractEdmTypeDefinition; -import org.apache.olingo.commons.core.edm.EdmAnnotationHelper; import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; -public class EdmTypeDefinitionImpl extends AbstractEdmTypeDefinition { +public class EdmTypeDefinitionImpl extends EdmNamedImpl implements EdmTypeDefinition { private TypeDefinition typeDefinition; - private EdmPrimitiveType edmPrimitiveTypeInstance; + private final EdmPrimitiveType edmPrimitiveTypeInstance; private final EdmAnnotationHelper helper; + private FullQualifiedName typeDefinitionName; public EdmTypeDefinitionImpl(final Edm edm, final FullQualifiedName typeDefinitionName, final TypeDefinition typeDefinition) { - super(edm, typeDefinitionName); + super(edm, typeDefinitionName.getName()); + this.typeDefinitionName = typeDefinitionName; this.typeDefinition = typeDefinition; try { if (typeDefinition.getUnderlyingType() == null) { @@ -57,15 +60,22 @@ public class EdmTypeDefinitionImpl extends AbstractEdmTypeDefinition { } @Override + public FullQualifiedName getFullQualifiedName() { + return typeDefinitionName; + } + + @Override + public String getNamespace() { + return typeDefinitionName.getNamespace(); + } + + @Override + public EdmTypeKind getKind() { + return EdmTypeKind.DEFINITION; + } + + @Override public EdmPrimitiveType getUnderlyingType() { - if (edmPrimitiveTypeInstance == null) { - try { - edmPrimitiveTypeInstance = EdmPrimitiveTypeFactory.getInstance( - EdmPrimitiveTypeKind.valueOfFQN(typeDefinition.getUnderlyingType())); - } catch (IllegalArgumentException e) { - throw new EdmException("Invalid underlying type: " + typeDefinition.getUnderlyingType(), e); - } - } return edmPrimitiveTypeInstance; } @@ -93,8 +103,64 @@ public class EdmTypeDefinitionImpl extends AbstractEdmTypeDefinition { public Boolean isUnicode() { return typeDefinition.isUnicode(); } + + @Override + public boolean isCompatible(final EdmPrimitiveType primitiveType) { + return getUnderlyingType().isCompatible(primitiveType); + } + + @Override + public Class<?> getDefaultType() { + return getUnderlyingType().getDefaultType(); + } + + @Override + public boolean validate(final String value, final Boolean isNullable, final Integer maxLength, + final Integer precision, final Integer scale, + final Boolean isUnicode) { + + return getUnderlyingType().validate(value, isNullable, maxLength, precision, scale, isUnicode); + } @Override + public <T> T valueOfString(final String value, final Boolean isNullable, final Integer maxLength, + final Integer precision, final Integer scale, + final Boolean isUnicode, final Class<T> returnType) throws EdmPrimitiveTypeException { + + return getUnderlyingType(). + valueOfString(value, isNullable, maxLength, precision, scale, isUnicode, returnType); + } + + @Override + public String valueToString(final Object value, final Boolean isNullable, final Integer maxLength, + final Integer precision, final Integer scale, + final Boolean isUnicode) throws EdmPrimitiveTypeException { + + return getUnderlyingType().valueToString(value, isNullable, maxLength, precision, scale, isUnicode); + } + + @Override + public String toUriLiteral(final String literal) { + return getUnderlyingType().toUriLiteral(literal); + } + + @Override + public String fromUriLiteral(final String literal) throws EdmPrimitiveTypeException { + return getUnderlyingType().fromUriLiteral(literal); + } + + + @Override + public TargetType getAnnotationsTargetType() { + return TargetType.TypeDefinition; + } + + @Override + public FullQualifiedName getAnnotationsTargetFQN() { + return getFullQualifiedName(); + } + + @Override public EdmAnnotation getAnnotation(final EdmTerm term) { return helper.getAnnotation(term); } @@ -103,5 +169,10 @@ public class EdmTypeDefinitionImpl extends AbstractEdmTypeDefinition { public List<EdmAnnotation> getAnnotations() { return helper.getAnnotations(); } + + @Override + public String getAnnotationsTargetPath() { + return getName(); + } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTypeImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTypeImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTypeImpl.java new file mode 100644 index 0000000..ea05c24 --- /dev/null +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTypeImpl.java @@ -0,0 +1,52 @@ +/* + * 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.edm.provider; + +import org.apache.olingo.commons.api.edm.Edm; +import org.apache.olingo.commons.api.edm.EdmType; +import org.apache.olingo.commons.api.edm.FullQualifiedName; +import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; + +public class EdmTypeImpl extends EdmNamedImpl implements EdmType { + + protected final FullQualifiedName typeName; + + protected final EdmTypeKind kind; + + public EdmTypeImpl(final Edm edm, final FullQualifiedName typeName, final EdmTypeKind kind) { + super(edm, typeName.getName()); + this.typeName = typeName; + this.kind = kind; + } + + @Override + public FullQualifiedName getFullQualifiedName() { + return typeName; + } + + @Override + public String getNamespace() { + return typeName.getNamespace(); + } + + @Override + public EdmTypeKind getKind() { + return kind; + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTypeInfo.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTypeInfo.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTypeInfo.java new file mode 100644 index 0000000..768ec00 --- /dev/null +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTypeInfo.java @@ -0,0 +1,244 @@ +/* + * 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.edm.provider; + +import org.apache.commons.lang3.StringUtils; +import org.apache.olingo.commons.api.edm.Edm; +import org.apache.olingo.commons.api.edm.EdmComplexType; +import org.apache.olingo.commons.api.edm.EdmEntityType; +import org.apache.olingo.commons.api.edm.EdmEnumType; +import org.apache.olingo.commons.api.edm.EdmPrimitiveType; +import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; +import org.apache.olingo.commons.api.edm.EdmType; +import org.apache.olingo.commons.api.edm.EdmTypeDefinition; +import org.apache.olingo.commons.api.edm.FullQualifiedName; +import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; + +public class EdmTypeInfo { + + public static class Builder { + + private String typeExpression; + + private String defaultNamespace; + + private Edm edm; + + public Builder setTypeExpression(final String typeExpression) { + this.typeExpression = typeExpression; + return this; + } + + public Builder setDefaultNamespace(final String defaultNamespace) { + this.defaultNamespace = defaultNamespace; + return this; + } + + public Builder setEdm(final Edm edm) { + this.edm = edm; + return this; + } + + public EdmTypeInfo build() { + return new EdmTypeInfo(edm, typeExpression.indexOf('.') == -1 && StringUtils.isNotBlank(defaultNamespace) + ? defaultNamespace + "." + typeExpression + : typeExpression); + } + } + + private final Edm edm; + + private final boolean collection; + + private final FullQualifiedName fullQualifiedName; + + private EdmPrimitiveTypeKind primitiveType; + + private EdmTypeDefinition typeDefinition; + + private EdmEnumType enumType; + + private EdmComplexType complexType; + + private EdmEntityType entityType; + + private EdmTypeInfo(final Edm edm, final String typeExpression) { + this.edm = edm; + + String baseType; + final int collStartIdx = typeExpression.indexOf("Collection("); + final int collEndIdx = typeExpression.lastIndexOf(')'); + if (collStartIdx == -1) { + baseType = typeExpression; + collection = false; + } else { + if (collEndIdx == -1) { + throw new IllegalArgumentException("Malformed type: " + typeExpression); + } + + collection = true; + baseType = typeExpression.substring(collStartIdx + 11, collEndIdx); + } + + baseType = baseType.replaceAll("^#", ""); + + final String typeName; + final String namespace; + + final int lastDotIdx = baseType.lastIndexOf('.'); + if (lastDotIdx == -1) { + namespace = EdmPrimitiveType.EDM_NAMESPACE; + typeName = baseType; + baseType = new FullQualifiedName(EdmPrimitiveType.EDM_NAMESPACE, baseType).toString(); + } else { + namespace = baseType.substring(0, lastDotIdx); + typeName = baseType.substring(lastDotIdx + 1); + } + + if (StringUtils.isBlank(typeName)) { + throw new IllegalArgumentException("Null or empty type name in " + typeExpression); + } + + final StringBuilder exp = new StringBuilder(); + exp.append(baseType); + + fullQualifiedName = new FullQualifiedName(namespace, typeName); + + try { + primitiveType = EdmPrimitiveTypeKind.valueOf(fullQualifiedName.getName()); + } catch (final IllegalArgumentException e) { + primitiveType = null; + } + if (primitiveType == null && this.edm != null) { + typeDefinition = this.edm.getTypeDefinition(fullQualifiedName); + if (typeDefinition == null) { + enumType = this.edm.getEnumType(fullQualifiedName); + if (enumType == null) { + complexType = this.edm.getComplexType(fullQualifiedName); + if (complexType == null) { + entityType = this.edm.getEntityType(fullQualifiedName); + } + } + } + } + } + + public String internal() { + final StringBuilder deserialize = new StringBuilder(); + + if (isCollection()) { + deserialize.append("Collection("); + } + + deserialize.append(getFullQualifiedName().toString()); + + if (isCollection()) { + deserialize.append(")"); + } + + return deserialize.toString(); + } + + public String external() { + final StringBuilder serialize = new StringBuilder(); + + if (isCollection()) { + serialize.append('#'); + serialize.append("Collection("); + } + + if (isPrimitiveType()) { + serialize.append(getFullQualifiedName().getName()); + }else{ + serialize.append(getFullQualifiedName().toString()); + } + + if (isCollection()) { + serialize.append(")"); + } + + if (!isPrimitiveType() && !isCollection()) { + serialize.insert(0, '#'); + } + + return serialize.toString(); + } + + public boolean isCollection() { + return collection; + } + + public FullQualifiedName getFullQualifiedName() { + return fullQualifiedName; + } + + public boolean isPrimitiveType() { + return primitiveType != null; + } + + public EdmPrimitiveTypeKind getPrimitiveTypeKind() { + return primitiveType; + } + + public boolean isTypeDefinition() { + return typeDefinition != null; + } + + public EdmTypeDefinition getTypeDefinition() { + return typeDefinition; + } + + public boolean isEnumType() { + return enumType != null; + } + + public EdmEnumType getEnumType() { + return enumType; + } + + public boolean isComplexType() { + return complexType != null; + } + + public EdmComplexType getComplexType() { + return complexType; + } + + public boolean isEntityType() { + return entityType != null; + } + + public EdmEntityType getEntityType() { + return entityType; + } + + public EdmType getType() { + return isPrimitiveType() + ? EdmPrimitiveTypeFactory.getInstance(getPrimitiveTypeKind()) + : isTypeDefinition() + ? getTypeDefinition() + : isEnumType() + ? getEnumType() + : isComplexType() + ? getComplexType() + : isEntityType() + ? getEntityType() + : null; + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomDeserializer.java index dcfb328..1a50c26 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomDeserializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomDeserializer.java @@ -66,7 +66,7 @@ import org.apache.olingo.commons.core.data.EntityImpl; import org.apache.olingo.commons.core.data.EntitySetImpl; import org.apache.olingo.commons.core.data.LinkImpl; import org.apache.olingo.commons.core.data.PropertyImpl; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; +import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import com.fasterxml.aalto.stax.InputFactoryImpl; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomSerializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomSerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomSerializer.java index 6c36116..b6d9a74 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomSerializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomSerializer.java @@ -50,8 +50,8 @@ import org.apache.olingo.commons.core.data.AbstractODataObject; import org.apache.olingo.commons.core.data.EntityImpl; import org.apache.olingo.commons.core.data.EntitySetImpl; import org.apache.olingo.commons.core.data.LinkImpl; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; +import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import com.fasterxml.aalto.stax.OutputFactoryImpl; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java index 929ad95..fc7e4f8 100755 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java @@ -56,7 +56,7 @@ import org.apache.olingo.commons.core.data.ComplexValueImpl; import org.apache.olingo.commons.core.data.EntitySetImpl; import org.apache.olingo.commons.core.data.LinkImpl; import org.apache.olingo.commons.core.data.PropertyImpl; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; +import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntityDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntityDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntityDeserializer.java index 5596fb3..b63950b 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntityDeserializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntityDeserializer.java @@ -41,7 +41,7 @@ import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; import org.apache.olingo.commons.core.data.AnnotationImpl; import org.apache.olingo.commons.core.data.EntityImpl; import org.apache.olingo.commons.core.data.LinkImpl; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; +import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySerializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySerializer.java index b6a32ef..b0fce7c 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySerializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySerializer.java @@ -30,7 +30,7 @@ import org.apache.olingo.commons.api.data.ResWrap; import org.apache.olingo.commons.api.domain.ODataOperation; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; import org.apache.olingo.commons.api.format.ODataFormat; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; +import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import com.fasterxml.jackson.core.JsonGenerator; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonGeoValueDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonGeoValueDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonGeoValueDeserializer.java index 8c439f7..355f321 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonGeoValueDeserializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonGeoValueDeserializer.java @@ -36,8 +36,8 @@ import org.apache.olingo.commons.api.edm.geo.MultiPolygon; import org.apache.olingo.commons.api.edm.geo.Point; import org.apache.olingo.commons.api.edm.geo.Polygon; import org.apache.olingo.commons.api.edm.geo.SRID; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; import org.apache.olingo.commons.core.edm.primitivetype.EdmDouble; +import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import com.fasterxml.jackson.databind.JsonNode; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertyDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertyDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertyDeserializer.java index ade76ed..9a9498e 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertyDeserializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertyDeserializer.java @@ -32,7 +32,7 @@ import org.apache.olingo.commons.api.data.ValueType; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; import org.apache.olingo.commons.core.data.AnnotationImpl; import org.apache.olingo.commons.core.data.PropertyImpl; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; +import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.JsonNode; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertySerializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertySerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertySerializer.java index da28791..f6ddd58 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertySerializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertySerializer.java @@ -27,7 +27,7 @@ import org.apache.olingo.commons.api.data.Annotation; import org.apache.olingo.commons.api.data.Property; import org.apache.olingo.commons.api.data.ResWrap; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; +import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import com.fasterxml.jackson.core.JsonGenerator; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonSerializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonSerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonSerializer.java index f054be5..012d3a3 100755 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonSerializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonSerializer.java @@ -47,8 +47,8 @@ import org.apache.olingo.commons.api.edm.geo.Geospatial; import org.apache.olingo.commons.api.format.ODataFormat; import org.apache.olingo.commons.api.serialization.ODataSerializer; import org.apache.olingo.commons.api.serialization.ODataSerializerException; -import org.apache.olingo.commons.core.edm.EdmTypeInfo; import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; +import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmNamedImplTest.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmNamedImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmNamedImplTest.java index e5f364f..60897c1 100644 --- a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmNamedImplTest.java +++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmNamedImplTest.java @@ -19,7 +19,7 @@ package org.apache.olingo.server.core.edm.provider; import org.apache.olingo.commons.api.edm.EdmNamed; -import org.apache.olingo.commons.core.edm.EdmNamedImpl; +import org.apache.olingo.commons.core.edm.provider.EdmNamedImpl; import org.junit.Test; import static org.junit.Assert.assertEquals; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a6293b6/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmTypeImplTest.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmTypeImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmTypeImplTest.java index 141ff32..38938fd 100644 --- a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmTypeImplTest.java +++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmTypeImplTest.java @@ -21,7 +21,7 @@ package org.apache.olingo.server.core.edm.provider; import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; -import org.apache.olingo.commons.core.edm.EdmTypeImpl; +import org.apache.olingo.commons.core.edm.provider.EdmTypeImpl; import org.junit.Test; import static org.junit.Assert.assertEquals;
