/******************************************************************************* * 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.ep; import java.util.Collections; import java.util.HashMap; import java.util.Map; import com.sap.core.odata.api.ep.callback.OnReadInlineContent; /** * <p>The {@link EntityProviderReadProperties} contains all necessary settings * to read an entity with the {@link EntityProvider}.</p> * <p>The main settings are * <ul> * <li>the <code>mergeSemantic</code></li> * <li>the <code>callback for inlined navigation properties</code></li> * <li>and the <code>type mappings</code></li> * </ul> * </p> * @author SAP AG */ public class EntityProviderReadProperties { /** Callback which is necessary if entity contains inlined navigation properties. */ private OnReadInlineContent callback; /** * if merge is <code>true</code> the input content is in context of a <b>merge</b> (e.g. MERGE, PATCH) read request, * otherwise if <code>false</code> it is a <b>non-merge</b> (e.g. CREATE) read request */ private boolean merge; /** * typeMappings contains mappings from <code>edm property name</code> to <code>java class</code> which should be used * for a type mapping during reading of content. If according <code>edm property</code> can not be read * into given <code>java class</code> an {@link EntityProviderException} is thrown. * Supported mappings are documented in {@link com.sap.core.odata.api.edm.EdmSimpleType}. */ final private Map<String, Object> typeMappings; final private Map<String, String> validatedPrefix2NamespaceUri; private EntityProviderReadProperties() { typeMappings = new HashMap<String, Object>(); validatedPrefix2NamespaceUri = new HashMap<String, String>(); } public static EntityProviderReadPropertiesBuilder init() { return new EntityProviderReadPropertiesBuilder(); } public static EntityProviderReadPropertiesBuilder initFrom(final EntityProviderReadProperties properties) { return new EntityProviderReadPropertiesBuilder(properties); } public Map<String, String> getValidatedPrefixNamespaceUris() { return Collections.unmodifiableMap(validatedPrefix2NamespaceUri); } public Map<String, Object> getTypeMappings() { return Collections.unmodifiableMap(typeMappings); } public OnReadInlineContent getCallback() { return callback; } /** * <p>Gets the merge semantics.</p> * <p>Merge semantics is set if the input content has to be treated in the context * of a request to merge incoming data with existing data (e.g., indicated by the * HTTP verbs <code>MERGE</code> or <code>PATCH</code> in a server application). * Otherwise the request, even if not all data are supplied, is supposed to * overwrite the existing entity completely.</p> */ public boolean getMergeSemantic() { return merge; } /** * @author SAP AG */ public static class EntityProviderReadPropertiesBuilder { private final EntityProviderReadProperties properties = new EntityProviderReadProperties(); public EntityProviderReadPropertiesBuilder() {} public EntityProviderReadPropertiesBuilder(final EntityProviderReadProperties propertiesFrom) { properties.merge = propertiesFrom.merge; properties.callback = propertiesFrom.callback; addValidatedPrefixes(propertiesFrom.validatedPrefix2NamespaceUri); addTypeMappings(propertiesFrom.typeMappings); } /** * Sets the merge semantics. * @param mergeSemantic whether merge semantics is requested * @see EntityProviderReadProperties#getMergeSemantic() */ public EntityProviderReadPropertiesBuilder mergeSemantic(final boolean mergeSemantic) { properties.merge = mergeSemantic; return this; } public EntityProviderReadPropertiesBuilder callback(final OnReadInlineContent callback) { properties.callback = callback; return this; } public EntityProviderReadPropertiesBuilder addValidatedPrefixes(final Map<String, String> prefix2NamespaceUri) { if (prefix2NamespaceUri != null) { properties.validatedPrefix2NamespaceUri.putAll(prefix2NamespaceUri); } return this; } public EntityProviderReadPropertiesBuilder addTypeMappings(final Map<String, Object> typeMappings) { if (typeMappings != null) { properties.typeMappings.putAll(typeMappings); } return this; } public EntityProviderReadProperties build() { return properties; } } }