cz.zcu.kiv.eegdatabase.webservices.rest.scenario.ScenarioServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for cz.zcu.kiv.eegdatabase.webservices.rest.scenario.ScenarioServiceImpl.java

Source

/*******************************************************************************
 * This file is part of the EEG-database project
 * 
 *   ==========================================
 *  
 *   Copyright (C) 2013 by University of West Bohemia (http://www.zcu.cz/en/)
 *  
 *  ***********************************************************************************************************************
 *  
 *   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.
 *  
 *  ***********************************************************************************************************************
 *  
 *   ScenarioServiceImpl.java, 2013/10/02 00:01 Jakub Rinkes
 ******************************************************************************/
package cz.zcu.kiv.eegdatabase.webservices.rest.scenario;

import cz.zcu.kiv.eegdatabase.data.dao.PersonDao;
import cz.zcu.kiv.eegdatabase.data.dao.ResearchGroupDao;
import cz.zcu.kiv.eegdatabase.data.dao.ScenarioDao;
import cz.zcu.kiv.eegdatabase.data.pojo.*;
import cz.zcu.kiv.eegdatabase.webservices.rest.common.exception.RestNotFoundException;
import cz.zcu.kiv.eegdatabase.webservices.rest.common.exception.RestServiceException;
import cz.zcu.kiv.eegdatabase.webservices.rest.scenario.wrappers.ScenarioData;
import org.apache.commons.io.IOUtils;
import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Scenario service implementation.
 *
 * @author Petr Miko
 */
@Service
public class ScenarioServiceImpl implements ScenarioService {

    @Autowired
    @Qualifier("scenarioDao")
    private ScenarioDao scenarioDao;
    @Autowired
    @Qualifier("personDao")
    private PersonDao personDao;
    @Autowired
    @Qualifier("researchGroupDao")
    private ResearchGroupDao researchGroupDao;

    private final Comparator<ScenarioData> idComparator = new Comparator<ScenarioData>() {
        @Override
        public int compare(ScenarioData o1, ScenarioData o2) {
            return o1.getScenarioId() - o2.getScenarioId();
        }
    };

    /**
     * {@inheritDoc}
     */
    @Override
    @Transactional(readOnly = true)
    public List<ScenarioData> getAllScenarios() {
        List<Scenario> scenarios = scenarioDao.getAvailableScenarios(personDao.getLoggedPerson());
        List<ScenarioData> scenarioDatas = new ArrayList<ScenarioData>(scenarios.size());

        for (Scenario s : scenarios) {
            ScenarioData sd = new ScenarioData();
            Person owner = s.getPerson();
            sd.setScenarioId(s.getScenarioId());
            sd.setScenarioName(s.getTitle());
            sd.setOwnerName(owner.getGivenname() + " " + owner.getSurname());
            sd.setMimeType(s.getMimetype() != null ? s.getMimetype().trim() : "");
            sd.setFileName(s.getScenarioName());
            sd.setFileLength(s.getScenarioLength());
            sd.setDescription(s.getDescription());
            sd.setPrivate(s.isPrivateScenario());
            sd.setResearchGroupId(s.getResearchGroup().getResearchGroupId());
            sd.setResearchGroupName(s.getResearchGroup().getTitle());
            scenarioDatas.add(sd);
        }

        Collections.sort(scenarioDatas, idComparator);
        return scenarioDatas;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @Transactional(readOnly = true)
    public List<ScenarioData> getMyScenarios() {
        List<Scenario> scenarios = scenarioDao.getScenariosWhereOwner(personDao.getLoggedPerson());
        List<ScenarioData> scenarioDatas = new ArrayList<ScenarioData>(scenarios.size());

        for (Scenario s : scenarios) {
            ScenarioData sd = new ScenarioData();
            Person owner = s.getPerson();
            sd.setScenarioId(s.getScenarioId());
            sd.setScenarioName(s.getTitle());
            sd.setOwnerName(owner.getGivenname() + " " + owner.getSurname());
            sd.setMimeType(s.getMimetype() != null ? s.getMimetype().trim() : "");
            sd.setFileName(s.getScenarioName());
            sd.setFileLength(s.getScenarioLength());
            sd.setDescription(s.getDescription());
            sd.setPrivate(s.isPrivateScenario());
            sd.setResearchGroupId(s.getResearchGroup().getResearchGroupId());
            sd.setResearchGroupName(s.getResearchGroup().getTitle());
            scenarioDatas.add(sd);
        }
        Collections.sort(scenarioDatas, idComparator);
        return scenarioDatas;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @Transactional
    public int create(ScenarioData scenarioData, MultipartFile file)
            throws IOException, SAXException, ParserConfigurationException {
        Scenario scenario = new Scenario();
        scenario.setDescription(scenarioData.getDescription());
        scenario.setTitle(scenarioData.getScenarioName());
        scenario.setScenarioName(file.getOriginalFilename().replace(" ", "_"));
        scenario.setMimetype(scenarioData.getMimeType().toLowerCase().trim());

        //DB column size restriction
        if (scenario.getMimetype().length() > 30) {
            scenario.setMimetype("application/octet-stream");
        }

        ResearchGroup group = researchGroupDao.read(scenarioData.getResearchGroupId());
        scenario.setResearchGroup(group);
        Person owner = personDao.getLoggedPerson();
        scenario.setPerson(owner);

        scenario.setScenarioLength((int) file.getSize());

        scenario.setPrivateScenario(scenarioData.isPrivate());
        return scenarioDao.create(scenario);

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void getFile(int id, HttpServletResponse response)
            throws RestServiceException, SQLException, IOException, TransformerException, RestNotFoundException {
        Scenario scenario = scenarioDao.read(id);

        //if is user member of group, then he has rights to download file
        //basic verification, in future should be extended
        ResearchGroup expGroup = scenario.getResearchGroup();
        if (!isInGroup(personDao.getLoggedPerson(), expGroup.getResearchGroupId()))
            throw new RestServiceException("User does not have access to this file!");

    }

    /**
     * Checks if is user a member of specified research group.
     *
     * @param user            user
     * @param researchGroupId research group identifier
     * @return true if is user in group
     */
    private boolean isInGroup(Person user, int researchGroupId) {
        if (!user.getResearchGroupMemberships().isEmpty()) {
            for (ResearchGroup g : researchGroupDao.getResearchGroupsWhereMember(user)) {
                if (g.getResearchGroupId() == researchGroupId) {
                    return true;
                }
            }
        }
        return false;
    }
}