SF-FR 67, Export as imagemap

This commit is contained in:
Ralf Wisser
2021-02-03 17:30:27 +01:00
parent 1f9f08cb2e
commit 9e66995fd6
10 changed files with 89 additions and 56 deletions

View File

@@ -1,32 +0,0 @@
<style type="text/css">
<!--
/* CSS Style-Sheet-Specifications */
/* created with (X)HTML-Format */
/* http://www.openwebsuite.org */
//-->
A {
font-weight: bold;
}
A:link {
color: #0000A0;
text-decoration: none;
}
A:visited {
color: #0000A0;
text-decoration: none;
}
A:hover {
color: #CC0000;
text-decoration: underline;
}
.titlebar {
vertical-align: middle; font-weight: bold; background-color: rgb(220, 220, 255);
}
.highlightedrow {
background-color: rgb(240, 255, 255);
}
</style>

View File

@@ -46,6 +46,7 @@ import net.sf.jailer.extractionmodel.ExtractionModel.AdditionalSubject;
import net.sf.jailer.modelbuilder.ModelBuilder;
import net.sf.jailer.progress.ProgressListener;
import net.sf.jailer.render.DataModelRenderer;
import net.sf.jailer.render.HtmlDataModelRenderer;
import net.sf.jailer.restrictionmodel.RestrictionModel;
import net.sf.jailer.subsetting.SubsettingEngine;
import net.sf.jailer.util.CancellationException;
@@ -130,6 +131,13 @@ public class Jailer {
LogUtil.reloadLog4jConfig(home);
Configuration configuration = Configuration.getInstance();
configuration.setTempFileFolder(new File(home, "tmp").getPath());
try {
HtmlDataModelRenderer renderer = configuration.getRenderer();
if (renderer != null) {
renderer.setOutputFolder(new File(home, renderer.getOutputFolder()).getAbsolutePath());
}
} catch (Exception e) {
}
}
getLogger();
try {

View File

@@ -66,6 +66,8 @@ public class HtmlDataModelRenderer implements DataModelRenderer {
*/
private static final Logger _log = Logger.getLogger(HtmlDataModelRenderer.class);
public static final String CONTENT_FOLDER_NAME = "tables";
/**
* @return the outputDir
*/
@@ -101,14 +103,19 @@ public class HtmlDataModelRenderer implements DataModelRenderer {
*/
@Override
public void render(DataModel dataModel, List<String> restrictionFiles) {
String oldOutputFolder = outputFolder;
try {
new File(outputFolder).mkdirs();
outputFolder = outputFolderOf(dataModel);
new File(outputFolder).mkdir();
String outputFolderContent = new File(outputFolder, CONTENT_FOLDER_NAME).getPath();
new File(outputFolderContent).mkdir();
List<Table> tableList = new ArrayList<Table>(dataModel.getTables());
Collections.sort(tableList);
List<String> tablesColumn = new ArrayList<String>();
for (Table table: tableList) {
tablesColumn.add(linkTo(table));
tablesColumn.add(linkTo(table, table.getName(), CONTENT_FOLDER_NAME + "/"));
StringBuffer legend = new StringBuffer();
String closure = renderClosure(table, legend);
closure = new PrintUtil().applyTemplate("template" + File.separatorChar + "table.html", new Object[] { "Closure", "", closure });
@@ -121,7 +128,7 @@ public class HtmlDataModelRenderer implements DataModelRenderer {
String components = "";
String domainSuffix = "";
String title = "Table " + escapeHtmlEntities(table.getName());
writeFile(new File(outputFolder, toFileName(table)), new PrintUtil().applyTemplate("template" + File.separator + "tableframe.html", new Object[] { title, renderTableBody(table, table, 0, 1, new HashSet<Table>()), closure + legend, components + columns, domainSuffix }));
writeFile(new File(outputFolderContent, toFileName(table)), new PrintUtil().applyTemplate("template" + File.separator + "tableframe.html", new Object[] { title, renderTableBody(table, table, 0, 1, new HashSet<Table>()), closure + legend, components + columns, domainSuffix, escapeHtmlEntities(dataModel.getName()) }));
CancellationHandler.checkForCancellation(null);
}
@@ -134,14 +141,20 @@ public class HtmlDataModelRenderer implements DataModelRenderer {
String domains = "";
writeFile(new File(outputFolder, "index.html"), new PrintUtil().applyTemplate("template" + File.separatorChar + "index.html", new Object[] { new Date(), generateHTMLTable("Tables", null, tablesColumn), restrictions, domains, overviewHtml == null? "" : (overviewHtml + " <br> <br>"), escapeHtmlEntities(dataModel.getName()) }));
writeFile(new File(outputFolder, "styles.css"), new PrintUtil().applyTemplate("template" + File.separatorChar + "styles.css", new Object[] { } ));
writeFile(new File(outputFolderContent, "styles.css"), new PrintUtil().applyTemplate("template" + File.separatorChar + "styles.css", new Object[] { } ));
} catch (CancellationException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
outputFolder = oldOutputFolder;
}
}
public String outputFolderOf(DataModel dataModel) {
return new File(outputFolder, toFileName(dataModel.getName())).getPath();
}
/**
* Renders the closure of a table.
*
@@ -333,8 +346,8 @@ public class HtmlDataModelRenderer implements DataModelRenderer {
aliasA = association.source.getName();
aliasB = association.destination.getName();
}
aliasA = linkTo(association.source, aliasA);
aliasB = linkTo(association.destination, aliasB);
aliasA = linkTo(association.source, aliasA, "");
aliasB = linkTo(association.destination, aliasB, "");
jc = SqlUtil.replaceAliases(jc, aliasA, aliasB);
return new PrintUtil().applyTemplate("template" + File.separator + "table_line.html", new Object[] { indentSpaces(indent), "&nbsp;&nbsp;" + (association.destination.equals(current)? escapeHtmlEntities(association.destination.getName()) : linkTo(association.destination)), "&nbsp;&nbsp;" + (association.getCardinality() != null? association.getCardinality() : ""), "&nbsp;on&nbsp;", jc, "", highlighted? "class=\"highlightedrow\"" : "" });
}
@@ -379,7 +392,7 @@ public class HtmlDataModelRenderer implements DataModelRenderer {
/**
* Returns Space-string of given length.
*
* @param indent the lenght
* @param indent the length
*/
private String indentSpaces(int indent) {
StringBuffer result = new StringBuffer();
@@ -398,7 +411,7 @@ public class HtmlDataModelRenderer implements DataModelRenderer {
* @return HTML-hyper link to the render of table
*/
private String linkTo(Table table) {
return linkTo(table, table.getName());
return linkTo(table, table.getName(), "");
}
/**
@@ -408,8 +421,8 @@ public class HtmlDataModelRenderer implements DataModelRenderer {
* @param name the name of the link
* @return HTML-hyper link to the render of table
*/
private String linkTo(Table table, String name) {
return "<a href=\"" + toFileName(table) + "\">" + escapeHtmlEntities(name) + "</a>";
private String linkTo(Table table, String name, String parent) {
return "<a href=\"" + parent + toFileName(table) + "\">" + escapeHtmlEntities(name) + "</a>";
}
/**
@@ -418,9 +431,8 @@ public class HtmlDataModelRenderer implements DataModelRenderer {
* @param table the table
* @return name of the file containing the HTML render of table
*/
public static String toFileName(Table table) {
public static String toFileName(String tableName) {
StringBuilder sb = new StringBuilder();
String tableName = table.getName();
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.";
for (int i = 0; i < tableName.length(); ++i) {
@@ -430,7 +442,17 @@ public class HtmlDataModelRenderer implements DataModelRenderer {
}
}
return sb.toString() + ".html";
return sb.toString();
}
/**
* Gets name of the file containing the HTML render of a given table.
*
* @param table the table
* @return name of the file containing the HTML render of table
*/
public static String toFileName(Table table) {
return toFileName(table.getName()) + ".html";
}
/**

View File

@@ -422,7 +422,7 @@
</MenuItem>
<MenuItem class="javax.swing.JMenuItem" name="renderHtml1">
<Properties>
<Property name="text" type="java.lang.String" value="HTML Renderer (graphical)"/>
<Property name="text" type="java.lang.String" value="HTML Renderer (with graphic)"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="renderHtml1ActionPerformed"/>

View File

@@ -852,7 +852,7 @@ public class ExtractionModelFrame extends javax.swing.JFrame {
});
jMenu3.add(renderHtml);
renderHtml1.setText("HTML Renderer (graphical)");
renderHtml1.setText("HTML Renderer (with graphic)");
renderHtml1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
renderHtml1ActionPerformed(evt);
@@ -1555,7 +1555,9 @@ public class ExtractionModelFrame extends javax.swing.JFrame {
args.add(file.getAbsolutePath());
if (UIUtil.canRunJailer()) {
UIUtil.runJailer(this, args, false, true, true, null, null, null /* dbConnectionDialog.getPassword() */, null, null, false, true, false, executionContext);
BrowserLauncher.openURL(Environment.newFile(table == null? "render/index.html" : ("render/" + HtmlDataModelRenderer.toFileName(table))).toURI(), this);
HtmlDataModelRenderer renderer = Configuration.getInstance().getRenderer();
String of = renderer.outputFolderOf(extractionModelEditor.dataModel);
BrowserLauncher.openURL(Environment.newFile(table == null? (of + "/index.html") : (of + "/" + HtmlDataModelRenderer.CONTENT_FOLDER_NAME + "/" + HtmlDataModelRenderer.toFileName(table))).toURI(), this);
}
} catch (Exception e) {
UIUtil.showException(this, "Error", e);
@@ -2062,7 +2064,7 @@ public class ExtractionModelFrame extends javax.swing.JFrame {
private void exportDisplay1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exportDisplay1ActionPerformed
HtmlDataModelRenderer renderer = Configuration.getInstance().getRenderer();
try {
File overviewImg = new File(renderer.getOutputFolder(), "datamodeloverview.png");
File overviewImg = new File(new File(renderer.outputFolderOf(extractionModelEditor.dataModel), HtmlDataModelRenderer.CONTENT_FOLDER_NAME), "graph.png");
File overviewHtml = Configuration.getInstance().createTempFile();
extractionModelEditor.graphView.exportDisplayToImage(overviewImg, overviewHtml);

View File

@@ -304,6 +304,14 @@
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="consistencyCheckMenuItemActionPerformed"/>
</Events>
</MenuItem>
<MenuItem class="javax.swing.JMenuItem" name="renderHtml">
<Properties>
<Property name="text" type="java.lang.String" value="HTML Renderer"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="renderHtmlActionPerformed"/>
</Events>
</MenuItem>
<MenuItem class="javax.swing.JMenuItem" name="createCLIItem">
<Properties>
<Property name="text" type="java.lang.String" value="Show Command Line"/>

View File

@@ -107,6 +107,7 @@ import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import net.sf.jailer.ExecutionContext;
import net.sf.jailer.configuration.Configuration;
import net.sf.jailer.database.BasicDataSource;
import net.sf.jailer.database.Session;
import net.sf.jailer.datamodel.Association;
@@ -115,6 +116,7 @@ import net.sf.jailer.datamodel.PrimaryKeyFactory;
import net.sf.jailer.datamodel.Table;
import net.sf.jailer.modelbuilder.JDBCMetaDataBasedModelElementFinder;
import net.sf.jailer.modelbuilder.ModelBuilder;
import net.sf.jailer.render.HtmlDataModelRenderer;
import net.sf.jailer.ui.About;
import net.sf.jailer.ui.AnalyseOptionsDialog;
import net.sf.jailer.ui.AssociationListUI;
@@ -1196,6 +1198,7 @@ public class DataBrowser extends javax.swing.JFrame {
jSeparator8 = new javax.swing.JPopupMenu.Separator();
createExtractionModelMenuItem = new javax.swing.JMenuItem();
consistencyCheckMenuItem = new javax.swing.JMenuItem();
renderHtml = new javax.swing.JMenuItem();
createCLIItem = new javax.swing.JMenuItem();
menuWindow = new javax.swing.JMenu();
layoutMenuItem = new javax.swing.JMenuItem();
@@ -1976,6 +1979,14 @@ public class DataBrowser extends javax.swing.JFrame {
});
jMenu2.add(consistencyCheckMenuItem);
renderHtml.setText("HTML Renderer");
renderHtml.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
renderHtmlActionPerformed(evt);
}
});
jMenu2.add(renderHtml);
createCLIItem.setText("Show Command Line");
createCLIItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
@@ -2836,6 +2847,7 @@ public class DataBrowser extends javax.swing.JFrame {
private javax.swing.JPanel outLinePanel;
private javax.swing.JMenuItem reconnectMenuItem;
private javax.swing.JButton refreshButton;
private javax.swing.JMenuItem renderHtml;
private javax.swing.JMenuItem restoreSessionItem;
private javax.swing.JMenu rowLimitMenu;
private javax.swing.JMenuItem saveScriptAsMenuItem;
@@ -4122,6 +4134,21 @@ public class DataBrowser extends javax.swing.JFrame {
consistencyCheckMenuItemActionPerformed(evt);
}//GEN-LAST:event_consistencyCheckMenuItem1ActionPerformed
private void renderHtmlActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_renderHtmlActionPerformed
try {
List<String> args = new ArrayList<String>();
args.add("render-datamodel");
if (UIUtil.canRunJailer()) {
UIUtil.runJailer(this, args, false, true, true, null, null, null /* dbConnectionDialog.getPassword() */, null, null, false, true, false, executionContext);
HtmlDataModelRenderer renderer = Configuration.getInstance().getRenderer();
String of = renderer.outputFolderOf(datamodel.get());
BrowserLauncher.openURL(Environment.newFile(of + "/index.html").toURI(), this);
}
} catch (Exception e) {
UIUtil.showException(this, "Error", e);
}
}//GEN-LAST:event_renderHtmlActionPerformed
private String bookmarkName(String bookmarkFileName) {
if (bookmarkFileName.endsWith(BookmarksPanel.BOOKMARKFILE_EXTENSION)) {
return bookmarkFileName.substring(0, bookmarkFileName.length() - BookmarksPanel.BOOKMARKFILE_EXTENSION.length());

View File

@@ -11,8 +11,6 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;
@@ -114,6 +112,7 @@ public class DisplayExporter {
}
// Now save the image
f.getParentFile().mkdirs();
OutputStream out = new BufferedOutputStream(new FileOutputStream(f));
exportImage(display, out, format, img, mapHtmlFile, model);
@@ -121,7 +120,6 @@ public class DisplayExporter {
out.close();
}
private boolean exportImage(Display display, OutputStream output, String format, File imgFile, File mapHtmlFile, DataModel model) throws Exception {
String m_group = Visualization.ALL_ITEMS;
@@ -189,7 +187,7 @@ public class DisplayExporter {
// out.println("</head>");
// out.println("<body>");
// out.println("<h1 style=\"font-style: italic;\"><small>JailerModel<small><small> " + SimpleDateFormat.getInstance().format(new Date()) + "</small></small></small></h1>");
out.println("<img src=\"" + imgFile.getName() + "\" usemap=\"#TableMap\" />");
out.println("<img src=\"" + imgFile.getParentFile().getName() + "/" + imgFile.getName() + "\" usemap=\"#TableMap\" />");
out.println("<map name=\"TableMap\">");
@SuppressWarnings("rawtypes")
@@ -217,7 +215,7 @@ public class DisplayExporter {
int h = (int) (viBounds.getHeight() * scale);
out.println(" <area shape=\"rect\" coords=\"" + x + "," + y + "," + (x + w) + "," + (y + h) + "\"");
out.println(" href=\"" + HtmlDataModelRenderer.toFileName(table) + "\"");
out.println(" href=\"" + HtmlDataModelRenderer.CONTENT_FOLDER_NAME + "/" + HtmlDataModelRenderer.toFileName(table) + "\"");
out.println(" title=\"" + HtmlDataModelRenderer.escapeHtmlEntities(tableName) + "\" />");
}
}

View File

@@ -4,7 +4,7 @@
<meta content="text/html; charset=ISO-8859-1"
http-equiv="content-type">
<title>{5}</title>
<link href="styles.css" rel="stylesheet" type="text/css">
<link href="tables/styles.css" rel="stylesheet" type="text/css">
</head>
<body>
<h1 style="font-style: italic;"><small>{5}<small><small> {0}</small></small></small></h1>

View File

@@ -3,11 +3,11 @@
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="content-type">
<title>JailerModel</title>
<title>{5}</title>
<link href="styles.css" rel="stylesheet" type="text/css">
</head>
<body>
<h1 style="font-style: italic;"><small><a href="index.html">{0}</a>{4}</small></h1>
<h1 style="font-style: italic;"><small><a href="../index.html">{0}</a>{4}</small></h1>
{3}
{1} <br>