From 4f9a66a1bb0beac79be52b199a676994912f9805 Mon Sep 17 00:00:00 2001 From: Eva Roddeck Date: Thu, 21 Aug 2025 12:59:42 +0200 Subject: [PATCH 1/7] MCR-3441 expand MCRNameMerger --- .../org/mycore/mods/merger/MCRNameMerger.java | 96 ++++++++++++++++--- .../components/mods/config/mycore.properties | 1 + .../mycore/mods/merger/MCRNameMergerTest.java | 82 ++++++++++++++++ .../src/test/resources/mycore.properties | 3 + 4 files changed, 169 insertions(+), 13 deletions(-) diff --git a/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java index 1e3b1ca989..df8fe474b3 100644 --- a/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java +++ b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java @@ -38,6 +38,12 @@ */ public class MCRNameMerger extends MCRMerger { + private static final String ALTERNATIVE_NAME = "alternativeName"; + + private static final String TYPE = "type"; + + private static final String NAME_PART = "namePart"; + private String familyName; private Set givenNames = new HashSet<>(); @@ -69,8 +75,8 @@ private void setFromDisplayForm(Element element) { } private void setFromNameParts(Element modsName) { - for (Element namePart : modsName.getChildren("namePart", MCRConstants.MODS_NAMESPACE)) { - String type = namePart.getAttributeValue("type"); + for (Element namePart : modsName.getChildren(NAME_PART, MCRConstants.MODS_NAMESPACE)) { + String type = namePart.getAttributeValue(TYPE); String nameFragment = namePart.getText().replaceAll("\\p{Zs}+", " "); if (Objects.equals(type, "family")) { @@ -83,7 +89,7 @@ private void setFromNameParts(Element modsName) { continue; } else if (Objects.equals(type, "termsOfAddress")) { continue; - } else if ("personal".equals(modsName.getAttributeValue("type"))) { + } else if ("personal".equals(modsName.getAttributeValue(TYPE))) { setFromCombinedName(nameFragment); } else { setFamilyName(nameFragment); @@ -162,6 +168,23 @@ private String normalize(String nameFragment) { return text.trim(); } + /** + * Checks if this merger has an alternativeName-element that is + * {@link MCRNameMerger#isProbablySameAs(MCRMerger) probably the same as} the other given merger. + * @param other the other merger + * @return returns true if the other merger is also a {@link MCRNameMerger} and if this merger has + * an alternative name that matches the other + */ + public boolean hasAlternativeNameSameAs(MCRMerger other) { + if (!(other instanceof MCRNameMerger)) { + return false; + } + return this.element.getChildren(ALTERNATIVE_NAME, MCRConstants.MODS_NAMESPACE) + .stream() + .map(MCRMergerFactory::buildFrom) + .anyMatch(altMerger -> altMerger.isProbablySameAs(other)); + } + @Override public boolean isProbablySameAs(MCRMerger e) { if (!(e instanceof MCRNameMerger other)) { @@ -172,16 +195,20 @@ public boolean isProbablySameAs(MCRMerger e) { return false; } else if (this.allNames.equals(other.allNames)) { return true; - } else if (!Objects.equals(familyName, other.familyName)) { - return false; - } else if (initials.isEmpty() && other.initials.isEmpty()) { - return true; // same family name, no given name, no initals, then assumed same - } else if (!haveAtLeastOneCommon(this.initials, other.initials)) { - return false; - } else if (this.givenNames.isEmpty() || other.givenNames.isEmpty()) { - return true; + } else if (Objects.equals(familyName, other.familyName)) { + if (initials.isEmpty() && other.initials.isEmpty()) { + return true; // same family name, no given name, no initals, then assumed same + } else if (!haveAtLeastOneCommon(this.initials, other.initials)) { + return false; + } else if (this.givenNames.isEmpty() || other.givenNames.isEmpty()) { + return true; + } else { + return haveAtLeastOneCommon(this.givenNames, other.givenNames); + } } else { - return haveAtLeastOneCommon(this.givenNames, other.givenNames); + // compound name with same given names assumes same + return this.givenNames.equals(other.givenNames) && + (this.familyName.contains(other.familyName) || other.familyName.contains(this.familyName)); } } @@ -210,7 +237,7 @@ private boolean haveContradictingNameIds(Map> a, Map ids; @@ -247,6 +274,49 @@ public String toString() { return sb.toString(); } + /** + * Merges the contents of the element wrapped by the other merger into a new alternativeName element + * in the element wrapped by this merger. Should only be called if this.isProbablySameAs(other). + * The alternative name is only added if the two names are not exactly the same and if the + * alternative name doesn't yet exist in the element wrapped by this merger. + * Only the family name and given names are merged into the alternativeName element. + * @param e the other merger + */ + public void mergeAsAlternativeName(MCRMerger e) { + if (!(e instanceof MCRNameMerger other)) { + return; + } + if (this.allNames.equals(other.allNames)) { + return; + } + if (this.hasAlternativeNameSameAs(e)) { + return; + } + Element alternativeName = new Element(ALTERNATIVE_NAME, MCRConstants.MODS_NAMESPACE); + + other.element.getChildren(NAME_PART, MCRConstants.MODS_NAMESPACE) + .stream() + .filter(namePart -> "given".equals(namePart.getAttributeValue(TYPE))) + .forEach(namePart -> { + Element altGivenName = new Element(NAME_PART, MCRConstants.MODS_NAMESPACE) + .setAttribute(TYPE, "given"); + altGivenName.addContent(namePart.getText()); + alternativeName.addContent(altGivenName); + }); + + Element altFamilyName = new Element(NAME_PART, MCRConstants.MODS_NAMESPACE) + .setAttribute(TYPE, "family"); + Element familyName = other.element.getChildren(NAME_PART, MCRConstants.MODS_NAMESPACE).stream() + .filter(namePart -> "family".equals(namePart.getAttributeValue(TYPE))) + .findFirst() + .orElse(null); + altFamilyName.addContent(familyName != null ? familyName.getText() : null); + alternativeName.addContent(altFamilyName); + + this.element.addContent(alternativeName); + + } + @Override public void mergeFrom(MCRMerger other) { super.mergeFrom(other); diff --git a/mycore-mods/src/main/resources/components/mods/config/mycore.properties b/mycore-mods/src/main/resources/components/mods/config/mycore.properties index 02b32652fd..9986e7b0cd 100644 --- a/mycore-mods/src/main/resources/components/mods/config/mycore.properties +++ b/mycore-mods/src/main/resources/components/mods/config/mycore.properties @@ -151,6 +151,7 @@ MCR.MODS.Merger.relatedItem=org.mycore.mods.merger.MCRRelatedItemMerger MCR.MODS.Merger.classification=org.mycore.mods.merger.MCRCategoryMerger MCR.MODS.Merger.genre=org.mycore.mods.merger.MCRCategoryMerger MCR.MODS.Merger.typeOfResource=org.mycore.mods.merger.MCRCategoryMerger +MCR.MODS.Merger.alternativeName=org.mycore.mods.merger.MCRNameMerger MCR.MODS.Merger.default=org.mycore.mods.merger.MCRMerger # Maximum number of characters to compare from two abstracts diff --git a/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java index dd475bd8ee..2da1a54998 100644 --- a/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java +++ b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java @@ -19,6 +19,8 @@ package org.mycore.mods.merger; import java.io.IOException; +import java.util.Arrays; +import java.util.List; import org.jaxen.JaxenException; import org.jdom2.Element; @@ -69,6 +71,20 @@ public void testIsProbablySameAs() throws Exception { assertTrue(i.isProbablySameAs(a)); assertTrue(i.isProbablySameAs(d)); + MCRNameMerger j = buildNameEntry("[mods:namePart='Thorsten Müller-Doppelname']"); + assertFalse(j.isProbablySameAs(a)); + assertFalse(j.isProbablySameAs(g)); + assertFalse(j.isProbablySameAs(i)); + assertTrue(j.isProbablySameAs(f)); + + MCRNameMerger k = buildNameEntry("[mods:namePart='Thomas Müller-Doppelname']"); + assertTrue(k.isProbablySameAs(a)); + assertTrue(k.isProbablySameAs(b)); + assertTrue(k.isProbablySameAs(h)); + assertFalse(k.isProbablySameAs(c)); + assertFalse(k.isProbablySameAs(d)); + assertFalse(k.isProbablySameAs(i)); + try { new MCRNameMerger().setElement(null); fail("No name should result in NPE while creating a MCRNameMerger"); @@ -192,10 +208,76 @@ public void testPrioritizeMergeNonConflictingIDs() throws JaxenException, IOExce MCRMergerTest.test(a, b, e); } + @Test + public void testHasAlternativeNameSameAs() throws JaxenException { + Element modsNameElement = new MCRNodeBuilder() + .buildElement("mods:name[@type='personal'][mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Müller']", null, null); + + Element altNameElement = buildAlternativeNameElement("Thomas", "Meyer"); + modsNameElement.addContent(altNameElement); + + MCRNameMerger a = new MCRNameMerger(); + a.setElement(modsNameElement); + MCRNameMerger b = buildNameEntry( + "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Meyer']"); + MCRNameMerger c = buildNameEntry( + "[mods:namePart[@type='given']='T'][mods:namePart[@type='family']='Meyer']"); + MCRNameMerger d = buildNameEntry( + "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Mayer']"); + + assertTrue(a.hasAlternativeNameSameAs(b)); + assertTrue(a.hasAlternativeNameSameAs(c)); + assertFalse(a.hasAlternativeNameSameAs(d)); + assertFalse(b.hasAlternativeNameSameAs(c)); + } + + @Test + public void testMergeAsAlternativeName() throws JaxenException { + MCRNameMerger a = buildNameEntry( + "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Müller']"); + MCRNameMerger b = buildNameEntry( + "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Meyer']"); + + a.mergeAsAlternativeName(b); + + Element mergedModsName = a.element; + + List nameParts = mergedModsName.getChildren("namePart", MCRConstants.MODS_NAMESPACE); + assertEquals(2, nameParts.size()); + + assertEquals("Thomas", nameParts.getFirst().getText()); + assertEquals("Müller", nameParts.get(1).getText()); + + List alternativeNames = mergedModsName.getChildren("alternativeName", MCRConstants.MODS_NAMESPACE); + assertEquals(1, alternativeNames.size()); + Element alternativeName = alternativeNames.getFirst(); + nameParts = alternativeName.getChildren("namePart", MCRConstants.MODS_NAMESPACE); + assertEquals(2, nameParts.size()); + + assertEquals("Thomas", nameParts.getFirst().getText()); + assertEquals("Meyer", nameParts.get(1).getText()); + } + private MCRNameMerger buildNameEntry(String predicates) throws JaxenException { Element modsName = new MCRNodeBuilder().buildElement("mods:name[@type='personal']" + predicates, null, null); MCRNameMerger ne = new MCRNameMerger(); ne.setElement(modsName); return ne; } + + private Element buildAlternativeNameElement(String givenName, String familyName) { + Element altNameElement = new Element("alternativeName", MCRConstants.MODS_NAMESPACE); + + Element altFamilyNameElement = new Element("namePart", MCRConstants.MODS_NAMESPACE); + altFamilyNameElement.setAttribute("type", "family"); + altFamilyNameElement.setText(familyName); + + Element altGivenNameElement = new Element("namePart", MCRConstants.MODS_NAMESPACE); + altGivenNameElement.setAttribute("type", "given"); + altGivenNameElement.setText(givenName); + + altNameElement.setContent(Arrays.asList(altFamilyNameElement, altGivenNameElement)); + + return altNameElement; + } } diff --git a/mycore-mods/src/test/resources/mycore.properties b/mycore-mods/src/test/resources/mycore.properties index e09940b91a..ba4aef0e05 100644 --- a/mycore-mods/src/test/resources/mycore.properties +++ b/mycore-mods/src/test/resources/mycore.properties @@ -61,3 +61,6 @@ MCR.Category.XPathMapping.Pattern.genre-with-host-genre=mods:genre[substring-aft MCR.Category.XPathMapping.Pattern.language-term=mods:language/mods:languageTerm[@authority='{0}' and @type='{1}' and text()='{2}'] MCR.Category.XPathMapping.Pattern.title=mods:titleInfo/mods:title MCR.Category.XPathMapping.Pattern.title-contains=mods:titleInfo[mods:title[contains(text(), '{0}')]] + +# MCRNameMergerTest#testHasAlternativeNameSameAs() +MCR.MODS.Merger.alternativeName=org.mycore.mods.merger.MCRNameMerger From 1fde2f9885b98c8ae0ac08b7d199c1edd3b57601 Mon Sep 17 00:00:00 2001 From: Eva Roddeck Date: Thu, 21 Aug 2025 14:22:02 +0200 Subject: [PATCH 2/7] MCR-3441 fixed comment --- .../src/main/java/org/mycore/mods/merger/MCRNameMerger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java index df8fe474b3..75ea978275 100644 --- a/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java +++ b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java @@ -206,7 +206,7 @@ public boolean isProbablySameAs(MCRMerger e) { return haveAtLeastOneCommon(this.givenNames, other.givenNames); } } else { - // compound name with same given names assumes same + // double-barreled name with same given names assumes same return this.givenNames.equals(other.givenNames) && (this.familyName.contains(other.familyName) || other.familyName.contains(this.familyName)); } From e2184c6094e09d95e3dfc10451b2332ccb1feb14 Mon Sep 17 00:00:00 2001 From: Eva Roddeck Date: Thu, 21 Aug 2025 14:54:58 +0200 Subject: [PATCH 3/7] MCR-3441 checkstyle --- .../test/java/org/mycore/mods/merger/MCRNameMergerTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java index 2da1a54998..fc40609721 100644 --- a/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java +++ b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java @@ -211,7 +211,8 @@ public void testPrioritizeMergeNonConflictingIDs() throws JaxenException, IOExce @Test public void testHasAlternativeNameSameAs() throws JaxenException { Element modsNameElement = new MCRNodeBuilder() - .buildElement("mods:name[@type='personal'][mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Müller']", null, null); + .buildElement("mods:name[@type='personal'][mods:namePart[@type='given']='Thomas']" + + "[mods:namePart[@type='family']='Müller']", null, null); Element altNameElement = buildAlternativeNameElement("Thomas", "Meyer"); modsNameElement.addContent(altNameElement); From bb532f048680871b1c6cadf8eae7d130c797a73a Mon Sep 17 00:00:00 2001 From: Eva Roddeck Date: Fri, 26 Sep 2025 08:35:42 +0200 Subject: [PATCH 4/7] MCR-3441 MCRNameMerger new extending class --- .../mods/merger/MCRModspersonNameMerger.java | 113 ++++++++++++++ .../org/mycore/mods/merger/MCRNameMerger.java | 36 ++--- .../components/mods/config/mycore.properties | 2 +- .../merger/MCRModspersonNameMergerTest.java | 145 ++++++++++++++++++ .../mycore/mods/merger/MCRNameMergerTest.java | 83 ---------- .../src/test/resources/mycore.properties | 4 +- 6 files changed, 277 insertions(+), 106 deletions(-) create mode 100644 mycore-mods/src/main/java/org/mycore/mods/merger/MCRModspersonNameMerger.java create mode 100644 mycore-mods/src/test/java/org/mycore/mods/merger/MCRModspersonNameMergerTest.java diff --git a/mycore-mods/src/main/java/org/mycore/mods/merger/MCRModspersonNameMerger.java b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRModspersonNameMerger.java new file mode 100644 index 0000000000..d20d4979cf --- /dev/null +++ b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRModspersonNameMerger.java @@ -0,0 +1,113 @@ +package org.mycore.mods.merger; + +import java.util.Objects; + +import org.jdom2.Element; +import org.mycore.common.MCRConstants; + +/** + * Compares and merges mods:name elements. Extends MCRNameMerger and provides + * additional functionality: + *
    + *
  1. It can handle mods:alternativeName and considers them when determining + * if two names are probably the same.
  2. + *
  3. If first name is the same and one of the family names contains the other, + * the names are considered as "probablySameAs". + * This takes double-barreled names (Doppelnamen) into account.
  4. + *
+ */ +public class MCRModspersonNameMerger extends MCRNameMerger { + + private static final String ALTERNATIVE_NAME = "alternativeName"; + + private static final String TYPE = "type"; + + private static final String NAME_PART = "namePart"; + + @Override + public boolean isProbablySameAs(MCRMerger e) { + if (!(e instanceof MCRNameMerger other)) { + return false; + } + + if (haveContradictingNameIds(this.nameIds, other.nameIds)) { + return false; + } else if (this.allNames.equals(other.allNames)) { + return true; + } else if (Objects.equals(familyName, other.familyName)) { + if (initials.isEmpty() && other.initials.isEmpty()) { + return true; // same family name, no given name, no initals, then assumed same + } else if (!haveAtLeastOneCommon(this.initials, other.initials)) { + return false; + } else if (this.givenNames.isEmpty() || other.givenNames.isEmpty()) { + return true; + } else { + return haveAtLeastOneCommon(this.givenNames, other.givenNames); + } + } else { + // double-barreled name with same given names assumes same + return this.givenNames.equals(other.givenNames) && + (this.familyName.contains(other.familyName) || other.familyName.contains(this.familyName)); + } + } + + /** + * Checks if this merger has an alternativeName-element that is + * {@link MCRNameMerger#isProbablySameAs(MCRMerger) probably the same as} the other given merger. + * @param other the other merger + * @return returns true if the other merger is also a {@link MCRNameMerger} and if this merger has + * an alternative name that matches the other + */ + public boolean hasAlternativeNameSameAs(MCRMerger other) { + if (!(other instanceof MCRNameMerger)) { + return false; + } + return this.element.getChildren(ALTERNATIVE_NAME, MCRConstants.MODS_NAMESPACE) + .stream() + .map(MCRMergerFactory::buildFrom) + .anyMatch(altMerger -> altMerger.isProbablySameAs(other)); + } + + /** + * Merges the contents of the element wrapped by the other merger into a new alternativeName element + * in the element wrapped by this merger. Should only be called if this.isProbablySameAs(other). + * The alternative name is only added if the two names are not exactly the same and if the + * alternative name doesn't yet exist in the element wrapped by this merger. + * Only the family name and given names are merged into the alternativeName element. + * @param e the other merger + */ + public void mergeAsAlternativeName(MCRMerger e) { + if (!(e instanceof MCRNameMerger other)) { + return; + } + if (this.allNames.equals(other.allNames)) { + return; + } + if (this.hasAlternativeNameSameAs(e)) { + return; + } + Element alternativeName = new Element(ALTERNATIVE_NAME, MCRConstants.MODS_NAMESPACE); + + other.element.getChildren(NAME_PART, MCRConstants.MODS_NAMESPACE) + .stream() + .filter(namePart -> "given".equals(namePart.getAttributeValue(TYPE))) + .forEach(namePart -> { + Element altGivenName = new Element(NAME_PART, MCRConstants.MODS_NAMESPACE) + .setAttribute(TYPE, "given"); + altGivenName.addContent(namePart.getText()); + alternativeName.addContent(altGivenName); + }); + + Element altFamilyName = new Element(NAME_PART, MCRConstants.MODS_NAMESPACE) + .setAttribute(TYPE, "family"); + Element familyName = other.element.getChildren(NAME_PART, MCRConstants.MODS_NAMESPACE).stream() + .filter(namePart -> "family".equals(namePart.getAttributeValue(TYPE))) + .findFirst() + .orElse(null); + altFamilyName.addContent(familyName != null ? familyName.getText() : null); + alternativeName.addContent(altFamilyName); + + this.element.addContent(alternativeName); + + } +} diff --git a/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java index 75ea978275..e50339ee06 100644 --- a/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java +++ b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java @@ -44,15 +44,15 @@ public class MCRNameMerger extends MCRMerger { private static final String NAME_PART = "namePart"; - private String familyName; + protected String familyName; - private Set givenNames = new HashSet<>(); + protected Set givenNames = new HashSet<>(); - private Set initials = new HashSet<>(); + protected Set initials = new HashSet<>(); - private Set allNames = new HashSet<>(); + protected Set allNames = new HashSet<>(); - private Map> nameIds = new HashMap<>(); + protected Map> nameIds = new HashMap<>(); @Override public void setElement(Element element) { @@ -195,30 +195,26 @@ public boolean isProbablySameAs(MCRMerger e) { return false; } else if (this.allNames.equals(other.allNames)) { return true; - } else if (Objects.equals(familyName, other.familyName)) { - if (initials.isEmpty() && other.initials.isEmpty()) { - return true; // same family name, no given name, no initals, then assumed same - } else if (!haveAtLeastOneCommon(this.initials, other.initials)) { - return false; - } else if (this.givenNames.isEmpty() || other.givenNames.isEmpty()) { - return true; - } else { - return haveAtLeastOneCommon(this.givenNames, other.givenNames); - } + } else if (!Objects.equals(familyName, other.familyName)) { + return false; + } else if (initials.isEmpty() && other.initials.isEmpty()) { + return true; // same family name, no given name, no initals, then assumed same + } else if (!haveAtLeastOneCommon(this.initials, other.initials)) { + return false; + } else if (this.givenNames.isEmpty() || other.givenNames.isEmpty()) { + return true; } else { - // double-barreled name with same given names assumes same - return this.givenNames.equals(other.givenNames) && - (this.familyName.contains(other.familyName) || other.familyName.contains(this.familyName)); + return haveAtLeastOneCommon(this.givenNames, other.givenNames); } } - private boolean haveAtLeastOneCommon(Set a, Set b) { + protected boolean haveAtLeastOneCommon(Set a, Set b) { Set intersection = new HashSet<>(a); intersection.retainAll(b); return !intersection.isEmpty(); } - private boolean haveContradictingNameIds(Map> a, Map> b) { + protected boolean haveContradictingNameIds(Map> a, Map> b) { Set intersection; boolean foundContradictingNameIds = false; for (String type : a.keySet()) { diff --git a/mycore-mods/src/main/resources/components/mods/config/mycore.properties b/mycore-mods/src/main/resources/components/mods/config/mycore.properties index 9986e7b0cd..bc56fae78e 100644 --- a/mycore-mods/src/main/resources/components/mods/config/mycore.properties +++ b/mycore-mods/src/main/resources/components/mods/config/mycore.properties @@ -151,7 +151,7 @@ MCR.MODS.Merger.relatedItem=org.mycore.mods.merger.MCRRelatedItemMerger MCR.MODS.Merger.classification=org.mycore.mods.merger.MCRCategoryMerger MCR.MODS.Merger.genre=org.mycore.mods.merger.MCRCategoryMerger MCR.MODS.Merger.typeOfResource=org.mycore.mods.merger.MCRCategoryMerger -MCR.MODS.Merger.alternativeName=org.mycore.mods.merger.MCRNameMerger +MCR.MODS.Merger.alternativeName=org.mycore.mods.merger.MCRModspersonNameMerger MCR.MODS.Merger.default=org.mycore.mods.merger.MCRMerger # Maximum number of characters to compare from two abstracts diff --git a/mycore-mods/src/test/java/org/mycore/mods/merger/MCRModspersonNameMergerTest.java b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRModspersonNameMergerTest.java new file mode 100644 index 0000000000..bcd351521d --- /dev/null +++ b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRModspersonNameMergerTest.java @@ -0,0 +1,145 @@ +package org.mycore.mods.merger; + +import org.jaxen.JaxenException; +import org.jdom2.Element; +import org.junit.jupiter.api.Test; +import org.mycore.common.MCRConstants; +import org.mycore.common.xml.MCRNodeBuilder; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +public class MCRModspersonNameMergerTest { + + @Test + public void testIsProbablySameAs() throws Exception { + MCRNameMerger a = buildNameEntry("[mods:namePart='Thomas Müller']"); + MCRNameMerger b = buildNameEntry("[mods:namePart='thomas Mueller']"); + assertTrue(a.isProbablySameAs(b)); + + MCRNameMerger c = buildNameEntry("[mods:namePart='Muller, T.']"); + assertTrue(a.isProbablySameAs(c)); + + MCRNameMerger d = buildNameEntry("[mods:namePart='Mueller, T']"); + assertTrue(a.isProbablySameAs(d)); + + MCRNameMerger e = buildNameEntry("[mods:namePart='Müller, Egon']"); + assertFalse(a.isProbablySameAs(e)); + + MCRNameMerger f = buildNameEntry("[mods:namePart='Thorsten Mueller']"); + assertTrue(c.isProbablySameAs(f)); + assertFalse(a.isProbablySameAs(f)); + + MCRNameMerger g = buildNameEntry("[mods:namePart='Thorsten Egon Mueller']"); + assertTrue(e.isProbablySameAs(g)); + assertTrue(f.isProbablySameAs(g)); + + MCRNameMerger h = buildNameEntry( + "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Müller']"); + assertTrue(h.isProbablySameAs(a)); + assertTrue(h.isProbablySameAs(d)); + + MCRNameMerger i = buildNameEntry("[mods:namePart[@type='given']='T.'][mods:namePart[@type='family']='Müller']" + + "[mods:namePart[@type='termsOfAddress']='Jun.']"); + assertTrue(i.isProbablySameAs(h)); + assertTrue(i.isProbablySameAs(a)); + assertTrue(i.isProbablySameAs(d)); + + MCRNameMerger j = buildNameEntry("[mods:namePart='Thorsten Müller-Doppelname']"); + assertFalse(j.isProbablySameAs(a)); + assertFalse(j.isProbablySameAs(g)); + assertFalse(j.isProbablySameAs(i)); + assertTrue(j.isProbablySameAs(f)); + + MCRNameMerger k = buildNameEntry("[mods:namePart='Thomas Müller-Doppelname']"); + assertTrue(k.isProbablySameAs(a)); + assertTrue(k.isProbablySameAs(b)); + assertTrue(k.isProbablySameAs(h)); + assertFalse(k.isProbablySameAs(c)); + assertFalse(k.isProbablySameAs(d)); + assertFalse(k.isProbablySameAs(i)); + + try { + new MCRNameMerger().setElement(null); + fail("No name should result in NPE while creating a MCRNameMerger"); + } catch (NullPointerException ex) { + // exception excepted + } + } + + @Test + public void testHasAlternativeNameSameAs() throws JaxenException { + Element modsNameElement = new MCRNodeBuilder() + .buildElement("mods:name[@type='personal'][mods:namePart[@type='given']='Thomas']" + + "[mods:namePart[@type='family']='Müller']", null, null); + + Element altNameElement = buildAlternativeNameElement("Thomas", "Meyer"); + modsNameElement.addContent(altNameElement); + + MCRNameMerger a = new MCRNameMerger(); + a.setElement(modsNameElement); + MCRNameMerger b = buildNameEntry( + "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Meyer']"); + MCRNameMerger c = buildNameEntry( + "[mods:namePart[@type='given']='T'][mods:namePart[@type='family']='Meyer']"); + MCRNameMerger d = buildNameEntry( + "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Mayer']"); + + assertTrue(a.hasAlternativeNameSameAs(b)); + assertTrue(a.hasAlternativeNameSameAs(c)); + assertFalse(a.hasAlternativeNameSameAs(d)); + assertFalse(b.hasAlternativeNameSameAs(c)); + } + + @Test + public void testMergeAsAlternativeName() throws JaxenException { + MCRNameMerger a = buildNameEntry( + "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Müller']"); + MCRNameMerger b = buildNameEntry( + "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Meyer']"); + + a.mergeAsAlternativeName(b); + + Element mergedModsName = a.element; + + List nameParts = mergedModsName.getChildren("namePart", MCRConstants.MODS_NAMESPACE); + assertEquals(2, nameParts.size()); + + assertEquals("Thomas", nameParts.getFirst().getText()); + assertEquals("Müller", nameParts.get(1).getText()); + + List alternativeNames = mergedModsName.getChildren("alternativeName", MCRConstants.MODS_NAMESPACE); + assertEquals(1, alternativeNames.size()); + Element alternativeName = alternativeNames.getFirst(); + nameParts = alternativeName.getChildren("namePart", MCRConstants.MODS_NAMESPACE); + assertEquals(2, nameParts.size()); + + assertEquals("Thomas", nameParts.getFirst().getText()); + assertEquals("Meyer", nameParts.get(1).getText()); + } + + private MCRNameMerger buildNameEntry(String predicates) throws JaxenException { + Element modsName = new MCRNodeBuilder().buildElement("mods:name[@type='personal']" + predicates, null, null); + MCRNameMerger ne = new MCRNameMerger(); + ne.setElement(modsName); + return ne; + } + + private Element buildAlternativeNameElement(String givenName, String familyName) { + Element altNameElement = new Element("alternativeName", MCRConstants.MODS_NAMESPACE); + + Element altFamilyNameElement = new Element("namePart", MCRConstants.MODS_NAMESPACE); + altFamilyNameElement.setAttribute("type", "family"); + altFamilyNameElement.setText(familyName); + + Element altGivenNameElement = new Element("namePart", MCRConstants.MODS_NAMESPACE); + altGivenNameElement.setAttribute("type", "given"); + altGivenNameElement.setText(givenName); + + altNameElement.setContent(Arrays.asList(altFamilyNameElement, altGivenNameElement)); + + return altNameElement; + } +} diff --git a/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java index fc40609721..dd475bd8ee 100644 --- a/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java +++ b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java @@ -19,8 +19,6 @@ package org.mycore.mods.merger; import java.io.IOException; -import java.util.Arrays; -import java.util.List; import org.jaxen.JaxenException; import org.jdom2.Element; @@ -71,20 +69,6 @@ public void testIsProbablySameAs() throws Exception { assertTrue(i.isProbablySameAs(a)); assertTrue(i.isProbablySameAs(d)); - MCRNameMerger j = buildNameEntry("[mods:namePart='Thorsten Müller-Doppelname']"); - assertFalse(j.isProbablySameAs(a)); - assertFalse(j.isProbablySameAs(g)); - assertFalse(j.isProbablySameAs(i)); - assertTrue(j.isProbablySameAs(f)); - - MCRNameMerger k = buildNameEntry("[mods:namePart='Thomas Müller-Doppelname']"); - assertTrue(k.isProbablySameAs(a)); - assertTrue(k.isProbablySameAs(b)); - assertTrue(k.isProbablySameAs(h)); - assertFalse(k.isProbablySameAs(c)); - assertFalse(k.isProbablySameAs(d)); - assertFalse(k.isProbablySameAs(i)); - try { new MCRNameMerger().setElement(null); fail("No name should result in NPE while creating a MCRNameMerger"); @@ -208,77 +192,10 @@ public void testPrioritizeMergeNonConflictingIDs() throws JaxenException, IOExce MCRMergerTest.test(a, b, e); } - @Test - public void testHasAlternativeNameSameAs() throws JaxenException { - Element modsNameElement = new MCRNodeBuilder() - .buildElement("mods:name[@type='personal'][mods:namePart[@type='given']='Thomas']" - + "[mods:namePart[@type='family']='Müller']", null, null); - - Element altNameElement = buildAlternativeNameElement("Thomas", "Meyer"); - modsNameElement.addContent(altNameElement); - - MCRNameMerger a = new MCRNameMerger(); - a.setElement(modsNameElement); - MCRNameMerger b = buildNameEntry( - "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Meyer']"); - MCRNameMerger c = buildNameEntry( - "[mods:namePart[@type='given']='T'][mods:namePart[@type='family']='Meyer']"); - MCRNameMerger d = buildNameEntry( - "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Mayer']"); - - assertTrue(a.hasAlternativeNameSameAs(b)); - assertTrue(a.hasAlternativeNameSameAs(c)); - assertFalse(a.hasAlternativeNameSameAs(d)); - assertFalse(b.hasAlternativeNameSameAs(c)); - } - - @Test - public void testMergeAsAlternativeName() throws JaxenException { - MCRNameMerger a = buildNameEntry( - "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Müller']"); - MCRNameMerger b = buildNameEntry( - "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Meyer']"); - - a.mergeAsAlternativeName(b); - - Element mergedModsName = a.element; - - List nameParts = mergedModsName.getChildren("namePart", MCRConstants.MODS_NAMESPACE); - assertEquals(2, nameParts.size()); - - assertEquals("Thomas", nameParts.getFirst().getText()); - assertEquals("Müller", nameParts.get(1).getText()); - - List alternativeNames = mergedModsName.getChildren("alternativeName", MCRConstants.MODS_NAMESPACE); - assertEquals(1, alternativeNames.size()); - Element alternativeName = alternativeNames.getFirst(); - nameParts = alternativeName.getChildren("namePart", MCRConstants.MODS_NAMESPACE); - assertEquals(2, nameParts.size()); - - assertEquals("Thomas", nameParts.getFirst().getText()); - assertEquals("Meyer", nameParts.get(1).getText()); - } - private MCRNameMerger buildNameEntry(String predicates) throws JaxenException { Element modsName = new MCRNodeBuilder().buildElement("mods:name[@type='personal']" + predicates, null, null); MCRNameMerger ne = new MCRNameMerger(); ne.setElement(modsName); return ne; } - - private Element buildAlternativeNameElement(String givenName, String familyName) { - Element altNameElement = new Element("alternativeName", MCRConstants.MODS_NAMESPACE); - - Element altFamilyNameElement = new Element("namePart", MCRConstants.MODS_NAMESPACE); - altFamilyNameElement.setAttribute("type", "family"); - altFamilyNameElement.setText(familyName); - - Element altGivenNameElement = new Element("namePart", MCRConstants.MODS_NAMESPACE); - altGivenNameElement.setAttribute("type", "given"); - altGivenNameElement.setText(givenName); - - altNameElement.setContent(Arrays.asList(altFamilyNameElement, altGivenNameElement)); - - return altNameElement; - } } diff --git a/mycore-mods/src/test/resources/mycore.properties b/mycore-mods/src/test/resources/mycore.properties index ba4aef0e05..cb30d939ec 100644 --- a/mycore-mods/src/test/resources/mycore.properties +++ b/mycore-mods/src/test/resources/mycore.properties @@ -62,5 +62,5 @@ MCR.Category.XPathMapping.Pattern.language-term=mods:language/mods:languageTerm[ MCR.Category.XPathMapping.Pattern.title=mods:titleInfo/mods:title MCR.Category.XPathMapping.Pattern.title-contains=mods:titleInfo[mods:title[contains(text(), '{0}')]] -# MCRNameMergerTest#testHasAlternativeNameSameAs() -MCR.MODS.Merger.alternativeName=org.mycore.mods.merger.MCRNameMerger +# MCRModspersonNameMergerTest#testHasAlternativeNameSameAs() +MCR.MODS.Merger.alternativeName=org.mycore.mods.merger.MCRModspersonNameMerger From 96f5ed510da9b6fe2fd951c0c3d092373f3b4278 Mon Sep 17 00:00:00 2001 From: Eva Roddeck Date: Fri, 26 Sep 2025 08:54:11 +0200 Subject: [PATCH 5/7] MCR-3441 MCRNameMerger fix unit test --- .../merger/MCRModspersonNameMergerTest.java | 18 +++++++++--------- .../mycore/mods/merger/MCRNameMergerTest.java | 9 ++------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/mycore-mods/src/test/java/org/mycore/mods/merger/MCRModspersonNameMergerTest.java b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRModspersonNameMergerTest.java index bcd351521d..38e15f1a03 100644 --- a/mycore-mods/src/test/java/org/mycore/mods/merger/MCRModspersonNameMergerTest.java +++ b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRModspersonNameMergerTest.java @@ -5,12 +5,17 @@ import org.junit.jupiter.api.Test; import org.mycore.common.MCRConstants; import org.mycore.common.xml.MCRNodeBuilder; +import org.mycore.test.MyCoReTest; import java.util.Arrays; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; +@MyCoReTest public class MCRModspersonNameMergerTest { @Test @@ -61,12 +66,7 @@ public void testIsProbablySameAs() throws Exception { assertFalse(k.isProbablySameAs(d)); assertFalse(k.isProbablySameAs(i)); - try { - new MCRNameMerger().setElement(null); - fail("No name should result in NPE while creating a MCRNameMerger"); - } catch (NullPointerException ex) { - // exception excepted - } + assertThrows(NullPointerException.class, () -> new MCRModspersonNameMerger().setElement(null)); } @Test @@ -120,9 +120,9 @@ public void testMergeAsAlternativeName() throws JaxenException { assertEquals("Meyer", nameParts.get(1).getText()); } - private MCRNameMerger buildNameEntry(String predicates) throws JaxenException { + private MCRModspersonNameMerger buildNameEntry(String predicates) throws JaxenException { Element modsName = new MCRNodeBuilder().buildElement("mods:name[@type='personal']" + predicates, null, null); - MCRNameMerger ne = new MCRNameMerger(); + MCRModspersonNameMerger ne = new MCRModspersonNameMerger(); ne.setElement(modsName); return ne; } diff --git a/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java index dd475bd8ee..9b5c32603f 100644 --- a/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java +++ b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRNameMergerTest.java @@ -30,7 +30,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertThrows; @MyCoReTest public class MCRNameMergerTest { @@ -69,12 +69,7 @@ public void testIsProbablySameAs() throws Exception { assertTrue(i.isProbablySameAs(a)); assertTrue(i.isProbablySameAs(d)); - try { - new MCRNameMerger().setElement(null); - fail("No name should result in NPE while creating a MCRNameMerger"); - } catch (NullPointerException ex) { - // exception excepted - } + assertThrows(NullPointerException.class, () -> new MCRNameMerger().setElement(null)); } @Test From 4f40ca8aa6cecc9844eae4521a05903018374727 Mon Sep 17 00:00:00 2001 From: Eva Roddeck Date: Fri, 26 Sep 2025 09:38:04 +0200 Subject: [PATCH 6/7] MCR-3441 MCRNameMerger remove additional methods from MCRNameMerger --- .../mods/merger/MCRModspersonNameMerger.java | 1 - .../org/mycore/mods/merger/MCRNameMerger.java | 60 ------------------- .../merger/MCRModspersonNameMergerTest.java | 12 ++-- 3 files changed, 6 insertions(+), 67 deletions(-) diff --git a/mycore-mods/src/main/java/org/mycore/mods/merger/MCRModspersonNameMerger.java b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRModspersonNameMerger.java index d20d4979cf..bf32655fea 100644 --- a/mycore-mods/src/main/java/org/mycore/mods/merger/MCRModspersonNameMerger.java +++ b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRModspersonNameMerger.java @@ -108,6 +108,5 @@ public void mergeAsAlternativeName(MCRMerger e) { alternativeName.addContent(altFamilyName); this.element.addContent(alternativeName); - } } diff --git a/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java index e50339ee06..054409570e 100644 --- a/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java +++ b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java @@ -168,23 +168,6 @@ private String normalize(String nameFragment) { return text.trim(); } - /** - * Checks if this merger has an alternativeName-element that is - * {@link MCRNameMerger#isProbablySameAs(MCRMerger) probably the same as} the other given merger. - * @param other the other merger - * @return returns true if the other merger is also a {@link MCRNameMerger} and if this merger has - * an alternative name that matches the other - */ - public boolean hasAlternativeNameSameAs(MCRMerger other) { - if (!(other instanceof MCRNameMerger)) { - return false; - } - return this.element.getChildren(ALTERNATIVE_NAME, MCRConstants.MODS_NAMESPACE) - .stream() - .map(MCRMergerFactory::buildFrom) - .anyMatch(altMerger -> altMerger.isProbablySameAs(other)); - } - @Override public boolean isProbablySameAs(MCRMerger e) { if (!(e instanceof MCRNameMerger other)) { @@ -270,49 +253,6 @@ public String toString() { return sb.toString(); } - /** - * Merges the contents of the element wrapped by the other merger into a new alternativeName element - * in the element wrapped by this merger. Should only be called if this.isProbablySameAs(other). - * The alternative name is only added if the two names are not exactly the same and if the - * alternative name doesn't yet exist in the element wrapped by this merger. - * Only the family name and given names are merged into the alternativeName element. - * @param e the other merger - */ - public void mergeAsAlternativeName(MCRMerger e) { - if (!(e instanceof MCRNameMerger other)) { - return; - } - if (this.allNames.equals(other.allNames)) { - return; - } - if (this.hasAlternativeNameSameAs(e)) { - return; - } - Element alternativeName = new Element(ALTERNATIVE_NAME, MCRConstants.MODS_NAMESPACE); - - other.element.getChildren(NAME_PART, MCRConstants.MODS_NAMESPACE) - .stream() - .filter(namePart -> "given".equals(namePart.getAttributeValue(TYPE))) - .forEach(namePart -> { - Element altGivenName = new Element(NAME_PART, MCRConstants.MODS_NAMESPACE) - .setAttribute(TYPE, "given"); - altGivenName.addContent(namePart.getText()); - alternativeName.addContent(altGivenName); - }); - - Element altFamilyName = new Element(NAME_PART, MCRConstants.MODS_NAMESPACE) - .setAttribute(TYPE, "family"); - Element familyName = other.element.getChildren(NAME_PART, MCRConstants.MODS_NAMESPACE).stream() - .filter(namePart -> "family".equals(namePart.getAttributeValue(TYPE))) - .findFirst() - .orElse(null); - altFamilyName.addContent(familyName != null ? familyName.getText() : null); - alternativeName.addContent(altFamilyName); - - this.element.addContent(alternativeName); - - } - @Override public void mergeFrom(MCRMerger other) { super.mergeFrom(other); diff --git a/mycore-mods/src/test/java/org/mycore/mods/merger/MCRModspersonNameMergerTest.java b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRModspersonNameMergerTest.java index 38e15f1a03..fbb5a608be 100644 --- a/mycore-mods/src/test/java/org/mycore/mods/merger/MCRModspersonNameMergerTest.java +++ b/mycore-mods/src/test/java/org/mycore/mods/merger/MCRModspersonNameMergerTest.java @@ -78,13 +78,13 @@ public void testHasAlternativeNameSameAs() throws JaxenException { Element altNameElement = buildAlternativeNameElement("Thomas", "Meyer"); modsNameElement.addContent(altNameElement); - MCRNameMerger a = new MCRNameMerger(); + MCRModspersonNameMerger a = new MCRModspersonNameMerger(); a.setElement(modsNameElement); - MCRNameMerger b = buildNameEntry( + MCRModspersonNameMerger b = buildNameEntry( "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Meyer']"); - MCRNameMerger c = buildNameEntry( + MCRModspersonNameMerger c = buildNameEntry( "[mods:namePart[@type='given']='T'][mods:namePart[@type='family']='Meyer']"); - MCRNameMerger d = buildNameEntry( + MCRModspersonNameMerger d = buildNameEntry( "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Mayer']"); assertTrue(a.hasAlternativeNameSameAs(b)); @@ -95,9 +95,9 @@ public void testHasAlternativeNameSameAs() throws JaxenException { @Test public void testMergeAsAlternativeName() throws JaxenException { - MCRNameMerger a = buildNameEntry( + MCRModspersonNameMerger a = buildNameEntry( "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Müller']"); - MCRNameMerger b = buildNameEntry( + MCRModspersonNameMerger b = buildNameEntry( "[mods:namePart[@type='given']='Thomas'][mods:namePart[@type='family']='Meyer']"); a.mergeAsAlternativeName(b); From 3f3519285726ffc1c687f78407cd3e5fd5a27e06 Mon Sep 17 00:00:00 2001 From: Eva Roddeck Date: Tue, 7 Oct 2025 14:42:36 +0200 Subject: [PATCH 7/7] MCR-3441 MCRNameMerger: fix pmd --- .../src/main/java/org/mycore/mods/merger/MCRNameMerger.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java index 054409570e..b6fc871092 100644 --- a/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java +++ b/mycore-mods/src/main/java/org/mycore/mods/merger/MCRNameMerger.java @@ -37,9 +37,7 @@ * @author Frank Lützenkirchen */ public class MCRNameMerger extends MCRMerger { - - private static final String ALTERNATIVE_NAME = "alternativeName"; - + private static final String TYPE = "type"; private static final String NAME_PART = "namePart";