package org.odata4j.core;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.odata4j.edm.EdmEntitySet;
import org.odata4j.edm.EdmEntityType;
import org.odata4j.edm.EdmFunctionImport;
import org.odata4j.edm.EdmFunctionImport.FunctionKind;
import org.odata4j.edm.EdmType;
import org.odata4j.exceptions.NotImplementedException;
/**
* This is a helper class to build OBindableEntity instances.
*
*/
public class OBindableEntities {
public static OBindableEntity createBindableExtension(Map<String, EdmFunctionImport> actions, Map<String, EdmFunctionImport> functions) {
return new OBindableEntityImpl(functions, actions);
}
public static OEntity createBindableEntity(final OEntity entity, Map<String, EdmFunctionImport> bindableFunctions){
final Map<String, EdmFunctionImport> functions = new HashMap<String, EdmFunctionImport>();
final Map<String, EdmFunctionImport> actions = new HashMap<String, EdmFunctionImport>();
for (Map.Entry<String, EdmFunctionImport> entry: bindableFunctions.entrySet()){
String fqFunctionName = entry.getKey();
EdmFunctionImport f = entry.getValue();
if (f.getFunctionKind() == FunctionKind.Action){
actions.put(fqFunctionName, f);
} else if (f.getFunctionKind() == FunctionKind.Function){
functions.put(fqFunctionName, f);
}
}
return new OExtensibleEntity(entity,
new OBindableEntityImpl(Collections.unmodifiableMap(functions), Collections.unmodifiableMap(actions)));
}
private static class OBindableEntityImpl implements OBindableEntity {
private final Map<String, EdmFunctionImport> functions;
private final Map<String, EdmFunctionImport> actions;
public OBindableEntityImpl(Map<String, EdmFunctionImport> functions, Map<String, EdmFunctionImport> actions) {
this.functions = functions;
this.actions = actions;
}
@Override
public Map<String, EdmFunctionImport> getBindableActions() {
return actions;
}
@Override
public Map<String, EdmFunctionImport> getBindableFunctions() {
return functions;
}
}
/**
* Class used to add extensions over an existing OEntity.
*
*/
private static class OExtensibleEntity implements OEntity{
private final OEntity delegate;
private final Collection<Object> extensions;
private String mediaStreamContentType;
private InputStream mediaInputStream;
public OExtensibleEntity(OEntity delegate, Object... extensions) {
super();
this.delegate = delegate;
this.extensions = Arrays.asList(extensions);
}
@Override
public String getEntitySetName() {
return delegate.getEntitySetName();
}
@Override
public OEntityKey getEntityKey() {
return delegate.getEntityKey();
}
@Override
public List<OProperty<?>> getProperties() {
return delegate.getProperties();
}
@Override
public OProperty<?> getProperty(String propName) {
return delegate.getProperty(propName);
}
@Override
public <T> OProperty<T> getProperty(String propName, Class<T> propClass) {
return delegate.getProperty(propName, propClass);
}
@Override
public <TExtension extends OExtension<OEntity>> TExtension findExtension(Class<TExtension> clazz) {
for (Object extension : extensions) {
if (clazz.isInstance(extension)) {
return clazz.cast(extension);
}
}
return delegate.findExtension(clazz);
}
@Override
public EdmType getType() {
return delegate.getType();
}
@Override
public EdmEntitySet getEntitySet() {
return delegate.getEntitySet();
}
@Override
public EdmEntityType getEntityType() {
return delegate.getEntityType();
}
@Override
public String getEntityTag() {
return delegate.getEntityTag();
}
@Override
public List<OLink> getLinks() {
return delegate.getLinks();
}
@Override
public <T extends OLink> T getLink(String title, Class<T> linkClass) {
return delegate.getLink(title, linkClass);
}
/*************************************************************
* the following are LGC added method, we should remove it.
*************************************************************/
@Override
public String getMediaTypeForStream() {
return this.mediaStreamContentType;
}
@Override
public InputStream getMediaLinkStream() {
return this.mediaInputStream;
}
@Override
public void setMediaLinkStream(InputStream inStream) {
this.mediaInputStream = inStream;
}
@Override
public void setMediaTypeForStream(String mediaTypeForStream) {
this.mediaStreamContentType = mediaTypeForStream;
}
}
}