/** * Categorize file. * * <p>If {@code file} parameter contains a pipe character, the pipe character is followed by the * format of the file. * * <p>TODO: Pass format as separate DITA class parameter. * * @param file file path with optional format */ private void categorizeResultFile(String file) { // edited by william on 2009-08-06 for bug:2832696 start String lcasefn = null; String format = null; // has format attribute set if (file.contains(STICK)) { // get lower case file name lcasefn = file.substring(0, file.indexOf(STICK)).toLowerCase(); // get format attribute format = file.substring(file.indexOf(STICK) + 1); file = file.substring(0, file.indexOf(STICK)); } else { lcasefn = file.toLowerCase(); } // Added by William on 2010-03-04 for bug:2957938 start // avoid files referred by coderef being added into wait list if (subsidiarySet.contains(lcasefn)) { return; } // Added by William on 2010-03-04 for bug:2957938 end if (FileUtils.isDITAFile(lcasefn) && (format == null || ATTR_FORMAT_VALUE_DITA.equalsIgnoreCase(format) || ATTR_FORMAT_VALUE_DITAMAP.equalsIgnoreCase(format))) { addToWaitList(file); } else if (!FileUtils.isSupportedImageFile(lcasefn)) { // FIXME: Treating all non-image extensions as HTML/resource files is not correct if // HTML/resource files // are defined by the file extension. Correct behaviour would be to remove this else // block. htmlSet.add(file); } // edited by william on 2009-08-06 for bug:2832696 end if (FileUtils.isSupportedImageFile(lcasefn)) { imageSet.add(file); try { final File image = new File(baseInputDir + File.separator + file).getCanonicalFile(); if (!image.exists()) { final Properties prop = new Properties(); prop.put("%1", image.getAbsolutePath()); logger.logWarn(MessageUtils.getMessage("DOTX008W", prop).toString()); } } catch (final IOException e) { logger.logError(e.getMessage()); } } if (FileUtils.isHTMLFile(lcasefn) || FileUtils.isResourceFile(lcasefn)) { htmlSet.add(file); } }
private void processParseResult(String currentFile) { final Map<String, String> cpMap = reader.getCopytoMap(); final Map<String, KeyDef> kdMap = reader.getKeysDMap(); // Added by William on 2010-06-09 for bug:3013079 start // the reader's reset method will clear the map. final Map<String, String> exKdMap = reader.getExKeysDefMap(); exKeyDefMap.putAll(exKdMap); // Added by William on 2010-06-09 for bug:3013079 end // Category non-copyto result and update uplevels accordingly for (final String file : reader.getNonCopytoResult()) { categorizeResultFile(file); updateUplevels(file); } // Update uplevels for copy-to targets, and store copy-to map. // Note: same key(target) copy-to will be ignored. for (final String key : cpMap.keySet()) { final String value = cpMap.get(key); if (copytoMap.containsKey(key)) { // edited by Alan on Date:2009-11-02 for Work Item:#1590 start /* * StringBuffer buff = new StringBuffer(); * buff.append("Copy-to task [href=\""); buff.append(value); * buff.append("\" copy-to=\""); buff.append(key); * buff.append("\"] which points to another copy-to target"); * buff.append(" was ignored."); * logger.logWarn(buff.toString()); */ final Properties prop = new Properties(); prop.setProperty("%1", value); prop.setProperty("%2", key); logger.logWarn(MessageUtils.getMessage("DOTX065W", prop).toString()); // edited by Alan on Date:2009-11-02 for Work Item:#1590 end ignoredCopytoSourceSet.add(value); } else { updateUplevels(key); copytoMap.put(key, value); } } // TODO Added by William on 2009-06-09 for scheme key bug(497) schemeSet.addAll(reader.getSchemeRefSet()); // collect key definitions for (final String key : kdMap.keySet()) { // key and value.keys will differ when keydef is a redirect to another keydef final KeyDef value = kdMap.get(key); if (keysDefMap.containsKey(key)) { // if there already exists duplicated key definition in // different map files. // Should only emit this if in a debug mode; comment out for now /* * Properties prop = new Properties(); prop.put("%1", key); * prop.put("%2", value); prop.put("%3", currentFile); logger * .logInfo(MessageUtils.getMessage("DOTJ048I", * prop).toString()); */ } else { updateUplevels(key); // add the ditamap where it is defined. /* * try { keydef.write("<keydef "); * keydef.write("keys=\""+key+"\" "); * keydef.write("href=\""+value+"\" "); * keydef.write("source=\""+currentFile+"\"/>"); * keydef.write("\n"); keydef.flush(); } catch (IOException e) { * * logger.logException(e); } */ keysDefMap.put(key, new KeyDef(key, value.href, currentFile)); } // TODO Added by William on 2009-06-09 for scheme key bug(532-547) // if the current file is also a schema file if (schemeSet.contains(currentFile)) { // write the keydef into the scheme keydef file try { schemekeydef.writeStartElement(ELEMENT_KEYDEF); schemekeydef.writeAttribute(ATTRIBUTE_KEYS, key); if (value.href != null) { schemekeydef.writeAttribute(ATTRIBUTE_HREF, value.href); } schemekeydef.writeAttribute(ATTRIUBTE_SOURCE, currentFile); schemekeydef.writeEndElement(); } catch (final SAXException e) { logger.logException(e); } } } hrefTargetSet.addAll(reader.getHrefTargets()); hrefWithIDSet.addAll(reader.getHrefTopicSet()); chunkTopicSet.addAll(reader.getChunkTopicSet()); // schemeSet.addAll(reader.getSchemeRefSet()); conrefTargetSet.addAll(reader.getConrefTargets()); nonConrefCopytoTargetSet.addAll(reader.getNonConrefCopytoTargets()); ignoredCopytoSourceSet.addAll(reader.getIgnoredCopytoSourceSet()); subsidiarySet.addAll(reader.getSubsidiaryTargets()); outDitaFilesSet.addAll(reader.getOutFilesSet()); resourceOnlySet.addAll(reader.getResourceOnlySet()); // Generate topic-scheme dictionary if (reader.getSchemeSet() != null && reader.getSchemeSet().size() > 0) { Set<String> children = null; children = this.schemeDictionary.get(currentFile); if (children == null) { children = new HashSet<String>(); } children.addAll(reader.getSchemeSet()); // for Linux support currentFile = FileUtils.separatorsToUnix(currentFile); this.schemeDictionary.put(currentFile, children); final Set<String> hrfSet = reader.getHrefTargets(); for (final String f : hrfSet) { // for Linux support final String filename = FileUtils.separatorsToUnix(f); children = this.schemeDictionary.get(filename); if (children == null) { children = new HashSet<String>(); } children.addAll(reader.getSchemeSet()); this.schemeDictionary.put(filename, children); } } }
private void processFile(String currentFile) throws DITAOTException { File fileToParse; final File file = new File(currentFile); if (file.isAbsolute()) { fileToParse = file; currentFile = FileUtils.getRelativePath(rootFile, currentFile); } else { fileToParse = new File(baseInputDir, currentFile); } try { fileToParse = fileToParse.getCanonicalFile(); } catch (final IOException e1) { logger.logError(e1.toString()); } logger.logInfo("Processing " + fileToParse.getAbsolutePath()); String msg = null; final Properties params = new Properties(); params.put("%1", currentFile); if (!fileToParse.exists()) { logger.logError(MessageUtils.getMessage("DOTX008E", params).toString()); return; } try { if (FileUtils.isValidTarget(currentFile.toLowerCase())) { reader.setTranstype(transtype); reader.setCurrentDir(new File(currentFile).getParent()); reader.parse(fileToParse); } else { // edited by Alan on Date:2009-11-02 for Work Item:#1590 start // logger.logWarn("Input file name is not valid DITA file name."); final Properties prop = new Properties(); prop.put("%1", fileToParse); logger.logWarn(MessageUtils.getMessage("DOTJ053W", params).toString()); // edited by Alan on Date:2009-11-02 for Work Item:#1590 end } // don't put it into dita.list if it is invalid if (reader.isValidInput()) { processParseResult(currentFile); categorizeCurrentFile(currentFile); } else if (!currentFile.equals(inputFile)) { logger.logWarn(MessageUtils.getMessage("DOTJ021W", params).toString()); } } catch (final SAXParseException sax) { // To check whether the inner third level is DITAOTBuildException // :FATALERROR final Exception inner = sax.getException(); if (inner != null && inner instanceof DITAOTException) { // second // level logger.logInfo(inner.getMessage()); throw (DITAOTException) inner; } if (currentFile.equals(inputFile)) { // stop the build if exception thrown when parsing input file. final MessageBean msgBean = MessageUtils.getMessage("DOTJ012F", params); msg = MessageUtils.getMessage("DOTJ012F", params).toString(); msg = new StringBuffer(msg).append(":").append(sax.getMessage()).toString(); throw new DITAOTException(msgBean, sax, msg); } final StringBuffer buff = new StringBuffer(); msg = MessageUtils.getMessage("DOTJ013E", params).toString(); buff.append(msg).append(LINE_SEPARATOR).append(sax.getMessage()); logger.logError(buff.toString()); } catch (final Exception e) { if (currentFile.equals(inputFile)) { // stop the build if exception thrown when parsing input file. final MessageBean msgBean = MessageUtils.getMessage("DOTJ012F", params); msg = MessageUtils.getMessage("DOTJ012F", params).toString(); msg = new StringBuffer(msg).append(":").append(e.getMessage()).toString(); throw new DITAOTException(msgBean, e, msg); } final StringBuffer buff = new StringBuffer(); msg = MessageUtils.getMessage("DOTJ013E", params).toString(); buff.append(msg).append(LINE_SEPARATOR).append(e.getMessage()); logger.logError(buff.toString()); } if (!reader.isValidInput() && currentFile.equals(inputFile)) { if (xmlValidate == true) { // stop the build if all content in the input file was filtered // out. msg = MessageUtils.getMessage("DOTJ022F", params).toString(); throw new DITAOTException(msg); } else { // stop the build if the content of the file is not valid. msg = MessageUtils.getMessage("DOTJ034F", params).toString(); throw new DITAOTException(msg); } } doneList.add(currentFile); reader.reset(); }