use of org.gradle.build.docs.dsl.docbook.model.PropertyDoc in project gradle by gradle.
the class ClassDocMethodsBuilder method build.
/**
* Builds the methods and script blocks of the given class. Assumes properties have already been built.
*/
public void build(ClassDoc classDoc) {
Set<String> signatures = new HashSet<String>();
for (Element tr : children(classDoc.getMethodsTable(), "tr")) {
List<Element> cells = children(tr, "td");
if (cells.size() != 1) {
throw new RuntimeException(String.format("Expected 1 cell in <tr>, found: %s", tr));
}
String methodName = cells.get(0).getTextContent().trim();
Collection<MethodMetaData> methods = classDoc.getClassMetaData().findDeclaredMethods(methodName);
if (methods.isEmpty()) {
throw new RuntimeException(String.format("No metadata for method '%s.%s()'. Available methods: %s", classDoc.getName(), methodName, classDoc.getClassMetaData().getDeclaredMethodNames()));
}
for (MethodMetaData method : methods) {
DocComment docComment = javadocConverter.parse(method, listener);
MethodDoc methodDoc = new MethodDoc(method, docComment.getDocbook());
if (methodDoc.getDescription() == null) {
throw new RuntimeException(String.format("Docbook content for '%s %s' does not contain a description paragraph.", classDoc.getName(), method.getSignature()));
}
PropertyDoc property = classDoc.findProperty(methodName);
boolean multiValued = false;
if (property != null && method.getParameters().size() == 1 && method.getParameters().get(0).getType().getSignature().equals(Closure.class.getName())) {
TypeMetaData type = property.getMetaData().getType();
if (type.getName().equals("java.util.List") || type.getName().equals("java.util.Collection") || type.getName().equals("java.util.Set") || type.getName().equals("java.util.Iterable")) {
type = type.getTypeArgs().get(0);
multiValued = true;
}
classDoc.addClassBlock(new BlockDoc(methodDoc, property, type, multiValued));
} else {
classDoc.addClassMethod(methodDoc);
signatures.add(method.getOverrideSignature());
}
}
}
for (ClassDoc supertype : classDoc.getSuperTypes()) {
for (MethodDoc method : supertype.getClassMethods()) {
if (signatures.add(method.getMetaData().getOverrideSignature())) {
classDoc.addClassMethod(method);
}
}
}
}
use of org.gradle.build.docs.dsl.docbook.model.PropertyDoc 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);
}
}
use of org.gradle.build.docs.dsl.docbook.model.PropertyDoc in project gradle by gradle.
the class PropertiesRenderer method renderSummaryTo.
public void renderSummaryTo(ClassDoc classDoc, Element parent) {
Document document = parent.getOwnerDocument();
Element summarySection = document.createElement("section");
parent.appendChild(summarySection);
Element title = document.createElement("title");
summarySection.appendChild(title);
title.appendChild(document.createTextNode("Properties"));
Collection<PropertyDoc> classProperties = classDoc.getClassProperties();
if (!classProperties.isEmpty()) {
Element table = document.createElement("table");
summarySection.appendChild(table);
title = document.createElement("title");
table.appendChild(title);
title.appendChild(document.createTextNode("Properties - " + classDoc.getSimpleName()));
propertyTableRenderer.renderTo(classProperties, table);
}
for (ClassExtensionDoc extensionDoc : classDoc.getClassExtensions()) {
extensionPropertiesSummaryRenderer.renderTo(extensionDoc, summarySection);
}
if (!hasProperties(classDoc)) {
Element para = document.createElement("para");
summarySection.appendChild(para);
para.appendChild(document.createTextNode("No properties"));
}
}
use of org.gradle.build.docs.dsl.docbook.model.PropertyDoc in project gradle by gradle.
the class PropertyTableRenderer method renderTo.
public void renderTo(Iterable<PropertyDoc> properties, Element parent) {
Document document = parent.getOwnerDocument();
// <thead>
// <tr>
// <td>Property</td>
// <td>Description</td>
// </tr>
// </thead>
Element thead = document.createElement("thead");
parent.appendChild(thead);
Element tr = document.createElement("tr");
thead.appendChild(tr);
Element td = document.createElement("td");
tr.appendChild(td);
td.appendChild(document.createTextNode("Property"));
td = document.createElement("td");
tr.appendChild(td);
td.appendChild(document.createTextNode("Description"));
for (PropertyDoc propDoc : properties) {
// <tr>
// <td><link linkend="$id"><literal>$name</literal></link</td>
// <td>$description</td>
// </tr>
tr = document.createElement("tr");
parent.appendChild(tr);
td = document.createElement("td");
tr.appendChild(td);
Element link = document.createElement("link");
td.appendChild(link);
link.setAttribute("linkend", propDoc.getId());
Element literal = document.createElement("literal");
link.appendChild(literal);
literal.appendChild(document.createTextNode(propDoc.getName()));
td = document.createElement("td");
tr.appendChild(td);
if (propDoc.isDeprecated()) {
Element caution = document.createElement("caution");
td.appendChild(caution);
caution.appendChild(document.createTextNode("Deprecated"));
}
if (propDoc.isIncubating()) {
Element caution = document.createElement("caution");
td.appendChild(caution);
caution.appendChild(document.createTextNode("Incubating"));
}
td.appendChild(document.importNode(propDoc.getDescription(), true));
}
}
use of org.gradle.build.docs.dsl.docbook.model.PropertyDoc in project gradle by gradle.
the class PropertiesRenderer method renderDetailsTo.
public void renderDetailsTo(ClassDoc classDoc, Element parent) {
if (hasProperties(classDoc)) {
Document document = parent.getOwnerDocument();
Element detailsSection = document.createElement("section");
parent.appendChild(detailsSection);
Element title = document.createElement("title");
detailsSection.appendChild(title);
title.appendChild(document.createTextNode("Property details"));
for (PropertyDoc classProperty : classDoc.getClassProperties()) {
propertiesDetailRenderer.renderTo(classProperty, detailsSection);
}
for (ClassExtensionDoc extensionDoc : classDoc.getClassExtensions()) {
for (PropertyDoc propertyDoc : extensionDoc.getExtensionProperties()) {
propertiesDetailRenderer.renderTo(propertyDoc, detailsSection);
}
}
}
}
Aggregations