Coverage Summary for Class: DestinationReferenceSelector (org.kitodo.production.metadata.copier)
Class |
Class, %
|
Method, %
|
Line, %
|
DestinationReferenceSelector |
0%
(0/1)
|
0%
(0/3)
|
0%
(0/17)
|
/*
* (c) Kitodo. Key to digital objects e. V. <contact@kitodo.org>
*
* This file is part of the Kitodo project.
*
* It is licensed under GNU General Public License version 3 or later.
*
* For the full copyright and license information, please read the
* GPL3-License.txt file that was distributed with this source code.
*/
package org.kitodo.production.metadata.copier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.configuration.ConfigurationException;
import org.kitodo.production.helper.metadata.legacytypeimplementations.LegacyDocStructHelperInterface;
/**
* A DestinationReferenceSelector provides methods to retrieve document
* structure nodes relative to the respective document structure that the result
* of the operation shall be written to for reading from them.
*/
public class DestinationReferenceSelector extends DataSelector {
/**
* Regular expression pattern to parse the path string.
*/
private static final Pattern DESTINATION_REFERENCE_SELECTOR_SCHEME = Pattern
.compile(Pattern.quote(RESPECTIVE_DESTINATION_REFERENCE) + "(\\d+)([" + METADATA_PATH_SEPARATOR
+ METADATA_SEPARATOR + "].*)");
/**
* Hierarchical level to retrieve (0 references the top level).
*/
private final int index;
/**
* A further selector to read data relative to the resolved result of this
* selector.
*/
private final MetadataSelector nextSelector;
/**
* Creates a new DestinationReferenceSelector.
*
* @param path
* reference to resolve
* @throws ConfigurationException
* if the path is syntactically wrong
*/
public DestinationReferenceSelector(String path) throws ConfigurationException {
Matcher pathSplitter = DESTINATION_REFERENCE_SELECTOR_SCHEME.matcher(path);
if (!pathSplitter.find()) {
throw new ConfigurationException("Invalid destination reference selector: " + path);
}
this.index = Integer.parseInt(pathSplitter.group(1));
this.nextSelector = MetadataSelector.create(pathSplitter.group(2));
}
/**
* Returns the document structure level indicated by the index form the
* respective destination path.
*
* @see org.kitodo.production.metadata.copier.DataSelector#findIn(org.kitodo.production.metadata.copier.CopierData)
*/
@Override
public String findIn(CopierData data) {
LegacyDocStructHelperInterface currentLevel = data.getLogicalDocStruct();
MetadataSelector destination = data.getDestination();
for (int descend = index; descend > 0; descend--) {
if (!(destination instanceof MetadataPathSelector)) {
return null;
}
int childReference = ((MetadataPathSelector) destination).getIndex();
currentLevel = currentLevel.getAllChildren().get(childReference);
destination = ((MetadataPathSelector) destination).getSelector();
}
return nextSelector.findIn(currentLevel);
}
}