/******************************************************************************* * Copyright 2013 SAP AG * * Licensed 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 com.sap.core.odata.ref.processor; import java.util.Arrays; import java.util.List; import java.util.Map; import com.sap.core.odata.api.edm.EdmEntitySet; import com.sap.core.odata.api.edm.EdmException; import com.sap.core.odata.api.edm.EdmFunctionImport; import com.sap.core.odata.api.exception.ODataApplicationException; import com.sap.core.odata.api.exception.ODataNotFoundException; import com.sap.core.odata.api.exception.ODataNotImplementedException; /** * <p>This interface is intended to make it easier to implement an OData * service in cases where all data for each entity set can be provided as a * {@link List} of objects from which all properties described in the * Entity Data Model can be retrieved and set.</p> * <p>By obeying these restrictions, data-source implementations get the * following advantages: * <ul> * <li>All system query options can be handled centrally.</li> * <li>Following navigation paths must only be done step by step.</li> * </ul> * </p> * @author SAP AG */ public interface ListsDataSource { /** * Retrieves the whole data list for the specified entity set. * @param entitySet the requested {@link EdmEntitySet} * @return the requested data list */ List<?> readData(EdmEntitySet entitySet) throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException; /** * Retrieves a single data object for the specified entity set and key. * @param entitySet the requested {@link EdmEntitySet} * @param keys the entity key as map of key names to key values * @return the requested data object */ Object readData(EdmEntitySet entitySet, Map<String, Object> keys) throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException; /** * <p>Retrieves data for the specified function import and key.</p> * <p>This method is called also for function imports that have defined in * their metadata an other HTTP method than <code>GET</code>.</p> * @param function the requested {@link EdmFunctionImport} * @param parameters the parameters of the function import * as map of parameter names to parameter values * @param keys the key of the returned entity set, as map of key names to key values, * if the return type of the function import is a collection of entities * (optional) * @return the requested data object, either a list or a single object; * if the function import's return type is of type <code>Binary</code>, * the returned object(s) must be of type {@link BinaryData} */ Object readData(EdmFunctionImport function, Map<String, Object> parameters, Map<String, Object> keys) throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException; /** * <p>Retrieves related data for the specified source data, entity set, and key.</p> * <p>If the underlying association of the EDM is specified to have target * multiplicity '*' and no target key is given, this method returns a list of * related data, otherwise it returns a single data object.</p> * @param sourceEntitySet the {@link EdmEntitySet} of the source entity * @param sourceData the data object of the source entity * @param targetEntitySet the requested target {@link EdmEntitySet} * @param targetKeys the key of the target entity as map of key names to key values * (optional) * @return the requested releated data object, either a list or a single object */ Object readRelatedData(EdmEntitySet sourceEntitySet, Object sourceData, EdmEntitySet targetEntitySet, Map<String, Object> targetKeys) throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException; /** * Retrieves the binary data and the MIME type for the media resource * associated to the specified media-link entry. * @param entitySet the {@link EdmEntitySet} of the media-link entry * @param mediaLinkEntryData the data object of the media-link entry * @return the binary data and the MIME type of the media resource */ BinaryData readBinaryData(EdmEntitySet entitySet, Object mediaLinkEntryData) throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException; /** * <p>Creates and returns a new instance of the requested data-object type.</p> * <p>This instance must not be part of the corresponding list and should * have empty content, apart from the key and other mandatory properties. * However, intermediate objects to access complex properties must not be * <code>null</code>.</p> * @param entitySet the {@link EdmEntitySet} the object must correspond to * @return the new data object */ Object newDataObject(EdmEntitySet entitySet) throws ODataNotImplementedException, EdmException, ODataApplicationException; /** * Writes the binary data for the media resource associated to the * specified media-link entry. * @param entitySet the {@link EdmEntitySet} of the media-link entry * @param mediaLinkEntryData the data object of the media-link entry * @param binaryData the binary data of the media resource along with * the MIME type of the binary data */ void writeBinaryData(EdmEntitySet entitySet, Object mediaLinkEntryData, BinaryData binaryData) throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException; /** * Deletes a single data object identified by the specified entity set and key. * @param entitySet the {@link EdmEntitySet} of the entity to be deleted * @param keys the entity key as map of key names to key values */ void deleteData(EdmEntitySet entitySet, Map<String, Object> keys) throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException; /** * <p>Inserts an instance into the entity list of the specified entity set.</p> * <p>If {@link #newDataObject} has not set the key and other mandatory * properties already, this method must set them before inserting the * instance into the list.</p> * @param entitySet the {@link EdmEntitySet} the object must correspond to * @param data the data object of the new entity */ void createData(EdmEntitySet entitySet, Object data) throws ODataNotImplementedException, EdmException, ODataApplicationException; /** * Deletes the relation from the specified source data to a target entity * specified by entity set and key. * @param sourceEntitySet the {@link EdmEntitySet} of the source entity * @param sourceData the data object of the source entity * @param targetEntitySet the {@link EdmEntitySet} of the target entity * @param targetKeys the key of the target entity as map of key names to key values * (optional) */ void deleteRelation(EdmEntitySet sourceEntitySet, Object sourceData, EdmEntitySet targetEntitySet, Map<String, Object> targetKeys) throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException; /** * Writes a relation from the specified source data to a target entity * specified by entity set and key. * @param sourceEntitySet the {@link EdmEntitySet} of the source entity * @param sourceData the data object of the source entity * @param targetEntitySet the {@link EdmEntitySet} of the relation target * @param targetKeys the key of the target entity as map of key names to key values */ void writeRelation(EdmEntitySet sourceEntitySet, Object sourceData, EdmEntitySet targetEntitySet, Map<String, Object> targetKeys) throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException; /** * Container to store binary data (as byte array) and the associated MIME type. */ public class BinaryData { private final byte[] data; private final String mimeType; public BinaryData(final byte[] data, final String mimeType) { this.data = data; this.mimeType = mimeType; } public byte[] getData() { return data; } public String getMimeType() { return mimeType; } @Override public String toString() { return "data=" + Arrays.toString(data) + ", mimeType=" + mimeType; } } }