You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by tb...@apache.org on 2013/12/10 14:50:00 UTC
[05/50] [abbrv] git commit: Minor refactorings for duplicate codings
Minor refactorings for duplicate codings
Project: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/commit/d4407934
Tree: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/tree/d4407934
Diff: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/diff/d4407934
Branch: refs/heads/ODataServlet
Commit: d44079345b5a182d1897a91f365a8866d4507f39
Parents: 014bb97
Author: Michael Bolz <mi...@apache.org>
Authored: Tue Nov 19 08:45:54 2013 +0100
Committer: Michael Bolz <mi...@apache.org>
Committed: Tue Nov 19 08:45:54 2013 +0100
----------------------------------------------------------------------
.../annotation/data/AnnotationInMemoryDs.java | 14 +-
.../annotation/edm/AnnotationEdmProvider.java | 49 +------
.../core/annotation/edm/AnnotationHelper.java | 145 +++++++++++++++++--
3 files changed, 150 insertions(+), 58 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/d4407934/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationInMemoryDs.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationInMemoryDs.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationInMemoryDs.java
index 3b79e27..a8f4cb9 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationInMemoryDs.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationInMemoryDs.java
@@ -115,7 +115,9 @@ public class AnnotationInMemoryDs implements ListsDataSource {
String targetName = targetEntitySet.getEntityType().getName();
DataStore targetStore = dataStores.get(targetName);
- Field sourceFieldAtTarget = extractSourceField(sourceStore, targetStore);
+ AnnotationHelper.AnnotatedNavInfo navigationInfo = extractNavigationInfo(sourceStore, targetStore);
+
+ Field sourceFieldAtTarget = navigationInfo.getToField();
if (sourceFieldAtTarget == null) {
throw new ODataRuntimeException("Missing source field for related data.");
}
@@ -136,8 +138,7 @@ public class AnnotationInMemoryDs implements ListsDataSource {
}
}
- EdmNavigationProperty navProperty = sourceFieldAtTarget.getAnnotation(EdmNavigationProperty.class);
- if(navProperty.from().multiplicity() == EdmMultiplicity.ONE) {
+ if(navigationInfo.getToMultiplicity() == EdmMultiplicity.ONE) {
if(resultData.isEmpty()) {
return null;
}
@@ -269,4 +270,11 @@ public class AnnotationInMemoryDs implements ListsDataSource {
return ANNOTATION_HELPER.getCommonNavigationFieldFromTarget(sourceDataTypeClass, targetDataTypeClass);
}
+
+ private AnnotationHelper.AnnotatedNavInfo extractNavigationInfo(DataStore sourceStore, DataStore targetStore) {
+ Class sourceDataTypeClass = sourceStore.getDataTypeClass();
+ Class targetDataTypeClass = targetStore.getDataTypeClass();
+
+ return ANNOTATION_HELPER.getCommonNavigationInfo(sourceDataTypeClass, targetDataTypeClass);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/d4407934/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java
index dc253d8..8f9a2f4 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java
@@ -495,40 +495,19 @@ public class AnnotationEdmProvider extends EdmProvider {
navProp.setName(entityName);
//
NavigationEnd from = enp.from();
- String fromRole = from.role();
- if (fromRole.isEmpty()) {
- fromRole = getCanonicalRole(from, field.getDeclaringClass());
- }
+ String fromRole = ANNOTATION_HELPER.extractRoleName(from, field.getDeclaringClass());
navProp.setFromRole(fromRole);
NavigationEnd to = enp.to();
- String toRole = to.role();
- if (toRole.isEmpty()) {
- toRole = getCanonicalRole(to, field.getType());
- }
+ String toRole = ANNOTATION_HELPER.extractRoleName(to, field.getType());
navProp.setToRole(toRole);
- String relationshipName = enp.association();
- if(relationshipName.isEmpty()) {
- if(fromRole.compareTo(toRole) > 0) {
- relationshipName = toRole + "-" + fromRole;
- } else {
- relationshipName = fromRole + "-" + toRole;
- }
- }
+ String relationshipName = ANNOTATION_HELPER.extractRelationshipName(enp, fromRole, toRole);
navProp.setRelationship(new FullQualifiedName(namespace, relationshipName));
return navProp;
}
- private String getCanonicalRole(NavigationEnd navEnd, Class<?> fallbackClass) {
- String toRole = ANNOTATION_HELPER.extractEntityTypeName(navEnd.entitySet());
- if(toRole == null) {
- toRole = ANNOTATION_HELPER.extractEntityTypeName(fallbackClass);
- }
- return "r_" + toRole;
- }
-
private EdmSimpleTypeKind getEdmSimpleType(Class<?> type) {
if (type == String.class) {
return EdmSimpleTypeKind.String;
@@ -576,10 +555,7 @@ public class AnnotationEdmProvider extends EdmProvider {
NavigationEnd from = navigation.from();
AssociationEnd fromEnd = new AssociationEnd();
fromEnd.setRole(navProperty.getFromRole());
- String typeName = extractEntitTypeName(from);
- if (typeName.isEmpty()) {
- typeName = ANNOTATION_HELPER.extractEntityTypeName(field.getDeclaringClass());
- }
+ String typeName = ANNOTATION_HELPER.extractEntitTypeName(from, field.getDeclaringClass());
fromEnd.setType(new FullQualifiedName(namespace, typeName));
fromEnd.setMultiplicity(from.multiplicity());
association.setEnd1(fromEnd);
@@ -587,10 +563,7 @@ public class AnnotationEdmProvider extends EdmProvider {
NavigationEnd to = navigation.to();
AssociationEnd toEnd = new AssociationEnd();
toEnd.setRole(navProperty.getToRole());
- String toTypeName = extractEntitTypeName(to);
- if (toTypeName.isEmpty()) {
- toTypeName = ANNOTATION_HELPER.extractEntityTypeName(field.getType());
- }
+ String toTypeName = ANNOTATION_HELPER.extractEntitTypeName(to, field.getType());
toEnd.setType(new FullQualifiedName(namespace, toTypeName));
EdmMultiplicity toMultiplicity = to.multiplicity();
@@ -616,18 +589,6 @@ public class AnnotationEdmProvider extends EdmProvider {
private boolean isAnnotatedEntity(Class<?> clazz) {
return ANNOTATION_HELPER.isEdmTypeAnnotated(clazz);
}
-
- private String extractEntitTypeName(NavigationEnd navEnd) {
- Class<?> entityTypeClass = navEnd.entitySet();
- if(entityTypeClass == Object.class) {
- return "";
- }
- EdmEntityType type = entityTypeClass.getAnnotation(EdmEntityType.class);
- if(type == null) {
- return "";
- }
- return type.name();
- }
}
static class SchemaBuilder {
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/d4407934/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationHelper.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationHelper.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationHelper.java
index fbc0c7c..dfa461a 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationHelper.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationHelper.java
@@ -17,7 +17,6 @@ package org.apache.olingo.odata2.core.annotation.edm;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
@@ -30,7 +29,9 @@ import org.apache.olingo.odata2.api.annotation.edm.EdmEntityType;
import org.apache.olingo.odata2.api.annotation.edm.EdmKey;
import org.apache.olingo.odata2.api.annotation.edm.EdmNavigationProperty;
import org.apache.olingo.odata2.api.annotation.edm.EdmProperty;
+import org.apache.olingo.odata2.api.annotation.edm.NavigationEnd;
import org.apache.olingo.odata2.api.edm.EdmLiteralKind;
+import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
import org.apache.olingo.odata2.api.edm.EdmSimpleTypeException;
import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind;
import org.apache.olingo.odata2.api.edm.FullQualifiedName;
@@ -79,6 +80,21 @@ public class AnnotationHelper {
}
}
+ public String extractEntitTypeName(NavigationEnd navEnd, Class<?> fallbackClass) {
+ Class<?> entityTypeClass = navEnd.entitySet();
+ if (entityTypeClass == Object.class) {
+ return extractEntityTypeName(fallbackClass);
+ }
+ EdmEntityType type = entityTypeClass.getAnnotation(EdmEntityType.class);
+ if (type == null) {
+ return null;
+ }
+ if(type.name().isEmpty()) {
+ return extractEntityTypeName(fallbackClass);
+ }
+ return type.name();
+ }
+
/**
* Returns <code>NULL</code> if given class is not annotated. If annotated the set entity type name is returned and if
* no name is set the default name is generated from the simple class name.
@@ -105,13 +121,13 @@ public class AnnotationHelper {
}
/**
- *
- *
+ *
+ *
* @param <T> must be EdmEntityType or EdmComplexType annotation
* @param annotatedClass
* @param typeAnnotation
- * @return null if annotatedClass is not annotated or
- * name set via annotation or generated via {@link #getCanonicalName(java.lang.Class)}
+ * @return null if annotatedClass is not annotated or name set via annotation or generated via
+ * {@link #getCanonicalName(java.lang.Class)}
*/
private <T extends Annotation> String extractTypeName(Class<?> annotatedClass, Class<T> typeAnnotation) {
if (annotatedClass == Object.class) {
@@ -121,12 +137,12 @@ public class AnnotationHelper {
if (type == null) {
return null;
}
-
+
String name;
- if(typeAnnotation == EdmEntityType.class) {
- name = ((EdmEntityType)type).name();
- } else if(typeAnnotation == EdmComplexType.class) {
- name = ((EdmComplexType)type).name();
+ if (typeAnnotation == EdmEntityType.class) {
+ name = ((EdmEntityType) type).name();
+ } else if (typeAnnotation == EdmComplexType.class) {
+ name = ((EdmComplexType) type).name();
} else {
return null;
}
@@ -136,7 +152,7 @@ public class AnnotationHelper {
}
return name;
}
-
+
/**
* Get the set property name from an EdmProperty or EdmNavigationProperty annotation.
*
@@ -164,6 +180,41 @@ public class AnnotationHelper {
return propertyName;
}
+ public String extractRoleName(NavigationEnd navigationEnd, Class<?> fallbackClass) {
+ String role = navigationEnd.role();
+ if (role.isEmpty()) {
+ role = getCanonicalRole(navigationEnd, fallbackClass);
+ }
+ return role;
+ }
+
+ public String getCanonicalRole(NavigationEnd navEnd, Class<?> fallbackClass) {
+ String toRole = extractEntityTypeName(navEnd.entitySet());
+ if (toRole == null) {
+ toRole = extractEntityTypeName(fallbackClass);
+ }
+ return "r_" + toRole;
+ }
+
+ public String extractRelationshipName(EdmNavigationProperty enp, Field field) {
+ String fromRole = extractRoleName(enp.from(), field.getDeclaringClass());
+ String toRole = extractRoleName(enp.to(), field.getType());
+
+ return extractRelationshipName(enp, fromRole, toRole);
+ }
+
+ public String extractRelationshipName(EdmNavigationProperty enp, String fromRole, String toRole) {
+ String relationshipName = enp.association();
+ if(relationshipName.isEmpty()) {
+ if(fromRole.compareTo(toRole) > 0) {
+ relationshipName = toRole + "-" + fromRole;
+ } else {
+ relationshipName = fromRole + "-" + toRole;
+ }
+ }
+ return relationshipName;
+ }
+
public static final class ODataAnnotationException extends ODataException {
public ODataAnnotationException(String message) {
@@ -187,6 +238,78 @@ public class AnnotationHelper {
return instance;
}
+ public static class AnnotatedNavInfo {
+
+ private final Field fromField;
+ private final Field toField;
+ private final EdmNavigationProperty fromNavigation;
+ private final EdmNavigationProperty toNavigation;
+
+ public AnnotatedNavInfo(Field fromField, Field toField, EdmNavigationProperty fromNavigation,
+ EdmNavigationProperty toNavigation) {
+ this.fromField = fromField;
+ this.toField = toField;
+ this.fromNavigation = fromNavigation;
+ this.toNavigation = toNavigation;
+ }
+
+ public Field getFromField() {
+ return fromField;
+ }
+
+ public Field getToField() {
+ return toField;
+ }
+
+ public EdmMultiplicity getFromMultiplicity() {
+ EdmMultiplicity from = fromNavigation.from().multiplicity();
+ EdmMultiplicity to = toNavigation.to().multiplicity();
+
+ if (from.equals(to)) {
+ return from;
+ } else {
+ if (EdmMultiplicity.MANY == from || EdmMultiplicity.MANY == to) {
+ return EdmMultiplicity.MANY;
+ } else {
+ return EdmMultiplicity.ONE;
+ }
+ }
+ }
+
+ public EdmMultiplicity getToMultiplicity() {
+ EdmMultiplicity from = fromNavigation.to().multiplicity();
+ EdmMultiplicity to = toNavigation.from().multiplicity();
+
+ if (from.equals(to)) {
+ return from;
+ } else {
+ if (EdmMultiplicity.MANY == from || EdmMultiplicity.MANY == to) {
+ return EdmMultiplicity.MANY;
+ } else {
+ return EdmMultiplicity.ONE;
+ }
+ }
+ }
+ }
+
+ public AnnotatedNavInfo getCommonNavigationInfo(Class<?> sourceClass, Class<?> targetClass) {
+ List<Field> sourceFields = getAnnotatedFields(sourceClass, EdmNavigationProperty.class);
+ List<Field> targetFields = getAnnotatedFields(targetClass, EdmNavigationProperty.class);
+
+ for (Field targetField : targetFields) {
+ for (Field sourceField : sourceFields) {
+ EdmNavigationProperty sourceNav = sourceField.getAnnotation(EdmNavigationProperty.class);
+ EdmNavigationProperty targetNav = targetField.getAnnotation(EdmNavigationProperty.class);
+ String sourceAssociation = extractRelationshipName(sourceNav, sourceField);
+ String targetAssociation = extractRelationshipName(targetNav, targetField);
+ if (sourceAssociation.equals(targetAssociation)) {
+ return new AnnotatedNavInfo(sourceField, targetField, sourceNav, targetNav);
+ }
+ }
+ }
+ return null;
+ }
+
public Field getCommonNavigationFieldFromTarget(Class<?> sourceClass, Class<?> targetClass) {
List<Field> sourceFields = getAnnotatedFields(sourceClass, EdmNavigationProperty.class);
List<Field> targetFields = getAnnotatedFields(targetClass, EdmNavigationProperty.class);