package org.gcube.informationsystem.utils.documentation.model; import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.discovery.knowledge.UsageKnowledge; import org.gcube.informationsystem.types.reference.Type; import org.gcube.informationsystem.types.reference.properties.LinkedEntity; import org.gcube.informationsystem.types.reference.properties.PropertyDefinition; import org.gcube.informationsystem.utils.documentation.rst.Section; import org.gcube.informationsystem.utils.documentation.rst.Section.SectionType; import org.gcube.informationsystem.utils.documentation.rst.table.Cell; import org.gcube.informationsystem.utils.documentation.rst.table.Row; import org.gcube.informationsystem.utils.documentation.rst.table.RowType; import org.gcube.informationsystem.utils.documentation.rst.table.Table; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Luca Frosini (ISTI - CNR) */ public abstract class DocumentationGenerator { private static final Logger logger = LoggerFactory.getLogger(DocumentationGenerator.class); private static final int DEFAULT_NUMBER_OF_COLUMNS = 5; public static final String NO_ADDITIONAL_ATTRIBUTE = "This type does not define any additional attributes."; public static final String NO_SPECIFIC_KNOWN_USAGE = "No specific known usage for this type."; protected static int defaultOffsetLevel = 0; public static int getDefaultOffsetLevel() { return defaultOffsetLevel; } public static void setDefaultOffsetLevel(int defaultOffsetLevel) { DocumentationGenerator.defaultOffsetLevel = defaultOffsetLevel; } protected final Type type; protected final AccessType requiredType; protected String superClassToBeExcluded; protected int requiredNumberOfColumns; protected int offsetLevel; protected int level; protected UsageKnowledge facetKnowledge; protected UsageKnowledge resourceKnowledge; public UsageKnowledge getFacetKnowledge() { return facetKnowledge; } public void setFacetKnowledge(UsageKnowledge facetKnowledge) { this.facetKnowledge = facetKnowledge; } public UsageKnowledge getResourceKnowledge() { return resourceKnowledge; } public void setResourceKnowledge(UsageKnowledge resourceKnowledge) { this.resourceKnowledge = resourceKnowledge; } protected DocumentationGenerator(Type type, AccessType requiredType) { this.type = type; this.requiredType = requiredType; AccessType accessType = type.getAccessType(); if(accessType!=requiredType) { throw new RuntimeException(type.getName() + " is not a " + requiredType.getName() + " type"); } this.requiredNumberOfColumns = DEFAULT_NUMBER_OF_COLUMNS; this.superClassToBeExcluded = null; this.offsetLevel = DocumentationGenerator.defaultOffsetLevel; } public void setLevel(int level) { this.level = level; } public void setOffsetLevel(int offsetLevel) { this.offsetLevel = offsetLevel; } protected Row getPropertyFieldsBoldRow() { Row row = new Row(RowType.NORMAL); Cell name = new Cell(); name.setText("**Name**"); row.appendCell(name); Cell type = new Cell(); type.setText("**Type**"); row.appendCell(type); Cell attributes = new Cell(); attributes.setText("**Attributes**"); row.appendCell(attributes); Cell description = new Cell(); description.setText("**Description**"); row.appendCell(description); for(int i=row.getCells().size(); i entities, String messageFroNullOrEmptyCollection) { if(entities!=null && entities.size()>0) { for(LinkedEntity entity : entities) { Row row = getLinkedEntityrow(entity); table.appendRow(row); } }else { Row row = getRowCellSpan(messageFroNullOrEmptyCollection, requiredNumberOfColumns);; table.appendRow(row); } return table; } protected String getPropertyAttributes(PropertyDefinition propertyDefinition) { StringBuffer stringBuffer = new StringBuffer(); boolean mandatory = propertyDefinition.isMandatory(); stringBuffer.append("``Mandatory:"); stringBuffer.append(mandatory); boolean readOnly = propertyDefinition.isReadonly(); stringBuffer.append("`` ``ReadOnly:"); stringBuffer.append(readOnly); boolean notNull = propertyDefinition.isNotnull(); stringBuffer.append("`` ``NotNull:"); stringBuffer.append(notNull); String regex = propertyDefinition.getRegexp(); if(regex!=null && regex.compareTo("")!=0) { stringBuffer.append("`` ``Regex:"); stringBuffer.append(regex); } Integer max = propertyDefinition.getMax(); if(max!=null) { stringBuffer.append("`` ``Max:"); stringBuffer.append(max); } Integer min = propertyDefinition.getMin(); if(min!=null) { stringBuffer.append("`` ``Min:"); stringBuffer.append(min); } stringBuffer.append("``"); return stringBuffer.toString(); } protected Row getPropertyRow(PropertyDefinition propertyDefinition) { Row row = new Row(RowType.NORMAL); Cell name = new Cell(); name.setText(propertyDefinition.getName()); row.appendCell(name); Cell type = new Cell(); type.setText(propertyDefinition.getType()); row.appendCell(type); Cell attributes = new Cell(); attributes.setText(getPropertyAttributes(propertyDefinition)); row.appendCell(attributes); Cell description = new Cell(); description.setText(propertyDefinition.getDescription()); row.appendCell(description); for(int i=row.getCells().size(); i properties) { table.appendRow(getPropertyFieldsBoldRow()); if(properties!=null && properties.size()>0) { Set notMandatoryProperties = new HashSet<>(); for(PropertyDefinition propertyDefinition : properties) { if(propertyDefinition.isMandatory()) { /* * Adding Mandatory properties first in the table */ table.appendRow(getPropertyRow(propertyDefinition)); }else { notMandatoryProperties.add(propertyDefinition); } } for(PropertyDefinition propertyDefinition : notMandatoryProperties) { table.appendRow(getPropertyRow(propertyDefinition)); } }else { table.appendRow(getNoPropertyRow()); } return table; } /* * E.g. GCubeProperty extends Property */ protected StringBuffer getTypeDeclaration() { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("**"); stringBuffer.append(type.getName()); stringBuffer.append("**"); Set superClasses = type.getSuperClasses(); if(superClassToBeExcluded!=null) { superClasses.remove(superClassToBeExcluded); } if(superClasses.size()>0){ stringBuffer.append(" ``extends`` "); boolean first = true; for(String superClass : superClasses) { if(!first) { stringBuffer.append(", "); }else { first = false; } stringBuffer.append("**"); stringBuffer.append(superClass); stringBuffer.append("**"); } } return stringBuffer; } public Section getSection() { Section section = new Section(); int sectionLevel = level+offsetLevel; SectionType[] sectionTypes = SectionType.values(); int maxSectionLevel = sectionTypes.length-1; sectionLevel = sectionLevel>=maxSectionLevel ? maxSectionLevel : sectionLevel; SectionType sectionType = SectionType.values()[sectionLevel]; section.setSectionType(sectionType); return section; } public StringBuffer generateSection() { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("\n"); Section section = getSection(); String name = type.getName(); stringBuffer.append(section.generate(name)); return stringBuffer; } protected StringBuffer generateChangelog() { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("The **"); stringBuffer.append(type.getName()); stringBuffer.append("** current version is "); stringBuffer.append(type.getVersionAsString()); stringBuffer.append(".\n\n"); Map changelog = type.getChangelogWithVersionAsString(); Set keySet = changelog.keySet(); stringBuffer.append("Changelog:\n\n"); int i=0; for(String version : keySet) { stringBuffer.append("* **"); stringBuffer.append(version); stringBuffer.append("**: "); stringBuffer.append(changelog.get(version)); if(i==keySet.size()-1) { stringBuffer.append("."); }else { stringBuffer.append(";"); } } stringBuffer.append("\n\n"); return stringBuffer; } protected abstract Table getTable(); protected StringBuffer generateTable() { StringBuffer stringBuffer = new StringBuffer(); String tableTitle = getTypeDeclaration().toString(); Table table = getTable(); stringBuffer.append(table.generateTable(tableTitle)); return stringBuffer; } public StringBuffer generate() { StringBuffer stringBuffer = generateSection(); stringBuffer.append(type.getDescription()); stringBuffer.append("\n"); stringBuffer.append(generateTable()); stringBuffer.append(generateChangelog()); logger.trace(stringBuffer.toString()); return stringBuffer; } }