All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.odata4j.consumer.AbstractODataConsumer Maven / Gradle / Ivy

The newest version!
package org.odata4j.consumer;

import java.util.HashMap;
import java.util.Map;

import org.core4j.Enumerable;
import org.odata4j.core.EntitySetInfo;
import org.odata4j.core.OCountRequest;
import org.odata4j.core.OCreateRequest;
import org.odata4j.core.OEntity;
import org.odata4j.core.OEntityDeleteRequest;
import org.odata4j.core.OEntityGetRequest;
import org.odata4j.core.OEntityId;
import org.odata4j.core.OEntityKey;
import org.odata4j.core.OEntityRequest;
import org.odata4j.core.OFunctionRequest;
import org.odata4j.core.OModifyRequest;
import org.odata4j.core.OObject;
import org.odata4j.core.OQueryRequest;
import org.odata4j.core.ORelatedEntitiesLink;
import org.odata4j.core.ORelatedEntityLink;
import org.odata4j.edm.EdmDataServices;
import org.odata4j.edm.EdmEntitySet;
import org.odata4j.edm.EdmEntityType;
import org.odata4j.edm.EdmProperty;
import org.odata4j.exceptions.ODataProducerException;
import org.odata4j.internal.EdmDataServicesDecorator;
import org.odata4j.internal.FeedCustomizationMapping;

/**
 * Useful base class for {@link ODataConsumer} implementations with common functionality.
 */
public abstract class AbstractODataConsumer implements ODataConsumer {

  private static final FeedCustomizationMapping EMPTY_MAPPING = new FeedCustomizationMapping();

  private String serviceRootUri;
  private EdmDataServices cachedMetadata;
  private final Map cachedMappings = new HashMap();

  protected AbstractODataConsumer(String serviceRootUri) {
    if (!serviceRootUri.endsWith("/"))
      serviceRootUri = serviceRootUri + "/";

    this.serviceRootUri = serviceRootUri;
  }

  public String getServiceRootUri() {
    return serviceRootUri;
  }

  public Enumerable getEntitySets() throws ODataProducerException {
    ODataClientRequest request = ODataClientRequest.get(getServiceRootUri());
    return Enumerable.create(getClient().getCollections(request)).cast(EntitySetInfo.class);
  }

  public EdmDataServices getMetadata() {
    if (cachedMetadata == null)
      cachedMetadata = new CachedEdmDataServices();
    return cachedMetadata;
  }

  public OQueryRequest getEntities(ORelatedEntitiesLink link) {
    ParsedHref parsed = ParsedHref.parse(link.getHref());
    return getEntities(parsed.entitySetName).nav(parsed.entityKey, parsed.navProperty);
  }

  public OQueryRequest getEntities(String entitySetHref) {
    return getEntities(OEntity.class, entitySetHref);
  }

  public  OQueryRequest getEntities(Class entityType, String entitySetHref) {
    FeedCustomizationMapping mapping = getFeedCustomizationMapping(entitySetHref);
    return new ConsumerQueryEntitiesRequest(getClient(), entityType, getServiceRootUri(), getMetadata(), entitySetHref, mapping);
  }

  public OEntityGetRequest getEntity(ORelatedEntityLink link) {
    ParsedHref parsed = ParsedHref.parse(link.getHref());
    return (OEntityGetRequest) getEntity(parsed.entitySetName, parsed.entityKey).nav(parsed.navProperty);
  }

  public OEntityGetRequest getEntity(String entitySetName, Object keyValue) {
    return getEntity(entitySetName, OEntityKey.create(keyValue));
  }

  public OEntityGetRequest getEntity(OEntity entity) {
    return getEntity(entity.getEntitySet().getName(), entity.getEntityKey());
  }

  public OEntityGetRequest getEntity(String entitySetName, OEntityKey key) {
    return getEntity(OEntity.class, entitySetName, key);
  }

  public  OEntityGetRequest getEntity(Class entityType, String entitySetName, Object keyValue) {
    return getEntity(entityType, entitySetName, OEntityKey.create(keyValue));
  }

  public  OEntityGetRequest getEntity(Class entityType, String entitySetName, OEntityKey key) {
    FeedCustomizationMapping mapping = getFeedCustomizationMapping(entitySetName);
    return new ConsumerGetEntityRequest(getClient(), entityType, getServiceRootUri(), getMetadata(), entitySetName, OEntityKey.create(key), mapping);
  }

  public OQueryRequest getLinks(OEntityId sourceEntity, String targetNavProp) {
    return new ConsumerQueryLinksRequest(getClient(), getServiceRootUri(), getMetadata(), sourceEntity, targetNavProp);
  }

  public OEntityRequest createLink(OEntityId sourceEntity, String targetNavProp, OEntityId targetEntity) {
    return new ConsumerCreateLinkRequest(getClient(), getServiceRootUri(), getMetadata(), sourceEntity, targetNavProp, targetEntity);
  }

  public OEntityRequest deleteLink(OEntityId sourceEntity, String targetNavProp, Object... targetKeyValues) {
    return new ConsumerDeleteLinkRequest(getClient(), getServiceRootUri(), getMetadata(), sourceEntity, targetNavProp, targetKeyValues);
  }

  public OEntityRequest updateLink(OEntityId sourceEntity, OEntityId newTargetEntity, String targetNavProp, Object... oldTargetKeyValues) {
    return new ConsumerUpdateLinkRequest(getClient(), getServiceRootUri(), getMetadata(), sourceEntity, newTargetEntity, targetNavProp, oldTargetKeyValues);
  }

  public OCreateRequest createEntity(String entitySetName) {
    FeedCustomizationMapping mapping = getFeedCustomizationMapping(entitySetName);
    return new ConsumerCreateEntityRequest(getClient(), getServiceRootUri(), getMetadata(), entitySetName, mapping);
  }

  public OModifyRequest updateEntity(OEntity entity) {
    return new ConsumerEntityModificationRequest(entity, getClient(), getServiceRootUri(), getMetadata(),
        entity.getEntitySet().getName(), entity.getEntityKey(), entity.getEntityTag());
  }

  public OModifyRequest mergeEntity(OEntity entity) {
    return mergeEntity(entity.getEntitySet().getName(), entity.getEntityKey(), entity.getEntityTag());
  }

  public OModifyRequest mergeEntity(String entitySetName, Object keyValue) {
    return mergeEntity(entitySetName, OEntityKey.create(keyValue));
  }

  public OModifyRequest mergeEntity(String entitySetName, OEntityKey key) {
    return mergeEntity(entitySetName, key, null);
  }

  public OModifyRequest mergeEntity(String entitySetName, OEntityKey key, String entityTag) {
    return new ConsumerEntityModificationRequest(null, getClient(), getServiceRootUri(), getMetadata(), entitySetName, key, entityTag);
  }

  public OEntityDeleteRequest deleteEntity(OEntity entity) {
    return new ConsumerDeleteEntityRequest(getClient(), getServiceRootUri(), getMetadata(),
        entity.getEntitySetName(), entity.getEntityKey(), entity.getEntityTag());
  }

  public OEntityDeleteRequest deleteEntity(String entitySetName, Object keyValue) {
    return deleteEntity(entitySetName, OEntityKey.create(keyValue));
  }

  public OEntityDeleteRequest deleteEntity(String entitySetName, OEntityKey key) {
    return new ConsumerDeleteEntityRequest(getClient(), getServiceRootUri(), getMetadata(), entitySetName, key, null);
  }

  public OFunctionRequest callFunction(String functionName) {
    return new ConsumerFunctionCallRequest(getClient(), getServiceRootUri(), getMetadata(), functionName);
  }

  public OCountRequest getEntitiesCount(String entitySetName) {
    return new ConsumerCountRequest(getClient(), getServiceRootUri()).entitySetName(entitySetName);
  }

  protected abstract ODataClient getClient();

  private static class ParsedHref {
    public String entitySetName;
    public OEntityKey entityKey;
    public String navProperty;

    private ParsedHref() {}

    public static ParsedHref parse(String href) {
      // href: entityset(keyvalue[,keyvalue])/navprop[/navprop]
      // keyvalue:  for one key value -or-  for multiple key values

      int slashIndex = href.indexOf('/');
      String head = href.substring(0, slashIndex);
      String navProperty = href.substring(slashIndex + 1);

      int pIndex = head.indexOf('(');
      String entitySetName = head.substring(0, pIndex);

      String keyString = head.substring(pIndex + 1, head.length() - 1); // keyvalue[,keyvalue]

      ParsedHref rt = new ParsedHref();
      rt.entitySetName = entitySetName;
      rt.entityKey = OEntityKey.parse(keyString);
      rt.navProperty = navProperty;
      return rt;
    }
  }

  private class CachedEdmDataServices extends EdmDataServicesDecorator {

    private EdmDataServices delegate;

    private CachedEdmDataServices() {}

    @Override
    protected EdmDataServices getDelegate() {
      if (delegate == null)
        refreshDelegate();
      return delegate;
    }

    private void refreshDelegate() {
      ODataClientRequest request = ODataClientRequest.get(AbstractODataConsumer.this.getServiceRootUri() + "$metadata");
      try {
        delegate = AbstractODataConsumer.this.getClient().getMetadata(request);
      } catch (ODataProducerException e) {
        // to support services that do not expose metadata information
        delegate = EdmDataServices.EMPTY;
      }
    }

    @Override
    public EdmEntitySet findEdmEntitySet(String entitySetName) {
      EdmEntitySet rt = super.findEdmEntitySet(entitySetName);
      if (rt == null && delegate != EdmDataServices.EMPTY) {
        refreshDelegate();
        rt = super.findEdmEntitySet(entitySetName);
      }
      return rt;
    }
  }

  private FeedCustomizationMapping getFeedCustomizationMapping(String entitySetName) {
    if (!cachedMappings.containsKey(entitySetName)) {
      FeedCustomizationMapping rt = new FeedCustomizationMapping();
      EdmDataServices metadata = getMetadata();
      if (metadata != null) {
        EdmEntitySet ees = metadata.findEdmEntitySet(entitySetName);
        if (ees == null) {
          rt = EMPTY_MAPPING;
        } else {
          EdmEntityType eet = ees.getType();
          for (EdmProperty ep : eet.getProperties()) {
            if ("SyndicationTitle".equals(ep.getFcTargetPath()) && "false".equals(ep.getFcKeepInContent()))
              rt.titlePropName = ep.getName();
            if ("SyndicationSummary".equals(ep.getFcTargetPath()) && "false".equals(ep.getFcKeepInContent()))
              rt.summaryPropName = ep.getName();
          }
        }
      }
      cachedMappings.put(entitySetName, rt);
    }
    FeedCustomizationMapping mapping = cachedMappings.get(entitySetName);
    return mapping == null || mapping == EMPTY_MAPPING ? null : mapping;
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy