View Javadoc
1 /* 2 * PROJECT : DAR Runtime and Tools 3 * COPYRIGHT : Copyright (C) 1999-2004 tim.stephenson@enableit.org 4 * LICENSE : GNU LESSER GENERAL PUBLIC LICENSE 5 * Version 2.1, February 1999 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21 package org.enableit.db.darrt.visualise; 22 23 import javax.xml.parsers.DocumentBuilder; 24 import javax.xml.parsers.DocumentBuilderFactory; 25 import javax.xml.parsers.FactoryConfigurationError; 26 import javax.xml.parsers.ParserConfigurationException; 27 28 import org.apache.log4j.Logger; 29 import org.enableit.db.beans.Column; 30 import org.enableit.db.beans.Table; 31 import org.enableit.db.darrt.AbstractSchemaHandler; 32 import org.w3c.dom.DOMImplementation; 33 import org.w3c.dom.Document; 34 import org.w3c.dom.DocumentFragment; 35 import org.w3c.dom.Element; 36 37 38 /*** 39 * Visualize a DAR schema. 40 * 41 * Not thread-safe, if used in multi-threaded environment should be 42 * externally synchronized. 43 * 44 * @author $Author: tim $ 45 */ 46 public class SchemaVisualiser extends AbstractSchemaHandler { 47 /*** 48 * The Log4J <code>Logger</code> doing the logging. 49 */ 50 private static Logger logger = Logger.getLogger(SchemaVisualiser.class); 51 52 /*** 53 * Width of single text character. 54 */ 55 private static final int fontWidth = 10; 56 57 /*** 58 * Height of text. 59 */ 60 private static final int fontHeight = 12; 61 62 /*** 63 * Space before and after text lines. 64 */ 65 private static final int textSpacing = 5; 66 67 /*** 68 * The SVG namespace for generated documents. 69 */ 70 public static final String SVG_NAMESPACE_URI = "http://www.w3.org/2000/svg"; 71 72 /*** 73 * CVS info ABOUT this class and its current version 74 */ 75 public static final String ABOUT = "$Id: SchemaVisualiser.java,v 1.6 2004/03/20 05:23:38 tim Exp $"; 76 77 /* 78 * Properties 79 */ 80 81 /*** 82 * Max. width required by image. 83 */ 84 private int maxX = 0; 85 86 /*** 87 * Y co-ord for next text line. 88 */ 89 private int y = 0; 90 91 /*** 92 * The DOM implementation we are using. 93 */ 94 private DOMImplementation impl; 95 96 /*** 97 * JAXP document builder to create new DOMs. 98 */ 99 private DocumentBuilder docBuilder; 100 101 /* 102 * Constructors 103 */ 104 105 /*** 106 * Default Constructor 107 */ 108 public SchemaVisualiser() 109 throws FactoryConfigurationError, ParserConfigurationException { 110 super(); 111 112 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 113 114 docBuilder = factory.newDocumentBuilder(); 115 } 116 117 /* 118 * Methods 119 */ 120 121 /*** 122 * Converts a Table object into an SVG representation. 123 * Note that the representation takes no account of the positioning of 124 * any other objects, just the one provided. 125 * 126 * @param table Table to create visualisation of. 127 */ 128 public Document toSVG(Table table) { 129 logger.info("METHOD_ENTRY: toSVG"); 130 131 // Create a document to append elements to 132 impl = docBuilder.getDOMImplementation(); 133 134 String svgNS = SVG_NAMESPACE_URI; 135 Document doc = impl.createDocument(svgNS, "svg", null); 136 Element svgRoot = doc.getDocumentElement(); 137 138 // Title element 139 Element title = doc.createElementNS(svgNS, "title"); 140 141 title.appendChild(doc.createTextNode("Data diagram: " + table.getName())); 142 svgRoot.appendChild(title); 143 144 // Add the table element 145 doc = toSVG(doc, table); 146 147 // set the width and height attribute on the root svg element 148 svgRoot.setAttributeNS(null, "width", 149 String.valueOf((2 * textSpacing) + (maxX * fontWidth))); 150 svgRoot.setAttributeNS(null, "height", String.valueOf(y + textSpacing)); 151 152 //svgRoot.setAttributeNS(null, "viewBox", "0 0 450 500"); 153 logger.info("METHOD_EXIT: toSVG"); 154 155 return doc; 156 } 157 158 /*** 159 * Converts a Table object into an SVG representation. 160 * Note that the representation takes no account of the positioning of 161 * any other objects, just the one provided. 162 * 163 * @param doc Pre-existing Document to append to. 164 * @param table Table to create visualisation of. 165 */ 166 public Document toSVG(Document doc, Table table) { 167 logger.info("METHOD_ENTRY: toSVG"); 168 169 // Create a fragment to attach to 170 DocumentFragment fragment = doc.createDocumentFragment(); 171 172 // set up co-ordinate system (in pixels?) for now just relative to 0,0 173 int xOrigin = 0; 174 int yOrigin = 0; 175 int x = 0; 176 177 maxX = 0; 178 y = 0; 179 180 // Create table name text 181 x += textSpacing; 182 y += (fontHeight + textSpacing); 183 184 Element tableName = doc.createElementNS(SVG_NAMESPACE_URI, "text"); 185 186 tableName.setAttributeNS(null, "x", String.valueOf(x)); 187 tableName.setAttributeNS(null, "y", String.valueOf(y)); 188 maxX = table.getName().length(); 189 tableName.appendChild(doc.createTextNode(table.getName())); 190 fragment.appendChild(tableName); 191 192 // Create table attributes text 193 y += textSpacing; 194 195 for (int i = 0; i < table.getColumnCount(); i++) { 196 y += (fontHeight + textSpacing); 197 198 Element colName = doc.createElementNS(SVG_NAMESPACE_URI, "text"); 199 200 colName.setAttributeNS(null, "x", String.valueOf(x)); 201 colName.setAttributeNS(null, "y", String.valueOf(y)); 202 203 Column col = table.getColumn(i); 204 String colText = col.getColName() + " " + col.getColType(); 205 206 if (colText.length() > maxX) { 207 maxX = colText.length(); 208 } 209 210 colName.appendChild(doc.createTextNode(colText)); 211 fragment.appendChild(colName); 212 } 213 214 // Create line to separate table name from attributes 215 y += (fontHeight + textSpacing); 216 217 Element line = doc.createElementNS(SVG_NAMESPACE_URI, "line"); 218 219 line.setAttributeNS(null, "x1", String.valueOf(xOrigin)); 220 line.setAttributeNS(null, "y1", 221 String.valueOf(yOrigin + fontHeight + (2 * textSpacing))); 222 line.setAttributeNS(null, "x2", 223 String.valueOf((2 * textSpacing) + (maxX * fontWidth))); 224 line.setAttributeNS(null, "y2", 225 String.valueOf(yOrigin + fontHeight + (2 * textSpacing))); 226 line.setAttributeNS(null, "stroke", "black"); 227 fragment.appendChild(line); 228 229 // Create rectangle for background of table 230 Element rectangle = doc.createElementNS(SVG_NAMESPACE_URI, "rect"); 231 232 rectangle.setAttributeNS(null, "x", String.valueOf(xOrigin)); 233 rectangle.setAttributeNS(null, "y", String.valueOf(yOrigin)); 234 rectangle.setAttributeNS(null, "width", 235 String.valueOf((2 * textSpacing) + (maxX * fontWidth))); 236 rectangle.setAttributeNS(null, "height", String.valueOf(y + textSpacing)); 237 rectangle.setAttributeNS(null, "stroke", "black"); 238 rectangle.setAttributeNS(null, "fill", "none"); 239 fragment.appendChild(rectangle); 240 241 // append to the doc root element 242 doc.getDocumentElement().appendChild(fragment); 243 244 logger.info("METHOD_EXIT: toSVG"); 245 246 return doc; 247 } 248 }

This page was automatically generated by Maven