package org.odata4j.test.integration.producer.custom;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.odata4j.edm.EdmAssociation;
import org.odata4j.edm.EdmAssociationEnd;
import org.odata4j.edm.EdmAssociationSet;
import org.odata4j.edm.EdmAssociationSetEnd;
import org.odata4j.edm.EdmComplexType;
import org.odata4j.edm.EdmDataServices;
import org.odata4j.edm.EdmDecorator;
import org.odata4j.edm.EdmEntityContainer;
import org.odata4j.edm.EdmEntitySet;
import org.odata4j.edm.EdmEntityType;
import org.odata4j.edm.EdmFunctionImport;
import org.odata4j.edm.EdmFunctionParameter;
import org.odata4j.edm.EdmGenerator;
import org.odata4j.edm.EdmMultiplicity;
import org.odata4j.edm.EdmNavigationProperty;
import org.odata4j.edm.EdmProperty;
import org.odata4j.edm.EdmProperty.CollectionKind;
import org.odata4j.edm.EdmSchema;
import org.odata4j.edm.EdmSimpleType;
import org.odata4j.producer.edm.Edm;
public class CustomEdm implements EdmGenerator {
public static final String namespace = "myns";
private EdmDecorator decorator = null;
private EdmSchema.Builder schema = null;
private EdmEntityContainer.Builder container = null;
private List<EdmAssociation.Builder> associations = new LinkedList<EdmAssociation.Builder>();
private List<EdmComplexType.Builder> complexTypes = new LinkedList<EdmComplexType.Builder>();
private List<EdmEntityType.Builder> entityTypes = new LinkedList<EdmEntityType.Builder>();
private List<EdmEntitySet.Builder> entitySets = new LinkedList<EdmEntitySet.Builder>();
private List<EdmAssociationSet.Builder> associationSets = new LinkedList<EdmAssociationSet.Builder>();
private EdmComplexType.Builder complexType = null;
@Override
public EdmDataServices.Builder generateEdm(EdmDecorator decorator) {
createComplexTypes();
createEntityTypes();
container = EdmEntityContainer.newBuilder()
.setName("Container1")
.setIsDefault(true)
.setLazyLoadingEnabled(Boolean.TRUE)
.addEntitySets(entitySets)
.addAssociationSets(associationSets);
schema = EdmSchema.newBuilder()
.setNamespace(namespace)
.addEntityTypes(entityTypes)
.addComplexTypes(complexTypes)
.addAssociations(associations)
.addEntityContainers(container);
List<EdmFunctionParameter.Builder> params = new ArrayList<EdmFunctionParameter.Builder>(1);
params.add(EdmFunctionParameter.newBuilder()
.setName("p")
.setType(EdmSimpleType.STRING)
.setMode(EdmFunctionParameter.Mode.In));
EdmFunctionImport.Builder f = EdmFunctionImport.newBuilder()
.setName("f")
.setHttpMethod("GET")
.setReturnType(EdmSimpleType.BOOLEAN)
.addParameters(params);
container.addFunctionImports(f);
return EdmDataServices.newBuilder().addSchemas(schema);
}
private void createComplexTypes() {
// ----------------------------- ComplexType1 --------------------------
List<EdmProperty.Builder> props = new ArrayList<EdmProperty.Builder>();
EdmProperty.Builder ep = EdmProperty.newBuilder("Prop1").setType(EdmSimpleType.STRING);
props.add(ep);
ep = EdmProperty.newBuilder("Prop2").setType(EdmSimpleType.STRING);
props.add(ep);
complexType = EdmComplexType.newBuilder().setNamespace(namespace).setName("ComplexType1").addProperties(props);
complexTypes.add(complexType);
}
private void createEntityTypes() {
// --------------------------- Type1 ------------------------------
List<EdmProperty.Builder> props = new ArrayList<EdmProperty.Builder>();
List<EdmNavigationProperty.Builder> navprops = new ArrayList<EdmNavigationProperty.Builder>();
EdmProperty.Builder ep = null;
ep = EdmProperty.newBuilder("EmptyStrings").setType(EdmSimpleType.STRING).setCollectionKind(CollectionKind.List);
props.add(ep);
ep = EdmProperty.newBuilder("ListOStrings").setType(EdmSimpleType.STRING).setCollectionKind(CollectionKind.List);
props.add(ep);
ep = EdmProperty.newBuilder("BagOStrings").setType(EdmSimpleType.STRING).setCollectionKind(CollectionKind.Bag);
props.add(ep);
ep = EdmProperty.newBuilder("BagOInts").setType(EdmSimpleType.INT32).setCollectionKind(CollectionKind.Bag);
props.add(ep);
ep = EdmProperty.newBuilder("Complex1").setType(complexType);
props.add(ep);
ep = EdmProperty.newBuilder("ListOComplex").setType(complexType).setCollectionKind(CollectionKind.List);
props.add(ep);
ep = EdmProperty.newBuilder("Id").setType(EdmSimpleType.STRING).setNullable(false);
props.add(ep);
List<String> keys = new ArrayList<String>();
keys.add("Id");
EdmEntityType.Builder type1Type = EdmEntityType.newBuilder()
.setNamespace(namespace)
.setName("Type1")
.addKeys(keys)
.addProperties(props)
.addNavigationProperties(navprops);
if (decorator != null) {
type1Type.setDocumentation(decorator.getDocumentationForEntityType(Edm.namespace, Edm.EntityType.name()));
type1Type.setAnnotations(decorator.getAnnotationsForEntityType(namespace, "Type1"));
}
entityTypes.add(type1Type);
EdmEntitySet.Builder type1Set = EdmEntitySet.newBuilder().setName("Type1s").setEntityType(type1Type);
entitySets.add(type1Set);
// FileSystemItem
// - Directory
// nav Items: 0..* FileSystemItem
// nav NewestItem: 0..1 FileSystemItem
// - File
// --------------------------- FileSystemItem ------------------------------
props = new ArrayList<EdmProperty.Builder>();
navprops = new ArrayList<EdmNavigationProperty.Builder>();
ep = null;
ep = EdmProperty.newBuilder("Name").setType(EdmSimpleType.STRING);
props.add(ep);
ep = EdmProperty.newBuilder("Number").setType(EdmSimpleType.INT32);
props.add(ep);
keys = new ArrayList<String>();
keys.add("Name");
EdmEntityType.Builder fsiType = EdmEntityType.newBuilder()
.setNamespace(namespace)
.setName("FileSystemItem")
.addKeys(keys)
.addProperties(props)
.addNavigationProperties(navprops);
entityTypes.add(fsiType);
EdmEntitySet.Builder fsiSet = EdmEntitySet.newBuilder().setName("FileSystemItems").setEntityType(fsiType);
entitySets.add(fsiSet);
// --------------------------- Directory ------------------------------
props = new ArrayList<EdmProperty.Builder>();
navprops = new ArrayList<EdmNavigationProperty.Builder>();
ep = EdmProperty.newBuilder("DirProp1").setType(EdmSimpleType.STRING);
props.add(ep);
EdmEntityType.Builder dirType = EdmEntityType.newBuilder()
.setNamespace(namespace)
.setName("Directory")
.setBaseType(fsiType)
.addProperties(props);
entityTypes.add(dirType);
EdmEntitySet.Builder dirSet = EdmEntitySet.newBuilder().setName("Directories").setEntityType(dirType);
entitySets.add(dirSet);
EdmAssociation.Builder assoc = this.defineAssociation("Items", EdmMultiplicity.ONE, EdmMultiplicity.MANY, dirType, dirSet, fsiType, fsiSet);
navprops.add(EdmNavigationProperty.newBuilder(assoc.getName())
.setRelationship(assoc)
.setFromTo(assoc.getEnd1(), assoc.getEnd2()));
assoc = this.defineAssociation("NewestItem", EdmMultiplicity.ONE, EdmMultiplicity.ONE, dirType, dirSet, fsiType, fsiSet);
navprops.add(EdmNavigationProperty.newBuilder(assoc.getName())
.setRelationship(assoc)
.setFromTo(assoc.getEnd1(), assoc.getEnd2()));
dirType.addNavigationProperties(navprops);
// --------------------------- File ------------------------------
props = new ArrayList<EdmProperty.Builder>();
navprops = new ArrayList<EdmNavigationProperty.Builder>();
ep = EdmProperty.newBuilder("FileProp1").setType(EdmSimpleType.STRING);
props.add(ep);
EdmEntityType.Builder fileType = EdmEntityType.newBuilder()
.setNamespace(namespace)
.setName("File")
.setBaseType(fsiType)
.addProperties(props);
entityTypes.add(fileType);
EdmEntitySet.Builder fileSet = EdmEntitySet.newBuilder().setName("Files").setEntityType(fileType);
entitySets.add(fileSet);
// --------------------------- a Media Link Entry thing ------------------------------
props = new ArrayList<EdmProperty.Builder>();
navprops = new ArrayList<EdmNavigationProperty.Builder>();
ep = EdmProperty.newBuilder("Id").setType(EdmSimpleType.STRING);
props.add(ep);
ep = EdmProperty.newBuilder("MLEProp1").setType(EdmSimpleType.STRING);
props.add(ep);
EdmEntityType.Builder mleType = EdmEntityType.newBuilder()
.setNamespace(namespace)
.setName("MLE")
.addKeys("Id")
.setHasStream(Boolean.TRUE)
.addProperties(props);
entityTypes.add(mleType);
EdmEntitySet.Builder mleSet = EdmEntitySet.newBuilder().setName("MLEs").setEntityType(mleType);
entitySets.add(mleSet);
// --------------------------- Message Entity ------------------------------
props = new ArrayList<EdmProperty.Builder>();
navprops = new ArrayList<EdmNavigationProperty.Builder>();
ep = EdmProperty.newBuilder("Id").setType(EdmSimpleType.STRING);
props.add(ep);
ep = EdmProperty.newBuilder("messageLog").setType(EdmSimpleType.STRING);
props.add(ep);
EdmEntityType.Builder messageType = EdmEntityType.newBuilder()
.setNamespace(namespace)
.setName("Message")
.addKeys("Id")
.setHasStream(Boolean.TRUE)
.addProperties(props);
entityTypes.add(messageType);
EdmEntitySet.Builder messageTypes = EdmEntitySet.newBuilder().setName("Message").setEntityType(messageType);
entitySets.add(messageTypes);
}
private EdmAssociation.Builder defineAssociation(
String assocName,
EdmMultiplicity fromMult,
EdmMultiplicity toMult,
EdmEntityType.Builder fromEntityType,
EdmEntitySet.Builder fromEntitySet,
EdmEntityType.Builder toEntityType,
EdmEntitySet.Builder toEntitySet) {
// add EdmAssociation
EdmAssociationEnd.Builder fromAssociationEnd = EdmAssociationEnd.newBuilder().setRole(fromEntityType.getName()).setType(fromEntityType).setMultiplicity(fromMult);
String toAssociationRole = toEntityType.getName();
if (toAssociationRole.equals(fromEntityType.getName())) {
toAssociationRole = toAssociationRole + "1";
}
EdmAssociationEnd.Builder toAssociationEnd = EdmAssociationEnd.newBuilder().setRole(toAssociationRole).setType(toEntityType).setMultiplicity(toMult);
EdmAssociation.Builder association = EdmAssociation.newBuilder().setNamespace(namespace).setName(assocName).setEnds(fromAssociationEnd, toAssociationEnd);
// add EdmAssociationSet
EdmAssociationSet.Builder associationSet = EdmAssociationSet.newBuilder()
.setName(assocName)
.setAssociation(association).setEnds(
EdmAssociationSetEnd.newBuilder().setRole(fromAssociationEnd).setEntitySet(fromEntitySet),
EdmAssociationSetEnd.newBuilder().setRole(toAssociationEnd).setEntitySet(toEntitySet));
associationSets.add(associationSet);
associations.add(association);
return association;
}
}