edu.emory.cci.aiw.cvrg.eureka.services.resource.DataElementResource.java Source code

Java tutorial

Introduction

Here is the source code for edu.emory.cci.aiw.cvrg.eureka.services.resource.DataElementResource.java

Source

/*
 * #%L
 * Eureka Services
 * %%
 * Copyright (C) 2012 - 2013 Emory University
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */
package edu.emory.cci.aiw.cvrg.eureka.services.resource;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;

import javax.annotation.security.RolesAllowed;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import org.apache.commons.lang3.StringUtils;

import com.google.inject.Inject;

import edu.emory.cci.aiw.cvrg.eureka.common.comm.DataElement;
import edu.emory.cci.aiw.cvrg.eureka.common.entity.DataElementEntity;
import edu.emory.cci.aiw.cvrg.eureka.common.entity.PropositionChildrenVisitor;
import edu.emory.cci.aiw.cvrg.eureka.common.entity.UserEntity;
import edu.emory.cci.aiw.cvrg.eureka.common.exception.DataElementHandlingException;
import edu.emory.cci.aiw.cvrg.eureka.common.exception.HttpStatusException;
import edu.emory.cci.aiw.cvrg.eureka.services.dao.DataElementEntityDao;
import edu.emory.cci.aiw.cvrg.eureka.services.dao.UserDao;
import edu.emory.cci.aiw.cvrg.eureka.services.translation.DataElementEntityTranslatorVisitor;
import edu.emory.cci.aiw.cvrg.eureka.services.translation.DataElementTranslatorVisitor;
import edu.emory.cci.aiw.cvrg.eureka.services.translation.SummarizingDataElementEntityTranslatorVisitor;

/**
 * PropositionCh
 *
 * @author hrathod
 */
@Path("/protected/dataelement")
@RolesAllowed({ "researcher" })
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class DataElementResource {

    private static final ResourceBundle messages = ResourceBundle.getBundle("Messages");
    private final DataElementEntityDao dataElementEntityDao;
    private final UserDao userDao;
    private final DataElementEntityTranslatorVisitor dEETranslatorVisitor;
    private final DataElementTranslatorVisitor dataElementTranslatorVisitor;
    private final SummarizingDataElementEntityTranslatorVisitor summDEETranslatorVisitor;

    @Inject
    public DataElementResource(DataElementEntityDao inDao, UserDao inUserDao,
            DataElementEntityTranslatorVisitor inDEETranslatorVisitor,
            SummarizingDataElementEntityTranslatorVisitor inSummDEETranslatorVisitor,
            DataElementTranslatorVisitor inDataElementTranslatorVisitor) {
        this.dataElementEntityDao = inDao;
        this.dEETranslatorVisitor = inDEETranslatorVisitor;
        this.summDEETranslatorVisitor = inSummDEETranslatorVisitor;
        this.dataElementTranslatorVisitor = inDataElementTranslatorVisitor;
        this.userDao = inUserDao;
    }

    @GET
    public List<DataElement> getAll(@Context HttpServletRequest inRequest,
            @DefaultValue("false") @QueryParam("summarize") boolean inSummarize) {
        UserEntity user = this.userDao.getByHttpServletRequest(inRequest);
        List<DataElement> result = new ArrayList<>();
        List<DataElementEntity> dataElementEntities = this.dataElementEntityDao.getByUserId(user.getId());
        for (DataElementEntity dataElementEntity : dataElementEntities) {
            result.add(convertToDataElement(dataElementEntity, inSummarize));
        }

        return result;
    }

    @GET
    @Path("/{key}")
    public DataElement get(@Context HttpServletRequest inRequest, @PathParam("key") String inKey,
            @DefaultValue("false") @QueryParam("summarize") boolean inSummarize) {
        UserEntity user = this.userDao.getByHttpServletRequest(inRequest);
        DataElement result = readDataElement(user, inKey, inSummarize);
        if (result == null) {
            throw new HttpStatusException(Response.Status.NOT_FOUND);
        } else {
            return result;
        }
    }

    @POST
    public void create(DataElement inElement) {
        if (inElement.getId() != null) {
            throw new HttpStatusException(Response.Status.PRECONDITION_FAILED,
                    "Data element to " + "be created should not have an identifier.");
        }

        if (inElement.getUserId() == null) {
            throw new HttpStatusException(Response.Status.PRECONDITION_FAILED,
                    "Data element to " + "be created should have a user identifier.");
        }

        if (inElement.isSummarized()) {
            throw new HttpStatusException(Response.Status.PRECONDITION_FAILED,
                    "Data element to " + "be created cannot be summarized.");
        }

        try {
            inElement.accept(this.dataElementTranslatorVisitor);
        } catch (DataElementHandlingException ex) {
            throw new HttpStatusException(ex.getStatus(), ex);
        }
        DataElementEntity dataElementEntity = this.dataElementTranslatorVisitor.getDataElementEntity();

        if (this.dataElementEntityDao.getByUserAndKey(inElement.getUserId(), dataElementEntity.getKey()) != null) {
            String msg = messages.getString("dataElementResource.create.error.duplicate");
            throw new HttpStatusException(Status.CONFLICT, msg);
        }

        Date now = new Date();
        dataElementEntity.setCreated(now);
        dataElementEntity.setLastModified(now);

        this.dataElementEntityDao.create(dataElementEntity);
    }

    @PUT
    public void update(@Context HttpServletRequest inRequest, DataElement inElement) {
        if (inElement.getId() == null) {
            throw new HttpStatusException(Response.Status.PRECONDITION_FAILED,
                    "The data element to be updated must " + "have a unique identifier.");
        }

        if (inElement.getUserId() == null) {
            throw new HttpStatusException(Response.Status.PRECONDITION_FAILED,
                    "The data element to be updated must " + "have a user identifier");
        }

        if (inElement.isSummarized()) {
            throw new HttpStatusException(Response.Status.PRECONDITION_FAILED,
                    "Data element to " + "be updated cannot be summarized.");
        }

        try {
            inElement.accept(this.dataElementTranslatorVisitor);
        } catch (DataElementHandlingException ex) {
            throw new HttpStatusException(Response.Status.INTERNAL_SERVER_ERROR, ex);
        }
        DataElementEntity dataElementEntity = this.dataElementTranslatorVisitor.getDataElementEntity();

        DataElementEntity potentialConflict = this.dataElementEntityDao.getByUserAndKey(inElement.getUserId(),
                dataElementEntity.getKey());
        if (potentialConflict != null && !potentialConflict.getId().equals(dataElementEntity.getId())) {
            String msg = messages.getString("dataElementResource.update.error.duplicate");
            throw new HttpStatusException(Status.CONFLICT, msg);
        }

        DataElementEntity oldDataElementEntity = this.dataElementEntityDao.retrieve(inElement.getId());

        if (oldDataElementEntity == null) {
            throw new HttpStatusException(Response.Status.NOT_FOUND);
        } else if (!oldDataElementEntity.getUserId().equals(inElement.getUserId())) {
            throw new HttpStatusException(Response.Status.NOT_FOUND);
        } else {
            UserEntity user = this.userDao.getByHttpServletRequest(inRequest);
            if (!user.getId().equals(oldDataElementEntity.getUserId())) {
                throw new HttpStatusException(Response.Status.NOT_FOUND);
            }
        }

        Date now = new Date();
        dataElementEntity.setLastModified(now);
        dataElementEntity.setCreated(oldDataElementEntity.getCreated());
        dataElementEntity.setId(oldDataElementEntity.getId());
        this.dataElementEntityDao.update(dataElementEntity);
    }

    @DELETE
    @Path("/{userId}/{key}")
    public void delete(@PathParam("userId") Long inUserId, @PathParam("key") String inKey) {
        DataElementEntity dataElementEntity = this.dataElementEntityDao.getByUserAndKey(inUserId, inKey);
        if (dataElementEntity == null) {
            throw new HttpStatusException(Response.Status.NOT_FOUND);
        }
        List<String> dataElementsUsedIn = getDataElementsUsedIn(inUserId, dataElementEntity);
        if (!dataElementsUsedIn.isEmpty()) {
            deleteFailed(dataElementsUsedIn, dataElementEntity);
        }

        this.dataElementEntityDao.remove(dataElementEntity);
    }

    private void deleteFailed(List<String> dataElementsUsedIn, DataElementEntity proposition)
            throws HttpStatusException {
        String dataElementList;
        int size = dataElementsUsedIn.size();
        if (size > 1) {
            List<String> subList = dataElementsUsedIn.subList(0, dataElementsUsedIn.size() - 1);
            dataElementList = StringUtils.join(subList, ", ") + " and " + dataElementsUsedIn.get(size - 1);
        } else {
            dataElementList = dataElementsUsedIn.get(0);
        }
        MessageFormat usedByOtherDataElements = new MessageFormat(
                messages.getString("dataElementResource.delete.error.usedByOtherDataElements"));
        String msg = usedByOtherDataElements
                .format(new Object[] { proposition.getDisplayName(), dataElementsUsedIn.size(), dataElementList });
        throw new HttpStatusException(Response.Status.PRECONDITION_FAILED, msg);
    }

    private List<String> getDataElementsUsedIn(Long inUserId, DataElementEntity proposition) {
        List<DataElementEntity> others = this.dataElementEntityDao.getByUserId(inUserId);
        List<String> dataElementsUsedIn = new ArrayList<>();
        for (DataElementEntity other : others) {
            if (!other.getId().equals(proposition.getId())) {
                PropositionChildrenVisitor visitor = new PropositionChildrenVisitor();
                other.accept(visitor);
                for (DataElementEntity child : visitor.getChildren()) {
                    if (child.getId().equals(proposition.getId())) {
                        dataElementsUsedIn.add(other.getDisplayName());
                    }
                }
            }
        }
        return dataElementsUsedIn;
    }

    private DataElement readDataElement(UserEntity userEntity, String inKey, boolean summarize) {
        DataElement result;
        DataElementEntity dataElementEntity = this.dataElementEntityDao.getByUserAndKey(userEntity.getId(), inKey);
        result = convertToDataElement(dataElementEntity, summarize);
        return result;
    }

    private DataElement convertToDataElement(DataElementEntity dataElementEntity, boolean summarize) {
        DataElement result = null;
        if (dataElementEntity != null) {
            if (summarize) {
                result = toSummarizedDataElement(dataElementEntity);
            } else {
                result = toDataElement(dataElementEntity);
            }
        }
        return result;
    }

    private DataElement toDataElement(DataElementEntity dataElementEntity) {
        dataElementEntity.accept(this.dEETranslatorVisitor);
        return this.dEETranslatorVisitor.getDataElement();
    }

    private DataElement toSummarizedDataElement(DataElementEntity dataElementEntity) {
        dataElementEntity.accept(this.summDEETranslatorVisitor);
        return this.summDEETranslatorVisitor.getDataElement();
    }
}