package tr.com.srdc.mdr.web.html.api;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.CookieParam;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import tr.com.srdc.mdr.core.api.ai.ConceptualDomain;
import tr.com.srdc.mdr.core.api.ai.Context;
import tr.com.srdc.mdr.core.api.ai.DataElementConcept;
import tr.com.srdc.mdr.core.api.ai.ObjectClass;
import tr.com.srdc.mdr.core.api.ai.Property;
import tr.com.srdc.mdr.core.impl.Repository;
import tr.com.srdc.mdr.core.impl.RepositoryManager;
import tr.com.srdc.mdr.core.model.Util;
import tr.com.srdc.mdr.web.html.models.DataElementConceptModel;
import tr.com.srdc.mdr.web.html.models.ObjectClassModel;
import tr.com.srdc.mdr.web.html.util.WebUtil;
@Path("/oc/{ocid}")
public class ObjectClassService {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getObjectClass(
@CookieParam(AuthenticationService.SID) String sessionID,
@PathParam("ocid") String ocID) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
ObjectClass objectClass = repository.getObjectClass(ocID);
return Response.ok(new ObjectClassModel(objectClass)).build();
}
@GET
@Path("/parent")
@Produces(MediaType.APPLICATION_JSON)
public Response getParentConcept(
@CookieParam(AuthenticationService.SID) String sessionID,
@PathParam("ocid") String ocID) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
ObjectClass objectClass = repository.getObjectClass(ocID);
ObjectClass parent = objectClass.getParentConcept();
if (parent == null) {
return Response.noContent().build();
}
return Response.ok(new ObjectClassModel(parent)).build();
}
@GET
@Path("/subconcept")
@Produces(MediaType.APPLICATION_JSON)
public Response getSubConcepts(
@CookieParam(AuthenticationService.SID) String sessionID,
@PathParam("ocid") String ocID) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
if (Util.isNull(ocID)) {
throw new WebApplicationException(Status.BAD_REQUEST);
}
ObjectClass objectClass = repository.getObjectClass(ocID);
List<ObjectClassModel> ocModelList = new ArrayList<ObjectClassModel>();
List<ObjectClass> subConceptList = objectClass.getSubConcepts();
for (ObjectClass oc : subConceptList) {
ocModelList.add(new ObjectClassModel(oc));
}
return Response.ok(ocModelList).build();
}
@GET
@Path("/dec")
@Produces(MediaType.APPLICATION_JSON)
public Response listDataElementConcepts(
@CookieParam(AuthenticationService.SID) String sessionID,
@PathParam("ocid") String objectClassID,
@QueryParam("limit") @DefaultValue("10") Integer limit,
@QueryParam("offset") @DefaultValue("0") Integer offset) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
ObjectClass objectClass = repository.getObjectClass(objectClassID);
List<DataElementConcept> decList = objectClass.getDataElementConcepts(
limit, offset);
List<DataElementConceptModel> decModelList = new ArrayList<DataElementConceptModel>();
for (DataElementConcept dec : decList) {
decModelList.add(new DataElementConceptModel(dec.asMDRResource()));
}
return Response.ok(decModelList).build();
}
@GET
@Path("/dec")
@Produces(MediaType.TEXT_PLAIN)
public Response getNumberOfDataElementConcepts(
@CookieParam(AuthenticationService.SID) String sessionID,
@PathParam("ocid") String objectClassID) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
ObjectClass objectClass = repository.getObjectClass(objectClassID);
int size = objectClass.getNumberOfDataElementConcepts();
return Response.ok(String.valueOf(size)).build();
}
@POST
@Path("/dec")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createDataElementConcept(
@CookieParam(AuthenticationService.SID) String sessionID,
@PathParam("ocid") String objectClassID,
DataElementConceptModel decModel) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
Context context = repository.getContext(decModel.getContextID());
ObjectClass oc = context.getObjectClass(objectClassID);
ConceptualDomain cd = repository.getConceptualDomain(decModel
.getConceptualDomainID());
DataElementConcept dec = null;
// if propertyID is not defined, than it means new property will be
// created
if (!Util.isNull(decModel.getPropertyID())) {
Property property = context.getProperty(decModel.getPropertyID());
dec = oc.createDataElementConcept(property, cd,
decModel.getDefinition());
} else {
dec = oc.createDataElementConcept(decModel.getPropertyName(),
decModel.getPropertyDefinition(), cd,
decModel.getDefinition());
}
return Response.ok(new DataElementConceptModel(dec.asMDRResource()))
.build();
}
@PUT
@Path("/dec")
@Consumes(MediaType.APPLICATION_JSON)
public Response updateDataElementConcept(
@CookieParam(AuthenticationService.SID) String sessionID,
@PathParam("ocid") String objectClassID,
DataElementConceptModel decModel) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
Context context = repository.getContext(decModel.getContextID());
ObjectClass oc = context.getObjectClass(objectClassID);
DataElementConcept dec = oc.getDataElementConcept(decModel.getId());
dec.setPropertyQualifier(decModel.getPropertyQualifier());
dec.setObjectClassQualifier(dec.getObjectClassQualifier());
dec.setDefinition(decModel.getDefinition());
dec.setName(decModel.getName());
// means property of object class is not changed
if (dec.getProperty().getUniqueID().equals(decModel.getPropertyID())) {
dec.getProperty().setName(decModel.getPropertyName());
dec.getProperty().setDefinition(decModel.getPropertyDefinition());
} else { // means new property is assigned for object class
if (!Util.isNull(decModel.getPropertyID())) {
// already existing property is assigned
Property property = context.getProperty(decModel
.getPropertyID());
dec.setProperty(property);
} else { // new property will be created and will be assigned
dec.setProperty(decModel.getPropertyName(),
decModel.getPropertyDefinition());
}
}
return Response.ok().build();
}
}