/* * Copyright (c) 2004-2014, Willem Cazander * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are permitted provided * that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of conditions and the * following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.x4o.maisdoc; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Map; import org.x4o.maisdoc.flake.MaisDocGenerator; import org.x4o.maisdoc.flake.DefaultPageWriterHelp; import org.x4o.maisdoc.flake.DefaultPageWriterIndexAll; import org.x4o.maisdoc.flake.DefaultPageWriterTree; import org.x4o.maisdoc.model.MaisDoc; import org.x4o.maisdoc.model.MaisDocConcept; import org.x4o.maisdoc.model.MaisDocNode; import org.x4o.maisdoc.model.MaisDocRemoteClass; import org.x4o.sax3.SAX3WriterXml; import org.x4o.sax3.io.SAX3PropertyConfig; import org.x4o.sax3.io.SAX3PropertyConfig.PropertyConfigItem; /** * ApiDocWriter writes the api documentation. * * @author Willem Cazander * @version 1.0 Aug 26, 2010 */ @Deprecated // marked until make working to write multiple project or mix api docs in one big tree public class MaisDocWriter { // NOTE: this class is unused, and is waiting for ApiDocProject code and replaces most code in EldDocWriter to here. private final static String PROPERTY_CONTEXT_PREFIX = SAX3PropertyConfig.X4O_PROPERTIES_PREFIX+"api-doc/"; public final static SAX3PropertyConfig DEFAULT_PROPERTY_CONFIG; public final static String OUTPUT_PATH = PROPERTY_CONTEXT_PREFIX+"output/path"; public final static String DOC_NAME = PROPERTY_CONTEXT_PREFIX+"doc/name"; public final static String DOC_DESCRIPTION = PROPERTY_CONTEXT_PREFIX+"doc/description"; public final static String DOC_ABOUT = PROPERTY_CONTEXT_PREFIX+"doc/about"; public final static String DOC_COPYRIGHT = PROPERTY_CONTEXT_PREFIX+"doc/copyright"; public final static String DOC_PAGE_SUB_TITLE = PROPERTY_CONTEXT_PREFIX+"doc/page-sub-title"; public final static String DOC_NO_FRAME_ALL_NAME = PROPERTY_CONTEXT_PREFIX+"doc/no-frame-all-name"; public final static String META_KEYWORDS = PROPERTY_CONTEXT_PREFIX+"meta/keywords"; public final static String META_STYLESHEET = PROPERTY_CONTEXT_PREFIX+"meta/stylesheet"; public final static String META_STYLESHEET_THEMA = PROPERTY_CONTEXT_PREFIX+"meta/stylesheet-thema"; public final static String JAVADOC_LINK = PROPERTY_CONTEXT_PREFIX+"javadoc/link"; public final static String JAVADOC_LINK_OFFLINE = PROPERTY_CONTEXT_PREFIX+"javadoc/link-offline"; public final static String PAGE_PRINT_TREE = PROPERTY_CONTEXT_PREFIX+"page/print-tree"; public final static String PAGE_PRINT_XTREE = PROPERTY_CONTEXT_PREFIX+"page/print-xtree"; public final static String PAGE_PRINT_INDEX_ALL = PROPERTY_CONTEXT_PREFIX+"page/print-index-all"; public final static String PAGE_PRINT_HELP = PROPERTY_CONTEXT_PREFIX+"page/print-help"; static { DEFAULT_PROPERTY_CONFIG = new SAX3PropertyConfig(true,SAX3WriterXml.DEFAULT_PROPERTY_CONFIG,PROPERTY_CONTEXT_PREFIX, new PropertyConfigItem(true,OUTPUT_PATH,File.class), new PropertyConfigItem(DOC_NAME,String.class,"X4O API DOC"), new PropertyConfigItem(DOC_DESCRIPTION,String.class,"X4O API Documentation."), new PropertyConfigItem(false,DOC_ABOUT,String.class), new PropertyConfigItem(false,DOC_COPYRIGHT,String.class), new PropertyConfigItem(false,DOC_PAGE_SUB_TITLE,String.class), new PropertyConfigItem(DOC_NO_FRAME_ALL_NAME,String.class,"All Elements"), new PropertyConfigItem(false,META_KEYWORDS,List.class), new PropertyConfigItem(false,META_STYLESHEET,File.class), new PropertyConfigItem(false,META_STYLESHEET_THEMA,String.class), new PropertyConfigItem(false,JAVADOC_LINK,List.class), new PropertyConfigItem(false,JAVADOC_LINK_OFFLINE,Map.class), new PropertyConfigItem(PAGE_PRINT_TREE,Boolean.class,true), new PropertyConfigItem(PAGE_PRINT_XTREE,Boolean.class,true), new PropertyConfigItem(PAGE_PRINT_INDEX_ALL,Boolean.class,true), new PropertyConfigItem(PAGE_PRINT_HELP,Boolean.class,true) ); } /** The config of this writer. */ private final SAX3PropertyConfig propertyConfig; public MaisDocWriter(SAX3PropertyConfig parentConfig) { this.propertyConfig=new SAX3PropertyConfig(DEFAULT_PROPERTY_CONFIG,PROPERTY_CONTEXT_PREFIX); this.propertyConfig.copyParentProperties(parentConfig); } /** * Writes the language documentation to the base path. * @throws IOException Is thrown when error is done. */ public void writeDocumentation() throws IOException { File basePath = propertyConfig.getPropertyFile(OUTPUT_PATH); MaisDocGenerator writer = new MaisDocGenerator(); MaisDoc doc = buildLanguageDoc(); writer.write(doc, basePath); } /** * Creates a fully configured ApiDoc object. * @return The ApiDoc configured to write eld documentation. */ private MaisDoc buildLanguageDoc() { // Generic config MaisDoc doc = new MaisDoc(); doc.setName( propertyConfig.getPropertyString(DOC_NAME)); doc.setDescription( propertyConfig.getPropertyString(DOC_DESCRIPTION)); doc.setDocAbout( propertyConfig.getPropertyString(DOC_ABOUT, () -> createDefaultAbout(doc.getName()))); doc.setDocCopyright( propertyConfig.getPropertyString(DOC_COPYRIGHT, () -> createForeverCopyright())); doc.setDocPageSubTitle( propertyConfig.getPropertyString(DOC_PAGE_SUB_TITLE, () -> createDefaultPageSubTitle(doc.getName()))); doc.setMetaStyleSheetThema( propertyConfig.getPropertyString(META_STYLESHEET_THEMA)); doc.setMetaStyleSheet( propertyConfig.getPropertyFile(META_STYLESHEET)); doc.addMetaKeywordAll( propertyConfig.getPropertyList(META_KEYWORDS, () -> createDefaultKeywords())); doc.setNoFrameAllName( propertyConfig.getPropertyString(DOC_NO_FRAME_ALL_NAME)); doc.setFrameNavPrintParent(true); doc.setFrameNavPrintParentId(true); doc.setGroupTypeName("summary", "Summary",1); doc.setGroupTypeName("overview", "Overview",2); // Javadoc linking config List javadocLinkList = propertyConfig.getPropertyList(JAVADOC_LINK); Map javadocLinkOfflineMap = propertyConfig.getPropertyMap(JAVADOC_LINK_OFFLINE); if (javadocLinkList!=null) { for (String javadocUrl:javadocLinkList) { doc.addRemoteClass(new MaisDocRemoteClass(javadocUrl)); } } if (javadocLinkOfflineMap!=null) { for (Map.Entry offlineLink:javadocLinkOfflineMap.entrySet()) { doc.addRemoteClass(new MaisDocRemoteClass(offlineLink.getKey(),offlineLink.getValue())); } } // Tree and navagation config // doc.setFrameNavConceptClass(ElementClass.class); // // doc.addTreeNodePageModeClass(X4OLanguageSession.class); // doc.addTreeNodePageModeClass(X4OLanguageModule.class); // doc.addTreeNodePageModeClass(ElementInterface.class); // doc.addTreeNodePageModeClass(ElementNamespace.class); // // doc.addAnnotatedClasses(EldDocWriterLanguage.class); // doc.addAnnotatedClasses(EldDocWriterLanguageModule.class); // doc.addAnnotatedClasses(EldDocWriterElementClass.class); // doc.addAnnotatedClasses(EldDocWriterElementNamespace.class); // doc.addAnnotatedClasses(EldDocWriterElementInterface.class); // // ApiDocConcept adcRoot = doc.addConcept(new ApiDocConcept(null,C_CONTEXT,X4OLanguage.class)); // // ApiDocConcept adcMod = doc.addConcept(new ApiDocConcept(adcRoot,C_MODULE,X4OLanguageModule.class)); // ApiDocConcept adcIface = doc.addConcept(new ApiDocConcept(adcMod,C_INTERFACE,ElementInterface.class)); // ApiDocConcept adcNs = doc.addConcept(new ApiDocConcept(adcMod,C_NAMESPACE,ElementNamespace.class)); // ApiDocConcept adcEc = doc.addConcept(new ApiDocConcept(adcNs,C_ELEMENT,ElementClass.class)); // mm maybe redo something here // adcMod.addChildConcepts(new ApiDocConcept(adcMod,CC_ATTRIBUTE_H,ElementNamespaceAttribute.class)); // adcMod.addChildConcepts(new ApiDocConcept(adcMod,CC_CONFIGURATOR_G,ElementConfiguratorGlobal.class)); // adcMod.addChildConcepts(new ApiDocConcept(adcMod,CC_BINDING,ElementBindingHandler.class)); // adcIface.addChildConcepts(new ApiDocConcept(adcMod,CC_ATTRIBUTE,ElementClassAttribute.class)); // adcIface.addChildConcepts(new ApiDocConcept(adcMod,CC_CONFIGURATOR,ElementConfigurator.class)); // adcEc.addChildConcepts(new ApiDocConcept(adcEc,CC_CONFIGURATOR,ElementConfigurator.class)); // adcEc.addChildConcepts(new ApiDocConcept(adcEc,CC_ATTRIBUTE,ElementClassAttribute.class)); // Non-tree pages config // if (propertyConfig.getPropertyBoolean(PAGE_PRINT_XTREE)) { doc.addDocPage(EldDocXTreePageWriter.createDocPage()); } // if (propertyConfig.getPropertyBoolean(PAGE_PRINT_TREE)) { doc.addDocPage(DefaultPageWriterTree.createDocPage()); } // if (propertyConfig.getPropertyBoolean(PAGE_PRINT_INDEX_ALL)) { doc.addDocPage(DefaultPageWriterIndexAll.createDocPage()); } // if (propertyConfig.getPropertyBoolean(PAGE_PRINT_HELP)) { doc.addDocPage(DefaultPageWriterHelp.createDocPage()); } // Doc tree config // ApiDocNode rootNode = new ApiDocNode(language,"language",getLanguageNameUpperCase()+" Language","The X4O "+getLanguageNameUpperCase()+" Language"); // doc.setRootNode(rootNode); // for (X4OLanguageModule mod:language.getLanguageModules()) { ApiDocNode modNode = rootNode.addNode(createNodeLanguageModule(mod)); // for (ElementBindingHandler bind:mod.getElementBindingHandlers()) { modNode.addNode(createNodeElementBindingHandler(bind)); } // for (ElementConfiguratorGlobal conf:mod.getElementConfiguratorGlobals()) { modNode.addNode(createNodeElementConfiguratorGlobal(conf)); } // for (ElementInterface iface:mod.getElementInterfaces()) { ApiDocNode ifaceNode = modNode.addNode(createNodeElementInterface(iface)); // for (ElementClassAttribute eca:iface.getElementClassAttributes()) { ifaceNode.addNode(createNodeElementClassAttribute(eca)); } // for (ElementConfigurator conf:iface.getElementConfigurators()) { ifaceNode.addNode(createNodeElementConfigurator(conf)); } } // for (ElementNamespace ns:mod.getElementNamespaces()) { ApiDocNode nsNode = modNode.addNode(createNodeElementNamespace(ns)); // for (ElementNamespaceAttribute attr:ns.getElementNamespaceAttributes()) { nsNode.addNode(createNodeElementNamespaceAttribute(attr)); } // for (ElementClass ec:ns.getElementClasses()) { ApiDocNode ecNode = nsNode.addNode(createNodeElementClass(ec)); // for (ElementClassAttribute eca:ec.getElementClassAttributes()) { ecNode.addNode(createNodeElementClassAttribute(eca)); } // for (ElementConfigurator conf:ec.getElementConfigurators()) { ecNode.addNode(createNodeElementConfigurator(conf)); } } } // } return doc; } private String createDefaultPageSubTitle(String name) { StringBuilder buf = new StringBuilder(100); buf.append(name); buf.append(" ");// note use real space as 'html/header/title' will not always escape entities. TODO: add to html writer buf.append("API"); return buf.toString(); } private String createDefaultAbout(String name) { Calendar calendar = Calendar.getInstance(); StringBuilder buf = new StringBuilder(100); buf.append(name); buf.append("™ "); buf.append(calendar.get(Calendar.YEAR)); return buf.toString(); } private String createForeverCopyright() { StringBuilder buf = new StringBuilder(100); buf.append("Copyright © "); buf.append("Δ∞"); buf.append(" "); buf.append("仙上主天"); buf.append(" "); buf.append("All Rights Reserved."); return buf.toString(); } private List createDefaultKeywords() { List keywords = new ArrayList(10); keywords.add("language"); keywords.add("documentation"); return keywords; } }