/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.drm.helpset;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.ParserConfigurationException;
import org.jdom2.DocType;
import org.openflexo.drm.DocItem;
import org.openflexo.drm.DocItemFolder;
import org.openflexo.drm.DocResourceCenter;
import org.openflexo.drm.Language;
import org.openflexo.foundation.FlexoObject;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.toolbox.FileResource;
import org.openflexo.toolbox.FileUtils;
import org.openflexo.xmlcode.InvalidModelException;
import org.openflexo.xmlcode.XMLCoder;
import org.openflexo.xmlcode.XMLMapping;
import org.openflexo.xmlcode.XMLSerializable;
import org.xml.sax.SAXException;
public class HSMap extends FlexoObject implements XMLSerializable {
protected static final Logger logger = Logger.getLogger(HSMap.class.getPackage().getName());
private DocResourceCenter _drc;
protected Language _language;
private Vector<HSMapEntry> _entries;
public String version = "1.0";
protected File _mapFile;
org.openflexo.localization.Language lang;
protected HelpSetConfiguration configuration;
public HSMap(DocResourceCenter drc, Language language, File mapFile, HelpSetConfiguration config) {
_drc = drc;
_language = language;
_mapFile = mapFile;
lang = org.openflexo.localization.Language.get(_language.getIdentifier());
configuration = config;
getEntries();
}
public Vector<HSMapEntry> getEntries() {
if (_entries == null) {
_entries = new Vector<HSMapEntry>();
_entries.add(new HSMapEntry(DRMHelpSet.TOP_LEVEL_FOLDER, DRMHelpSet.TOP_LEVEL_IMAGE));
for (DocItem next : _drc.getAllItems()) {
if (next.isIncluded(configuration)) {
if (!next.getIsEmbedded() && next.isPublished()) {
logger.fine("Generate map entry for " + next);
_entries.add(new HSMapEntry(next));
}
} else {
if (logger.isLoggable(Level.FINE)) {
logger.fine("Ignoring " + next);
}
}
}
}
return _entries;
}
public class HSMapEntry extends FlexoObject implements XMLSerializable {
public DocItem docItem;
public String url;
public String target;
public HSMapEntry(DocItem docItem) {
this.docItem = docItem;
url = "HTML/" + docItem.getRelativePath() + ".html";
target = docItem.getIdentifier();
}
public HSMapEntry(String aTarget, String url) {
target = aTarget;
this.url = url;
}
public void generate() {
if (docItem != null) {
File fileToGenerate = new File(_mapFile.getParentFile(), url);
fileToGenerate.getParentFile().mkdirs();
StringBuffer contents = new StringBuffer();
String title;
if (docItem.getTitle(_language) != null) {
title = docItem.getTitle(_language);
} else {
title = docItem.getIdentifier();
}
StringBuilder sb = new StringBuilder();
DocItemFolder folder = docItem.getFolder();
while (folder != null && !folder.getDirectory().equals(docItem.getDocResourceCenter().getRootFolder().getDirectory())) {
sb.append("../");
folder = folder.getParentFolder();
}
contents.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0.1//EN\">\n");
contents.append("<HTML>\n");
contents.append("<HEAD>\n");
contents.append("<TITLE>");
contents.append(title);
contents.append("</TITLE>\n");
contents.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n");
contents.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"").append(sb).append("FlexoHelpMasterStyle.css\">\n");
contents.append("</HEAD>\n");
contents.append("<BODY BGCOLOR=\"#ffffff\">\n");
contents.append("<H1>" + title + "</H1>\n");
contents.append("<HR>\n");
String inheritanceText = "";
DocItem inheritanceParent = docItem.getInheritanceParentItem();
DocItem firstNonHiddenParent = null;
while (inheritanceParent != null) {
if (!inheritanceParent.isPublished()) {
if (inheritanceParent.getLastApprovedActionForLanguage(_language) != null) {
inheritanceText = inheritanceParent.getLastApprovedActionForLanguage(_language).getVersion()
.getFullHTMLDescription()
+ "<br>" + inheritanceText;
}
} else if (firstNonHiddenParent == null) {
firstNonHiddenParent = inheritanceParent;
}
inheritanceParent = inheritanceParent.getInheritanceParentItem();
}
contents.append(inheritanceText);
if (docItem.getLastApprovedActionForLanguage(_language) != null) {
contents.append(docItem.getLastApprovedActionForLanguage(_language).getVersion().getFullHTMLDescription());
} else {
contents.append(FlexoLocalization.localizedForKeyAndLanguage("no_documentation", lang));
}
/*for (Enumeration en=docItem.getEmbeddingChildItems().elements(); en.hasMoreElements();) {
DocItem next = (DocItem)en.nextElement();
if (next.isIncluded(configuration)) {
if (next.getIsEmbedded()) {
String subItemTitle;
if (next.getTitle(_language) != null) {
subItemTitle = next.getTitle(_language);
}
else {
subItemTitle = next.getIdentifier();
}
contents.append("<H2>"+subItemTitle+"</H2>\n");
if (next.getLastApprovedActionForLanguage(_language) != null) {
contents.append(next.getLastApprovedActionForLanguage(_language).getVersion().getFullHTMLDescription());
}
else {
contents.append(FlexoLocalization.localizedForKeyAndLanguage("no_documentation",lang));
}
}
}
}*/
DocItem currentDocItem = docItem;
while (currentDocItem != null) {
boolean hasEmbeddedItemsToInclude = false;
StringBuffer embeddedItemsAtThisLevel = new StringBuffer();
for (Enumeration en = currentDocItem.getEmbeddingChildItems().elements(); en.hasMoreElements();) {
DocItem next = (DocItem) en.nextElement();
if (next.isIncluded(configuration)) {
if (next.getIsEmbedded() && next.isPublished()) {
hasEmbeddedItemsToInclude = true;
String subItemTitle;
if (next.getTitle(_language) != null) {
subItemTitle = next.getTitle(_language);
} else {
subItemTitle = next.getIdentifier();
}
embeddedItemsAtThisLevel.append("<H3>" + subItemTitle + "</H3>\n");
if (next.getLastApprovedActionForLanguage(_language) != null) {
embeddedItemsAtThisLevel.append(next.getLastApprovedActionForLanguage(_language).getVersion()
.getFullHTMLDescription());
}/*
else {
embeddedItemsAtThisLevel.append(FlexoLocalization.localizedForKeyAndLanguage("no_documentation",lang));
}*/
}
}
}
if (hasEmbeddedItemsToInclude) {
if (currentDocItem == docItem) { // We are at this level
if (embeddedItemsAtThisLevel.length() > 0) {
contents.append("<H2>" + FlexoLocalization.localizedForKeyAndLanguage("declared_attributes", lang)
+ "</H2>\n");
contents.append(embeddedItemsAtThisLevel.toString());
}
} else { // Inherited items
if (embeddedItemsAtThisLevel.length() > 0) {
String inheritedItemsTitle;
if (!currentDocItem.isPublished()) {
inheritedItemsTitle = currentDocItem.getTitle(_language);
} else {
inheritedItemsTitle = currentDocItem.getHTMLLinkFrom(docItem, _language);
}
contents.append("<H2>" + FlexoLocalization.localizedForKeyAndLanguage("attributes_inherited_from", lang)
+ " " + inheritedItemsTitle + "</H2>\n");
contents.append(embeddedItemsAtThisLevel.toString());
}
}
}
currentDocItem = currentDocItem.getInheritanceParentItem();
}
contents.append("<HR>\n");
String inheritanceParentHTMLFragment = getInheritanceParentHTMLFragment(firstNonHiddenParent);
if (inheritanceParentHTMLFragment != null) {
contents.append(inheritanceParentHTMLFragment);
}
String embeddingParentHTMLFragment = getEmbeddingParentHTMLFragment();
if (embeddingParentHTMLFragment != null) {
contents.append(embeddingParentHTMLFragment);
}
String inheritanceChildsHTMLFragment = getInheritanceChildsHTMLFragment();
if (inheritanceChildsHTMLFragment != null) {
contents.append(inheritanceChildsHTMLFragment);
}
String embeddingChildsHTMLFragment = getEmbeddingChildsHTMLFragment();
if (embeddingChildsHTMLFragment != null) {
contents.append(embeddingChildsHTMLFragment);
}
String relatedToItemsHTMLFragment = getRelatedToItemsHTMLFragment();
if (relatedToItemsHTMLFragment != null) {
contents.append(relatedToItemsHTMLFragment);
}
contents.append("\n</BODY>\n");
contents.append("</HTML>\n");
try {
FileUtils.saveToFile(fileToGenerate, contents.toString());
} catch (IOException e) {
// Warns about the exception
logger.warning("Exception raised: " + e.getClass().getName() + " when writing " + fileToGenerate.getAbsolutePath()
+ ". See console for details.");
e.printStackTrace();
}
}
}
private String getInheritanceParentHTMLFragment(DocItem firstNonHiddenParent) {
if (firstNonHiddenParent == null) {
return null;
}
StringBuffer returned = new StringBuffer();
returned.append("<p>");
returned.append("<b>" + FlexoLocalization.localizedForKeyAndLanguage("extends", lang) + "</b> ");
returned.append(firstNonHiddenParent.getHTMLLinkFrom(docItem, _language));
returned.append("</p>");
return returned.toString();
}
private String getEmbeddingParentHTMLFragment() {
if (docItem.getEmbeddingParentItem() == null) {
return null;
}
StringBuffer returned = new StringBuffer();
returned.append("<p>");
returned.append("<b>" + FlexoLocalization.localizedForKeyAndLanguage("found_in", lang) + "</b> ");
returned.append(docItem.getEmbeddingParentItem().getHTMLLinkFrom(docItem, _language));
returned.append("</p>");
return returned.toString();
}
private String getInheritanceChildsHTMLFragment() {
int inheritanceChildItemCount = 0;
for (DocItem aDocItem : docItem.getInheritanceChildItems()) {
if (aDocItem.isIncluded(configuration)) {
inheritanceChildItemCount++;
}
}
if (inheritanceChildItemCount == 0) {
return null;
}
StringBuffer returned = new StringBuffer();
returned.append("<p>");
returned.append("<b>" + FlexoLocalization.localizedForKeyAndLanguage("inheritance_child_items", lang) + "</b> ");
boolean isFirst = true;
for (Enumeration en = docItem.getDerivedInheritanceChildItems().elements(); en.hasMoreElements();) {
DocItem next = (DocItem) en.nextElement();
if (next.isPublished()) {
returned.append((isFirst ? "" : ", ") + next.getHTMLLinkFrom(docItem, _language));
isFirst = false;
}
}
returned.append("</p>");
return returned.toString();
}
private String getEmbeddingChildsHTMLFragment() {
Vector<DocItem> embeddedChilds = new Vector<DocItem>();
for (DocItem next : docItem.getEmbeddingChildItems()) {
if (!next.getIsEmbedded()) {
embeddedChilds.add(next);
}
}
if (embeddedChilds.size() == 0) {
return null;
}
StringBuffer returned = new StringBuffer();
returned.append("<p>");
returned.append("<b>" + FlexoLocalization.localizedForKeyAndLanguage("embedding_child_items", lang) + "</b> ");
boolean isFirst = true;
for (Enumeration en = embeddedChilds.elements(); en.hasMoreElements();) {
DocItem next = (DocItem) en.nextElement();
if (next.isPublished()) {
returned.append((isFirst ? "" : ", ") + next.getHTMLLinkFrom(docItem, _language));
isFirst = false;
}
}
returned.append("</p>");
return returned.toString();
}
private String getRelatedToItemsHTMLFragment() {
if (docItem.getRelatedToItems().size() == 0) {
return null;
}
StringBuffer returned = new StringBuffer();
returned.append("<p>");
returned.append("<b>" + FlexoLocalization.localizedForKeyAndLanguage("related_to_items", lang) + "</b> ");
boolean isFirst = true;
for (Enumeration en = docItem.getRelatedToItems().elements(); en.hasMoreElements();) {
DocItem next = (DocItem) en.nextElement();
if (next.isPublished()) {
returned.append((isFirst ? "" : ", ") + next.getHTMLLinkFrom(docItem, _language));
isFirst = false;
}
}
returned.append("</p>");
return returned.toString();
}
}
protected void generate() {
try {
FileOutputStream out = new FileOutputStream(_mapFile);
XMLCoder.encodeObjectWithMapping(this, getMapMapping(), out, getMapDocType());
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
for (Enumeration en = getEntries().elements(); en.hasMoreElements();) {
HSMapEntry next = (HSMapEntry) en.nextElement();
// if (next.docItem.isIncluded(configuration)) {
next.generate();
// }
}
}
private static XMLMapping _mapMapping;
public static XMLMapping getMapMapping() {
if (_mapMapping == null) {
File hsMapModelFile;
hsMapModelFile = new FileResource("Models/HSMapModel.xml");
if (!hsMapModelFile.exists()) {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("File " + hsMapModelFile.getAbsolutePath() + " doesn't exist. Maybe you have to check your paths ?");
}
return null;
} else {
try {
_mapMapping = new XMLMapping(hsMapModelFile);
} catch (InvalidModelException e) {
// Warns about the exception
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Exception raised: " + e.getClass().getName() + ". See console for details.");
}
e.printStackTrace();
} catch (IOException e) {
// Warns about the exception
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Exception raised: " + e.getClass().getName() + ". See console for details.");
}
e.printStackTrace();
} catch (SAXException e) {
// Warns about the exception
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Exception raised: " + e.getClass().getName() + ". See console for details.");
}
e.printStackTrace();
} catch (ParserConfigurationException e) {
// Warns about the exception
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Exception raised: " + e.getClass().getName() + ". See console for details.");
}
e.printStackTrace();
}
}
}
return _mapMapping;
}
public static DocType getMapDocType() {
return new DocType("map", "-//Sun Microsystems Inc.//DTD JavaHelp Map Version 1.0//EN",
"http://java.sun.com/products/javahelp/map_1_0.dtd");
}
}