mirror of
https://github.com/Wisser/Jailer.git
synced 2026-01-06 09:09:32 -06:00
SF-FR 67, Export as imagemap
This commit is contained in:
@@ -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>
|
||||
@@ -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 {
|
||||
|
||||
@@ -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), " " + (association.destination.equals(current)? escapeHtmlEntities(association.destination.getName()) : linkTo(association.destination)), " " + (association.getCardinality() != null? association.getCardinality() : ""), " on ", 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";
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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) + "\" />");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user