diff --git a/mir-module/src/main/java/org/mycore/mir/authorization/MIRStrategy.java b/mir-module/src/main/java/org/mycore/mir/authorization/MIRStrategy.java index 589669c91c..3b5ee672bc 100644 --- a/mir-module/src/main/java/org/mycore/mir/authorization/MIRStrategy.java +++ b/mir-module/src/main/java/org/mycore/mir/authorization/MIRStrategy.java @@ -13,6 +13,9 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jdom2.filter.Filters; +import org.jdom2.xpath.XPathExpression; +import org.jdom2.xpath.XPathFactory; import org.mycore.access.MCRAccessInterface; import org.mycore.access.MCRAccessManager; import org.mycore.access.strategies.MCRAccessCheckStrategy; @@ -24,8 +27,10 @@ import org.mycore.backend.jpa.access.MCRACCESSPK_; import org.mycore.backend.jpa.access.MCRACCESS_; import org.mycore.common.MCRCache; +import org.mycore.common.MCRConstants; import org.mycore.common.MCRException; import org.mycore.common.config.MCRConfiguration2; +import org.mycore.common.xml.MCRURIResolver; import org.mycore.datamodel.classifications2.MCRCategLinkReference; import org.mycore.datamodel.classifications2.MCRCategLinkService; import org.mycore.datamodel.classifications2.MCRCategLinkServiceFactory; @@ -167,7 +172,28 @@ private boolean checkDerivatePermission(MCRObjectID derivateId, String permissio MCRAccessManager.PERMISSION_DELETE.equalsIgnoreCase(permission)) { final boolean hasRegisteredPI = hasRegisteredPI(objectId); if (hasRegisteredPI && !canEditPI()) { - return false; + + XPathFactory xpathFactory = XPathFactory.instance(); + XPathExpression exportedXpath = xpathFactory + .compile(".//category/label[lang('x-export')]/@text='false'", + Filters.fboolean(), null, MCRConstants.XML_NAMESPACE); + + // allow modification of hidden derivates even after a PI has been registered + boolean hidden = MCRMetadataManager.retrieveMCRDerivate(derivateId) + .getDerivate() + .getClassifications() + .stream() + .filter(classification -> classification.getClassId().equals("derivate_types")) + .map(classification -> MCRURIResolver.obtainInstance() + .resolve("classification:metadata:0:children:derivate_types:" + classification.getCategId())) + .map(derivateTypeElement -> exportedXpath.evaluate(derivateTypeElement).get(0)) + .findAny() + .orElse(false); + + if (!hidden) { + return false; + } + } } diff --git a/mir-module/src/main/resources/xsl/metadata/mir-collapse-files.xsl b/mir-module/src/main/resources/xsl/metadata/mir-collapse-files.xsl index 2cf0db31f8..f2aed9bf7b 100644 --- a/mir-module/src/main/resources/xsl/metadata/mir-collapse-files.xsl +++ b/mir-module/src/main/resources/xsl/metadata/mir-collapse-files.xsl @@ -59,71 +59,75 @@ -
-
-
-
-
-
+ + + + +
- - - - -
-
- - - -
- - - - - -
-
-
-
+ + + +
+ + + + + +
+
+
+
+
-
- - - -
-
- + + + +
+
+ +
-
- - -
+
+ +
+
diff --git a/mir-module/src/main/resources/xsl/mods2epicur.xsl b/mir-module/src/main/resources/xsl/mods2epicur.xsl index e580efcf59..313c3f458c 100644 --- a/mir-module/src/main/resources/xsl/mods2epicur.xsl +++ b/mir-module/src/main/resources/xsl/mods2epicur.xsl @@ -20,9 +20,13 @@ - - - + + + + + + + diff --git a/mir-module/src/main/resources/xsl/mods2oai_dc.xsl b/mir-module/src/main/resources/xsl/mods2oai_dc.xsl index c85db3edc4..5e38995db2 100644 --- a/mir-module/src/main/resources/xsl/mods2oai_dc.xsl +++ b/mir-module/src/main/resources/xsl/mods2oai_dc.xsl @@ -22,9 +22,13 @@ - - - + + + + + + + diff --git a/mir-module/src/main/resources/xsl/mods2xMetaDissPlus.xsl b/mir-module/src/main/resources/xsl/mods2xMetaDissPlus.xsl index d7991cf990..3afc8062a5 100644 --- a/mir-module/src/main/resources/xsl/mods2xMetaDissPlus.xsl +++ b/mir-module/src/main/resources/xsl/mods2xMetaDissPlus.xsl @@ -106,9 +106,13 @@ - - - + + + + + + +