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.