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:32 UTC
[37/50] [abbrv] Renamed project
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/12ea18ae/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/DataSourceProcessor.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/DataSourceProcessor.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/DataSourceProcessor.java
deleted file mode 100644
index 2be5663..0000000
--- a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/DataSourceProcessor.java
+++ /dev/null
@@ -1,47 +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.odata2.api.data;
-
-import org.apache.olingo.odata2.api.processor.ODataSingleProcessor;
-
-/**
- * Abstract class for implementation of the centralized parts of OData processing,
- * allowing to use the simplified {@link DataSource} and {@link ValueAccess} for the
- * actual data handling.
- * <br/>
- * Extend this class and implement a DataSourceProcessor if the default implementation
- * (<code>ListProcessor</code> found in <code>annotation-processor-core module</code>) has to be overwritten.
- */
-public abstract class DataSourceProcessor extends ODataSingleProcessor {
-
- protected final DataSource dataSource;
- protected final ValueAccess valueAccess;
-
- /**
- * Initialize a {@link DataSourceProcessor} in combination with given {@link DataSource} (providing data objects)
- * and {@link ValueAccess} (accessing values of data objects).
- *
- * @param dataSource used for accessing the data objects
- * @param valueAccess for accessing the values provided by the data objects
- */
- public DataSourceProcessor(final DataSource dataSource, final ValueAccess valueAccess) {
- this.dataSource = dataSource;
- this.valueAccess = valueAccess;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/12ea18ae/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/ValueAccess.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/ValueAccess.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/ValueAccess.java
deleted file mode 100644
index 685e1b6..0000000
--- a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/ValueAccess.java
+++ /dev/null
@@ -1,69 +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.odata2.api.data;
-
-import org.apache.olingo.odata2.api.edm.EdmMapping;
-import org.apache.olingo.odata2.api.edm.EdmProperty;
-import org.apache.olingo.odata2.api.exception.ODataException;
-
-/**
- * This interface is intended to access values in a Java object.
- */
-public interface ValueAccess {
-
- /**
- * Retrieves the value of an EDM property for the given data object.
- * @param data the Java data object
- * @param property the requested {@link EdmProperty}
- * @return the requested property value
- */
- public <T> Object getPropertyValue(final T data, final EdmProperty property) throws ODataException;
-
- /**
- * Sets the value of an EDM property for the given data object.
- * @param data the Java data object
- * @param property the {@link EdmProperty}
- * @param value the new value of the property
- */
- public <T, V> void setPropertyValue(T data, final EdmProperty property, final V value) throws ODataException;
-
- /**
- * Retrieves the Java type of an EDM property for the given data object.
- * @param data the Java data object
- * @param property the requested {@link EdmProperty}
- * @return the requested Java type
- */
- public <T> Class<?> getPropertyType(final T data, final EdmProperty property) throws ODataException;
-
- /**
- * Retrieves the value defined by a mapping object for the given data object.
- * @param data the Java data object
- * @param mapping the requested {@link EdmMapping}
- * @return the requested value
- */
- public <T> Object getMappingValue(final T data, final EdmMapping mapping) throws ODataException;
-
- /**
- * Sets the value defined by a mapping object for the given data object.
- * @param data the Java data object
- * @param mapping the {@link EdmMapping}
- * @param value the new value
- */
- public <T, V> void setMappingValue(T data, final EdmMapping mapping, final V value) throws ODataException;
-}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/12ea18ae/odata2-edm-annotation/edm-annotation-core/pom.xml
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/pom.xml b/odata2-edm-annotation/edm-annotation-core/pom.xml
deleted file mode 100644
index 4e408f7..0000000
--- a/odata2-edm-annotation/edm-annotation-core/pom.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 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. -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <artifactId>olingo-odata2-edm-annotation-core-incubating</artifactId>
- <packaging>jar</packaging>
- <name>${project.artifactId}</name>
-
- <parent>
- <groupId>org.apache.olingo</groupId>
- <artifactId>olingo-odata2-edm-annotation-incubating</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <relativePath>..</relativePath>
- </parent>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.olingo</groupId>
- <artifactId>olingo-odata2-edm-annotation-api-incubating</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.olingo</groupId>
- <artifactId>olingo-odata2-api-incubating</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.olingo</groupId>
- <artifactId>olingo-odata2-api-annotation-incubating</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.olingo</groupId>
- <artifactId>olingo-odata2-core-incubating</artifactId>
- <version>${project.version}</version>
- </dependency>
- </dependencies>
-
-
-</project>
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/12ea18ae/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
deleted file mode 100644
index db03a4c..0000000
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationInMemoryDs.java
+++ /dev/null
@@ -1,351 +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.odata2.core.annotation.data;
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.olingo.odata2.api.annotation.edm.EdmMediaResourceContent;
-import org.apache.olingo.odata2.api.annotation.edm.EdmMediaResourceMimeType;
-import org.apache.olingo.odata2.api.annotation.edm.EdmNavigationProperty;
-import org.apache.olingo.odata2.api.data.DataSource;
-import org.apache.olingo.odata2.api.edm.EdmEntitySet;
-import org.apache.olingo.odata2.api.edm.EdmException;
-import org.apache.olingo.odata2.api.edm.EdmFunctionImport;
-import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
-import org.apache.olingo.odata2.api.exception.ODataApplicationException;
-import org.apache.olingo.odata2.api.exception.ODataNotFoundException;
-import org.apache.olingo.odata2.api.exception.ODataNotImplementedException;
-import org.apache.olingo.odata2.core.annotation.util.AnnotationHelper;
-import org.apache.olingo.odata2.core.annotation.util.ClassHelper;
-import org.apache.olingo.odata2.core.annotation.util.AnnotationHelper.AnnotatedNavInfo;
-import org.apache.olingo.odata2.core.annotation.util.AnnotationHelper.ODataAnnotationException;
-import org.apache.olingo.odata2.core.exception.ODataRuntimeException;
-
-public class AnnotationInMemoryDs implements DataSource {
-
- private static final AnnotationHelper ANNOTATION_HELPER = new AnnotationHelper();
- private final Map<String, DataStore<Object>> dataStores = new HashMap<String, DataStore<Object>>();
- private final boolean persistInMemory;
-
- public AnnotationInMemoryDs(String packageToScan) {
- this(packageToScan, true);
- }
-
- public AnnotationInMemoryDs(String packageToScan, boolean persistInMemory) {
- this.persistInMemory = persistInMemory;
- List<Class<?>> foundClasses = ClassHelper.loadClasses(packageToScan, new ClassHelper.ClassValidator() {
- @Override
- public boolean isClassValid(Class<?> c) {
- return null != c.getAnnotation(org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet.class);
- }
- });
-
- init(foundClasses);
- }
-
- @SuppressWarnings("unchecked")
- private void init(List<Class<?>> foundClasses) {
- for (Class<?> clz : foundClasses) {
-
- DataStore<Object> dhs = (DataStore<Object>) getDataStore(clz);
- org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet entitySet =
- clz.getAnnotation(org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet.class);
- dataStores.put(entitySet.name(), dhs);
- }
- }
-
- public <T> DataStore<T> getDataStore(Class<T> clazz) {
- return DataStore.createInMemory(clazz, persistInMemory);
- }
-
- @Override
- public List<?> readData(EdmEntitySet entitySet) throws ODataNotImplementedException,
- ODataNotFoundException, EdmException, ODataApplicationException {
-
- DataStore<Object> holder = getDataStore(entitySet);
- if (holder != null) {
- return new ArrayList<Object>(holder.read());
- }
-
- throw new ODataNotFoundException(ODataNotFoundException.ENTITY);
- }
-
- @Override
- public Object readData(EdmEntitySet entitySet, Map<String, Object> keys)
- throws ODataNotFoundException, EdmException, ODataApplicationException {
-
- DataStore<Object> store = getDataStore(entitySet);
- if (store != null) {
- Object keyInstance = store.createInstance();
- ANNOTATION_HELPER.setKeyFields(keyInstance, keys);
-
- Object result = store.read(keyInstance);
- if (result != null) {
- return result;
- }
- }
-
- throw new ODataNotFoundException(ODataNotFoundException.ENTITY);
- }
-
- @Override
- public Object readData(EdmFunctionImport function, Map<String, Object> parameters, Map<String, Object> keys)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
- throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
- }
-
- @Override
- public Object readRelatedData(EdmEntitySet sourceEntitySet, Object sourceData, EdmEntitySet targetEntitySet,
- Map<String, Object> targetKeys)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
-
- DataStore<?> sourceStore = dataStores.get(sourceEntitySet.getName());
- DataStore<?> targetStore = dataStores.get(targetEntitySet.getName());
-
- AnnotatedNavInfo navInfo = ANNOTATION_HELPER.getCommonNavigationInfo(
- sourceStore.getDataTypeClass(), targetStore.getDataTypeClass());
- Field sourceField = navInfo.getFromField();
- if (sourceField == null) {
- throw new ODataRuntimeException("Missing source field for related data (sourceStore='" + sourceStore
- + "', targetStore='" + targetStore + "').");
- }
-
- Object navigationInstance = getValue(sourceField, sourceData);
- List<Object> resultData = new ArrayList<Object>();
- for (Object targetInstance : targetStore.read()) {
- if (navigationInstance instanceof Collection) {
- for (Object object : (Collection<?>) navigationInstance) {
- if (ANNOTATION_HELPER.keyMatch(targetInstance, object)) {
- resultData.add(targetInstance);
- }
- }
- } else if (ANNOTATION_HELPER.keyMatch(targetInstance, navigationInstance)) {
- resultData.add(targetInstance);
- }
- }
-
- if (navInfo.getToMultiplicity() == EdmMultiplicity.MANY) {
- if (targetKeys.isEmpty()) {
- return resultData;
- } else {
- for (Object result : resultData) {
- if (ANNOTATION_HELPER.keyMatch(result, targetKeys)) {
- return result;
- }
- }
- return null;
- }
- } else {
- if (resultData.isEmpty()) {
- return null;
- }
- return resultData.get(0);
- }
- }
-
- @Override
- public BinaryData readBinaryData(EdmEntitySet entitySet, Object mediaLinkEntryData)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
-
- Object data = ANNOTATION_HELPER.getValueForField(mediaLinkEntryData, EdmMediaResourceContent.class);
- Object mimeType = ANNOTATION_HELPER.getValueForField(mediaLinkEntryData, EdmMediaResourceMimeType.class);
-
- BinaryData db = new BinaryData((byte[]) data, String.valueOf(mimeType));
- return db;
- }
-
- @Override
- public Object newDataObject(EdmEntitySet entitySet)
- throws ODataNotImplementedException, EdmException, ODataApplicationException {
-
- DataStore<Object> dataStore = getDataStore(entitySet);
- if (dataStore != null) {
- return dataStore.createInstance();
- }
-
- throw new ODataRuntimeException("No DataStore found for entitySet with name: " + entitySet.getName());
- }
-
- @Override
- public void writeBinaryData(EdmEntitySet entitySet, Object mediaEntityInstance, BinaryData binaryData)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
-
- try {
- ANNOTATION_HELPER.setValueForAnnotatedField(
- mediaEntityInstance, EdmMediaResourceContent.class, binaryData.getData());
- ANNOTATION_HELPER.setValueForAnnotatedField(
- mediaEntityInstance, EdmMediaResourceMimeType.class, binaryData.getMimeType());
- } catch (ODataAnnotationException e) {
- throw new ODataRuntimeException("Invalid media resource annotation at entity set '" + entitySet.getName()
- + "' with message '" + e.getMessage() + "'.", e);
- }
- }
-
- /**
- * <p>Updates a single data object identified by the specified entity set and key fields of
- * the data object.</p>
- * @param entitySet the {@link EdmEntitySet} the object must correspond to
- * @param data the data object of the new entity
- * @return updated data object instance
- * @throws org.apache.olingo.odata2.api.exception.ODataNotImplementedException
- * @throws org.apache.olingo.odata2.api.edm.EdmException
- * @throws org.apache.olingo.odata2.api.exception.ODataApplicationException
- */
- public Object updateData(EdmEntitySet entitySet, Object data)
- throws ODataNotImplementedException, EdmException, ODataApplicationException {
-
- DataStore<Object> dataStore = getDataStore(entitySet);
- return dataStore.update(data);
- }
-
- @Override
- public void deleteData(EdmEntitySet entitySet, Map<String, Object> keys)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
- DataStore<Object> dataStore = getDataStore(entitySet);
- Object keyInstance = dataStore.createInstance();
- ANNOTATION_HELPER.setKeyFields(keyInstance, keys);
- dataStore.delete(keyInstance);
- }
-
- @Override
- public void createData(EdmEntitySet entitySet, Object data)
- throws ODataNotImplementedException, EdmException, ODataApplicationException {
-
- DataStore<Object> dataStore = getDataStore(entitySet);
- dataStore.create(data);
- }
-
- @Override
- public void deleteRelation(EdmEntitySet sourceEntitySet, Object sourceData, EdmEntitySet targetEntitySet,
- Map<String, Object> targetKeys)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
- throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
- }
-
- @Override
- public void writeRelation(EdmEntitySet sourceEntitySet, Object sourceEntity, EdmEntitySet targetEntitySet,
- Map<String, Object> targetEntityValues)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
- // get common data
- DataStore<Object> sourceStore = dataStores.get(sourceEntitySet.getName());
- DataStore<Object> targetStore = dataStores.get(targetEntitySet.getName());
-
- AnnotatedNavInfo commonNavInfo = ANNOTATION_HELPER.getCommonNavigationInfo(
- sourceStore.getDataTypeClass(), targetStore.getDataTypeClass());
-
- // get and validate source fields
- Field sourceField = commonNavInfo.getFromField();
- if (sourceField == null) {
- throw new ODataRuntimeException("Missing source field for related data (sourceStore='" + sourceStore
- + "', targetStore='" + targetStore + "').");
- }
-
- // get related target entity
- Object targetEntity = targetStore.createInstance();
- ANNOTATION_HELPER.setKeyFields(targetEntity, targetEntityValues);
- targetEntity = targetStore.read(targetEntity);
-
- // set at source
- setValueAtNavigationField(sourceEntity, sourceField, targetEntity);
- // set at target
- Field targetField = commonNavInfo.getToField();
- if(targetField != null) {
- setValueAtNavigationField(targetEntity, targetField, sourceEntity);
- }
- }
-
- /**
- * Set (Multiplicity != *) or add (Multiplicity == *) <code>value</code> at <code>field</code>
- * of <code>instance</code>.
- *
- * @param instance
- * @param field
- * @param value
- * @throws EdmException
- */
- private void setValueAtNavigationField(Object instance, Field field, Object value)
- throws EdmException {
- Class<?> fieldTypeClass = field.getType();
- if (Collection.class.isAssignableFrom(fieldTypeClass)) {
- @SuppressWarnings("unchecked")
- Collection<Object> collection = (Collection<Object>) ANNOTATION_HELPER.getValueForField(
- instance, field.getName(), EdmNavigationProperty.class);
- if(collection == null) {
- collection = new ArrayList<Object>();
- setValue(instance, field, collection);
- }
- collection.add(value);
- } else if(fieldTypeClass.isArray()) {
- throw new ODataRuntimeException("Write relations for internal used arrays is not supported.");
- } else {
- setValue(instance, field, value);
- }
- }
-
- /**
- * Returns corresponding DataStore for EdmEntitySet or if no data store is registered an
- * ODataRuntimeException is thrown.
- * Never returns NULL.
- *
- * @param entitySet for which the corresponding DataStore is returned
- * @return a DataStore object
- * @throws EdmException
- * @throws ODataRuntimeException if no DataStore is found
- */
- private DataStore<Object> getDataStore(EdmEntitySet entitySet) throws EdmException {
- final String name = entitySet.getName();
- DataStore<Object> dataStore = dataStores.get(name);
- if (dataStore == null) {
- throw new ODataRuntimeException("No DataStore found for entity set '" + entitySet + "'.");
- }
- return dataStore;
- }
-
- private Object getValue(Field field, Object instance) {
- try {
- boolean access = field.isAccessible();
- field.setAccessible(true);
- Object value = field.get(instance);
- field.setAccessible(access);
- return value;
- } catch (IllegalArgumentException e) {
- throw new ODataRuntimeException("Error for getting value of field '"
- + field + "' at instance '" + instance + "'.", e);
- } catch (IllegalAccessException e) {
- throw new ODataRuntimeException("Error for getting value of field '"
- + field + "' at instance '" + instance + "'.", e);
- }
- }
-
- private void setValue(Object instance, Field field, Object value) {
- try {
- boolean access = field.isAccessible();
- field.setAccessible(true);
- field.set(instance, value);
- field.setAccessible(access);
- } catch (IllegalArgumentException e) {
- throw new ODataRuntimeException("Error for setting value of field: '"
- + field + "' at instance: '" + instance + "'.", e);
- } catch (IllegalAccessException e) {
- throw new ODataRuntimeException("Error for setting value of field: '"
- + field + "' at instance: '" + instance + "'.", e);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/12ea18ae/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationValueAccess.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationValueAccess.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationValueAccess.java
deleted file mode 100644
index 14183bf..0000000
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationValueAccess.java
+++ /dev/null
@@ -1,106 +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.odata2.core.annotation.data;
-
-import org.apache.olingo.odata2.api.data.ValueAccess;
-import org.apache.olingo.odata2.api.edm.EdmMapping;
-import org.apache.olingo.odata2.api.edm.EdmProperty;
-import org.apache.olingo.odata2.api.exception.ODataException;
-import org.apache.olingo.odata2.api.exception.ODataNotImplementedException;
-import org.apache.olingo.odata2.core.annotation.util.AnnotationHelper;
-
-/**
- *
- */
-public class AnnotationValueAccess implements ValueAccess {
- private final AnnotationHelper annotationHelper = new AnnotationHelper();
-
- /**
- * Retrieves the value of an EDM property for the given data object.
- * @param data the Java data object
- * @param property the requested {@link EdmProperty}
- * @return the requested property value
- */
- @Override
- public <T> Object getPropertyValue(final T data, final EdmProperty property) throws ODataException {
- if(data == null) {
- return null;
- } else if (annotationHelper.isEdmAnnotated(data)) {
- return annotationHelper.getValueForProperty(data, property.getName());
- }
- throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
- }
-
- /**
- * Sets the value of an EDM property for the given data object.
- * @param data the Java data object
- * @param property the {@link EdmProperty}
- * @param value the new value of the property
- */
- @Override
- public <T, V> void setPropertyValue(T data, final EdmProperty property, final V value) throws ODataException {
- if (annotationHelper.isEdmAnnotated(data)) {
- annotationHelper.setValueForProperty(data, property.getName(), value);
- } else {
- throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
- }
- }
-
- /**
- * Retrieves the Java type of an EDM property for the given data object.
- * @param data the Java data object
- * @param property the requested {@link EdmProperty}
- * @return the requested Java type
- */
- public <T> Class<?> getPropertyType(final T data, final EdmProperty property) throws ODataException {
- if (annotationHelper.isEdmAnnotated(data)) {
- Class<?> fieldType = annotationHelper.getFieldTypeForProperty(data, property.getName());
- if (fieldType == null) {
- throw new ODataException("No field type found for property " + property);
- }
- return fieldType;
- }
- throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
- }
-
- /**
- * Retrieves the value defined by a mapping object for the given data object.
- * @param data the Java data object
- * @param mapping the requested {@link EdmMapping}
- * @return the requested value
- */
- public <T> Object getMappingValue(final T data, final EdmMapping mapping) throws ODataException {
- if (mapping != null && mapping.getMediaResourceMimeTypeKey() != null) {
- return annotationHelper.getValueForProperty(data, mapping.getMediaResourceMimeTypeKey());
- }
- return null;
- }
-
- /**
- * Sets the value defined by a mapping object for the given data object.
- * @param data the Java data object
- * @param mapping the {@link EdmMapping}
- * @param value the new value
- */
- public <T, V> void setMappingValue(T data, final EdmMapping mapping, final V value) throws ODataException {
- if (mapping != null && mapping.getMediaResourceMimeTypeKey() != null) {
- annotationHelper.setValueForProperty(data, mapping.getMediaResourceMimeTypeKey(), value);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/12ea18ae/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/BeanPropertyAccess.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/BeanPropertyAccess.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/BeanPropertyAccess.java
deleted file mode 100644
index be3baac..0000000
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/BeanPropertyAccess.java
+++ /dev/null
@@ -1,186 +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.odata2.core.annotation.data;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-
-import org.apache.olingo.odata2.api.data.ValueAccess;
-import org.apache.olingo.odata2.api.edm.EdmException;
-import org.apache.olingo.odata2.api.edm.EdmMapping;
-import org.apache.olingo.odata2.api.edm.EdmProperty;
-import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind;
-import org.apache.olingo.odata2.api.exception.ODataException;
-import org.apache.olingo.odata2.api.exception.ODataHttpException;
-import org.apache.olingo.odata2.api.exception.ODataNotFoundException;
-
-/**
- * Data access.
- */
-public class BeanPropertyAccess implements ValueAccess {
-
- @Override
- public <T> Object getPropertyValue(final T data, final EdmProperty property) throws ODataException {
- return getValue(data, getGetterMethodName(property));
- }
-
- @Override
- public <T, V> void setPropertyValue(T data, final EdmProperty property, final V value) throws ODataException {
- final String methodName = getSetterMethodName(getGetterMethodName(property));
- if (methodName != null) {
- setValue(data, methodName, value);
- }
- }
-
- @Override
- public <T> Class<?> getPropertyType(final T data, final EdmProperty property) throws ODataException {
- return getType(data, getGetterMethodName(property));
- }
-
- @Override
- public <T> Object getMappingValue(final T data, final EdmMapping mapping) throws ODataException {
- if (mapping != null && mapping.getMimeType() != null) {
- return getValue(data, mapping.getMimeType());
- }
- return null;
- }
-
- @Override
- public <T, V> void setMappingValue(T data, final EdmMapping mapping, final V value) throws ODataException {
- if (mapping != null && mapping.getMimeType() != null) {
- setValue(data, getSetterMethodName(mapping.getMimeType()), value);
- }
- }
-
- private String getGetterMethodName(final EdmProperty property) throws EdmException {
- final String prefix = isBooleanProperty(property) ? "is" : "get";
- final String defaultMethodName = prefix + property.getName();
- return property.getMapping() == null || property.getMapping().getInternalName() == null ?
- defaultMethodName : property.getMapping().getInternalName();
- }
-
- private boolean isBooleanProperty(final EdmProperty property) throws EdmException {
- return property.isSimple()
- && property.getType() == EdmSimpleTypeKind.Boolean.getEdmSimpleTypeInstance();
- }
-
- private String getSetterMethodName(final String getterMethodName) {
- return getterMethodName.contains(".") ?
- null : getterMethodName.replaceFirst("^is", "set").replaceFirst("^get", "set");
- }
-
- private <T> Object getValue(final T data, final String methodName) throws ODataNotFoundException {
- Object dataObject = data;
-
- for (final String method : methodName.split("\\.", -1)) {
- if (dataObject != null) {
- try {
- dataObject = dataObject.getClass().getMethod(method).invoke(dataObject);
- } catch (SecurityException e) {
- throw new ODataNotFoundException(ODataHttpException.COMMON, e);
- } catch (NoSuchMethodException e) {
- throw new ODataNotFoundException(ODataHttpException.COMMON, e);
- } catch (IllegalArgumentException e) {
- throw new ODataNotFoundException(ODataHttpException.COMMON, e);
- } catch (IllegalAccessException e) {
- throw new ODataNotFoundException(ODataHttpException.COMMON, e);
- } catch (InvocationTargetException e) {
- throw new ODataNotFoundException(ODataHttpException.COMMON, e);
- }
- }
- }
-
- return dataObject;
- }
-
- private <T, V> void setValue(final T data, final String methodName, final V value)
- throws ODataNotFoundException {
- try {
- boolean found = false;
- for (final Method method : Arrays.asList(data.getClass().getMethods())) {
- if (method.getName().equals(methodName)) {
- found = true;
- final Class<?> type = method.getParameterTypes()[0];
- if (value == null) {
- if (type.equals(byte.class) || type.equals(short.class) || type.equals(int.class)
- || type.equals(long.class) || type.equals(char.class)) {
- method.invoke(data, 0);
- } else if (type.equals(float.class) || type.equals(double.class)) {
- method.invoke(data, 0.0);
- } else if (type.equals(boolean.class)) {
- method.invoke(data, false);
- } else {
- method.invoke(data, value);
- }
- } else {
- method.invoke(data, value);
- }
- break;
- }
- }
- if (!found) {
- throw new ODataNotFoundException(null);
- }
- } catch (SecurityException e) {
- throw new ODataNotFoundException(null, e);
- } catch (IllegalArgumentException e) {
- throw new ODataNotFoundException(null, e);
- } catch (IllegalAccessException e) {
- throw new ODataNotFoundException(null, e);
- } catch (InvocationTargetException e) {
- throw new ODataNotFoundException(null, e);
- }
- }
-
- private <T> Class<?> getType(final T data, final String methodName) throws ODataNotFoundException {
- if (data == null) {
- throw new ODataNotFoundException(ODataHttpException.COMMON);
- }
-
- Class<?> type = data.getClass();
- for (final String method : methodName.split("\\.", -1)) {
- try {
- type = type.getMethod(method).getReturnType();
- if (type.isPrimitive()) {
- if (type == boolean.class) {
- type = Boolean.class;
- } else if (type == byte.class) {
- type = Byte.class;
- } else if (type == short.class) {
- type = Short.class;
- } else if (type == int.class) {
- type = Integer.class;
- } else if (type == long.class) {
- type = Long.class;
- } else if (type == float.class) {
- type = Float.class;
- } else if (type == double.class) {
- type = Double.class;
- }
- }
- } catch (final SecurityException e) {
- throw new ODataNotFoundException(ODataHttpException.COMMON, e);
- } catch (final NoSuchMethodException e) {
- throw new ODataNotFoundException(ODataHttpException.COMMON, e);
- }
- }
- return type;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/12ea18ae/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/DataStore.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/DataStore.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/DataStore.java
deleted file mode 100644
index 696ab9a..0000000
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/DataStore.java
+++ /dev/null
@@ -1,192 +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.odata2.core.annotation.data;
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.olingo.odata2.api.annotation.edm.EdmKey;
-import org.apache.olingo.odata2.api.exception.ODataApplicationException;
-import org.apache.olingo.odata2.core.annotation.util.AnnotationHelper;
-import org.apache.olingo.odata2.core.exception.ODataRuntimeException;
-
-/**
- *
- */
-public class DataStore<T> {
-
- private static final AnnotationHelper ANNOTATION_HELPER = new AnnotationHelper();
- private final List<T> dataStore;
- private final Class<T> dataTypeClass;
-
- private int idCounter = 1;
-
- private static class InMemoryDataStore {
- private static final Map<Class<?>, DataStore<?>> c2ds = new HashMap<Class<?>, DataStore<?>>();
-
- @SuppressWarnings("unchecked")
- static DataStore<?> getInstance(Class<?> clz, boolean createNewInstance) {
- DataStore<?> ds = c2ds.get(clz);
- if (createNewInstance || ds == null) {
- ds = new DataStore<Object>((Class<Object>) clz);
- c2ds.put(clz, ds);
- }
- return ds;
- }
- }
-
- @SuppressWarnings("unchecked")
- public static <T> DataStore<T> createInMemory(Class<T> clazz) {
- return (DataStore<T>) InMemoryDataStore.getInstance(clazz, true);
- }
-
- @SuppressWarnings("unchecked")
- public static <T> DataStore<T> createInMemory(Class<T> clazz, boolean keepExisting) {
- return (DataStore<T>) InMemoryDataStore.getInstance(clazz, !keepExisting);
- }
-
- private DataStore(List<T> wrapStore, Class<T> clz) {
- dataStore = Collections.synchronizedList(wrapStore);
- dataTypeClass = clz;
- }
-
- private DataStore(Class<T> clz) {
- this(new ArrayList<T>(), clz);
- }
-
- public Class<T> getDataTypeClass() {
- return dataTypeClass;
- }
-
- public String getEntityTypeName() {
- return ANNOTATION_HELPER.extractEntityTypeName(dataTypeClass);
- }
-
- public T createInstance() {
- try {
- return dataTypeClass.newInstance();
- } catch (InstantiationException e) {
- throw new ODataRuntimeException("Unable to create instance of class '" + dataTypeClass + "'.", e);
- } catch (IllegalAccessException e) {
- throw new ODataRuntimeException("Unable to create instance of class '" + dataTypeClass + "'.", e);
- }
- }
-
- public T read(T obj) {
- List<Object> objKeys = getKeys(obj);
- for (T stored : dataStore) {
- if (objKeys.equals(getKeys(stored))) {
- return stored;
- }
- }
- return null;
- }
-
- public Collection<T> read() {
- return Collections.unmodifiableCollection(dataStore);
- }
-
- public T create(T object) throws DataStoreException {
- synchronized (dataStore) {
- if (read(object) != null || getKeys(object).contains(null)) {
- createKeys(object);
- return this.create(object);
- }
- dataStore.add(object);
- }
- return object;
- }
-
- public T update(T object) {
- synchronized (dataStore) {
- T stored = read(object);
- dataStore.remove(stored);
- dataStore.add(object);
- }
- return object;
- }
-
- public T delete(T object) {
- synchronized (dataStore) {
- T stored = read(object);
- if (stored != null) {
- dataStore.remove(stored);
- }
- return stored;
- }
- }
-
- private List<Object> getKeys(T object) {
- Map<String, Object> keys = ANNOTATION_HELPER.getValueForAnnotatedFields(object, EdmKey.class);
-
- // XXX: list should be in a defined order -> better to create an 'Key' object which is comparable
- List<Object> keyList = new ArrayList<Object>(keys.values());
- return keyList;
- }
-
- private T createKeys(T object) throws DataStoreException {
- List<Field> fields = ANNOTATION_HELPER.getAnnotatedFields(object, EdmKey.class);
- if (fields.isEmpty()) {
- throw new DataStoreException("No EdmKey annotated fields found for class " + object.getClass());
- }
- Map<String, Object> fieldName2KeyValue = new HashMap<String, Object>();
-
- for (Field field : fields) {
- Object key = createKey(field);
- fieldName2KeyValue.put(ANNOTATION_HELPER.getCanonicalName(field), key);
- }
-
- ANNOTATION_HELPER.setValuesToAnnotatedFields(object, EdmKey.class, fieldName2KeyValue);
-
- return object;
- }
-
- private Object createKey(Field field) {
- Class<?> type = field.getType();
-
- if (type == String.class) {
- return String.valueOf(idCounter++);
- } else if (type == Integer.class || type == int.class) {
- return Integer.valueOf(idCounter++);
- } else if (type == Long.class || type == long.class) {
- return Long.valueOf(idCounter++);
- }
-
- throw new UnsupportedOperationException("Automated key generation for type '" + type
- + "' is not supported (caused on field '" + field + "').");
- }
-
- public static class DataStoreException extends ODataApplicationException {
- private static final long serialVersionUID = 42L;
-
- public DataStoreException(String message) {
- this(message, null);
- }
-
- public DataStoreException(String message, Throwable cause) {
- super(message, Locale.ENGLISH, cause);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/12ea18ae/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
deleted file mode 100644
index 97f5b53..0000000
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java
+++ /dev/null
@@ -1,773 +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.odata2.core.annotation.edm;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.apache.olingo.odata2.api.annotation.edm.EdmComplexType;
-import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet;
-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.EdmMediaResourceContent;
-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.EdmType;
-import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
-import org.apache.olingo.odata2.api.edm.FullQualifiedName;
-import org.apache.olingo.odata2.api.edm.provider.AnnotationAttribute;
-import org.apache.olingo.odata2.api.edm.provider.AnnotationElement;
-import org.apache.olingo.odata2.api.edm.provider.Association;
-import org.apache.olingo.odata2.api.edm.provider.AssociationEnd;
-import org.apache.olingo.odata2.api.edm.provider.AssociationSet;
-import org.apache.olingo.odata2.api.edm.provider.AssociationSetEnd;
-import org.apache.olingo.odata2.api.edm.provider.ComplexProperty;
-import org.apache.olingo.odata2.api.edm.provider.ComplexType;
-import org.apache.olingo.odata2.api.edm.provider.EdmProvider;
-import org.apache.olingo.odata2.api.edm.provider.EntityContainer;
-import org.apache.olingo.odata2.api.edm.provider.EntityContainerInfo;
-import org.apache.olingo.odata2.api.edm.provider.EntitySet;
-import org.apache.olingo.odata2.api.edm.provider.EntityType;
-import org.apache.olingo.odata2.api.edm.provider.FunctionImport;
-import org.apache.olingo.odata2.api.edm.provider.Key;
-import org.apache.olingo.odata2.api.edm.provider.NavigationProperty;
-import org.apache.olingo.odata2.api.edm.provider.Property;
-import org.apache.olingo.odata2.api.edm.provider.PropertyRef;
-import org.apache.olingo.odata2.api.edm.provider.Schema;
-import org.apache.olingo.odata2.api.edm.provider.SimpleProperty;
-import org.apache.olingo.odata2.api.edm.provider.Using;
-import org.apache.olingo.odata2.api.exception.ODataException;
-import org.apache.olingo.odata2.core.annotation.util.AnnotationHelper;
-import org.apache.olingo.odata2.core.annotation.util.ClassHelper;
-import org.apache.olingo.odata2.core.exception.ODataRuntimeException;
-
-/**
- * Provider for the entity data model used in the reference scenario
- *
- */
-public class AnnotationEdmProvider extends EdmProvider {
-
- private static final AnnotationHelper ANNOTATION_HELPER = new AnnotationHelper();
-
- private final List<Class<?>> annotatedClasses;
- private final Map<String, EntityContainer> name2Container = new HashMap<String, EntityContainer>();
- private final Map<String, ContainerBuilder> containerName2ContainerBuilder = new HashMap<String, ContainerBuilder>();
- private final Map<String, Schema> namespace2Schema = new HashMap<String, Schema>();
- private EntityContainer defaultContainer;
-
- public AnnotationEdmProvider(Collection<Class<?>> annotatedClasses) {
-
- this.annotatedClasses = new ArrayList<Class<?>>(annotatedClasses.size());
- for (Class<?> aClass : annotatedClasses) {
- if (ANNOTATION_HELPER.isEdmAnnotated(aClass)) {
- this.annotatedClasses.add(aClass);
- }
- }
-
- init();
- }
-
- public AnnotationEdmProvider(String packageToScan) {
- this.annotatedClasses = ClassHelper.loadClasses(packageToScan, new ClassHelper.ClassValidator() {
- @Override
- public boolean isClassValid(Class<?> c) {
- return ANNOTATION_HELPER.isEdmAnnotated(c);
- }
- });
-
- init();
- }
-
- private void init() {
- for (Class<?> aClass : annotatedClasses) {
- updateSchema(aClass);
- handleEntityContainer(aClass);
- }
-
- finish();
- }
-
- @Override
- public Association getAssociation(FullQualifiedName edmFQName) throws ODataException {
- Schema schema = namespace2Schema.get(edmFQName.getNamespace());
- if (schema != null) {
- List<Association> associations = schema.getAssociations();
- for (Association association : associations) {
- if (association.getName().equals(edmFQName.getName())) {
- return association;
- }
- }
- }
- return null;
- }
-
- @Override
- public AssociationSet getAssociationSet(String entityContainer, FullQualifiedName association,
- String sourceEntitySetName, String sourceEntitySetRole) throws ODataException {
- EntityContainer container = name2Container.get(entityContainer);
- if (container != null) {
- List<AssociationSet> associations = container.getAssociationSets();
- for (AssociationSet associationSet : associations) {
- if (associationSet.getAssociation().equals(association)) {
- final AssociationSetEnd endOne = associationSet.getEnd1();
- if (endOne.getRole().equals(sourceEntitySetRole)
- && endOne.getEntitySet().equals(sourceEntitySetName)) {
- return associationSet;
- }
- final AssociationSetEnd endTwo = associationSet.getEnd2();
- if (endTwo.getRole().equals(sourceEntitySetRole)
- && endTwo.getEntitySet().equals(sourceEntitySetName)) {
- return associationSet;
- }
- }
- }
- }
- return null;
- }
-
- @Override
- public ComplexType getComplexType(FullQualifiedName edmFQName) throws ODataException {
- Schema schema = namespace2Schema.get(edmFQName.getNamespace());
- if (schema != null) {
- List<ComplexType> complexTypes = schema.getComplexTypes();
- for (ComplexType complexType : complexTypes) {
- if (complexType.getName().equals(edmFQName.getName())) {
- return complexType;
- }
- }
- }
- return null;
- }
-
- @Override
- public EntityContainerInfo getEntityContainerInfo(String name) throws ODataException {
- EntityContainer container = name2Container.get(name);
- if (container == null) {
- // use default container (if set)
- container = defaultContainer;
- }
- if (container != null) {
- EntityContainerInfo info = new EntityContainerInfo();
- info.setName(container.getName());
- info.setDefaultEntityContainer(container.isDefaultEntityContainer());
- info.setExtendz(container.getExtendz());
- info.setAnnotationAttributes(container.getAnnotationAttributes());
- info.setAnnotationElements(container.getAnnotationElements());
-
- return info;
- }
-
- return null;
- }
-
- @Override
- public EntitySet getEntitySet(String entityContainer, String name) throws ODataException {
- EntityContainer container = name2Container.get(entityContainer);
- if (container != null) {
- List<EntitySet> entitySets = container.getEntitySets();
- for (EntitySet entitySet : entitySets) {
- if (entitySet.getName().equals(name)) {
- return entitySet;
- }
- }
- }
-
- return null;
- }
-
- @Override
- public EntityType getEntityType(FullQualifiedName edmFQName) throws ODataException {
- Schema schema = namespace2Schema.get(edmFQName.getNamespace());
- if (schema != null) {
- List<EntityType> complexTypes = schema.getEntityTypes();
- for (EntityType complexType : complexTypes) {
- if (complexType.getName().equals(edmFQName.getName())) {
- return complexType;
- }
- }
- }
- return null;
- }
-
- @Override
- public FunctionImport getFunctionImport(String entityContainer, String name) throws ODataException {
- EntityContainer container = name2Container.get(entityContainer);
- if (container != null) {
- List<FunctionImport> functionImports = container.getFunctionImports();
- for (FunctionImport functionImport : functionImports) {
- if (functionImport.getName().equals(name)) {
- return functionImport;
- }
- }
- }
- return null;
- }
-
- @Override
- public List<Schema> getSchemas() throws ODataException {
- return new ArrayList<Schema>(namespace2Schema.values());
- }
-
- //
- //
- //
- private Map<String, SchemaBuilder> namespace2SchemaBuilder = new HashMap<String, SchemaBuilder>();
-
- private void updateSchema(Class<?> aClass) {
- EdmEntityType et = aClass.getAnnotation(EdmEntityType.class);
- if (et != null) {
- updateSchema(aClass, et);
- }
- EdmComplexType ect = aClass.getAnnotation(EdmComplexType.class);
- if (ect != null) {
- updateSchema(aClass, ect);
- }
- }
-
- private void updateSchema(Class<?> aClass, EdmEntityType et) {
- SchemaBuilder b = getSchemaBuilder(et.namespace(), aClass);
- TypeBuilder typeBuilder = TypeBuilder.init(et, aClass);
- b.addEntityType(typeBuilder.buildEntityType());
- b.addAssociations(typeBuilder.buildAssociations());
- }
-
- private SchemaBuilder getSchemaBuilder(String namespace, Class<?> aClass) {
- String usedNamespace = namespace;
- if(usedNamespace.isEmpty()) {
- usedNamespace = ANNOTATION_HELPER.getCanonicalNamespace(aClass);
- }
- SchemaBuilder builder = namespace2SchemaBuilder.get(usedNamespace);
- if (builder == null) {
- builder = SchemaBuilder.init(usedNamespace);
- namespace2SchemaBuilder.put(usedNamespace, builder);
- }
- return builder;
- }
-
- private void updateSchema(Class<?> aClass, EdmComplexType et) {
- SchemaBuilder b = getSchemaBuilder(et.namespace(), aClass);
- TypeBuilder typeBuilder = TypeBuilder.init(et, aClass);
- b.addComplexType(typeBuilder.buildComplexType());
- }
-
- private void handleEntityContainer(Class<?> aClass) {
- EdmEntityType entityType = aClass.getAnnotation(EdmEntityType.class);
- if (entityType != null) {
- FullQualifiedName typeName = createFqnForEntityType(aClass, entityType);
- String containerName = ANNOTATION_HELPER.extractContainerName(aClass);
- ContainerBuilder builder = containerName2ContainerBuilder.get(containerName);
- if (builder == null) {
- builder = ContainerBuilder.init(typeName.getNamespace(), containerName);
- containerName2ContainerBuilder.put(containerName, builder);
- }
- EdmEntitySet entitySet = aClass.getAnnotation(EdmEntitySet.class);
- if (entitySet != null) {
- builder.addEntitySet(createEntitySet(typeName, entitySet));
- }
- }
- }
-
- private EntitySet createEntitySet(FullQualifiedName typeName, EdmEntitySet entitySet) {
- return new EntitySet().setName(entitySet.name()).setEntityType(typeName);
- }
-
- private FullQualifiedName createFqnForEntityType(Class<?> annotatedClass, EdmEntityType entityType) {
- return ANNOTATION_HELPER.extractEntityTypeFqn(annotatedClass);
- }
-
- private void finish() {
- //
- Collection<ContainerBuilder> containers = containerName2ContainerBuilder.values();
- for (ContainerBuilder containerBuilder : containers) {
- SchemaBuilder schemaBuilder = namespace2SchemaBuilder.get(containerBuilder.getNamespace());
- containerBuilder.addAssociationSets(schemaBuilder.name2Associations.values());
- final EntityContainer container = containerBuilder.build();
- schemaBuilder.addEntityContainer(container);
- name2Container.put(container.getName(), container);
- if (container.isDefaultEntityContainer()) {
- defaultContainer = container;
- }
- }
- //
- Collection<SchemaBuilder> schemaBuilders = namespace2SchemaBuilder.values();
- for (SchemaBuilder schemaBuilder : schemaBuilders) {
- final Schema schema = schemaBuilder.build();
- namespace2Schema.put(schema.getNamespace(), schema);
- }
- }
-
- //
- //
- //
- static class TypeBuilder {
-
- final private String namespace;
- final private String name;
- private boolean isAbstract = false;
- private boolean isMediaResource = false;
- private FullQualifiedName baseEntityType = null;
- private final List<PropertyRef> keyProperties = new ArrayList<PropertyRef>();
- private final List<Property> properties = new ArrayList<Property>();
- private final List<NavigationProperty> navProperties = new ArrayList<NavigationProperty>();
- private final List<Association> associations = new ArrayList<Association>();
-
- public TypeBuilder(FullQualifiedName fqn) {
- this.namespace = fqn.getNamespace();
- this.name = fqn.getName();
- }
-
- public static TypeBuilder init(EdmEntityType entity, Class<?> aClass) {
- return new TypeBuilder(ANNOTATION_HELPER.extractEntityTypeFqn(entity, aClass)).withClass(aClass);
- }
-
- public static TypeBuilder init(EdmComplexType entity, Class<?> aClass) {
- return new TypeBuilder(ANNOTATION_HELPER.extractComplexTypeFqn(entity, aClass)).withClass(aClass);
- }
-
- private TypeBuilder withClass(Class<?> aClass) {
- baseEntityType = createBaseEntityFqn(aClass);
-
- if (Modifier.isAbstract(aClass.getModifiers())) {
- this.isAbstract = true;
- }
-
- Field[] fields = aClass.getDeclaredFields();
- for (Field field : fields) {
- EdmProperty ep = field.getAnnotation(EdmProperty.class);
- if (ep != null) {
- properties.add(createProperty(ep, field, namespace));
- EdmKey eti = field.getAnnotation(EdmKey.class);
- if (eti != null) {
- keyProperties.add(createKeyProperty(ep, field));
- }
- }
- EdmNavigationProperty enp = field.getAnnotation(EdmNavigationProperty.class);
- if (enp != null) {
- final NavigationProperty navProperty = createNavigationProperty(namespace, enp, field);
- navProperties.add(navProperty);
- Association association = createAssociation(field, navProperty);
- associations.add(association);
- }
- EdmMediaResourceContent emrc = field.getAnnotation(EdmMediaResourceContent.class);
- if (emrc != null) {
- isMediaResource = true;
- }
- }
-
- return this;
- }
-
- public TypeBuilder addProperty(PropertyRef property) {
- keyProperties.add(property);
- return this;
- }
-
- public TypeBuilder addProperty(Property property) {
- properties.add(property);
- return this;
- }
-
- public TypeBuilder addNavigationProperty(NavigationProperty property) {
- navProperties.add(property);
- return this;
- }
-
- public TypeBuilder setAbstract(boolean isAbstract) {
- this.isAbstract = isAbstract;
- return this;
- }
-
- public ComplexType buildComplexType() {
- ComplexType complexType = new ComplexType();
- if (baseEntityType != null) {
- complexType.setBaseType(baseEntityType);
- }
- return complexType.setName(name).setProperties(properties);
- }
-
- public EntityType buildEntityType() {
- EntityType entityType = new EntityType();
- if (baseEntityType != null) {
- entityType.setBaseType(baseEntityType);
- }
- if (!keyProperties.isEmpty()) {
- entityType.setKey(new Key().setKeys(keyProperties));
- }
- if (!navProperties.isEmpty()) {
- entityType.setNavigationProperties(navProperties);
- }
- return entityType.setName(name)
- .setAbstract(isAbstract)
- .setHasStream(isMediaResource)
- .setProperties(properties);
- }
-
- public Collection<Association> buildAssociations() {
- return Collections.unmodifiableCollection(associations);
- }
-
- private PropertyRef createKeyProperty(EdmProperty et, Field field) {
- PropertyRef keyProperty = new PropertyRef();
- String entityName = et.name();
- if (entityName.isEmpty()) {
- entityName = getCanonicalName(field);
- }
- return keyProperty.setName(entityName);
- }
-
- private Property createProperty(EdmProperty ep, Field field, String defaultNamespace) {
- if (isAnnotatedEntity(field.getType())) {
- return createComplexProperty(field, defaultNamespace);
- } else {
- return createSimpleProperty(ep, field);
- }
- }
-
- private Property createSimpleProperty(EdmProperty ep, Field field) {
- SimpleProperty sp = new SimpleProperty();
- String entityName = ANNOTATION_HELPER.getPropertyName(field);
- sp.setName(entityName);
- //
- EdmType type = ep.type();
- if (type == EdmType.NULL) {
- type = getEdmType(field.getType());
- }
- sp.setType(ANNOTATION_HELPER.mapTypeKind(type));
-
- return sp;
- }
-
- private Property createComplexProperty(Field field, String defaultNamespace) {
- ComplexProperty cp = new ComplexProperty();
- // settings from property
- String entityName = ANNOTATION_HELPER.getPropertyName(field);
- cp.setName(entityName);
-
- // settings from related complex entity
- EdmComplexType ece = field.getType().getAnnotation(EdmComplexType.class);
- String complexEntityNamespace = ece.namespace();
- if (complexEntityNamespace.isEmpty()) {
- complexEntityNamespace = defaultNamespace;
- }
- cp.setType(new FullQualifiedName(complexEntityNamespace, ece.name()));
-
- return cp;
- }
-
- private NavigationProperty createNavigationProperty(String namespace, EdmNavigationProperty enp, Field field) {
- NavigationProperty navProp = new NavigationProperty();
- navProp.setName(ANNOTATION_HELPER.getPropertyName(field));
- String fromRole = ANNOTATION_HELPER.extractFromRoleName(enp, field);
- navProp.setFromRole(fromRole);
-
- String toRole = ANNOTATION_HELPER.extractToRoleName(enp, field);
- navProp.setToRole(toRole);
-
- String relationshipName = ANNOTATION_HELPER.extractRelationshipName(enp, field);
- navProp.setRelationship(new FullQualifiedName(namespace, relationshipName));
-
- return navProp;
- }
-
-// private EdmSimpleTypeKind getEdmSimpleType(Class<?> type) {
-// if (type == String.class) {
-// return EdmType.String;
-// } else if (type == boolean.class || type == Boolean.class) {
-// return EdmType.Boolean;
-// } else if (type == byte.class || type == Byte.class) {
-// return EdmType.SByte;
-// } else if (type == short.class || type == Short.class) {
-// return EdmType.Int16;
-// } else if (type == int.class || type == Integer.class) {
-// return EdmType.Int32;
-// } else if (type == long.class || type == Long.class) {
-// return EdmType.Int64;
-// } else if (type == double.class || type == Double.class) {
-// return EdmType.Double;
-// } else if (type == float.class || type == Float.class) {
-// return EdmType.Single;
-// } else if (type == BigInteger.class || type == BigDecimal.class) {
-// return EdmType.Decimal;
-// } else if (type == Byte[].class || type == byte[].class) {
-// return EdmType.Binary;
-// } else if (type == Date.class) {
-// return EdmType.DateTime;
-// } else if (type == Calendar.class) {
-// return EdmType.DateTimeOffset;
-// } else if (type == UUID.class) {
-// return EdmType.Guid;
-// } else {
-// throw new UnsupportedOperationException("Not yet supported type '" + type + "'.");
-// }
-// }
-
- private EdmType getEdmType(Class<?> type) {
- if (type == String.class) {
- return EdmType.STRING;
- } else if (type == boolean.class || type == Boolean.class) {
- return EdmType.BOOLEAN;
- } else if (type == byte.class || type == Byte.class) {
- return EdmType.SBYTE;
- } else if (type == short.class || type == Short.class) {
- return EdmType.INT16;
- } else if (type == int.class || type == Integer.class) {
- return EdmType.INT32;
- } else if (type == long.class || type == Long.class) {
- return EdmType.INT64;
- } else if (type == double.class || type == Double.class) {
- return EdmType.DOUBLE;
- } else if (type == float.class || type == Float.class) {
- return EdmType.SINGLE;
- } else if (type == BigInteger.class || type == BigDecimal.class) {
- return EdmType.DECIMAL;
- } else if (type == Byte[].class || type == byte[].class) {
- return EdmType.BINARY;
- } else if (type == Date.class) {
- return EdmType.DATE_TIME;
- } else if (type == Calendar.class) {
- return EdmType.DATE_TIME_OFFSET;
- } else if (type == UUID.class) {
- return EdmType.GUID;
- } else {
- throw new UnsupportedOperationException("Not yet supported type '" + type + "'.");
- }
- }
-
-
- private Class<?> checkForBaseEntityClass(Class<?> aClass) {
- Class<?> superClass = aClass.getSuperclass();
- if (superClass == Object.class) {
- return null;
- } else {
- EdmEntityType edmEntity = superClass.getAnnotation(EdmEntityType.class);
- if (edmEntity == null) {
- return checkForBaseEntityClass(superClass);
- } else {
- return superClass;
- }
- }
- }
-
- private FullQualifiedName createBaseEntityFqn(Class<?> aClass) {
- Class<?> baseEntityClass = checkForBaseEntityClass(aClass);
- if (baseEntityClass == null) {
- return null;
- }
- return ANNOTATION_HELPER.extractEntityTypeFqn(baseEntityClass);
- }
-
- private Association createAssociation(Field field, NavigationProperty navProperty) {
- Association association = new Association();
- EdmNavigationProperty navigation = field.getAnnotation(EdmNavigationProperty.class);
-
- AssociationEnd fromEnd = new AssociationEnd();
- fromEnd.setRole(navProperty.getFromRole());
- String typeName = ANNOTATION_HELPER.extractEntityTypeName(field.getDeclaringClass());
- fromEnd.setType(new FullQualifiedName(namespace, typeName));
- fromEnd.setMultiplicity(EdmMultiplicity.ONE);
- association.setEnd1(fromEnd);
-
- AssociationEnd toEnd = new AssociationEnd();
- toEnd.setRole(navProperty.getToRole());
- String toTypeName = ANNOTATION_HELPER.extractEntitTypeName(navigation, field);
- toEnd.setType(new FullQualifiedName(namespace, toTypeName));
- toEnd.setMultiplicity(ANNOTATION_HELPER.getMultiplicity(navigation, field));
- association.setEnd2(toEnd);
-
- String associationName = navProperty.getRelationship().getName();
- association.setName(associationName);
- return association;
- }
-
- private String getCanonicalName(Field field) {
- return ANNOTATION_HELPER.getCanonicalName(field);
- }
-
- private boolean isAnnotatedEntity(Class<?> clazz) {
- return ANNOTATION_HELPER.isEdmTypeAnnotated(clazz);
- }
- }
-
- static class SchemaBuilder {
-
- final private String namespace;
- // private String alias;
- private final List<Using> usings = new ArrayList<Using>();
- private final List<EntityType> entityTypes = new ArrayList<EntityType>();
- private final List<ComplexType> complexTypes = new ArrayList<ComplexType>();
- private final Map<String, Association> name2Associations = new HashMap<String, Association>();
- private final List<EntityContainer> entityContainers = new ArrayList<EntityContainer>();
- private final List<AnnotationAttribute> annotationAttributes = new ArrayList<AnnotationAttribute>();
- private final List<AnnotationElement> annotationElements = new ArrayList<AnnotationElement>();
-
- private SchemaBuilder(String namespace) {
- this.namespace = namespace;
- }
-
- public static SchemaBuilder init(String namespace) {
- return new SchemaBuilder(namespace);
- }
-
- public SchemaBuilder addEntityType(EntityType type) {
- entityTypes.add(type);
- return this;
- }
-
- public SchemaBuilder addEntityContainer(EntityContainer container) {
- entityContainers.add(container);
- return this;
- }
-
- public SchemaBuilder addComplexType(ComplexType createEntityType) {
- complexTypes.add(createEntityType);
- return this;
- }
-
- public void addAssociations(Collection<Association> associations) {
- for (Association association : associations) {
- final String relationshipName = association.getName();
- if (name2Associations.containsKey(relationshipName)) {
- association = mergeAssociations(name2Associations.get(relationshipName), association);
- }
- name2Associations.put(relationshipName, association);
- }
- }
-
- private Association mergeAssociations(Association associationOne, Association associationTwo) {
- AssociationEnd oneEnd1 = associationOne.getEnd1();
- AssociationEnd oneEnd2 = associationOne.getEnd2();
- AssociationEnd twoEnd1 = associationTwo.getEnd1();
- AssociationEnd twoEnd2 = associationTwo.getEnd2();
- AssociationEnd[] oneEnds = new AssociationEnd[] { oneEnd1, oneEnd2 };
-
- for (AssociationEnd associationEnd : oneEnds) {
- if (associationEnd.getRole().equals(twoEnd1.getRole())) {
- if (twoEnd1.getMultiplicity() == EdmMultiplicity.MANY) {
- associationEnd.setMultiplicity(EdmMultiplicity.MANY);
- }
- } else if (associationEnd.getRole().equals(twoEnd2.getRole())) {
- if (twoEnd2.getMultiplicity() == EdmMultiplicity.MANY) {
- associationEnd.setMultiplicity(EdmMultiplicity.MANY);
- }
- }
- }
-
- return associationOne;
- }
-
- public Schema build() {
- Schema s = new Schema();
- s.setUsings(usings);
- s.setEntityTypes(entityTypes);
- s.setComplexTypes(complexTypes);
- s.setAssociations(new ArrayList<Association>(name2Associations.values()));
- s.setEntityContainers(entityContainers);
- s.setAnnotationAttributes(annotationAttributes);
- s.setAnnotationElements(annotationElements);
- s.setNamespace(namespace);
- return s;
- }
- }
-
- private static class ContainerBuilder {
-
- final private String name;
- final private String namespace;
- private boolean defaultContainer = true;
- private final List<EntitySet> entitySets = new ArrayList<EntitySet>();
- private final List<AssociationSet> associationSets = new ArrayList<AssociationSet>();
- private final List<FunctionImport> functionImports = new ArrayList<FunctionImport>();
-
- // private Documentation documentation;
-
- private ContainerBuilder(String namespace, String containerName) {
- this.namespace = namespace;
- name = containerName;
- }
-
- public String getNamespace() {
- return namespace;
- }
-
- public static ContainerBuilder init(String namespace, String containerName) {
- return new ContainerBuilder(namespace, containerName);
- }
-
- public ContainerBuilder setDefaultContainer(boolean isDefault) {
- defaultContainer = isDefault;
- return this;
- }
-
- public ContainerBuilder addEntitySet(EntitySet entitySet) {
- entitySets.add(entitySet);
- return this;
- }
-
- public void addAssociationSets(Collection<Association> associations) {
- for (Association association : associations) {
- AssociationSet as = new AssociationSet();
- as.setName(association.getName());
- FullQualifiedName asAssociationFqn = new FullQualifiedName(namespace, association.getName());
- as.setAssociation(asAssociationFqn);
-
- AssociationSetEnd asEnd1 = new AssociationSetEnd();
- asEnd1.setEntitySet(getEntitySetName(association.getEnd1()));
- asEnd1.setRole(association.getEnd1().getRole());
- as.setEnd1(asEnd1);
-
- AssociationSetEnd asEnd2 = new AssociationSetEnd();
- asEnd2.setEntitySet(getEntitySetName(association.getEnd2()));
- asEnd2.setRole(association.getEnd2().getRole());
- as.setEnd2(asEnd2);
-
- associationSets.add(as);
- }
- }
-
- public EntityContainer build() {
- EntityContainer ec = new EntityContainer();
- ec.setName(name);
- ec.setDefaultEntityContainer(defaultContainer);
- ec.setEntitySets(entitySets);
- ec.setAssociationSets(associationSets);
- ec.setFunctionImports(functionImports);
- return ec;
- }
-
- private String getEntitySetName(AssociationEnd end) {
- for (EntitySet entitySet : entitySets) {
- if (entitySet.getEntityType().equals(end.getType())) {
- return entitySet.getName();
- }
- }
- throw new ODataRuntimeException("No entity set found for " + end.getType());
- }
- }
-}