diff --git a/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/Main.java b/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/Main.java index 42b4320e..daa47984 100644 --- a/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/Main.java +++ b/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/Main.java @@ -19,6 +19,7 @@ import de.oc.dbdoc.ant.Tableregistry; import de.oc.dbdoc.export.DotExport; import de.oc.dbdoc.export.DotWriterImpl; +import de.oc.dbdoc.export.PlantUmlWriterImpl; import de.oc.dbdoc.graphdata.Graph; import de.oc.dbdoc.graphdata.GraphForDiagram; import de.oc.dbdoc.graphdata.GraphForSingleTable; @@ -35,6 +36,8 @@ */ public class Main { + private static boolean isPlantuml; + public static class GraphRef { private Graph _graph; @@ -109,8 +112,9 @@ public static String readFile( File pFile ) } - public static void writeDiagramsRecursive( Diagram pRootDiagram, Styles pStyles, Schema pSchema, String pHtmlOutDir, String pDotOutDir, String pTableSourcefileFolder, Tableregistry pTableregistry, boolean pIsSvg ) + public static void writeDiagramsRecursive( Diagram pRootDiagram, Styles pStyles, Schema pSchema, String pHtmlOutDir, String pDotOutDir, String pTableSourcefileFolder, Tableregistry pTableregistry, boolean pIsSvg, boolean pIsPlantuml ) { + isPlantuml = pIsPlantuml; try { GraphForDiagram lRootGraph = new GraphForDiagram( pRootDiagram, pStyles, null, pTableregistry ); @@ -216,11 +220,19 @@ public static String getNameFromLabel( String pLabel ) private static void _writeSingleGraph( GraphRef pGraphRef, Schema pSchema, String pHtmlOutDir, String pDotOutDir, String pTableSourcefileFolder, Tableregistry pTableregistry, boolean pIsSvg ) throws Exception { - System.out.println( "writing graph: " + getFileNameForGraph( pGraphRef, pGraphRef.getGraph().getDotExecutable() ) ); - _writeHTML( pHtmlOutDir, pGraphRef, pSchema, pTableSourcefileFolder, pTableregistry, pIsSvg ); - FileWriter lFileWriter = new FileWriter( pDotOutDir + "/" + getFileNameForGraph( pGraphRef, pGraphRef.getGraph().getDotExecutable() ) ); - new DotExport().export( pGraphRef.getGraph(), pSchema, new DotWriterImpl( lFileWriter ), pGraphRef.isOutref() ); - lFileWriter.close(); + if(isPlantuml){ + System.out.println( "writing graph: " + getFileNameForGraph( pGraphRef, "plantuml" ) ); + FileWriter lPlantUmlFileWriter = new FileWriter( pHtmlOutDir + "/" + getFileNameForGraph( pGraphRef, "plantuml" ) ); + new DotExport().export( pGraphRef.getGraph(), pSchema, new PlantUmlWriterImpl( lPlantUmlFileWriter ), pGraphRef.isOutref() ); + lPlantUmlFileWriter.close(); + } + else { + System.out.println( "writing graph: " + getFileNameForGraph( pGraphRef, pGraphRef.getGraph().getDotExecutable() ) ); + _writeHTML(pHtmlOutDir, pGraphRef, pSchema, pTableSourcefileFolder, pTableregistry, pIsSvg); + FileWriter lFileWriter = new FileWriter(pDotOutDir + "/" + getFileNameForGraph(pGraphRef, pGraphRef.getGraph().getDotExecutable())); + new DotExport().export(pGraphRef.getGraph(), pSchema, new DotWriterImpl(lFileWriter), pGraphRef.isOutref()); + lFileWriter.close(); + } } private static boolean _hasOutrefVersion( Graph pGraph, Schema pSchema ) diff --git a/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/ant/OrcasDbDoc.java b/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/ant/OrcasDbDoc.java index 634fe5db..f9b13ffe 100644 --- a/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/ant/OrcasDbDoc.java +++ b/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/ant/OrcasDbDoc.java @@ -117,7 +117,7 @@ public void execute( Parameters pParameters ) Schema lSchema = new DbLoader().loadSchema( _diagram, lExtensionHandlerImpl.loadSyexModel(), _tableregistry ); lSchema.mergeAssociations(); - Main.writeDiagramsRecursive( _diagram, _styles, lSchema, _outfolder, _tmpfolder, pParameters.getModelFile() + "/tables", _tableregistry, _svg ); + Main.writeDiagramsRecursive( _diagram, _styles, lSchema, _outfolder, _tmpfolder, pParameters.getModelFile() + "/tables", _tableregistry, _svg, pParameters.getDbdocPlantuml() ); } catch( Exception e ) { diff --git a/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/export/PlantUmlWriterImpl.java b/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/export/PlantUmlWriterImpl.java new file mode 100644 index 00000000..0b1db92b --- /dev/null +++ b/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/export/PlantUmlWriterImpl.java @@ -0,0 +1,169 @@ +package de.oc.dbdoc.export; + +import java.io.PrintWriter; +import java.io.Writer; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import de.oc.dbdoc.Main; +import de.oc.dbdoc.graphdata.Graph; +import de.oc.dbdoc.schemadata.Association; +import de.oc.dbdoc.schemadata.Column; +import de.oc.dbdoc.schemadata.Table; + +public class PlantUmlWriterImpl implements DotWriter +{ + private PrintWriter lPrintWriter; + + public PlantUmlWriterImpl( Writer pWriter ) + { + lPrintWriter = new PrintWriter( pWriter ); + } + + private void println( String pString ) + { + lPrintWriter.println( pString ); + } + + private void print( String pString ) + { + lPrintWriter.print( pString ); + } + + public void printHeaderStart( String pStyleForGraph ) + { + println( "@startuml" ); + } + + public void printHeaderEnd() + { + println( "@enduml" ); + } + + public void printGraph( Graph pGraph, String pCommonStyle, boolean pIsOutref ) + { + println( "package \""+pGraph.getLabel()+"\" {" ); + println("}" ); + } + + public void printSubGraphStartFilled( Graph pGraph, boolean pOutRefsOnly ) + { + printSubGraphStart( pGraph, "filled", pOutRefsOnly ); + } + + private void printSubGraphStart( Graph pGraph, String pStyle, boolean pIsOutref ) + { + print( "package \""+pGraph.getLabel()+"\" " ); + Map lStyleMap = parseStyle(pGraph.getStyleForGraph()); + if(lStyleMap.containsKey("package")){ + print( lStyleMap.get("package") + " " ); + } + println( "{" ); + } + + public void printSubGraphEnd() + { + println( "}" ); + } + + public void printSubGraphStartDashed( Graph pGraph, boolean pOutRefsOnly ) + { + printSubGraphStart( pGraph, "dashed", pOutRefsOnly ); + } + + public void printGraphAssociation( DotExport.GraphAssociation pGraphAssociation ) + { + print( Main.getNameFromLabel( pGraphAssociation.getGraphTo().getLabel() ) ); + if( pGraphAssociation._bidirectional ) + { + print( " - " ); + } + else + { + print( " <-- " ); + } + println( Main.getNameFromLabel( pGraphAssociation.getGraphFrom().getLabel() ) ); + /*print( " [label=\"\", taillabel=\"\", headlabel=\"\", style=\"dashed\"" );*/ + } + + private Map parseStyle(String pStyle){ + Map lReturn = new HashMap<>(); + + String lLastKey = null; + String lLastValue = null; + + String[] lStyles = pStyle.split(","); + for( int i=0;i pVisibleAssociation, boolean pIsOutref, String pStyle, List pFilteredColumns ) + { + print("class "+ pTable.getName() ); + Map lStyleMap = parseStyle(pStyle); + if(lStyleMap.containsKey("class")){ + print( " " + lStyleMap.get("class") ); + } + + println( " {" ); + + boolean lColumnsFiltered = pFilteredColumns.size() != pTable.getColumns().size(); + + Iterator lColumnIterator = pFilteredColumns.iterator(); + while( lColumnIterator.hasNext() ) + { + Column lColumn = lColumnIterator.next(); + + print( lColumn.getColumnType() ); + print( " " ); + println( lColumn.getColumnName() ); + } + + if( lColumnsFiltered ) + { + println( "\"...\"" ); + } + + println( "}" ); + } + + public void printAssociation( Association pAssociation, Graph pGraph ) { + print(pAssociation.getTableTo().getName()); + if (pAssociation.getMultiplicityTextTo().length() > 0) { + print(" \"" + pAssociation.getMultiplicityTextTo() + "\" "); + } + if(pAssociation.isDirected()) { + print(" <-- "); + } else { + print(" - "); + } + if (pAssociation.getMultiplicityTextFrom().length() > 0){ + print(" \"" + pAssociation.getMultiplicityTextFrom() + "\" "); + } + print( pAssociation.getTableFrom().getName() ); + if( pAssociation.getAssociationName().length() <= 20 ) + { + print( " : "+ pAssociation.getAssociationName() ); + } + println(""); + } +} diff --git a/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/load/DbLoader.java b/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/load/DbLoader.java index 6c392e7e..a1016a89 100644 --- a/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/load/DbLoader.java +++ b/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/load/DbLoader.java @@ -28,7 +28,7 @@ public Schema loadSchema( Diagram pRootDiagram, Model pModel, Tableregistry pTab lSchema.addTable( lTable ); - pTable.getColumns().forEach( pColumn -> lTable.addColumn( new Column( pColumn.getName() ) ) ); + pTable.getColumns().forEach( pColumn -> lTable.addColumn( new Column( pColumn.getName(), pColumn.getObject_type() != null ? pColumn.getObject_type() : pColumn.getData_type().getName() ) ) ); } } ); diff --git a/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/schemadata/Column.java b/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/schemadata/Column.java index 5f215f7e..7a3ad171 100644 --- a/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/schemadata/Column.java +++ b/orcas_core/build_source/orcas_dbdoc/src/main/java/de/oc/dbdoc/schemadata/Column.java @@ -9,10 +9,12 @@ public class Column { private String _columnName; + private String _columnType; - public Column( String pColumnName ) + public Column( String pColumnName, String pColumnType ) { _columnName = pColumnName; + _columnType = pColumnType; _columnName = _columnName.replaceAll("ß", "SS"); _columnName = _columnName.replaceAll("Ä", "AE"); @@ -28,4 +30,9 @@ public String getColumnName() { return _columnName; } + + public String getColumnType() + { + return _columnType; + } } diff --git a/orcas_core/build_source/orcas_dbdoc/src/test/java/de/oc/dbdoc/test/TestGraphPrinting.java b/orcas_core/build_source/orcas_dbdoc/src/test/java/de/oc/dbdoc/test/TestGraphPrinting.java index 0ab45c02..9d9145ea 100644 --- a/orcas_core/build_source/orcas_dbdoc/src/test/java/de/oc/dbdoc/test/TestGraphPrinting.java +++ b/orcas_core/build_source/orcas_dbdoc/src/test/java/de/oc/dbdoc/test/TestGraphPrinting.java @@ -57,9 +57,9 @@ private enum Mode private Table createTable( String pTableName ) { Table lTable = new Table( pTableName ); - lTable.addColumn( new Column( COLUMN_NAME_ID ) ); - lTable.addColumn( new Column( COLUMN_NAME_REF ) ); - lTable.addColumn( new Column( COLUMN_NAME_3 ) ); + lTable.addColumn( new Column( COLUMN_NAME_ID, "type" ) ); + lTable.addColumn( new Column( COLUMN_NAME_REF, "type" ) ); + lTable.addColumn( new Column( COLUMN_NAME_3, "type" ) ); _schema.addTable( lTable ); diff --git a/orcas_core/build_source/orcas_diff/src/main/java/de/opitzconsulting/orcas/diff/ParameterDefaults.java b/orcas_core/build_source/orcas_diff/src/main/java/de/opitzconsulting/orcas/diff/ParameterDefaults.java index 358c75b6..334874c2 100644 --- a/orcas_core/build_source/orcas_diff/src/main/java/de/opitzconsulting/orcas/diff/ParameterDefaults.java +++ b/orcas_core/build_source/orcas_diff/src/main/java/de/opitzconsulting/orcas/diff/ParameterDefaults.java @@ -45,4 +45,6 @@ public class ParameterDefaults { public static final String viewextractmode = "text"; public static boolean sqlplustable = false; public static boolean orderColumnsByName = false; + + public static boolean dbdocPlantuml = false; } diff --git a/orcas_core/build_source/orcas_diff/src/main/java/de/opitzconsulting/orcas/diff/Parameters.java b/orcas_core/build_source/orcas_diff/src/main/java/de/opitzconsulting/orcas/diff/Parameters.java index 4287f404..9c3af4d2 100644 --- a/orcas_core/build_source/orcas_diff/src/main/java/de/opitzconsulting/orcas/diff/Parameters.java +++ b/orcas_core/build_source/orcas_diff/src/main/java/de/opitzconsulting/orcas/diff/Parameters.java @@ -122,6 +122,8 @@ public static enum FailOnErrorMode protected String _charsetName = StandardCharsets.UTF_8.name(); protected String _charsetNameSqlLog = null; + protected boolean _dbdocPlantuml = false; + private AdditionalExtensionFactory _additionalExtensionFactory = new AdditionalExtensionFactory() { @SuppressWarnings( "unchecked" ) @@ -485,4 +487,9 @@ public Charset getEncodingForSqlLog() { return _charsetNameSqlLog == null ? getEncoding() : Charset.forName( _charsetNameSqlLog ); } + + public boolean getDbdocPlantuml() + { + return _dbdocPlantuml; + } } diff --git a/orcas_core/build_source/orcas_diff/src/main/java/de/opitzconsulting/orcas/diff/ParametersCall.java b/orcas_core/build_source/orcas_diff/src/main/java/de/opitzconsulting/orcas/diff/ParametersCall.java index 6cde1395..70af5c8b 100644 --- a/orcas_core/build_source/orcas_diff/src/main/java/de/opitzconsulting/orcas/diff/ParametersCall.java +++ b/orcas_core/build_source/orcas_diff/src/main/java/de/opitzconsulting/orcas/diff/ParametersCall.java @@ -256,6 +256,12 @@ public void setCreateIndexOnline( boolean pCreateIndexOnline ) _createIndexOnline = pCreateIndexOnline; } + + public void setDbdocPlantuml( boolean pDbdocPlantuml ) + { + _dbdocPlantuml = pDbdocPlantuml; + } + public static ParametersCall createWithDefaults() { ParametersCall lReturn = new ParametersCall(); @@ -298,6 +304,8 @@ public static ParametersCall createWithDefaults() lReturn.setOrcasJdbcConnectParameters(lReturn.getJdbcConnectParameters()); + lReturn.setDbdocPlantuml(ParameterDefaults.dbdocPlantuml); + return lReturn; } } diff --git a/orcas_core/build_source/orcas_gradle_plugin/src/main/groovy/com/opitzconsulting/orcas/gradle/BaseOrcasTask.groovy b/orcas_core/build_source/orcas_gradle_plugin/src/main/groovy/com/opitzconsulting/orcas/gradle/BaseOrcasTask.groovy index bc393d0a..f2a8bea5 100644 --- a/orcas_core/build_source/orcas_gradle_plugin/src/main/groovy/com/opitzconsulting/orcas/gradle/BaseOrcasTask.groovy +++ b/orcas_core/build_source/orcas_gradle_plugin/src/main/groovy/com/opitzconsulting/orcas/gradle/BaseOrcasTask.groovy @@ -60,6 +60,8 @@ public abstract class BaseOrcasTask extends DefaultTask lParametersCall.setMultiSchemaDbaViews( project.orcasconfiguration.multischemadbaviews ); lParametersCall.setMultiSchemaExcludewhereowner( project.orcasconfiguration.multischemaexcludewhereowner ); + lParametersCall.setDbdocPlantuml( project.orcasconfiguration.dbdocPlantuml ); + if( project.orcasconfiguration.extensionHandler != null ) { lParametersCall.setExtensionHandler( project.orcasconfiguration.extensionHandler ); diff --git a/orcas_core/build_source/orcas_gradle_plugin/src/main/groovy/com/opitzconsulting/orcas/gradle/OrcasDbDocTask.groovy b/orcas_core/build_source/orcas_gradle_plugin/src/main/groovy/com/opitzconsulting/orcas/gradle/OrcasDbDocTask.groovy index 597cdc34..7eac40ae 100644 --- a/orcas_core/build_source/orcas_gradle_plugin/src/main/groovy/com/opitzconsulting/orcas/gradle/OrcasDbDocTask.groovy +++ b/orcas_core/build_source/orcas_gradle_plugin/src/main/groovy/com/opitzconsulting/orcas/gradle/OrcasDbDocTask.groovy @@ -1,8 +1,9 @@ package com.opitzconsulting.orcas.gradle import de.oc.dbdoc.ant.*; -import de.opitzconsulting.orcas.diff.ParametersCall; -import org.gradle.api.file.FileCollection; +import de.opitzconsulting.orcas.diff.ParametersCall +import org.gradle.api.tasks.InputDirectory; +import org.gradle.api.tasks.OutputDirectory; public class OrcasDbDocTask extends BaseOrcasTask { @@ -15,14 +16,21 @@ public class OrcasDbDocTask extends BaseOrcasTask return logname; } - private String getOutfolder() + @OutputDirectory + public String getOutfolder() { - return "build/dbdoc"; + return project.buildDir.toString() + "/dbdoc"; + } + + @InputDirectory + public String getInputfolder() + { + return project.file(project.orcasconfiguration.staticsfolder).toString(); } private String getTmpfolder() { - return "build/tmpdbdoc"; + return project.buildDir.toString() + "/tmpdbdoc"; } public void diagram(pClosure) { @@ -30,6 +38,10 @@ public class OrcasDbDocTask extends BaseOrcasTask callClosure( pClosure, orcasDbDoc.getDiagram() ); } + public OrcasDbDoc getOrcasDbDoc() { + return orcasDbDoc; + } + public void styles(pClosure) { orcasDbDoc.setStyles( new StylesWrapper() ); callClosure( pClosure, orcasDbDoc.getStyles() ); @@ -56,15 +68,18 @@ public class OrcasDbDocTask extends BaseOrcasTask @Override protected void executeOrcasTaskWithParameters( ParametersCall pParameters ) { - pParameters.setModelFile( project.file(project.orcasconfiguration.staticsfolder).toString() ); + pParameters.setModelFile( getInputfolder() ); pParameters.setSqlplustable( false ); pParameters.setOrderColumnsByName( false ); new File(getOutfolder()).deleteDir(); new File(getOutfolder()).mkdirs(); - new File(getTmpfolder()).deleteDir(); - new File(getTmpfolder()+"/mapfiles").mkdirs(); + + if(!pParameters.getDbdocPlantuml()) { + new File(getTmpfolder()).deleteDir(); + new File(getTmpfolder() + "/mapfiles").mkdirs(); + } orcasDbDoc.setOutfolder( getOutfolder() ); orcasDbDoc.setTmpfolder( getTmpfolder() ); @@ -104,17 +119,18 @@ public class OrcasDbDocTask extends BaseOrcasTask orcasDbDoc.execute( modifyParameters( pParameters ) ); def lTmpfolder = new File(getTmpfolder()); - - Arrays.stream( lTmpfolder.listFiles() ).parallel().forEach - { p -> - def lDotIndex = p.getName().lastIndexOf('.'); - if( lDotIndex > 0 ) - { - dotExec( (String)p.getName().substring(lDotIndex+1), (String)p.getName() ); - } - } - de.oc.dbdoc.postprocessing.Main.main( getOutfolder(), "${getTmpfolder()}/mapfiles" ); + if(!pParameters.getDbdocPlantuml()) { + Arrays.stream(lTmpfolder.listFiles()).parallel().forEach + { p -> + def lDotIndex = p.getName().lastIndexOf('.'); + if (lDotIndex > 0) { + dotExec((String) p.getName().substring(lDotIndex + 1), (String) p.getName()); + } + } + + de.oc.dbdoc.postprocessing.Main.main(getOutfolder(), "${getTmpfolder()}/mapfiles"); + } } public void dotExec( String pDotExecutable, String pDotFile ) diff --git a/orcas_core/build_source/orcas_gradle_plugin/src/main/groovy/com/opitzconsulting/orcas/gradle/OrcasGradlePlugin.groovy b/orcas_core/build_source/orcas_gradle_plugin/src/main/groovy/com/opitzconsulting/orcas/gradle/OrcasGradlePlugin.groovy index 836319c6..567d00c1 100644 --- a/orcas_core/build_source/orcas_gradle_plugin/src/main/groovy/com/opitzconsulting/orcas/gradle/OrcasGradlePlugin.groovy +++ b/orcas_core/build_source/orcas_gradle_plugin/src/main/groovy/com/opitzconsulting/orcas/gradle/OrcasGradlePlugin.groovy @@ -106,6 +106,8 @@ class OrcasGradlePluginExtension { def String multischemaexcludewhereowner; def de.opitzconsulting.orcas.diff.ExtensionHandler extensionHandler; + + def boolean dbdocPlantuml = ParameterDefaults.dbdocPlantuml; }