Search in sources :

Example 1 with PropertyMetaData

use of org.gradle.build.docs.dsl.source.model.PropertyMetaData in project gradle by gradle.

the class ClassDocExtensionsBuilder method build.

private void build(ClassExtensionDoc extensionDoc) {
    Document doc;
    try {
        doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
    } catch (ParserConfigurationException e) {
        throw UncheckedException.throwAsUncheckedException(e);
    }
    LinkRenderer linkRenderer = new LinkRenderer(doc, model);
    for (Map.Entry<String, ClassDoc> entry : extensionDoc.getExtensionClasses().entrySet()) {
        String id = entry.getKey();
        ClassDoc type = entry.getValue();
        PropertyMetaData propertyMetaData = new PropertyMetaData(id, extensionDoc.getTargetClass().getClassMetaData());
        propertyMetaData.setType(new TypeMetaData(type.getName()));
        Element para = doc.createElement("para");
        para.appendChild(doc.createTextNode("The "));
        para.appendChild(linkRenderer.link(propertyMetaData.getType(), listener));
        para.appendChild(doc.createTextNode(String.format(" added by the %s plugin.", extensionDoc.getPluginId())));
        PropertyDoc propertyDoc = new PropertyDoc(propertyMetaData, Collections.singletonList(para), Collections.<ExtraAttributeDoc>emptyList());
        extensionDoc.getExtraProperties().add(propertyDoc);
        para = doc.createElement("para");
        para.appendChild(doc.createTextNode("Configures the "));
        para.appendChild(linkRenderer.link(propertyMetaData.getType(), listener));
        para.appendChild(doc.createTextNode(String.format(" added by the %s plugin.", extensionDoc.getPluginId())));
        MethodMetaData methodMetaData = new MethodMetaData(id, extensionDoc.getTargetClass().getClassMetaData());
        methodMetaData.addParameter("configClosure", new TypeMetaData(Closure.class.getName()));
        MethodDoc methodDoc = new MethodDoc(methodMetaData, Collections.singletonList(para));
        extensionDoc.getExtraBlocks().add(new BlockDoc(methodDoc, propertyDoc, propertyMetaData.getType(), false));
    }
}
Also used : Element(org.w3c.dom.Element) PropertyMetaData(org.gradle.build.docs.dsl.source.model.PropertyMetaData) MethodMetaData(org.gradle.build.docs.dsl.source.model.MethodMetaData) Document(org.w3c.dom.Document) TypeMetaData(org.gradle.build.docs.dsl.source.model.TypeMetaData) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with PropertyMetaData

use of org.gradle.build.docs.dsl.source.model.PropertyMetaData in project gradle by gradle.

the class ClassDocPropertiesBuilder method build.

/**
 * Builds the properties of the given class
 */
void build(ClassDoc classDoc) {
    Element thead = getChild(classDoc.getPropertiesTable(), "thead");
    Element tr = getChild(thead, "tr");
    List<Element> header = children(tr, "td");
    if (header.size() < 1) {
        throw new RuntimeException(String.format("Expected at least 1 <td> in <thead>/<tr>, found: %s", header));
    }
    Map<String, Element> inheritedValueTitleMapping = new HashMap<String, Element>();
    List<Element> valueTitles = new ArrayList<Element>();
    for (int i = 1; i < header.size(); i++) {
        Element element = header.get(i);
        Element override = findChild(element, "overrides");
        if (override != null) {
            element.removeChild(override);
            inheritedValueTitleMapping.put(override.getTextContent(), element);
        }
        Node firstChild = element.getFirstChild();
        if (firstChild instanceof Text) {
            firstChild.setTextContent(firstChild.getTextContent().replaceFirst("^\\s+", ""));
        }
        Node lastChild = element.getLastChild();
        if (lastChild instanceof Text) {
            lastChild.setTextContent(lastChild.getTextContent().replaceFirst("\\s+$", ""));
        }
        valueTitles.add(element);
    }
    // adding the properties from the super class onto the inheriting class
    Map<String, PropertyDoc> props = new TreeMap<String, PropertyDoc>();
    List<ClassDoc> superTypes = classDoc.getSuperTypes();
    for (ClassDoc superType : superTypes) {
        LOG.info("Getting properties for {}", superType.getName());
        for (PropertyDoc propertyDoc : superType.getClassProperties()) {
            Map<String, ExtraAttributeDoc> additionalValues = new LinkedHashMap<String, ExtraAttributeDoc>();
            for (ExtraAttributeDoc attributeDoc : propertyDoc.getAdditionalValues()) {
                String key = attributeDoc.getKey();
                if (inheritedValueTitleMapping.get(key) != null) {
                    ExtraAttributeDoc newAttribute = new ExtraAttributeDoc(inheritedValueTitleMapping.get(key), attributeDoc.getValueCell());
                    additionalValues.put(newAttribute.getKey(), newAttribute);
                } else {
                    additionalValues.put(key, attributeDoc);
                }
            }
            props.put(propertyDoc.getName(), propertyDoc.forClass(classDoc, additionalValues.values()));
        }
    }
    for (Element row : children(classDoc.getPropertiesTable(), "tr")) {
        List<Element> cells = children(row, "td");
        if (cells.size() != header.size()) {
            throw new RuntimeException(String.format("Expected %s <td> elements in <tr>, found: %s", header.size(), tr));
        }
        String propName = cells.get(0).getTextContent().trim();
        PropertyMetaData property = classDoc.getClassMetaData().findProperty(propName);
        if (property == null) {
            throw new RuntimeException(String.format("No metadata for property '%s.%s'. Available properties: %s", classDoc.getName(), propName, classDoc.getClassMetaData().getPropertyNames()));
        }
        Map<String, ExtraAttributeDoc> additionalValues = new LinkedHashMap<String, ExtraAttributeDoc>();
        if (!superTypes.isEmpty()) {
            PropertyDoc overriddenProp = props.get(propName);
            if (overriddenProp != null) {
                for (ExtraAttributeDoc attributeDoc : overriddenProp.getAdditionalValues()) {
                    additionalValues.put(attributeDoc.getKey(), attributeDoc);
                }
            }
        }
        for (int i = 1; i < header.size(); i++) {
            if (cells.get(i).getFirstChild() == null) {
                continue;
            }
            ExtraAttributeDoc attributeDoc = new ExtraAttributeDoc(valueTitles.get(i - 1), cells.get(i));
            additionalValues.put(attributeDoc.getKey(), attributeDoc);
        }
        PropertyDoc propertyDoc = new PropertyDoc(property, javadocConverter.parse(property, listener).getDocbook(), new ArrayList<ExtraAttributeDoc>(additionalValues.values()));
        if (propertyDoc.getDescription() == null) {
            throw new RuntimeException(String.format("Docbook content for '%s.%s' does not contain a description paragraph.", classDoc.getName(), propName));
        }
        props.put(propName, propertyDoc);
    }
    for (PropertyDoc propertyDoc : props.values()) {
        classDoc.addClassProperty(propertyDoc);
    }
}
Also used : Element(org.w3c.dom.Element) Node(org.w3c.dom.Node) Text(org.w3c.dom.Text) PropertyMetaData(org.gradle.build.docs.dsl.source.model.PropertyMetaData) PropertyDoc(org.gradle.build.docs.dsl.docbook.model.PropertyDoc) ExtraAttributeDoc(org.gradle.build.docs.dsl.docbook.model.ExtraAttributeDoc) ClassDoc(org.gradle.build.docs.dsl.docbook.model.ClassDoc)

Aggregations

PropertyMetaData (org.gradle.build.docs.dsl.source.model.PropertyMetaData)2 Element (org.w3c.dom.Element)2 HashMap (java.util.HashMap)1 Map (java.util.Map)1 ParserConfigurationException (javax.xml.parsers.ParserConfigurationException)1 ClassDoc (org.gradle.build.docs.dsl.docbook.model.ClassDoc)1 ExtraAttributeDoc (org.gradle.build.docs.dsl.docbook.model.ExtraAttributeDoc)1 PropertyDoc (org.gradle.build.docs.dsl.docbook.model.PropertyDoc)1 MethodMetaData (org.gradle.build.docs.dsl.source.model.MethodMetaData)1 TypeMetaData (org.gradle.build.docs.dsl.source.model.TypeMetaData)1 Document (org.w3c.dom.Document)1 Node (org.w3c.dom.Node)1 Text (org.w3c.dom.Text)1