package http.engine;
import http.HTTP;
import http.resource.AttachedEntityListResouce;
import http.resource.AttachedEntityNewResouce;
import http.resource.EntityListResouce;
import http.resource.EntityNewResouce;
import http.resource.EntityResouce;
import http.resource.FlowListResouce;
import http.resource.FlowNewResouce;
import http.resource.FlowResouce;
import http.resource.TxEntityResource;
import http.resource.TypeEditableResouce;
import http.resource.TypeListResouce;
import java.io.Reader;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import nebula.data.DataRepos;
import nebula.data.DataStore;
import nebula.data.Entity;
import nebula.data.impl.TypeDatastore;
import nebula.data.json.DataHelper;
import nebula.data.json.JsonHelperProvider;
import nebula.lang.EditableTypeLoader;
import nebula.lang.Type;
import nebula.lang.TypeLoader;
import nebula.server.Resource;
import nebula.server.ResourceEngine;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class EntityResouceEngine implements ResourceEngine {
private static final int TYPENAME = 2;
private static final int ID = 3;
private static final int ATTACHTO_TYPENAME = 2;
private static final int ATTACHTO_ID = 3;
private static final int ATTACH_TYPENAME = 4;
private static final int ATTACH_ID = 5;
private Log log = LogFactory.getLog(this.getClass());
final DataRepos dataRepos;
final TypeLoader typeLoader;
final TypeDatastore typeBrokers;
Map<String, String> tmap = new HashMap<String, String>();
@Inject
public EntityResouceEngine(final DataRepos dataWareHouse, EditableTypeLoader typeLoader, TypeDatastore typeBrokers) {
this.dataRepos = dataWareHouse;
this.typeLoader = typeLoader;
this.typeBrokers = typeBrokers;
}
@Override
public Resource resolve(String path) {
if (log.isTraceEnabled()) {
log.trace("resolve path : " + path);
}
String[] paths = path.split(HTTP.Href_Seperator);
String typeName = null;
switch (paths.length) {
case 6:
if (HTTP.Method_NEW.equalsIgnoreCase(paths[ATTACH_ID])) {
return makeAttachedEntityNewResouce(paths[ATTACHTO_TYPENAME], paths[ATTACHTO_ID], paths[ATTACH_TYPENAME]);
}
case 5:
return makeAttachedEntityListResouce(paths[ATTACHTO_TYPENAME], paths[ATTACHTO_ID], paths[ATTACH_TYPENAME]);
case 4:
typeName = paths[TYPENAME];
if (HTTP.Method_NEW.equalsIgnoreCase(paths[ID])) {
return makeEntityNewResouce(typeName);
}
if (HTTP.Type_Type.equals(typeName)) {
return makeTypeResouce(typeName, paths[ID]);
} else {
return makeEntityResouce(typeName, paths[ID]);
}
case 3:
typeName = paths[TYPENAME];
if (HTTP.Type_Type.equals(typeName)) {
return makeTypeResouce(typeName);
} else {
return makeEntityListResouce(typeName);
}
default:
return null;
}
}
private Resource makeTypeResouce(String typeName) {
DataHelper<Type, Reader, Writer> json = JsonHelperProvider.getSimpleSerialize(Type.class);
return new TypeListResouce(typeLoader, json);
}
private Resource makeTypeResouce(String typeName, String id) {
return new TypeEditableResouce(dataRepos, typeLoader, id);
}
private Resource makeEntityListResouce(String typeName) {
Type typeBroker = typeBrokers.getBroker(typeName);
DataStore<Entity> storeHolder = dataRepos.define(Long.class, Entity.class, typeName);
DataHelper<Entity, Reader, Writer> jsonHolder = JsonHelperProvider.getSimpleHelper(typeBroker);
switch (typeBroker.getStandalone()) {
case Transaction:
case Relation:
return new EntityListResouce(typeBroker, jsonHolder, storeHolder);
case Flow:
return new FlowListResouce(dataRepos, jsonHolder, storeHolder, typeBroker);
case Master:
default:
return new EntityListResouce(typeBroker, jsonHolder, storeHolder);
}
}
private Resource makeEntityNewResouce(String typeName) {
Type typeBroker = typeBrokers.getBroker(typeName);
DataStore<Entity> storeHolder = dataRepos.define(Long.class, Entity.class, typeName);
DataHelper<Entity, Reader, Writer> jsonHolder = JsonHelperProvider.getHelper(typeBroker);
switch (typeBroker.getStandalone()) {
case Transaction:
case Relation:
return new EntityNewResouce(null, dataRepos, jsonHolder, typeBroker, storeHolder);
case Flow:
return new FlowNewResouce(dataRepos, storeHolder, typeBroker);
case Master:
default:
return new EntityNewResouce(null, dataRepos, jsonHolder, typeBroker, storeHolder);
}
}
private Resource makeAttachedEntityNewResouce(String attachToTypeName, String attachToID, String typeName) {
Type typeBroker = typeBrokers.getBroker(typeName);
DataStore<Entity> storeHolder = dataRepos.define(Long.class, Entity.class, typeName);
DataHelper<Entity, Reader, Writer> jsonHolder = JsonHelperProvider.getHelper(typeBroker);
// if (typeBroker.get().getStandalone() == TypeStandalone.Transaction) {
// // return new TxEntityResource(jsonHolder, storeHolder, id);
// } else {
return new AttachedEntityNewResouce(null, dataRepos, jsonHolder, typeBroker, storeHolder, attachToTypeName, attachToID);
// }
}
private Resource makeEntityResouce(String typeName, String id) {
Type typeBroker = typeBrokers.getBroker(typeName);
DataStore<Entity> storeHolder = dataRepos.define(Long.class, Entity.class, typeName);
DataHelper<Entity, Reader, Writer> jsonHolder = JsonHelperProvider.getHelper(typeBroker);
switch (typeBroker.getStandalone()) {
case Transaction:
case Relation:
return new TxEntityResource(dataRepos, jsonHolder, storeHolder, id);
case Flow:
return new FlowResouce(dataRepos, storeHolder, typeBroker, id);
case Master:
default:
return new EntityResouce(dataRepos, jsonHolder, storeHolder, typeBroker, id);
}
}
private Resource makeAttachedEntityListResouce(String attachToTypeName, String attachToID, String typeName) {
Type typeBroker = typeBrokers.getBroker(typeName);
DataStore<Entity> storeHolder = dataRepos.define(Long.class, Entity.class, typeName);
DataHelper<Entity, Reader, Writer> jsonHolder = JsonHelperProvider.getSimpleHelper(typeBroker);
return new AttachedEntityListResouce(jsonHolder, storeHolder, attachToTypeName, attachToID);
}
}