Skip to content

Commit

Permalink
kitodo#3408 generate tsl/ats with workpiece of existing process or by…
Browse files Browse the repository at this point in the history
… ancestor title doc if it is imported via the catalog
  • Loading branch information
markusweigelt committed Oct 6, 2021
1 parent 64e084b commit 1584744
Show file tree
Hide file tree
Showing 4 changed files with 330 additions and 189 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,24 @@
import java.io.IOException;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicReference;

import javax.faces.model.SelectItem;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.kitodo.api.MdSec;
import org.kitodo.api.MetadataEntry;
import org.kitodo.api.dataeditor.rulesetmanagement.StructuralElementViewInterface;
import org.kitodo.data.database.beans.Process;
import org.kitodo.data.database.beans.Property;
import org.kitodo.exceptions.DoctypeMissingException;
import org.kitodo.exceptions.ProcessGenerationException;
import org.kitodo.production.helper.Helper;
import org.kitodo.production.helper.TempProcess;
import org.kitodo.production.process.TitleGenerator;
import org.kitodo.production.services.ServiceManager;
import org.kitodo.production.services.data.ImportService;
import org.kitodo.production.services.data.ProcessService;
import org.omnifaces.util.Ajax;

Expand All @@ -44,10 +51,12 @@ public class ProcessDataTab {
this.createProcessForm = createProcessForm;
}


/**
* Set docType.
*
* @param docType as java.lang.String
* @param docType
* as java.lang.String
*/
public void setDocType(String docType) {
if (Objects.isNull(allDocTypes) || allDocTypes.isEmpty()) {
Expand All @@ -57,15 +66,16 @@ public void setDocType(String docType) {
this.docType = docType;
} else {
this.docType = (String) allDocTypes.get(0).getValue();
Helper.setErrorMessage("docTypeNotFound", new Object[] {docType});
Helper.setErrorMessage("docTypeNotFound", new Object[] {docType });
}
if (!this.createProcessForm.getProcesses().isEmpty()) {
this.createProcessForm.getProcesses().get(0).getWorkpiece().getLogicalStructure().setType(this.docType);
if (this.docType.isEmpty()) {
this.createProcessForm.getProcessMetadataTab().setProcessDetails(ProcessFieldedMetadata.EMPTY);
} else {
ProcessFieldedMetadata metadata = this.createProcessForm.getProcessMetadataTab()
.initializeProcessDetails(this.createProcessForm.getProcesses().get(0).getWorkpiece().getLogicalStructure());
.initializeProcessDetails(
this.createProcessForm.getProcesses().get(0).getWorkpiece().getLogicalStructure());
this.createProcessForm.getProcessMetadataTab().setProcessDetails(metadata);
}
}
Expand Down Expand Up @@ -101,7 +111,8 @@ public boolean isUsingTemplates() {
/**
* Set useTemplate.
*
* @param usingTemplates as boolean
* @param usingTemplates
* as boolean
*/
public void setUsingTemplates(boolean usingTemplates) {
ServiceManager.getImportService().setUsingTemplates(usingTemplates);
Expand All @@ -119,7 +130,8 @@ public String getTiffHeaderImageDescription() {
/**
* Set tiffHeaderImageDescription.
*
* @param tiffHeaderImageDescription as java.lang.String
* @param tiffHeaderImageDescription
* as java.lang.String
*/
public void setTiffHeaderImageDescription(String tiffHeaderImageDescription) {
this.tiffHeaderImageDescription = tiffHeaderImageDescription;
Expand All @@ -137,7 +149,8 @@ public String getTiffHeaderDocumentName() {
/**
* Set tiffHeaderDocumentName.
*
* @param tiffHeaderDocumentName as java.lang.String
* @param tiffHeaderDocumentName
* as java.lang.String
*/
public void setTiffHeaderDocumentName(String tiffHeaderDocumentName) {
this.tiffHeaderDocumentName = tiffHeaderDocumentName;
Expand All @@ -155,7 +168,8 @@ public int getGuessedImages() {
/**
* Set guessedImages.
*
* @param guessedImages as int
* @param guessedImages
* as int
*/
public void setGuessedImages(int guessedImages) {
this.guessedImages = guessedImages;
Expand All @@ -173,7 +187,8 @@ public List<SelectItem> getAllDoctypes() {
/**
* Set allDocTypes.
*
* @param allDocTypes as java.util.List
* @param allDocTypes
* as java.util.List
*/
void setAllDocTypes(List<SelectItem> allDocTypes) {
this.allDocTypes = allDocTypes;
Expand All @@ -188,27 +203,83 @@ void setAllDocTypes(List<SelectItem> allDocTypes) {
* Generate process titles and other details.
*/
public void generateProcessTitleAndTiffHeader() {
List<ProcessDetail> processDetails = this.createProcessForm.getProcessMetadataTab().getProcessDetailsElements();
Process process = this.createProcessForm.getMainProcess();
List<ProcessDetail> processDetails = createProcessForm.getProcessMetadataTab().getProcessDetailsElements();
Process process = createProcessForm.getMainProcess();
try {
StructuralElementViewInterface docTypeView = createProcessForm.getRulesetManagement().getStructuralElementView(
docType, createProcessForm.getAcquisitionStage(), createProcessForm.getPriorityList());
StructuralElementViewInterface docTypeView = createProcessForm.getRulesetManagement()
.getStructuralElementView(docType, createProcessForm.getAcquisitionStage(),
createProcessForm.getPriorityList());
String processTitle = docTypeView.getProcessTitle().orElse("");
if (processTitle.isEmpty()) {
Helper.setErrorMessage("newProcess.titleGeneration.creationRuleNotFound",
new Object[] {getDocTypeLabel(docType), process.getRuleset().getTitle() });
}
this.atstsl = ProcessService.generateProcessTitle(this.atstsl, processDetails,
processTitle, process);

String currentTitle = TitleGenerator.getCurrentValue(TitleGenerator.TITLE_DOC_MAIN, processDetails);

if ((Objects.isNull(currentTitle) || currentTitle.isEmpty())) {
Process parentProcess = createProcessForm.getTitleRecordLinkTab().getTitleRecordProcess();

if (Objects.nonNull(parentProcess)) {

// get title of workpiece property "Haupttitle" from chosen title record process
for (Property property : parentProcess.getWorkpieces()) {
if ("Haupttitel".equals(property.getTitle())) {
currentTitle = property.getValue();
break;
}
}

} else {
int processesSize = createProcessForm.getProcesses().size();

if( processesSize > 1 ) {
List<TempProcess> ancestors = createProcessForm.getProcesses().subList(1, processesSize);

// get title of ancestors where TitleDocMain exists when several processes were imported
for (TempProcess tempProcess : ancestors) {

ProcessFieldedMetadata processFieldedMetadata = initializeTempProcessDetails(tempProcess);
if (Objects.nonNull(processFieldedMetadata)) {
AtomicReference<String> tempTitle = new AtomicReference<>();
processFieldedMetadata.getChildMetadata().parallelStream().filter(metadata -> TitleGenerator.TITLE_DOC_MAIN.equals(metadata.getKey())).findFirst().ifPresent(metadata -> {
if (metadata instanceof MetadataEntry) {
tempTitle.set(((MetadataEntry) metadata).getValue());
}
});

if (Objects.nonNull(tempTitle.get()) && !tempTitle.get().isEmpty()) {
currentTitle = tempTitle.get();
break;
}
}
}
}
}
}

atstsl = ProcessService.generateProcessTitleAndGetAtstsl(atstsl, processDetails, processTitle, process, currentTitle);
// document name is generally equal to process title
this.tiffHeaderDocumentName = process.getTitle();
this.tiffHeaderImageDescription = ProcessService.generateTiffHeader(
processDetails, this.atstsl, ServiceManager.getImportService().getTiffDefinition(), this.docType);
tiffHeaderDocumentName = process.getTitle();
tiffHeaderImageDescription = ProcessService.generateTiffHeader(processDetails, atstsl,
ServiceManager.getImportService().getTiffDefinition(), docType);
} catch (ProcessGenerationException e) {
Helper.setErrorMessage(e.getLocalizedMessage(), logger, e);
}
Ajax.update("editForm:processFromTemplateTabView:processDataEditGrid",
"editForm:processFromTemplateTabView:processMetadata");
"editForm:processFromTemplateTabView:processMetadata");
}

/**
* initialize process details table.
* @param tempProcess
* whose metadata should be queried
*/
private ProcessFieldedMetadata initializeTempProcessDetails(TempProcess tempProcess) {
ProcessFieldedMetadata metadata = ImportService.initializeProcessDetails(tempProcess.getWorkpiece().getLogicalStructure(), createProcessForm.getRulesetManagement(),
createProcessForm.getAcquisitionStage(), createProcessForm.getPriorityList());
metadata.setMetadata(ImportService.importMetadata(tempProcess.getMetadataNodes(), MdSec.DMD_SEC));
return metadata;
}

private String getDocTypeLabel(String docType) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

public class TitleGenerator extends Generator {

private static final String TITLE_DOC_MAIN = "TitleDocMain";
public static final String TITLE_DOC_MAIN = "TitleDocMain";

/**
* Constructor for TitleGenerator.
Expand All @@ -44,9 +44,18 @@ public TitleGenerator(String atstsl, List<ProcessDetail> processDetailsList) {
*/
public String generateTitle(String titleDefinition, Map<String, String> genericFields)
throws ProcessGenerationException {
String currentAuthors = ImportService.getListOfCreators(this.processDetailsList);
String currentTitle = getCurrentValue(TITLE_DOC_MAIN);
return generateTitle(titleDefinition, genericFields, getCurrentValue(TITLE_DOC_MAIN, processDetailsList));
}

/**
* Generate title for process.
*
* @param titleDefinition definition for title to generation
* @param genericFields Map of Strings
* @return String
*/
public String generateTitle(String titleDefinition, Map<String, String> genericFields, String title) throws ProcessGenerationException {
String currentAuthors = ImportService.getListOfCreators(this.processDetailsList);
StringBuilder newTitle = new StringBuilder();

StringTokenizer tokenizer = new StringTokenizer(titleDefinition, "+");
Expand All @@ -65,7 +74,7 @@ public String generateTitle(String titleDefinition, Map<String, String> genericF
}
}
} else {
newTitle.append(evaluateAdditionalDetailsRows(currentTitle, currentAuthors, token));
newTitle.append(evaluateAdditionalDetailsRows(title, currentAuthors, token));
}
}

Expand Down Expand Up @@ -130,9 +139,9 @@ public static String createAtstsl(String title, String author) {
return result.toString().replaceAll("[\\W]", ""); // delete umlauts etc.
}

private String getCurrentValue(String metadataTag) {
public static String getCurrentValue(String metadataTag, List<ProcessDetail> processDetailsList) {
//int counter = 0;
for (ProcessDetail row : this.processDetailsList) {
for (ProcessDetail row : processDetailsList) {
// TODO: check how to set "autogenerated" flag for metadata in ruleset!
/* if (row.isAutogenerated() && metadataValue.isEmpty()) {
row.setValue(String.valueOf(System.currentTimeMillis() + counter));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -979,7 +979,7 @@ public static void createProcessTitle(TempProcess tempProcess,
StructuralElementViewInterface docTypeView = rulesetManagementInterface
.getStructuralElementView(docType, acquisitionStage, priorityList);
String processTitle = docTypeView.getProcessTitle().orElse("");
ProcessService.generateProcessTitle("", processDetails,
ProcessService.generateProcessTitleAndGetAtstsl("", processDetails,
processTitle, tempProcess.getProcess());
}

Expand Down
Loading

0 comments on commit 1584744

Please sign in to comment.