package org.gcube.informationsystem.utils.documentation.generator; import java.io.File; import java.nio.file.Files; import java.nio.file.StandardOpenOption; import java.util.Map; import java.util.TreeMap; import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.types.TypeMapper; import org.gcube.informationsystem.types.reference.Type; import org.gcube.informationsystem.utils.documentation.knowledge.Node; import org.gcube.informationsystem.utils.documentation.knowledge.NodeElaborator; import org.gcube.informationsystem.utils.documentation.knowledge.Tree; import org.gcube.informationsystem.utils.documentation.model.DocumentationGenerator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Luca Frosini (ISTI - CNR) */ public class TreeGenerator extends Generator { private static final Logger logger = LoggerFactory.getLogger(TreeGenerator.class); public static final String IS_MODEL_FILENAME = "is-model.rst"; public static final String PROPERTIES_FILENAME = "properties.rst"; public static final String ENTITIES_FILENAME = "entities.rst"; public static final String RELATIONS_FILENAME = "relations.rst"; protected Map types; public TreeGenerator() { types = new TreeMap<>(); } public void addType(Type type) { AccessType accessType = type.getAccessType(); if(types.get(accessType)==null) { Type head = TypeMapper.createTypeDefinition(accessType.getTypeClass()); Tree tree = new Tree(head); types.put(accessType, tree); } if(type.getName().compareTo(accessType.getName())==0) { // Head has been already added return; } Tree tree = types.get(accessType); tree.addNode(type); } public void elaborateTree(final AccessType at, Tree tree, final File file) throws Exception { logger.debug("Going to elaborate the following type tree\n{}", tree.toString()); NodeElaborator ne = new NodeElaborator() { @Override public void elaborate(Node node, int level) throws Exception { Type type = node.getType(); if(level==0) { /* * Root node has been already documented in IS_MODEL_FILENAME * Going to skip it */ DocumentationGenerator dg = getDocumentationGenerator(type); dg.setLevel(level); StringBuffer sb = dg.generateSection(); Files.write(file.toPath(), sb.toString().getBytes(), StandardOpenOption.APPEND); }else { writeTypeToFile(type, file, level); } } }; tree.elaborate(ne); } public void generate() throws Exception { File is = getFile(IS_MODEL_FILENAME, true); File file = null; for(AccessType at : accessTypes) { Type type = TypeMapper.createTypeDefinition(at.getTypeClass()); writeTypeToFile(type, is); switch (at) { case PROPERTY: file = getFile(PROPERTIES_FILENAME, true); break; case ENTITY: file = getFile(ENTITIES_FILENAME, true); continue; case RELATION: file = getFile(RELATIONS_FILENAME, true); continue; default: break; } Tree tree = types.get(at); elaborateTree(at, tree, file); } } }