/*******************************************************************************
* 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.api.rt;
import java.io.InputStream;
import com.sap.core.odata.api.ODataService;
import com.sap.core.odata.api.batch.BatchResponsePart.BatchResponsePartBuilder;
import com.sap.core.odata.api.client.batch.BatchChangeSet.BatchChangeSetBuilder;
import com.sap.core.odata.api.client.batch.BatchChangeSetPart.BatchChangeSetPartBuilder;
import com.sap.core.odata.api.client.batch.BatchQueryPart.BatchQueryPartBuilder;
import com.sap.core.odata.api.edm.Edm;
import com.sap.core.odata.api.edm.EdmSimpleType;
import com.sap.core.odata.api.edm.EdmSimpleTypeFacade;
import com.sap.core.odata.api.edm.EdmSimpleTypeKind;
import com.sap.core.odata.api.edm.provider.EdmProvider;
import com.sap.core.odata.api.ep.EntityProvider.EntityProviderInterface;
import com.sap.core.odata.api.ep.EntityProviderException;
import com.sap.core.odata.api.processor.ODataRequest.ODataRequestBuilder;
import com.sap.core.odata.api.processor.ODataResponse.ODataResponseBuilder;
import com.sap.core.odata.api.processor.ODataSingleProcessor;
import com.sap.core.odata.api.uri.UriParser;
/**
* Provides access to core implementation classes for interfaces. This class is used
* by internal abstract API implementations and it is not intended to be used by others.
*
* @com.sap.core.odata.DoNotImplement
* @author SAP AG
*/
public abstract class RuntimeDelegate {
private static final String IMPLEMENTATION = "com.sap.core.odata.core.rt.RuntimeDelegateImpl";
/**
* Create a runtime delegate instance from the core library. The core
* library (com.sap.core.odata.core.jar) needs to be included into the classpath
* of the using application.
* @return an implementation object
*/
private static RuntimeDelegateInstance getInstance() {
RuntimeDelegateInstance delegate;
try {
final Class<?> clazz = Class.forName(RuntimeDelegate.IMPLEMENTATION);
/*
* We explicitly do not use the singleton pattern to keep the server state free
* and avoid class loading issues also during hot deployment.
*/
final Object object = clazz.newInstance();
delegate = (RuntimeDelegateInstance) object;
} catch (final Exception e) {
throw new RuntimeDelegateException(e);
}
return delegate;
}
/**
* An implementation is available in the core library.
* @com.sap.core.odata.DoNotImplement
*/
public static abstract class RuntimeDelegateInstance {
protected abstract ODataResponseBuilder createODataResponseBuilder();
protected abstract EdmSimpleType getEdmSimpleType(EdmSimpleTypeKind edmSimpleTypeKind);
protected abstract UriParser getUriParser(Edm edm);
protected abstract EdmSimpleTypeFacade getSimpleTypeFacade();
protected abstract Edm createEdm(EdmProvider provider);
protected abstract EntityProviderInterface createEntityProvider();
protected abstract ODataService createODataSingleProcessorService(EdmProvider provider, ODataSingleProcessor processor);
protected abstract EdmProvider createEdmProvider(InputStream metadataXml, boolean validate) throws EntityProviderException;
protected abstract BatchResponsePartBuilder createBatchResponsePartBuilder();
protected abstract ODataRequestBuilder createODataRequestBuilder();
protected abstract BatchChangeSetBuilder createBatchChangeSetBuilder();
protected abstract BatchQueryPartBuilder createBatchQueryRequestBuilder();
protected abstract BatchChangeSetPartBuilder createBatchChangeSetRequest();
}
/**
* Returns a simple type object for given type kind.
* @param edmSimpleTypeKind type kind
* @return an implementation object
*/
public static EdmSimpleType getEdmSimpleType(final EdmSimpleTypeKind edmSimpleTypeKind) {
return RuntimeDelegate.getInstance().getEdmSimpleType(edmSimpleTypeKind);
}
/**
* Returns an implementation of the EDM simple-type facade.
* @return an implementation object
*/
public static EdmSimpleTypeFacade getSimpleTypeFacade() {
return RuntimeDelegate.getInstance().getSimpleTypeFacade();
}
/**
* Returns a builder for creating response objects with variable parameter sets.
* @return an implementation object
*/
public static ODataResponseBuilder createODataResponseBuilder() {
return RuntimeDelegate.getInstance().createODataResponseBuilder();
}
/**
* Creates and returns an entity data model.
* @param provider a provider implemented by the OData service
* @return an implementation object
*/
public static Edm createEdm(final EdmProvider provider) {
return RuntimeDelegate.getInstance().createEdm(provider);
}
/**
* Returns an parser which can parse OData uris based on metadata.
* @param edm metadata of the implemented service
* @return an implementation object
*/
public static UriParser getUriParser(final Edm edm) {
return RuntimeDelegate.getInstance().getUriParser(edm);
}
/**
* Creates and returns a http entity provider.
* @return an implementation object
*/
public static EntityProviderInterface createEntityProvider() {
return RuntimeDelegate.getInstance().createEntityProvider();
}
/**
* Creates and returns a single processor service.
* @param provider a provider implementation for the metadata of the OData service
* @param processor a single data processor implementation of the OData service
* @return a implementation object
*/
public static ODataService createODataSingleProcessorService(final EdmProvider provider, final ODataSingleProcessor processor) {
return RuntimeDelegate.getInstance().createODataSingleProcessorService(provider, processor);
}
/**
* Creates and returns an edm provider.
* @param metadataXml a metadata xml input stream (means the metadata document)
* @param validate true if semantic checks for metadata input stream shall be done
* @return an instance of EdmProvider
*/
public static EdmProvider createEdmProvider(final InputStream metadataXml, final boolean validate) throws EntityProviderException {
return RuntimeDelegate.getInstance().createEdmProvider(metadataXml, validate);
}
private static class RuntimeDelegateException extends RuntimeException {
private static final long serialVersionUID = 1L;
public RuntimeDelegateException(final Exception e) {
super(e);
}
}
public static BatchResponsePartBuilder createBatchResponsePartBuilder() {
return RuntimeDelegate.getInstance().createBatchResponsePartBuilder();
}
public static ODataRequestBuilder createODataRequestBuilder() {
return RuntimeDelegate.getInstance().createODataRequestBuilder();
}
public static BatchChangeSetBuilder createBatchChangeSetBuilder() {
return RuntimeDelegate.getInstance().createBatchChangeSetBuilder();
}
public static BatchQueryPartBuilder createBatchQueryPartBuilder() {
return RuntimeDelegate.getInstance().createBatchQueryRequestBuilder();
}
public static BatchChangeSetPartBuilder createBatchChangeSetPartBuilder() {
return RuntimeDelegate.getInstance().createBatchChangeSetRequest();
}
}