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();
}
}