Skip to content

Commit

Permalink
Add input resource field to job and resources to keyref module
Browse files Browse the repository at this point in the history
Signed-off-by: Jarno Elovirta <jarno@elovirta.com>
  • Loading branch information
jelovirt committed Dec 3, 2019
1 parent 5b93bf6 commit cf7d7be
Show file tree
Hide file tree
Showing 8 changed files with 158 additions and 13 deletions.
6 changes: 4 additions & 2 deletions src/main/java/org/dita/dost/module/BranchFilterModule.java
Expand Up @@ -102,8 +102,10 @@ public void setJob(final Job job) {

@Override
public AbstractPipelineOutput execute(final AbstractPipelineInput input) throws DITAOTException {
final Job.FileInfo in = job.getFileInfo(fi -> fi.isInput).iterator().next();
processMap(in.uri);
final Collection<FileInfo> fis = job.getFileInfo(fi -> fi.isInput || fi.isInputResource);
for (FileInfo fi : fis) {
processMap(fi.uri);
}

try {
job.write();
Expand Down
19 changes: 19 additions & 0 deletions src/main/java/org/dita/dost/module/DebugAndFilterModule.java
Expand Up @@ -21,6 +21,8 @@
import java.io.*;
import java.net.URI;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
Expand Down Expand Up @@ -74,6 +76,7 @@ public final class DebugAndFilterModule extends SourceReaderModule {
private Map<QName, Map<String, String>> defaultValueMap;
/** Absolute path to current source file. */
private URI currentFile;
private List<URI> resources;
private Map<URI, Set<URI>> dic;
private SubjectSchemeReader subjectSchemeReader;
private FilterUtils baseFilterUtils;
Expand Down Expand Up @@ -256,6 +259,14 @@ List<XMLFilter> getProcessingPipe(final URI fileToParse) {
pipe.add(debugFilter);
}

// if (currentFile.equals(rootFile)) {
// final ResourceInsertFilter filter = new ResourceInsertFilter();
// filter.setLogger(logger);
// filter.setResources(resources);
// filter.setCurrentFile(currentFile);
// pipe.add(filter);
// }

if (filterUtils != null) {
final ProfilingFilter profilingFilter = new ProfilingFilter();
profilingFilter.setLogger(logger);
Expand Down Expand Up @@ -308,6 +319,14 @@ private void readArguments(AbstractPipelineInput input) {
genDebugInfo = Boolean.valueOf(input.getAttribute(ANT_INVOKER_EXT_PARAM_GENERATE_DEBUG_ATTR));
final String mode = input.getAttribute(ANT_INVOKER_EXT_PARAM_PROCESSING_MODE);
processingMode = mode != null ? Mode.valueOf(mode.toUpperCase()) : Mode.LAX;

if (input.getAttribute(ANT_INVOKER_PARAM_RESOURCES) != null) {
resources = Stream.of(input.getAttribute(ANT_INVOKER_PARAM_RESOURCES).split(File.pathSeparator))
.map(resource -> new File(resource).toURI())
.collect(Collectors.toList());
} else {
resources = Collections.emptyList();
}
}


Expand Down
20 changes: 19 additions & 1 deletion src/main/java/org/dita/dost/module/GenMapAndTopicListModule.java
Expand Up @@ -26,6 +26,7 @@
import org.dita.dost.writer.DebugFilter;
import org.dita.dost.writer.ExportAnchorsFilter;
import org.dita.dost.writer.ProfilingFilter;
import org.dita.dost.writer.ResourceInsertFilter;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLFilter;
Expand All @@ -36,6 +37,7 @@
import java.net.URI;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.dita.dost.reader.GenListModuleReader.*;
import static org.dita.dost.util.Configuration.Mode;
Expand Down Expand Up @@ -137,6 +139,7 @@ public final class GenMapAndTopicListModule extends SourceReaderModule {

/** Absolute path to input file. */
private URI rootFile;
private List<URI> resources;
/** File currently being processed */
private URI currentFile;
/** Subject scheme key map. Key is key value, value is key definition. */
Expand Down Expand Up @@ -197,6 +200,9 @@ public AbstractPipelineOutput execute(final AbstractPipelineInput input) throws
initXmlReader();

addToWaitList(new Reference(rootFile));
for (URI resource : resources) {
addToWaitList(new Reference(resource));
}
processWaitList();

updateBaseDirectory();
Expand Down Expand Up @@ -284,6 +290,14 @@ private void parseInputParameters(final AbstractPipelineInput input) {
assert baseInputDir.isAbsolute();
}

if (input.getAttribute(ANT_INVOKER_PARAM_RESOURCES) != null) {
resources = Stream.of(input.getAttribute(ANT_INVOKER_PARAM_RESOURCES).split(File.pathSeparator))
.map(resource -> new File(resource).toURI())
.collect(Collectors.toList());
} else {
resources = Collections.emptyList();
}

final URI ditaInput = toURI(input.getAttribute(ANT_INVOKER_PARAM_INPUTMAP));
if (ditaInput.isAbsolute()) {
rootFile = ditaInput;
Expand Down Expand Up @@ -703,7 +717,7 @@ private void outputResult() throws DITAOTException {

job.setInputDir(baseInputDir);
job.setInputMap(rootTemp);

//If root input file is marked resource only due to conref or other feature, remove that designation
if (resourceOnlySet.contains(rootFile)) {
resourceOnlySet.remove(rootFile);
Expand All @@ -716,6 +730,7 @@ private void outputResult() throws DITAOTException {
job.setProperty("tempdirToinputmapdir.relative.value", StringUtils.escapeRegExp(getPrefix(relativeRootFile)));
job.setProperty("uplevels", getLevelsPath(rootTemp));

resourceOnlySet.addAll(resources);
resourceOnlySet.addAll(listFilter.getResourceOnlySet());

if (job.getOnlyTopicInMap() || !job.crawlTopics()) {
Expand Down Expand Up @@ -789,6 +804,9 @@ private void outputResult() throws DITAOTException {
for (final URI file: resourceOnlySet) {
getOrCreateFileInfo(fileinfos, file).isResourceOnly = true;
}
for (final URI resource : resources) {
getOrCreateFileInfo(fileinfos, resource).isInputResource = true;
}

addFlagImagesSetToProperties(job, relFlagImagesSet);

Expand Down
35 changes: 26 additions & 9 deletions src/main/java/org/dita/dost/module/KeyrefModule.java
Expand Up @@ -105,18 +105,37 @@ public AbstractPipelineOutput execute(final AbstractPipelineInput input)
tempFileNameScheme.setBaseDir(job.getInputDir());
initFilters();

final Document doc = readMap();

// Read start map
final KeyrefReader reader = new KeyrefReader();
reader.setLogger(logger);
final Job.FileInfo in = job.getFileInfo(fi -> fi.isInput).iterator().next();
final URI mapFile = in.uri;
final Document doc = readMap(in);
logger.info("Reading " + job.tempDirURI.resolve(mapFile).toString());
reader.read(job.tempDirURI.resolve(mapFile), doc);

final KeyScope rootScope = reader.getKeyDefinition();
final List<ResolveTask> jobs = collectProcessingTopics(fis, rootScope, doc);
writeMap(doc);
final KeyScope startScope = reader.getKeyDefinition();
writeMap(in, doc);

// Read resources maps
final Collection<FileInfo> resourceFis = job.getFileInfo(fi -> fi.isInputResource);
final KeyScope rootScope = resourceFis.stream()
.map(fi -> {
try {
final Document d = readMap(fi);
logger.info("Reading " + job.tempDirURI.resolve(fi.uri).toString());
final KeyrefReader r = new KeyrefReader();
r.setLogger(logger);
r.read(job.tempDirURI.resolve(fi.uri), d);
final KeyScope s = r.getKeyDefinition();
writeMap(fi, d);
return s;
} catch (DITAOTException e) {
throw new RuntimeException(e);
}
})
.reduce(startScope, KeyScope::merge);
final List<ResolveTask> jobs = collectProcessingTopics(resourceFis, rootScope, doc);

transtype = input.getAttribute(ANT_INVOKER_EXT_PARAM_TRANSTYPE);
delayConrefUtils = transtype.equals(INDEX_TYPE_ECLIPSEHELP) ? new DelayConrefUtils() : null;
Expand Down Expand Up @@ -411,10 +430,9 @@ private void writeKeyDefinition(final Map<String, KeyDef> keydefs) {
}
}

private Document readMap() throws DITAOTException {
private Document readMap(final FileInfo input) throws DITAOTException {
InputSource in = null;
try {
final FileInfo input = job.getFileInfo(fi -> fi.isInput).iterator().next();
in = new InputSource(job.tempDirURI.resolve(input.uri).toString());
return XMLUtils.getDocumentBuilder().parse(in);
} catch (final Exception e) {
Expand All @@ -428,11 +446,10 @@ private Document readMap() throws DITAOTException {
}
}

private void writeMap(final Document doc) throws DITAOTException {
private void writeMap(final FileInfo in, final Document doc) throws DITAOTException {
Result out = null;
try {
final Transformer transformer = TransformerFactory.newInstance().newTransformer();
final FileInfo in = job.getFileInfo(fi -> fi.isInput).iterator().next();
out = new StreamResult(job.tempDirURI.resolve(in.uri).toString());
transformer.transform(new DOMSource(doc), out);
} catch (final TransformerConfigurationException e) {
Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/dita/dost/util/Constants.java
Expand Up @@ -860,6 +860,7 @@ public final class Constants {
public static final String ANT_INVOKER_PARAM_BASEDIR = "basedir";
/**Constants for common params used in ant invoker(inputmap).*/
public static final String ANT_INVOKER_PARAM_INPUTMAP = "inputmap";
public static final String ANT_INVOKER_PARAM_RESOURCES = "resources";
/**Constants for common params used in ant invoker(ditaval).*/
public static final String ANT_INVOKER_PARAM_DITAVAL = "ditaval";
/**Constants for common params used in ant invoker(mergedditaval)*/
Expand Down
12 changes: 11 additions & 1 deletion src/main/java/org/dita/dost/util/Job.java
Expand Up @@ -619,6 +619,8 @@ public static final class FileInfo {
public boolean isOutDita;
/** File is input document that is used as processing root. */
public boolean isInput;
/** Additional input resource. */
public boolean isInputResource;

FileInfo(final URI src, final URI uri, final File file) {
if (uri == null && file == null) throw new IllegalArgumentException(new NullPointerException());
Expand Down Expand Up @@ -650,6 +652,7 @@ public String toString() {
", isTarget=" + isTarget +
", isConrefPush=" + isConrefPush +
", isInput=" + isInput +
", isInputResource=" + isInputResource +
", hasKeyref=" + hasKeyref +
", hasCoderef=" + hasCoderef +
", isSubjectScheme=" + isSubjectScheme +
Expand Down Expand Up @@ -677,6 +680,7 @@ public boolean equals(Object o) {
isFlagImage == fileInfo.isFlagImage &&
isOutDita == fileInfo.isOutDita &&
isInput == fileInfo.isInput &&
isInputResource == fileInfo.isInputResource &&
Objects.equals(src, fileInfo.src) &&
Objects.equals(uri, fileInfo.uri) &&
Objects.equals(file, fileInfo.file) &&
Expand All @@ -687,7 +691,8 @@ public boolean equals(Object o) {
@Override
public int hashCode() {
return Objects.hash(src, uri, file, result, format, hasConref, isChunked, hasLink, isResourceOnly, isTarget,
isConrefPush, hasKeyref, hasCoderef, isSubjectScheme, isSubtarget, isFlagImage, isOutDita, isInput);
isConrefPush, hasKeyref, hasCoderef, isSubjectScheme, isSubtarget, isFlagImage, isOutDita, isInput,
isInputResource);
}

public static class Builder {
Expand All @@ -710,6 +715,7 @@ public static class Builder {
private boolean isFlagImage;
private boolean isOutDita;
private boolean isInput;
private boolean isInputResource;

public Builder() {}
public Builder(final FileInfo orig) {
Expand All @@ -731,6 +737,7 @@ public Builder(final FileInfo orig) {
isFlagImage = orig.isFlagImage;
isOutDita = orig.isOutDita;
isInput = orig.isInput;
isInputResource = orig.isInputResource;
}

/**
Expand All @@ -755,6 +762,7 @@ public Builder add(final FileInfo orig) {
if (orig.isFlagImage) isFlagImage = orig.isFlagImage;
if (orig.isOutDita) isOutDita = orig.isOutDita;
if (orig.isInput) isInput = orig.isInput;
if (orig.isInputResource) isInputResource = orig.isInputResource;
return this;
}

Expand Down Expand Up @@ -797,6 +805,7 @@ public Builder addContentFields(final FileInfo orig) {
public Builder isFlagImage(final boolean isFlagImage) { this.isFlagImage = isFlagImage; return this; }
public Builder isOutDita(final boolean isOutDita) { this.isOutDita = isOutDita; return this; }
public Builder isInput(final boolean isInput) { this.isInput = isInput; return this; }
public Builder isInputResource(final boolean isInputResource) { this.isInputResource = isInputResource; return this; }

public FileInfo build() {
if (uri == null && file == null) {
Expand All @@ -820,6 +829,7 @@ public FileInfo build() {
fi.isFlagImage = isFlagImage;
fi.isOutDita = isOutDita;
fi.isInput = isInput;
fi.isInputResource = isInputResource;
return fi;
}

Expand Down
24 changes: 24 additions & 0 deletions src/main/java/org/dita/dost/util/KeyScope.java
Expand Up @@ -7,6 +7,10 @@
*/
package org.dita.dost.util;

import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;

import java.util.*;

import static java.util.Collections.unmodifiableList;
Expand All @@ -19,6 +23,8 @@
*/
public class KeyScope {

public static final KeyScope EMPTY = new KeyScope(null, null, Collections.emptyMap(), Collections.emptyList());

public final String id;
public final String name;
public final Map<String, KeyDef> keyDefinition;
Expand Down Expand Up @@ -62,4 +68,22 @@ public int hashCode() {
result = 31 * result + childScopes.hashCode();
return result;
}

public static KeyScope merge(final KeyScope scope1, final KeyScope scope2) {
if (!Objects.equals(scope1.id, scope2.id)) {
throw new IllegalArgumentException(String.format("Scopes should have the same ID: %s != %s", scope1.id, scope2.id));
}
return new KeyScope(
scope1.id,
scope1.name,
ImmutableMap.<String, KeyDef>builder()
.putAll(scope1.keyDefinition)
.putAll(scope2.keyDefinition)
.build(),
ImmutableList.<KeyScope>builder()
.addAll(scope1.childScopes)
.addAll(scope2.childScopes)
.build()
);
}
}
54 changes: 54 additions & 0 deletions src/main/java/org/dita/dost/writer/ResourceInsertFilter.java
@@ -0,0 +1,54 @@
/*
* This file is part of the DITA Open Toolkit project.
*
* Copyright 2019 Jarno Elovirta
*
* See the accompanying LICENSE file for applicable license.
*/
package org.dita.dost.writer;

import org.dita.dost.util.XMLUtils.AttributesBuilder;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

import java.net.URI;
import java.util.List;

import static javax.xml.XMLConstants.NULL_NS_URI;
import static org.dita.dost.util.Constants.*;

public final class ResourceInsertFilter extends AbstractXMLFilter {

private boolean added = false;
private List<URI> resources;

public void setResources(final List<URI> resources) {
this.resources = resources;
}

// SAX methods

@Override
public void startElement(final String uri, final String localName, final String qName, final Attributes atts)
throws SAXException {
super.startElement(uri, localName, qName, atts);
if (!added) {
for (URI resource : resources) {
logger.info("add resource " + resource);
super.startElement(NULL_NS_URI, MAP_TOPICREF.localName, MAP_TOPICREF.localName,
getAttributes()
.add(ATTRIBUTE_NAME_HREF, currentFile.resolve(".").relativize(resource).toString())
.add(ATTRIBUTE_NAME_PROCESSING_ROLE, ATTR_PROCESSING_ROLE_VALUE_RESOURCE_ONLY)
// .add(ATTRIBUTE_NAME_FORMAT, FIXME)
.build());
super.endElement(NULL_NS_URI, MAP_TOPICREF.localName, MAP_TOPICREF.localName);
}
added = true;
}
}

private AttributesBuilder getAttributes() {
return new AttributesBuilder().add(ATTRIBUTE_NAME_CLASS, MAP_TOPICREF.toString());
}

}

0 comments on commit cf7d7be

Please sign in to comment.