From e1ad4b434782d47fcfd80bdfef918e04a0209ed0 Mon Sep 17 00:00:00 2001 From: tosmers Date: Thu, 10 Dec 2015 00:17:46 +0000 Subject: [PATCH] adds filePropertiesPanel to DocRepo and modifies minor stuff git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3766 8810af33-2d31-482b-a856-94f89814c4df --- .../AbstractAuditedEntityRepository.java | 23 +++ .../docrepo/ui/FilePropertiesPanel.java | 161 ++++++++++++++++++ .../java/org/libreccm/docrepo/Repository.java | 17 ++ .../docrepo/RepositoryRepository.java | 1 + .../java/org/libreccm/docrepo/Resource.java | 23 ++- .../org/libreccm/docrepo/ResourceManager.java | 7 +- .../Resources.properties | 3 + .../Resources_de.properties | 7 +- .../Resources_en.properties | 3 + 9 files changed, 238 insertions(+), 7 deletions(-) create mode 100644 ccm-docrepo/src/main/java/com/arsdigita/docrepo/ui/FilePropertiesPanel.java diff --git a/ccm-core/src/main/java/org/libreccm/auditing/AbstractAuditedEntityRepository.java b/ccm-core/src/main/java/org/libreccm/auditing/AbstractAuditedEntityRepository.java index c65fe2984..1bbe3b202 100644 --- a/ccm-core/src/main/java/org/libreccm/auditing/AbstractAuditedEntityRepository.java +++ b/ccm-core/src/main/java/org/libreccm/auditing/AbstractAuditedEntityRepository.java @@ -19,15 +19,18 @@ package org.libreccm.auditing; import org.hibernate.envers.AuditReader; +import org.hibernate.envers.exception.NotAuditedException; import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.query.AuditQuery; import org.libreccm.core.AbstractEntityRepository; import javax.inject.Inject; +import java.util.List; /** * * @author Jens Pelzetter + * @author Tobias Osmers + * @version $Id: FilePropertiesPanel.java pboy $ + */ +public class FilePropertiesPanel extends SimpleComponent implements Constants { + + private static final Logger log = Logger.getLogger( + FilePropertiesPanel.class); + + /** + * Generates the XML for this container. + * + * @param state represents the current request + * @param parent the parent XML element + */ + @Override + public void generateXML(PageState state, Element parent) { + // Get file id. + Long resourceId = (Long) state.getValue(FILE_ID_PARAM); + Element element = parent.newChildElement("docs:file-info", DOCS_XML_NS); + + File file = null; + final CdiUtil cdiUtil = new CdiUtil(); + ResourceRepository resourceRepository = null; + final PermissionChecker permissionChecker; + try { + resourceRepository = cdiUtil.findBean(ResourceRepository.class); + Resource resource = resourceRepository.findById(resourceId); + file = resource.isFile() ? (File) resource : null; + + permissionChecker = cdiUtil.findBean(PermissionChecker.class); + // checks if the subject has permissions granting the privilege to + // 'read' the file + permissionChecker.checkPermission("read", file); + } catch (CdiLookupException ex) { + log.error(GlobalizationUtil.globalize("beanFinder.fail" + + ".resourceRepository"), ex); + } catch (AuthorizationException authEx) { + log.error(GlobalizationUtil.globalize("ui.file.failure.privilege.read"), + authEx); + } + + Element nameElement = element.newChildElement("docs:name", DOCS_XML_NS); + nameElement.setText(file.getName()); + Element descriptionElement = element.newChildElement("docs:description", + DOCS_XML_NS); + String description = file.getDescription(); + if (description != null) { + descriptionElement.setText(description); + } + + Element sizeElement = element.newChildElement("docs:size", DOCS_XML_NS); + sizeElement.setText(Utils.FileSize.formatFileSize(file.getSize(), state)); + Element typeElement = element.newChildElement("docs:type", DOCS_XML_NS); + + // Retrieve pretty name for a mime type. + MimeType mimeType = file.getMimeType(); + typeElement.setText(mimeType.getBaseType()); + + Element lastModifiedElement = element.newChildElement( + "docs:last-modified", DOCS_XML_NS); + lastModifiedElement.setText(Utils.DateFormat.format( + file.getLastModifiedDate())); + + Element revisionElement = element.newChildElement("docs:revision", + DOCS_XML_NS); + + long numRevs = 0; // if there aren't any revisions 0 is accurate + if (resourceRepository != null) { + try { + numRevs = resourceRepository.retrieveRevisionNumbersOfEntity( + file, file.getObjectId()).size(); + } catch (IllegalArgumentException | + NotAuditedException | + IllegalStateException ex) { + log.error(GlobalizationUtil.globalize("ui.file.failure" + + ".retrieve.revisionNumber"), ex); + } + } + + //deprecated: exchanged through the above + //TransactionCollection tc = file.getTransactions(); + //long numRevs = tc.size(); + revisionElement.setText(numRevs + ""); + + // Must allow for the possibility that not author is available. + + Element authorElement = element.newChildElement("docs:author", + DOCS_XML_NS); + User author = file.getCreationUser(); + if (author != null) { + authorElement.setText(author.getName()); + } else { + authorElement.setText("Unknown"); + } + + Element uriElement = element.newChildElement("docs:uri", DOCS_XML_NS); + uriElement.setText(makeFileURL(file, state)); + } + + /** + * Makes an url for a given file. + * + * @param file The file + * @param state The page state + * + * @return The url to the file + */ + private static String makeFileURL(File file, PageState state) { + final HttpServletRequest req = state.getRequest(); + + final ParameterMap params = new ParameterMap(); + params.setParameter(FILE_ID_PARAM.getName(), file.getObjectId()); + + return URL.here(req, "/download/" + file.getName(), params).toString(); + } +} diff --git a/ccm-docrepo/src/main/java/org/libreccm/docrepo/Repository.java b/ccm-docrepo/src/main/java/org/libreccm/docrepo/Repository.java index adbfda96d..996268dab 100644 --- a/ccm-docrepo/src/main/java/org/libreccm/docrepo/Repository.java +++ b/ccm-docrepo/src/main/java/org/libreccm/docrepo/Repository.java @@ -27,8 +27,10 @@ import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; +import java.util.List; /** * Entity class of a repository for documents. Instances will be persisted into @@ -70,6 +72,13 @@ public class Repository extends CcmApplication { @NotBlank private User owner; + /** + * All {@link Resource}s contained in this {@code Repository}. + */ + @OneToMany(mappedBy = "repository") + private List resources; + + /** * Constructor calls the super-class-constructor of {@link CcmApplication}. */ @@ -103,6 +112,14 @@ public class Repository extends CcmApplication { this.owner = owner; } + public List getResources() { + return resources; + } + + public void setResources(List resources) { + this.resources = resources; + } + //< End GETTER & SETTER diff --git a/ccm-docrepo/src/main/java/org/libreccm/docrepo/RepositoryRepository.java b/ccm-docrepo/src/main/java/org/libreccm/docrepo/RepositoryRepository.java index 65fed8e88..2df56e129 100644 --- a/ccm-docrepo/src/main/java/org/libreccm/docrepo/RepositoryRepository.java +++ b/ccm-docrepo/src/main/java/org/libreccm/docrepo/RepositoryRepository.java @@ -72,4 +72,5 @@ public class RepositoryRepository extends return query.getResultList(); } + } diff --git a/ccm-docrepo/src/main/java/org/libreccm/docrepo/Resource.java b/ccm-docrepo/src/main/java/org/libreccm/docrepo/Resource.java index 45d8eada7..d54325c11 100644 --- a/ccm-docrepo/src/main/java/org/libreccm/docrepo/Resource.java +++ b/ccm-docrepo/src/main/java/org/libreccm/docrepo/Resource.java @@ -22,6 +22,7 @@ import org.hibernate.validator.constraints.NotBlank; import org.libreccm.core.CcmObject; import org.libreccm.security.User; +import javax.activation.MimeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.JoinColumn; @@ -33,7 +34,6 @@ import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; - import java.util.Date; import java.util.List; @@ -98,7 +98,7 @@ public abstract class Resource extends CcmObject { * Mime-type of the {@code Resource}. */ @Column(name = "MIME_TYPE") - private String mimeType; + private MimeType mimeType; /** * Size of the {@code Resource}. @@ -168,6 +168,13 @@ public abstract class Resource extends CcmObject { @OneToMany(mappedBy = "parent") private List immediateChildren; + /** + * The {@link Repository} containing this {@code Resource}. + */ + @ManyToOne + @JoinColumn(name = "REPOSITORY_ID") + private Repository repository; + /** * Constructor calls the super-class-constructor of {@link CcmObject}. */ @@ -209,11 +216,11 @@ public abstract class Resource extends CcmObject { this.path = path; } - public String getMimeType() { + public MimeType getMimeType() { return mimeType; } - public void setMimeType(String mimeType) { + public void setMimeType(MimeType mimeType) { this.mimeType = mimeType; } @@ -297,6 +304,14 @@ public abstract class Resource extends CcmObject { this.immediateChildren = immediateChildren; } + public Repository getRepository() { + return repository; + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + //< End GETTER & SETTER public boolean isRoot() { diff --git a/ccm-docrepo/src/main/java/org/libreccm/docrepo/ResourceManager.java b/ccm-docrepo/src/main/java/org/libreccm/docrepo/ResourceManager.java index 7a72cfd35..b06c9abab 100644 --- a/ccm-docrepo/src/main/java/org/libreccm/docrepo/ResourceManager.java +++ b/ccm-docrepo/src/main/java/org/libreccm/docrepo/ResourceManager.java @@ -21,6 +21,7 @@ package org.libreccm.docrepo; import org.apache.log4j.Logger; import org.apache.oro.text.perl.Perl5Util; +import javax.activation.MimetypesFileTypeMap; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; @@ -95,9 +96,13 @@ public class ResourceManager { boolean validName = !(perl5Util.match(INVALID_START_PATTERN, name) || perl5Util.match(INVALID_NAME_PATTERN, name)); - // checks duplication of the name, database access (mind performance) + // checks duplication of the name; database access (mind performance) validName &= resourceRepository.findByName(name).isEmpty(); + // checks that the name corresponds to a compatible MIME type + validName &= new MimetypesFileTypeMap().getContentType(name).equals + (resource.getMimeType().toString()); + return validName; } } diff --git a/ccm-docrepo/src/main/resources/com.arsdigita.docrepo/Resources.properties b/ccm-docrepo/src/main/resources/com.arsdigita.docrepo/Resources.properties index 275223dc2..72368dcc4 100644 --- a/ccm-docrepo/src/main/resources/com.arsdigita.docrepo/Resources.properties +++ b/ccm-docrepo/src/main/resources/com.arsdigita.docrepo/Resources.properties @@ -77,3 +77,6 @@ ui.folder.choose_destination=Please choose a destination ui.file.name.invalid=The filename is not valid. beanFinder.fail.resourceRepository=Failed to find bean for the ResourceRepository. beanFinder.fail.resourceManager=Failed to find bean for the ResourceManager. +ui.file.failure.privilege.read=You do not have the permission granting you the privilege to the read the chosen file. +beanFinder.fail.repositoryRepository=Failed to find bean for the RepositoryRepository. +ui.file.failure.retrieve.revisionNumber=Wasn't able to retrieve the revision numbers for the given file. diff --git a/ccm-docrepo/src/main/resources/com.arsdigita.docrepo/Resources_de.properties b/ccm-docrepo/src/main/resources/com.arsdigita.docrepo/Resources_de.properties index dfeb32024..4d342bce8 100644 --- a/ccm-docrepo/src/main/resources/com.arsdigita.docrepo/Resources_de.properties +++ b/ccm-docrepo/src/main/resources/com.arsdigita.docrepo/Resources_de.properties @@ -1,7 +1,7 @@ ui.action.edit.copy=Kopieren ui.action.edit.cut=Ausschneiden ui.action.edit.delete=Löschen -ui.action.error=Folgende(r) Fehler trat(en) auf: +ui.action.error=Folgende(r) Fehler trat(en) auf\: ui.action.error.continue=Fortfahren ui.action.submit.delete=L\u00f6schen ui.action.confirm.delete='Sollen die ausgew\u00e4hlten Dateien und Ordner tats\u00e4chlich gel\u00f6scht werden?' @@ -22,7 +22,7 @@ ui.file.name.required=Name: (*) ui.file.save=Sichern ui.file.submit=Upload ui.file.source=Quelle: -ui.file.version.description=Version Description: (*) +ui.file.version.description=Version Description\: (*) ui.file.upload.header=Upload File into Folder ui.file.confirm.delete=Do you really want to delete this file? ui.fileinfo.goback.label=Return to @@ -77,3 +77,6 @@ ui.folder.choose_destination=Bitte w\u00e4hle ein Ziel ui.file.name.invalid=Der Dateiname ist nicht gültig. beanFinder.fail.resourceRepository=Das Finden der Bean für das ResourceRepository schlug fehl. beanFinder.fail.resourceManager=Das Finden der Bean für den ResourceManager schlug fehl. +ui.file.failure.privilege.read=Sie haben nicht die Erlaubnis, die ihnen das Recht gibt, die ausgewählte Datei zu lesen. +beanFinder.fail.repositoryRepository=Das Finden der Bean für das RepositoryRepository schlug fehl. +ui.file.failure.retrieve.revisionNumber=Es war nicht möglich, die Revisionsnummern für die gegebene Datei wiederzuholen. diff --git a/ccm-docrepo/src/main/resources/com.arsdigita.docrepo/Resources_en.properties b/ccm-docrepo/src/main/resources/com.arsdigita.docrepo/Resources_en.properties index 275223dc2..72368dcc4 100644 --- a/ccm-docrepo/src/main/resources/com.arsdigita.docrepo/Resources_en.properties +++ b/ccm-docrepo/src/main/resources/com.arsdigita.docrepo/Resources_en.properties @@ -77,3 +77,6 @@ ui.folder.choose_destination=Please choose a destination ui.file.name.invalid=The filename is not valid. beanFinder.fail.resourceRepository=Failed to find bean for the ResourceRepository. beanFinder.fail.resourceManager=Failed to find bean for the ResourceManager. +ui.file.failure.privilege.read=You do not have the permission granting you the privilege to the read the chosen file. +beanFinder.fail.repositoryRepository=Failed to find bean for the RepositoryRepository. +ui.file.failure.retrieve.revisionNumber=Wasn't able to retrieve the revision numbers for the given file.