Subversion Repositories bacoAlunos

Rev

Rev 1675 | Rev 1692 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.services.data.repositorydocuments;

import com.owlike.genson.TransformationException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.filters.chains.ResourceAccessControlEnum;
import pt.estgp.estgweb.filters.exceptions.AccessDeniedException;
import pt.estgp.estgweb.services.data.RepositoryService;
import pt.estgp.estgweb.web.controllers.utils.FileUploaded;
import pt.estgp.estgweb.web.controllers.utils.FilesUploadResult;
import pt.utl.ist.berserk.logic.serviceManager.IService;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * Created by jorgemachado on 23/02/17.
 */

public class RepositoryDocumentService implements IService
{

    public static final 1.5.0/docs/api/java/lang/String.html">String REPOSITORY_DOCS_ROLE = "repositoryDocs";


    /**
     * Public service
     * Uses Roles to filter collections
     * @param collectionId
     * @param userSession
     * @return
     * @throws IOException
     * @throws TransformationException
     * @throws JSONException
     * @throws AccessDeniedException
     */

    public JSONArray openRepositoryCollection(1.5.0/docs/api/java/lang/Long.html">Long collectionId, UserSession userSession) throws 1.5.0/docs/api/java/io/IOException.html">IOException, TransformationException, JSONException, AccessDeniedException {

        boolean onlyVisible = !(userSession.getUser() != null &&
                (userSession.getUser().hasRole(REPOSITORY_DOCS_ROLE)
                        ||
                        userSession.getUser().isSuperuserOrAdmin()));
        if(collectionId == null)
        {
            //finding roots
            List<RepositoryDocumentCollectionImpl> roots = DaoFactory.getRepositoryDocumentCollectionDaoImpl().findRoots(onlyVisible);
            return RepositoryDocumentCollectionImpl.toJsonArray(roots);
        }
        else
        {
            List<RepositoryDocumentCollectionImpl> childs = DaoFactory.getRepositoryDocumentCollectionDaoImpl().findChilds(onlyVisible,collectionId);
            return RepositoryDocumentCollectionImpl.toJsonArray(childs);
        }
    }


    public JSONArray openRepositoryCollectionDocuments(1.5.0/docs/api/java/lang/Long.html">Long collectionId, UserSession userSession) throws 1.5.0/docs/api/java/io/IOException.html">IOException, TransformationException, JSONException, AccessDeniedException {

        boolean onlyVisible = !(userSession.getUser() != null &&
                (userSession.getUser().hasRole(REPOSITORY_DOCS_ROLE)
                        ||
                        userSession.getUser().isSuperuserOrAdmin()));

        List<RepositoryDocumentImpl> docs = DaoFactory.getRepositoryDocumentDaoImpl().findDocumentsSortPublishDateDesc(onlyVisible, collectionId);
        return RepositoryDocumentImpl.toJsonArray(docs);
    }

    public JSONObject addRepositoryCollection(1.5.0/docs/api/java/lang/Long.html">Long collectionParentId, UserSession userSession) throws 1.5.0/docs/api/java/io/IOException.html">IOException, TransformationException, JSONException, AccessDeniedException {
        RepositoryDocumentCollectionImpl collectionParent = null;
        if(collectionParentId != null)
        {
             collectionParent = (RepositoryDocumentCollectionImpl) DaoFactory.getRepositoryDocumentCollectionDaoImpl().get(collectionParentId);
        }
        RepositoryDocumentCollectionImpl collectionChild = DomainObjectFactory.createRepositoryDocumentCollectionImpl();
        collectionChild.setParent(collectionParent);

        if(collectionParent != null)
            collectionParent.getChilds().add(collectionChild);

        collectionChild.setVisible(true);
        DaoFactory.getRepositoryDocumentCollectionDaoImpl().save(collectionChild);
        return collectionChild.toJsonObject();
    }

    public JSONObject changeParentRepositoryDocumentCollection(1.5.0/docs/api/java/lang/Long.html">Long collectionId,1.5.0/docs/api/java/lang/Long.html">Long newParentId, UserSession userSession) throws 1.5.0/docs/api/java/io/IOException.html">IOException, TransformationException, JSONException, AccessDeniedException {
        RepositoryDocumentCollectionImpl collectionChild = (RepositoryDocumentCollectionImpl) DaoFactory.getRepositoryDocumentCollectionDaoImpl().get(collectionId);
        RepositoryDocumentCollectionImpl collectionNewParent = newParentId == null ? null : (RepositoryDocumentCollectionImpl) DaoFactory.getRepositoryDocumentCollectionDaoImpl().get(newParentId);

        if(collectionChild.getParent() != null)
        {
            collectionChild.getParent().getChilds().remove(collectionChild);
        }
        collectionChild.setParent(collectionNewParent);
        if(collectionNewParent != null)
        {
            collectionNewParent.getChilds().add(collectionChild);
        }


        return collectionChild.toJsonObject();
    }



    public JSONObject updateRepositoryCollection(1.5.0/docs/api/java/lang/String.html">String collection, UserSession userSession) throws 1.5.0/docs/api/java/io/IOException.html">IOException, TransformationException, JSONException, AccessDeniedException {

        RepositoryDocumentCollectionImpl collectionChild = RepositoryDocumentCollectionImpl.loadFromJson(collection);


        RepositoryDocumentCollectionImpl persistent = (RepositoryDocumentCollectionImpl) DaoFactory.getRepositoryDocumentCollectionDaoImpl().get(collectionChild.getId());
        persistent.setName(collectionChild.getName());
        persistent.setDescription(collectionChild.getDescription());
        persistent.setLegacyUrl(collectionChild.getLegacyUrl());
        persistent.setVisible(collectionChild.isVisible());

        return persistent.toJsonObject();
    }


    public JSONObject saveRepositoryDocument(1.5.0/docs/api/java/lang/String.html">String docJson, FilesUploadResult uploadedFiles, UserSession userSession) throws 1.5.0/docs/api/java/io/IOException.html">IOException, TransformationException, JSONException, AccessDeniedException {

        RepositoryDocumentImpl view = RepositoryDocumentImpl.loadFromJson(docJson);
        RepositoryDocumentImpl persistent = null;
        if(view.getId() <= 0)
        {
            persistent = DomainObjectFactory.createRepositoryDocumentImpl();
            DaoFactory.getRepositoryDocumentDaoImpl().save(persistent);
        }
        else
        {
            persistent = (RepositoryDocumentImpl) DaoFactory.getRepositoryDocumentDaoImpl().get(view.getId());
        }

        persistent.setContributorsJson(view.getContributorsJson());
        persistent.setAuthorsJson(view.getAuthorsJson());
        persistent.setTitle(view.getTitle());
        persistent.setSubtitle(view.getSubtitle());
        persistent.setPublisher(view.getPublisher());
        persistent.setDescription(view.getDescription());
        persistent.setPublishDate(view.getPublishDate());
        persistent.setCloseDate(view.getCloseDate());
        persistent.setInternalIdentifier(view.getInternalIdentifier());
        persistent.setVisible(view.isVisible());

        if(view.getCollection() != null)
        {
            RepositoryDocumentCollection col = DaoFactory.getRepositoryDocumentCollectionDaoImpl().get(view.getCollection().getId());
            col.getId();
            persistent.setCollection((RepositoryDocumentCollectionImpl) col);
        }

        /**
         * atualizar campos dos ficheiros já existentes
         */

        if(view.getRepositoryDocumentFiles() != null && view.getRepositoryDocumentFiles().size() > 0)
        {
            for(RepositoryDocumentFileImpl ficheiroAtualizado : view.getRepositoryDocumentFiles())
            {
                for(RepositoryDocumentFileImpl repoFileCandidate: persistent.getRepositoryDocumentFiles() )
                {
                    if(repoFileCandidate.getId()==ficheiroAtualizado.getId())
                    {
                        //ficheiro encontrado
                        repoFileCandidate.setTitle(ficheiroAtualizado.getTitle());
                        repoFileCandidate.setDescription(ficheiroAtualizado.getDescription());
                        repoFileCandidate.setVisible(ficheiroAtualizado.isVisible());
                        repoFileCandidate.getRepositoryFileProxy().getRepositoryFile().setAccessControl(ficheiroAtualizado.getRepositoryFileProxy().getRepositoryFile().getAccessControl());
                        if(!repoFileCandidate.isVisible())
                            repoFileCandidate.getRepositoryFileProxy().getRepositoryFile().setAccessControl(ResourceAccessControlEnum.privateDomain.getKey());
                        break;
                    }
                }
            }
        }
        if(uploadedFiles != null)
        {
            RepositoryService repositoryService = new RepositoryService();
            for(FileUploaded uploadedF : uploadedFiles.getUploadedFiles())
            {

                ResourceAccessControlEnum controloAcesso = ResourceAccessControlEnum.parse(uploadedF.getAccessControl());

                RepositoryDocumentFileImpl repoFile = null;
                1.5.0/docs/api/java/lang/String.html">String repositoryStream = uploadedF.getRepositoryStream();
                if(repositoryStream != null)
                {
                    for(RepositoryDocumentFileImpl repoFileCandidate: persistent.getRepositoryDocumentFiles() )
                    {
                        if(repoFileCandidate.getRepositoryFileProxy().getRepositoryStream().equals(repositoryStream))
                        {
                            repoFile = repoFileCandidate;
                            break;
                        }
                    }
                    if(repoFile == null)
                        throw new AccessDeniedException("Trying to access to a repoFile not Allowded");

                    repositoryService.updateRepositoryFile(
                            repositoryStream,
                            new 1.5.0/docs/api/java/io/FileInputStream.html">FileInputStream(new java.io.1.5.0/docs/api/java/io/File.html">File(Globals.TMP_DIR + "/" + uploadedF.getTmpName())),
                            uploadedF.getContentType(),
                            uploadedF.getExtension(),
                            (int)uploadedF.getFileSize(),
                            uploadedF.getFileName(),
                            "Institutional Repository Document File",
                            controloAcesso);
                }
                else
                {
                    repositoryStream = repositoryService.storeRepositoryFile(
                            new 1.5.0/docs/api/java/io/FileInputStream.html">FileInputStream(new java.io.1.5.0/docs/api/java/io/File.html">File(Globals.TMP_DIR + "/" + uploadedF.getTmpName())),
                            uploadedF.getContentType(),
                            uploadedF.getExtension(),
                            (int)uploadedF.getFileSize(),
                            uploadedF.getFileName(),
                            "Institutional Repository Document File",
                            controloAcesso,
                            userSession.getUser());
                    Set<RepositoryDocumentFileImpl> files = persistent.getRepositoryDocumentFiles();
                    if(files == null)
                    {
                        files = new HashSet<RepositoryDocumentFileImpl>();
                        persistent.setRepositoryDocumentFiles(files);
                    }
                    repoFile = new RepositoryDocumentFileImpl();
                    DaoFactory.getRepositoryDocumentFileDaoImpl().save(repoFile);
                    files.add(repoFile);
                    RepositoryFileProxy repositoryFileProxy = new RepositoryFileProxy();
                    repositoryFileProxy.setRepositoryStream(repositoryStream);
                    repoFile.setRepositoryFileProxy(repositoryFileProxy);
                }

                repoFile.setVisible(uploadedF.isVisible());
                if(!repoFile.isVisible())
                    repoFile.getRepositoryFileProxy().getRepositoryFile().setAccessControl(ResourceAccessControlEnum.privateDomain.getKey());
                repoFile.setTitle(uploadedF.getTitle());
                repoFile.setDescription(uploadedF.getDescription());

            }

        }

        1.5.0/docs/api/java/lang/System.html">System.out.println(view.toJson());
        return persistent.toJsonObject();
    }
}