Coverage Summary for Class: ConfigProject (org.kitodo.config)
Class |
Class, %
|
Method, %
|
Line, %
|
ConfigProject |
100%
(1/1)
|
78,9%
(15/19)
|
76,1%
(86/113)
|
/*
* (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.config;
import de.unigoettingen.sub.search.opac.ConfigOpac;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.faces.model.SelectItem;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.kitodo.config.enums.KitodoConfigFile;
import org.kitodo.exceptions.DoctypeMissingException;
import org.kitodo.production.process.field.AdditionalField;
public class ConfigProject {
private static final Logger logger = LogManager.getLogger(ConfigProject.class);
private XMLConfiguration config;
private String projectTitle;
private static final String CREATE_NEW_PROCESS = "createNewProcess";
private static final String ITEM_LIST = CREATE_NEW_PROCESS + ".itemlist";
private static final String ITEM_LIST_ITEM = ITEM_LIST + ".item";
private static final String ITEM_LIST_PROCESS_TITLE = ITEM_LIST + ".processtitle";
/**
* Constructor for ConfigProject.
*
* @param projectTitle
* for which configuration is going to be read
* @throws IOException
* if config file not found
*/
public ConfigProject(String projectTitle) throws IOException {
KitodoConfigFile configFile = KitodoConfigFile.PROJECT_CONFIGURATION;
if (!configFile.exists()) {
throw new IOException("File not found: " + configFile.getAbsolutePath());
}
try {
this.config = new XMLConfiguration(configFile.getAbsolutePath());
} catch (ConfigurationException e) {
logger.error(e.getMessage(), e);
this.config = new XMLConfiguration();
}
this.config.setListDelimiter('&');
this.config.setReloadingStrategy(new FileChangedReloadingStrategy());
int countProjects = this.config.getMaxIndex("project");
for (int i = 0; i <= countProjects; i++) {
String title = this.config.getString("project(" + i + ")[@name]");
if (title.equals(projectTitle)) {
this.projectTitle = "project(" + i + ").";
break;
}
}
try {
this.config.getBoolean(this.projectTitle + "createNewProcess.opac[@use]");
} catch (NoSuchElementException e) {
this.projectTitle = "project(0).";
}
}
/**
* Get doc type.
*
* @return value of docType
*/
public String getDocType() throws DoctypeMissingException {
try {
return getParamString(CREATE_NEW_PROCESS + ".defaultdoctype", ConfigOpac.getAllDoctypes().get(0).getTitle());
} catch (IndexOutOfBoundsException e) {
throw new DoctypeMissingException("No doctypes configured in kitodo_opac.xml");
}
}
/**
* Get use opac.
*
* @return value of useOpac
*/
public boolean isUseOpac() {
return getParamBoolean(CREATE_NEW_PROCESS + ".opac[@use]");
}
/**
* Get use templates.
*
* @return value of useTemplates
*/
public boolean isUseTemplates() {
return getParamBoolean(CREATE_NEW_PROCESS + ".templates[@use]", true);
}
/**
* Get opac catalog.
*
* @return value of opacCatalog
*/
public String getOpacCatalog() {
return getParamString(CREATE_NEW_PROCESS + ".opac.catalogue");
}
/**
* Get tif definition.
*
* @return tif definition as String
*/
public String getTifDefinition() throws DoctypeMissingException {
return getParamString("tifheader." + getDocType(), "kitodo");
}
/**
* Get title definition.
*
* @return title definition as String
*/
public String getTitleDefinition() throws DoctypeMissingException {
int count = getParamList(ITEM_LIST_PROCESS_TITLE).size();
String titleDefinition = "";
for (int i = 0; i < count; i++) {
String title = getParamString(ITEM_LIST_PROCESS_TITLE + "(" + i + ")");
String isDocType = getParamString(ITEM_LIST_PROCESS_TITLE + "(" + i + ")[@isdoctype]");
String isNotDocType = getParamString(ITEM_LIST_PROCESS_TITLE + "(" + i + ")[@isnotdoctype]");
title = processNullValues(title);
isDocType = processNullValues(isDocType);
isNotDocType = processNullValues(isNotDocType);
titleDefinition = findTitleDefinition(title, getDocType(), isDocType, isNotDocType);
// break loop after title definition was found
if (isTitleDefinitionFound(titleDefinition)) {
break;
}
}
return titleDefinition;
}
/**
* Get hidden fields which are appended to standard fields with false value.
*
* @return value of hidden fields
*/
public Map<String, Boolean> getHiddenFields() {
Map<String, Boolean> hiddenFields = new HashMap<>();
for (String standardField : getParamList(ITEM_LIST + ".hide")) {
hiddenFields.put(standardField, false);
}
return hiddenFields;
}
/**
* Get additional fields.
*
* @return list of AdditionalField objects
*/
public List<AdditionalField> getAdditionalFields() throws DoctypeMissingException {
List<AdditionalField> additionalFields = new ArrayList<>();
int count = getParamList(ITEM_LIST_ITEM).size();
for (int i = 0; i < count; i++) {
AdditionalField additionalField = new AdditionalField(getDocType());
additionalField.setFrom(getParamString(ITEM_LIST_ITEM + "(" + i + ")[@from]"));
additionalField.setTitle(getParamString(ITEM_LIST_ITEM + "(" + i + ")"));
additionalField.setRequired(getParamBoolean(ITEM_LIST_ITEM + "(" + i + ")[@required]"));
additionalField.setIsDocType(getParamString(ITEM_LIST_ITEM + "(" + i + ")[@isdoctype]"));
additionalField.setIsNotDoctype(getParamString(ITEM_LIST_ITEM + "(" + i + ")[@isnotdoctype]"));
// attributes added 30.3.09
String test = getParamString(ITEM_LIST_ITEM + "(" + i + ")[@initStart]");
additionalField.setInitStart(test);
additionalField.setInitEnd(getParamString(ITEM_LIST_ITEM + "(" + i + ")[@initEnd]"));
// binding to a metadata of a doc struct
if (getParamBoolean(ITEM_LIST_ITEM + "(" + i + ")[@ughbinding]")) {
additionalField.setUghBinding(true);
additionalField.setDocStruct(getParamString(ITEM_LIST_ITEM + "(" + i + ")[@docstruct]"));
additionalField.setMetadata(getParamString(ITEM_LIST_ITEM + "(" + i + ")[@metadata]"));
}
if (getParamBoolean(ITEM_LIST_ITEM + "(" + i + ")[@autogenerated]")) {
additionalField.setAutogenerated(true);
}
// check whether the current item should become a selection list
int selectItemCount = getParamList(ITEM_LIST_ITEM + "(" + i + ").select").size();
// go through Children and create SelectItem elements
if (selectItemCount > 0) {
additionalField.setSelectList(new ArrayList<>());
for (int j = 0; j < selectItemCount; j++) {
String svalue = getParamString(ITEM_LIST_ITEM + "(" + i + ").select(" + j + ")[@label]");
String sid = getParamString(ITEM_LIST_ITEM + "(" + i + ").select(" + j + ")");
additionalField.getSelectList().add(new SelectItem(sid, svalue, null));
}
}
additionalFields.add(additionalField);
}
return additionalFields;
}
/**
* Determine a specific parameter of the configuration as a String.
*
* @return Parameter als String
*/
public String getParamString(String inParameter) {
try {
this.config.setListDelimiter('&');
String paramString = this.config.getString(this.projectTitle + inParameter);
return cleanXmlFormattedString(paramString);
} catch (RuntimeException e) {
logger.error(e.getMessage(), e);
return "";
}
}
/**
* Determining a specific parameter of the configuration with specification of a
* default value.
*
* @return Parameter als String
*/
public String getParamString(String parameter, String defaultIfNull) {
try {
this.config.setListDelimiter('&');
String myParam = this.projectTitle + parameter;
String paramString = this.config.getString(myParam, defaultIfNull);
return cleanXmlFormattedString(paramString);
} catch (RuntimeException e) {
return defaultIfNull;
}
}
/**
* Determine a boolean parameter of the configuration. Return given 'defaultValue' if boolean
* parameter was not found in the configuration.
*
* @param parameter as boolean
* @param defaultValue default value
* @return value of parameter in configuration
*/
public boolean getParamBoolean(String parameter, boolean defaultValue) {
try {
return this.config.getBoolean(this.projectTitle + parameter);
} catch (RuntimeException e) {
return defaultValue;
}
}
/**
* Determine a boolean parameter of the configuration.
*
* @return Parameter als boolean
*/
public boolean getParamBoolean(String parameter) {
return getParamBoolean(parameter, false);
}
/**
* Determine a list of configuration parameters.
*
* @return Parameter als List
*/
public List<String> getParamList(String parameter) {
try {
List<Object> configs = this.config.getList(this.projectTitle + parameter);
return configs.stream().map(object -> Objects.toString(object, null)).collect(Collectors.toList());
} catch (RuntimeException e) {
logger.error(e.getMessage(), e);
return new ArrayList<>();
}
}
private String cleanXmlFormattedString(String inString) {
if (Objects.nonNull(inString)) {
inString = inString.replaceAll("\t", " ");
inString = inString.replaceAll("\n", " ");
while (inString.contains(" ")) {
inString = inString.replaceAll(" {2}", " ");
}
}
return inString;
}
/**
* Find title definitions. Conditions:
* <dl>
* <dt>{@code isDocType.equals("") && isNotDocType.equals("")}</dt>
* <dd>nothing was specified</dd>
* <dt>{@code isNotDocType.equals("") && StringUtils.containsIgnoreCase(isDocType, docType)}</dt>
* <dd>only duty was specified</dd>
* <dt>{@code isDocType.equals("") && !StringUtils.containsIgnoreCase(isNotDocType, docType)}</dt>
* <dd>only may not was specified</dd>
* <dt>{@code !isDocType.equals("") && !isNotDocType.equals("") && StringUtils.containsIgnoreCase(isDocType, docType)
* && !StringUtils.containsIgnoreCase(isNotDocType, docType)}</dt>
* <dd>both were specified</dd>
* </dl>
*/
private String findTitleDefinition(String title, String docType, String isDocType, String isNotDocType) {
if ((isDocType.isEmpty()
&& (isNotDocType.isEmpty() || !StringUtils.containsIgnoreCase(isNotDocType, docType)))
|| (!isDocType.isEmpty() && !isNotDocType.isEmpty()
&& StringUtils.containsIgnoreCase(isDocType, docType)
&& !StringUtils.containsIgnoreCase(isNotDocType, docType))
|| (isNotDocType.isEmpty() && StringUtils.containsIgnoreCase(isDocType, docType))) {
return title;
}
return "";
}
private boolean isTitleDefinitionFound(String titleDefinition) {
return !titleDefinition.isEmpty();
}
private String processNullValues(String value) {
if (Objects.isNull(value)) {
value = "";
}
return value;
}
}