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.DELETE;
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.core.MediaType;
import javax.ws.rs.core.Response;
import eu.salusproject.securityprivacy.authentication.User;
import tr.com.srdc.mdr.core.MDRConstants;
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.DataElement;
import tr.com.srdc.mdr.core.api.ai.EnumeratedConceptualDomain;
import tr.com.srdc.mdr.core.api.composite.Contact;
import tr.com.srdc.mdr.core.api.composite.Datatype;
import tr.com.srdc.mdr.core.api.composite.Organization;
import tr.com.srdc.mdr.core.impl.Repository;
import tr.com.srdc.mdr.core.impl.RepositoryManager;
import tr.com.srdc.mdr.core.store.query.ResourceQueryFactory.TextSearchType;
import tr.com.srdc.mdr.web.html.models.ConceptualDomainModel;
import tr.com.srdc.mdr.web.html.models.ContextModel;
import tr.com.srdc.mdr.web.html.models.DataElementModel;
import tr.com.srdc.mdr.web.html.models.DataTypeModel;
import tr.com.srdc.mdr.web.html.util.WebUtil;
@Path("/repository")
public class RepositoryService {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response listContexts(
@CookieParam(AuthenticationService.SID) String sessionID) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
List<Context> contexts = repository.getContexts();
List<ContextModel> contextList = new ArrayList<ContextModel>();
for (Context context : contexts) {
contextList.add(new ContextModel(context));
}
return Response.ok(contextList).build();
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createContext(
@CookieParam(AuthenticationService.SID) String sessionID,
ContextModel contextModel) {
User user = WebUtil.getUser(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
Contact contact = repository.getContact(user.getFullName());
Organization organization = repository.getOrganization(user
.getAffiliation().getName());
Context context = repository.createContext(contextModel.getName(),
contextModel.getDefinition(), contact, organization);
return Response.ok(new ContextModel(context)).build();
}
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public Response updateContext(
@CookieParam(AuthenticationService.SID) String sessionID,
ContextModel contextModel) {
Repository repository = RepositoryManager.getInstance().getRepository();
Context context = repository.getContext(contextModel.getId());
context.setName(contextModel.getName());
context.setDefinition(contextModel.getDefinition());
context.setDescription(contextModel.getDefinition());
return Response.ok().build();
}
@DELETE
@Path("/{contextid}")
public Response deleteContext(
@CookieParam(AuthenticationService.SID) String sessionID,
@PathParam("contextid") String contextID) {
Repository repository = RepositoryManager.getInstance().getRepository();
Context context = repository.getContext(contextID);
context.delete();
return Response.ok().build();
}
@Path("/search")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response searchDataElements(
@CookieParam(AuthenticationService.SID) String sessionID,
@QueryParam("q") String keyword,
@QueryParam("limit") @DefaultValue("10") Integer limit,
@QueryParam("offset") @DefaultValue("0") Integer offset) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
List<DataElement> deList = repository.searchDataElement(keyword,
TextSearchType.WildCard, limit, offset);
List<DataElementModel> deModelList = new ArrayList<DataElementModel>();
for (DataElement de : deList) {
deModelList.add(new DataElementModel(de));
}
return Response.ok(deModelList).build();
}
@Path("/search")
@GET
@Produces(MediaType.TEXT_PLAIN)
public Response getNumberOfDataElementSearch(
@CookieParam(AuthenticationService.SID) String sessionID,
@QueryParam("q") String keyword) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
int size = repository.getNumberOfDataElementSearch(keyword,
TextSearchType.WildCard);
return Response.ok(String.valueOf(size)).build();
}
@GET
@Path("/cd")
@Produces(MediaType.APPLICATION_JSON)
public Response listConceptualDomains(
@CookieParam(AuthenticationService.SID) String sessionID,
@QueryParam("limit") @DefaultValue("10") Integer limit,
@QueryParam("offset") @DefaultValue("0") Integer offset) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
List<ConceptualDomain> cdList = repository.getConceptualDomains(limit,
offset);
List<ConceptualDomainModel> cdModelList = new ArrayList<ConceptualDomainModel>();
for (ConceptualDomain cd : cdList) {
if (cd instanceof EnumeratedConceptualDomain) {
cdModelList.add(new ConceptualDomainModel(cd, true));
} else {
cdModelList.add(new ConceptualDomainModel(cd, false));
}
}
return Response.ok(cdModelList).build();
}
@GET
@Path("/cd")
@Produces(MediaType.TEXT_PLAIN)
public Response getNumberOfConceptualDomains(
@CookieParam(AuthenticationService.SID) String sessionID) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
int size = repository.getNumberOfConceptualDomains();
return Response.ok(String.valueOf(size)).build();
}
@POST
@Path("/cd")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response createConceptualDomain(
@CookieParam(AuthenticationService.SID) String sessionID,
ConceptualDomainModel conceptualDomainModel) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
// TODO: get the oid of the conceptual domain if it is enumerated
ConceptualDomain cd = null;
if (conceptualDomainModel.isEnumerated()) {
cd = repository.createEnumeratedConceptualDomain(
conceptualDomainModel.getName(), null,
conceptualDomainModel.getDefinition(),
conceptualDomainModel.getDimensionality());
return Response.ok(new ConceptualDomainModel(cd, true)).build();
} else {
cd = repository.createNonEnumeratedConceptualDomain(
conceptualDomainModel.getName(),
conceptualDomainModel.getDefinition(),
conceptualDomainModel.getDimensionality());
return Response.ok(new ConceptualDomainModel(cd, false)).build();
}
}
@PUT
@Path("/cd")
@Consumes(MediaType.APPLICATION_JSON)
public Response updateConceptualDomain(
@CookieParam(AuthenticationService.SID) String sessionID,
ConceptualDomainModel cdModel) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
ConceptualDomain conceptualDomain = repository
.getConceptualDomain(cdModel.getId());
// Currently, only name, definition and dimensionality can be updated
conceptualDomain.setName(cdModel.getName());
conceptualDomain.setDefinition(cdModel.getDefinition());
conceptualDomain.setDimensionality(cdModel.getDimensionality());
return Response.ok().build();
}
@GET
@Path("/cd/search")
@Produces(MediaType.APPLICATION_JSON)
public Response searchConceptualDomain(
@CookieParam(AuthenticationService.SID) String sessionID,
@QueryParam("q") String keyword) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
List<ConceptualDomain> cdList = repository.searchConceptualDomain(
keyword, TextSearchType.WildCard);
List<ConceptualDomainModel> cdModelList = new ArrayList<ConceptualDomainModel>();
for (ConceptualDomain cd : cdList) {
if (cd instanceof EnumeratedConceptualDomain) {
cdModelList.add(new ConceptualDomainModel(cd, true));
} else {
cdModelList.add(new ConceptualDomainModel(cd, false));
}
}
return Response.ok(cdModelList).build();
}
@GET
@Path("/dt")
@Produces(MediaType.APPLICATION_JSON)
public Response listDataTypes(
@CookieParam(AuthenticationService.SID) String sessionID) {
WebUtil.checkUserSession(sessionID);
Repository repository = RepositoryManager.getInstance().getRepository();
List<Datatype> dtList = repository.getDataTypes();
List<DataTypeModel> dtModelList = new ArrayList<DataTypeModel>();
for (Datatype de : dtList) {
dtModelList.add(new DataTypeModel(de));
}
return Response.ok(dtModelList).build();
}
@GET
@Path("/mapping/relations")
@Produces(MediaType.APPLICATION_JSON)
public Response getMappingRelations(
@CookieParam(AuthenticationService.SID) String sessionID) {
WebUtil.checkUserSession(sessionID);
List<String> mappingRelations = MDRConstants.getMappingRelations();
return Response.ok(mappingRelations).build();
}
}