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 org.slf4j.Logger; import org.slf4j.LoggerFactory; import tr.com.srdc.mdr.core.api.ai.ConceptualDomain; import tr.com.srdc.mdr.core.api.ai.EnumeratedConceptualDomain; import tr.com.srdc.mdr.core.api.ai.EnumeratedValueDomain; import tr.com.srdc.mdr.core.api.ai.NonEnumeratedConceptualDomain; import tr.com.srdc.mdr.core.api.ai.ValueDomain; import tr.com.srdc.mdr.core.api.composite.Datatype; import tr.com.srdc.mdr.core.api.composite.PermissibleValue; import tr.com.srdc.mdr.core.api.composite.ValueMeaning; import tr.com.srdc.mdr.core.impl.Repository; import tr.com.srdc.mdr.core.impl.RepositoryManager; import tr.com.srdc.mdr.core.model.iso11179.composite.DatatypeResource; import tr.com.srdc.mdr.web.html.models.ConceptualDomainModel; import tr.com.srdc.mdr.web.html.models.PermissibleValueModel; import tr.com.srdc.mdr.web.html.models.ValueDomainModel; import tr.com.srdc.mdr.web.html.models.ValueMeaningModel; import tr.com.srdc.mdr.web.html.util.WebUtil; @Path("/cd/{cid}") public class ConceptualDomainService { private static final Logger logger = LoggerFactory .getLogger(ConceptualDomainService.class); @GET @Produces(MediaType.APPLICATION_JSON) public Response getConceptualDomain( @CookieParam(AuthenticationService.SID) String sessionID, @PathParam("cid") String cid) { WebUtil.checkUserSession(sessionID); Repository repository = RepositoryManager.getInstance().getRepository(); ConceptualDomain cd = repository.getConceptualDomain(cid); if (cd instanceof EnumeratedConceptualDomain) { return Response.ok(new ConceptualDomainModel(cd, true)).build(); } else { return Response.ok(new ConceptualDomainModel(cd, false)).build(); } } @GET @Path("/vm") @Produces(MediaType.APPLICATION_JSON) public Response listValueMeanings( @CookieParam(AuthenticationService.SID) String sessionID, @PathParam("cid") String conceptualDomainID, @QueryParam("limit") @DefaultValue("10") Integer limit, @QueryParam("offset") @DefaultValue("0") Integer offset) { WebUtil.checkUserSession(sessionID); Repository repository = RepositoryManager.getInstance().getRepository(); ConceptualDomain cd = repository .getConceptualDomain(conceptualDomainID); if (cd instanceof NonEnumeratedConceptualDomain) { logger.error( "{} is not EnumeratedConceptualDomain, so no ValueMeaning", conceptualDomainID); return Response.serverError().build(); } EnumeratedConceptualDomain ecd = (EnumeratedConceptualDomain) cd; List<ValueMeaning> vmList; if (limit != null && offset != null) { vmList = ecd.getValueMeanings(limit, offset); } else { vmList = ecd.getValueMeanings(); } List<ValueMeaningModel> vmModelList = new ArrayList<ValueMeaningModel>(); for (ValueMeaning vm : vmList) { vmModelList.add(new ValueMeaningModel(vm.asMDRResource())); } return Response.ok(vmModelList).build(); } @GET @Path("/vm") @Produces(MediaType.TEXT_PLAIN) public Response getNumberOfValueMeanings( @CookieParam(AuthenticationService.SID) String sessionID, @PathParam("cid") String conceptualDomainID) { WebUtil.checkUserSession(sessionID); Repository repository = RepositoryManager.getInstance().getRepository(); ConceptualDomain cd = repository .getConceptualDomain(conceptualDomainID); if (cd instanceof NonEnumeratedConceptualDomain) { logger.error( "{} is not EnumeratedConceptualDomain, so no ValueMeaning", conceptualDomainID); return Response.serverError().build(); } EnumeratedConceptualDomain ecd = (EnumeratedConceptualDomain) cd; int size = ecd.getNumberOfValueMeanings(); return Response.ok(String.valueOf(size)).build(); } @POST @Path("/vm") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response createValueMeaning( @CookieParam(AuthenticationService.SID) String sessionID, @PathParam("cid") String conceptualDomainID, ValueMeaningModel valueMeaningModel) { WebUtil.checkUserSession(sessionID); Repository repository = RepositoryManager.getInstance().getRepository(); ConceptualDomain cd = repository .getConceptualDomain(conceptualDomainID); if (cd instanceof NonEnumeratedConceptualDomain) { logger.error( "{} is not EnumeratedConceptualDomain, so no ValueMeaning", conceptualDomainID); return Response.serverError().build(); } EnumeratedConceptualDomain ecd = (EnumeratedConceptualDomain) cd; ValueMeaning vm = ecd.addValueMeaning(valueMeaningModel.getId(), valueMeaningModel.getDescription()); return Response.ok(new ValueMeaningModel(vm.asMDRResource())).build(); } @DELETE @Path("/vm") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response deleteValueMeaning( @CookieParam(AuthenticationService.SID) String sessionID, @PathParam("cid") String conceptualDomainID, ValueMeaningModel valueMeaningModel) { WebUtil.checkUserSession(sessionID); Repository repository = RepositoryManager.getInstance().getRepository(); ConceptualDomain cd = repository .getConceptualDomain(conceptualDomainID); if (cd instanceof NonEnumeratedConceptualDomain) { logger.error( "{} is not EnumeratedConceptualDomain, so no ValueMeaning", conceptualDomainID); return Response.serverError().build(); } // TODO it iterates over whole ValueMeaning set, not efficient, find // another way to do it EnumeratedConceptualDomain ecd = (EnumeratedConceptualDomain) cd; List<ValueMeaning> vmList = ecd.getValueMeanings(); for (ValueMeaning vm : vmList) { if (valueMeaningModel.getId().equals(vm.getIdentifier())) { vm.delete(); return Response.ok().build(); } } return Response.noContent().build(); } @GET @Path("/vd") @Produces(MediaType.APPLICATION_JSON) public Response listValueDomains( @CookieParam(AuthenticationService.SID) String sessionID, @PathParam("cid") String cid) { WebUtil.checkUserSession(sessionID); Repository repository = RepositoryManager.getInstance().getRepository(); List<ValueDomainModel> vdModelList = new ArrayList<ValueDomainModel>(); ConceptualDomain cd = repository.getConceptualDomain(cid); List<ValueDomain> vdList = cd.getValueDomains(); for (ValueDomain vd : vdList) { if (vd instanceof EnumeratedValueDomain) { vdModelList.add(new ValueDomainModel(vd, true)); } else { vdModelList.add(new ValueDomainModel(vd, false)); } } return Response.ok(vdModelList).build(); } @POST @Path("/vd") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response createValueDomain( @CookieParam(AuthenticationService.SID) String sessionID, @PathParam("cid") String cid, ValueDomainModel valueDomain) { WebUtil.checkUserSession(sessionID); Repository repository = RepositoryManager.getInstance().getRepository(); ConceptualDomain cd = repository.getConceptualDomain(cid); ValueDomain vd = null; Datatype dataType = repository .getMDRDatabase() .getResourceFactory() .createDatatype(valueDomain.getDataType().getDatatypeName(), null, valueDomain.getDataType().getSchemeReference(), null); if (cd instanceof EnumeratedConceptualDomain && valueDomain.isEnumerated()) { EnumeratedConceptualDomain ecd = (EnumeratedConceptualDomain) cd; List<PermissibleValue> permissibleValues = new ArrayList<PermissibleValue>(); List<PermissibleValueModel> permissibleValueModels = valueDomain .getPermissibleValues(); for (PermissibleValueModel pvModel : permissibleValueModels) { permissibleValues.add(ecd.getValueMeaning( pvModel.getValueMeaning().getId()) .createPermissibleValue(pvModel.getValueItem())); } vd = ecd.createEnumeratedValueDomain(valueDomain.getName(), valueDomain.getDefinition(), dataType, permissibleValues); return Response.ok(new ValueDomainModel(vd, true)).build(); } else if (cd instanceof NonEnumeratedConceptualDomain && !valueDomain.isEnumerated()) { vd = ((NonEnumeratedConceptualDomain) cd) .createNonEnumeratedValueDomain(valueDomain.getName(), valueDomain.getDefinition(), dataType); return Response.ok(new ValueDomainModel(vd, false)).build(); } else { logger.error( "{} ValueDomain's type should be consistent with ConceptualDomain's type", valueDomain.getName()); return Response.serverError().build(); } } @PUT @Path("/vd") @Consumes(MediaType.APPLICATION_JSON) public Response updateValueDomain( @CookieParam(AuthenticationService.SID) String sessionID, @PathParam("cid") String cid, ValueDomainModel valueDomain) { WebUtil.checkUserSession(sessionID); Repository repository = RepositoryManager.getInstance().getRepository(); ConceptualDomain cd = repository.getConceptualDomain(cid); ValueDomain vd = cd.getValueDomain(valueDomain.getId()); vd.setName(valueDomain.getName()); vd.setDefinition(valueDomain.getDefinition()); DatatypeResource dataType = repository .getMDRDatabase() .getResourceFactory() .createDatatype(valueDomain.getDataType().getDatatypeName(), null, valueDomain.getDataType().getSchemeReference(), null); vd.asMDRResource().setValueDomainDatatype(dataType); if (valueDomain.isEnumerated()) { EnumeratedConceptualDomain ecd = (EnumeratedConceptualDomain) cd; List<PermissibleValue> pvList = ((EnumeratedValueDomain) vd) .getPermissibleValues(); for (PermissibleValue pv : pvList) { pv.delete(); } List<PermissibleValue> permissibleValues = new ArrayList<PermissibleValue>(); List<PermissibleValueModel> permissibleValueModels = valueDomain .getPermissibleValues(); for (PermissibleValueModel pvModel : permissibleValueModels) { permissibleValues.add(ecd.getValueMeaning( pvModel.getValueMeaning().getId()) .createPermissibleValue(pvModel.getValueItem())); } ((EnumeratedValueDomain) vd).addPermissibleValue(permissibleValues .toArray(new PermissibleValue[permissibleValues.size()])); } return Response.ok().build(); } }