teaserDiv = METSQuery.findStructMap(mets, "PHYSICAL").getDiv().getDiv()
+ .stream()
+ .filter(d -> "START_PAGE".equals(d.getXlinkLabel()))
+ .findFirst();
+
+ if (teaserDiv.isPresent()) {
+ String teaserURL = MCRFrontendUtil.getBaseURL() + "api/iiif/image/v2"
+ + "/" + retrieveIIIFID(teaserDiv.get()) + "/full/!400,400/0/default.jpg";
+ // create TEASER filegroup
+ String id = "TEASER_file_0000";
+ FileGrp fgDownload = METSQuery.findOrCreateFileGrpOfUse(mets, "TEASER");
+ File fDown = new File();
+ fDown.setID(id);
+ fDown.setMIMETYPE("text/html");
+ fgDownload.getFile().add(0, fDown);
+
+ FLocat fLocat = new FLocat();
+ fLocat.setLOCTYPE(LOCTYPE.URL);
+ fLocat.setXlinkHref(teaserURL);
+ fDown.getFLocat().add(fLocat);
+
+ Div physRoot = METSQuery.findStructMap(mets, "PHYSICAL").getDiv();
+ Fptr fptr = new Fptr();
+ fptr.setFILEID(id);
+ physRoot.getFptr().add(fptr);
+ }
+ }
+
+ //TODO trennen
+ private void updateDMDSec(Mets mets, Mods mods) {
+ mets.getDmdSec().stream()
+ .filter(dmdSec -> "DMDLOG_0000".equals(dmdSec.getID()))
+ .forEach(dmdSec -> {
+ dmdSec.setCREATED(null);
+ dmdSec.getMdWrap().setMDTYPEVERSION(null);
+
+ org.w3c.dom.Document docMods = null;
+ try {
+ docMods = MODSXMLProcessor.getInstance().marshalToDOM(mods);
+ } catch (Exception e) {
+ //ignore
+ }
+ if (docMods != null) {
+ org.w3c.dom.Element eMods = docMods.getDocumentElement();
+ // mods:note[@type='titlewordindex'] ->
+ NodeList nl = eMods.getElementsByTagNameNS("http://www.loc.gov/mods/v3", "note");
+ for (int i = 0; i < nl.getLength(); i++) {
+ org.w3c.dom.Element e = (org.w3c.dom.Element) nl.item(i);
+ if ("titlewordindex".equals(e.getAttribute("type"))) {
+ String titlewordindex = e.getTextContent();
+ eMods.removeChild(e);
+
+ org.w3c.dom.Element eExtension = null;
+ NodeList nlExt
+ = eMods.getElementsByTagNameNS("http://www.loc.gov/mods/v3", "mods:extension");
+ for (int j = 0; i < nlExt.getLength(); j++) {
+ if ("zvdd".equals(((org.w3c.dom.Element) nl.item(j)).getAttribute("displayLabel"))) {
+ eExtension = (org.w3c.dom.Element) nl.item(j);
+ }
+ }
+ if (eExtension == null) {
+ eExtension = docMods.createElementNS("http://www.loc.gov/mods/v3", "mods:extension");
+ eExtension.setAttribute("displayLabel", "zvdd");
+ eMods.appendChild(eExtension);
+ }
+ eExtension.appendChild(docMods.createComment(
+ "We have not found a valid and documented ZVDD Namespace URI !!!"));
+ org.w3c.dom.Element eZVDDWrap
+ = docMods.createElementNS("http://zvdd.de/namespace", "zvdd:zvddWrap");
+ eExtension.appendChild(eZVDDWrap);
+ org.w3c.dom.Element eZVDDTitleWord
+ = docMods.createElementNS("http://zvdd.de/namespace", "zvdd:titleWord");
+ eZVDDWrap.appendChild(eZVDDTitleWord);
+ eZVDDTitleWord.setTextContent(titlewordindex);
+ }
+ }
+ dmdSec.getMdWrap().getXmlData().getNodes().clear();
+ dmdSec.getMdWrap().getXmlData().getNodes().add(eMods.cloneNode(true));
+ }
+
+ });
+ }
+
+ private void removePicaDMDSec(Mets mets) {
+ StructMap smLogical = METSQuery.findStructMap(mets, "LOGICAL");
+ if (smLogical != null) {
+ treeStreamOfDivs(smLogical.getDiv())
+ .filter(d -> d.getDMDID() != null
+ && d.getDMDID().contains("DMDLOG_0000_PICA"))
+ .forEach(d -> {
+ d.setDMDID(d.getDMDID().replace("DMDLOG_0000_PICA", "").replaceAll("\\s+", " ").trim());
+ });
+ }
+
+ mets.getDmdSec().removeIf(dmdSec -> "DMDLOG_0000_PICA".equals(dmdSec.getID()));
+ }
+
+ //TODO which is the "static" URL for our DV-METS files
+ private void updateMetsPtr(Mets mets) {
+ StructMap smLogical = METSQuery.findStructMap(mets, "LOGICAL");
+ treeStreamOfDivs(smLogical.getDiv())
+ .filter(d -> d.getMptr().size() > 0)
+ .forEach(div -> {
+ for (Mptr mptr : div.getMptr()) {
+ String recordIdentifier = mptr.getXlinkHref().replace("/", "_");
+ mptr.setXlinkHref(StringUtils.stripEnd(MCRFrontendUtil.getBaseURL(), "/")
+ + "/generated/recordIdentifier:" + recordIdentifier + "_dv.mets.xml");
+ mptr.setOTHERLOCTYPE(null);
+ mptr.setLOCTYPE(LOCTYPE.URL);
+ }
+ });
+ }
+
+ //TODO move to LibMeta
+ private Stream treeStreamOfDivs(Div d) {
+ return Stream.concat(Stream.of(d), d.getDiv().stream().flatMap(x -> treeStreamOfDivs(x)));
+ }
+
+ //TODO in 2024.06 this should be replaced with MCRMetaXML.getFirstContentElement()
+ private Element getFirstContentElement(MCRMetaXML mcrMetaXML) {
+ return mcrMetaXML.getContent().stream().filter(Element.class::isInstance).map(Element.class::cast).findFirst()
+ .orElse(null);
+ }
+
+ //TODO move to LibMeta
+ public static List getMODSChildren(Mods mods, Class type) {
+ return mods.getContent().stream().filter(type::isInstance).map(type::cast).toList();
+ }
+}
diff --git a/jspdocportal-diskcache/src/main/resources/config/jspdocportal-diskcache/mycore.properties b/jspdocportal-diskcache/src/main/resources/config/jspdocportal-diskcache/mycore.properties
index 42564609..faef7de4 100644
--- a/jspdocportal-diskcache/src/main/resources/config/jspdocportal-diskcache/mycore.properties
+++ b/jspdocportal-diskcache/src/main/resources/config/jspdocportal-diskcache/mycore.properties
@@ -20,7 +20,7 @@ MCR.Diskcache.Cache.iiif-manifest.LivespanInMillis=3600000
MCR.Diskcache.Cache.dv-mets.Class=org.mycore.jspdocportal.diskcache.MCRDiskcacheConfig
MCR.Diskcache.Cache.dv-mets.URLSuffix=_dv.mets.xml
MCR.Diskcache.Cache.dv-mets.MimeType=application/xml
-MCR.Diskcache.Cache.dv-mets.Generator.Class=org.mycore.jspdocportal.diskcache.generator.SimpleGenerator
+MCR.Diskcache.Cache.dv-mets.Generator.Class=org.mycore.jspdocportal.diskcache.generator.MCRDiskcacheDVMETSGenerator
MCR.Diskcache.Cache.hello.Class=org.mycore.jspdocportal.diskcache.MCRDiskcacheConfig
MCR.Diskcache.Cache.hello.URLSuffix=/hello