Author: jkuhnert
Date: Tue Oct 30 13:53:55 2007
New Revision: 590460
URL: http://svn.apache.org/viewvc?rev=590460&view=rev
Log:
Cleaned up some of the exception page rendering CSS attributes / handling of
tab && whitespace character data in template location render / various other
CSS improvements.
Modified:
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/describe/LocationRenderStrategy.java
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/error/ExceptionPresenterImpl.java
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/error/RequestExceptionReporterImpl.java
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.html
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.java
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.jwc
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.css
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.html
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.java
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/util/exception/ExceptionAnalyzer.java
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/describe/TestLocationRenderStrategy.java
Modified:
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/describe/LocationRenderStrategy.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/describe/LocationRenderStrategy.java?rev=590460&r1=590459&r2=590460&view=diff
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/describe/LocationRenderStrategy.java
(original)
+++
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/describe/LocationRenderStrategy.java
Tue Oct 30 13:53:55 2007
@@ -14,17 +14,13 @@
package org.apache.tapestry.describe;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
-import java.io.Reader;
-import java.net.URL;
-
import org.apache.hivemind.Location;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;
+import java.io.*;
+import java.net.URL;
+
/**
* Adapter for displaying [EMAIL PROTECTED]
org.apache.hivemind.Location} objects as
* HTML. This may include showing the content of the
@@ -53,52 +49,67 @@
int lineNumber = l.getLineNumber();
- if (lineNumber < 1) return;
+ if (lineNumber < 1)
+ return;
URL url = l.getResource().getResourceURL();
- if (url == null) return;
+ if (url == null)
+ return;
writeResourceContent(writer, url, lineNumber);
}
- private void writeResourceContent(IMarkupWriter writer, URL url,
- int lineNumber)
+ private void writeResourceContent(IMarkupWriter writer, URL url, int
lineNumber)
{
LineNumberReader reader = null;
try
{
- reader = new LineNumberReader(new BufferedReader(
- new InputStreamReader(url.openStream())));
+ reader = new LineNumberReader(new BufferedReader( new
InputStreamReader(url.openStream())));
writer.beginEmpty("br");
writer.begin("table");
writer.attribute("class", "location-content");
+ writer.attribute("cellspacing", "0");
+ writer.attribute("cellpadding", "0");
while(true)
{
String line = reader.readLine();
- if (line == null) break;
+ if (line == null)
+ break;
int currentLine = reader.getLineNumber();
- if (currentLine > lineNumber + RANGE) break;
+ if (currentLine > lineNumber + RANGE)
+ break;
- if (currentLine < lineNumber - RANGE) continue;
+ if (currentLine < lineNumber - RANGE)
+ continue;
writer.begin("tr");
if (currentLine == lineNumber)
writer.attribute("class", "target-line");
-
+
writer.begin("td");
writer.attribute("class", "line-number");
writer.print(currentLine);
writer.end();
writer.begin("td");
+
+ // pretty print tabs and spaces properly
+
+ String spacers = extractWhitespaceStart(line);
+
+ if (spacers != null && spacers.length() > 0)
+ {
+ writer.printRaw(spacers);
+ }
+
writer.print(line);
writer.end("tr");
writer.println();
@@ -118,11 +129,48 @@
}
}
+ /**
+ * Finds any tab or whitespace characters in the beginning of this string
- up
+ * to the first occurrence of normal character data and returns it.
+ *
+ * @param input The string to extract whitespace/tab characters from.
+ *
+ * @return The whitespace/tab characters found, or null if none found.
+ */
+ String extractWhitespaceStart(String input)
+ {
+ if (input == null || input.length() < 1)
+ return null;
+
+ char[] vals = input.toCharArray();
+ StringBuffer ret = new StringBuffer();
+
+ for (int i=0; i < vals.length; i++)
+ {
+ if (Character.isWhitespace(vals[i]))
+ {
+ ret.append(" ");
+ continue;
+ }
+
+ if (vals[i] == '\t')
+ {
+ ret.append(" ");
+ continue;
+ }
+
+ break;
+ }
+
+ return ret.toString();
+ }
+
private void close(Reader reader)
{
try
{
- if (reader != null) reader.close();
+ if (reader != null)
+ reader.close();
}
catch (IOException ex)
{
Modified:
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/error/ExceptionPresenterImpl.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/error/ExceptionPresenterImpl.java?rev=590460&r1=590459&r2=590460&view=diff
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/error/ExceptionPresenterImpl.java
(original)
+++
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/error/ExceptionPresenterImpl.java
Tue Oct 30 13:53:55 2007
@@ -52,14 +52,12 @@
// Worst case scenario. The exception page itself is broken,
leaving
// us with no option but to write the cause to the output.
- _requestExceptionReporter.reportRequestException(ErrorMessages
- .unableToProcessClientRequest(cause), cause);
+
_requestExceptionReporter.reportRequestException(ErrorMessages.unableToProcessClientRequest(cause),
cause);
// Also, write the exception thrown when redendering the exception
// page, so that can get fixed as well.
- _requestExceptionReporter.reportRequestException(ErrorMessages
- .unableToPresentExceptionPage(ex), ex);
+
_requestExceptionReporter.reportRequestException(ErrorMessages.unableToPresentExceptionPage(ex),
ex);
// And throw the exception.
@@ -67,8 +65,7 @@
}
if (_verbose)
- _requestExceptionReporter.reportRequestException(ErrorMessages
- .unableToProcessClientRequest(cause), cause);
+
_requestExceptionReporter.reportRequestException(ErrorMessages.unableToProcessClientRequest(cause),
cause);
}
public void setExceptionPageName(String exceptionPageName)
Modified:
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/error/RequestExceptionReporterImpl.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/error/RequestExceptionReporterImpl.java?rev=590460&r1=590459&r2=590460&view=diff
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/error/RequestExceptionReporterImpl.java
(original)
+++
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/error/RequestExceptionReporterImpl.java
Tue Oct 30 13:53:55 2007
@@ -44,8 +44,7 @@
{
_log.warn(message, cause);
- System.err
-
.println("\n\n**********************************************************\n\n");
+
System.err.println("\n\n**********************************************************\n\n");
System.err.println(message);
@@ -60,8 +59,7 @@
new ExceptionAnalyzer().reportException(cause, System.err);
- System.err
-
.println("\n**********************************************************\n");
+
System.err.println("\n**********************************************************\n");
}
}
Modified:
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.html
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.html?rev=590460&r1=590459&r2=590460&view=diff
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.html
(original)
+++
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.html
Tue Oct 30 13:53:55 2007
@@ -30,7 +30,7 @@
<tr jwcid="$remove$" class="odd">
<th>Property Name 4:</th>
<td>Property Value 4</td>
- </tr>
+ </tr>
<tr jwcid="ifNotLast"> <td colspan="2"> </td> </tr>
Modified:
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.java?rev=590460&r1=590459&r2=590460&view=diff
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.java
(original)
+++
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.java
Tue Oct 30 13:53:55 2007
@@ -14,13 +14,14 @@
package org.apache.tapestry.html;
-import java.util.List;
import org.apache.tapestry.BaseComponent;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.bean.EvenOdd;
import org.apache.tapestry.util.exception.ExceptionDescription;
+import java.util.List;
+
/**
* Component used to display an already formatted exception. [ <a
* href="../../../../../ComponentReference/ExceptionDisplay.html">Component
@@ -95,7 +96,8 @@
return false;
String trace = getTrace();
- for (int i=0; i<packages.size(); i++) {
+ for (int i=0; i<packages.size(); i++)
+ {
if (trace.startsWith((String)packages.get(i)))
return true;
}
@@ -103,7 +105,8 @@
return false;
}
- public String getStackClass() {
+ public String getStackClass()
+ {
return isInPackage() ? "stackSelected" : null;
}
}
Modified:
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.jwc
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.jwc?rev=590460&r1=590459&r2=590460&view=diff
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.jwc
(original)
+++
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ExceptionDisplay.jwc
Tue Oct 30 13:53:55 2007
@@ -63,7 +63,6 @@
</component>
<component id="eProperty" type="For">
- <binding name="element" value="literal:tr"/>
<binding name="class" value="beans.evenOdd.next"/>
<binding name="source" value="exception.properties"/>
<binding name="value" value="property"/>
Modified:
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.css
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.css?rev=590460&r1=590459&r2=590460&view=diff
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.css
(original)
+++
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.css
Tue Oct 30 13:53:55 2007
@@ -1,24 +1,13 @@
P {}
-
H1 {}
-
H2 {}
-
H3 {}
-
A {}
-
A:Visited {}
-
A:Active {}
-
A:Hover {}
-BODY {
- margin:0;
- padding:0;
-}
-
+BODY { margin:0; padding:0;}
body, td, th {
font-family: Lucida Grande, Tahoma, Verdana, Arial, sans-serif;
font-size: 13px;
@@ -28,77 +17,28 @@
h2 { font: 1.4em Tahoma, Myriad, sans-serif; font-weight:bold; color: #296cb5;
padding-bottom:0; }
h3 { font: 0.8em Tahoma, Myriad, sans-serif; font-weight:bold; color: #296cb5;
padding-bottom:0; }
-TABLE.exception-display TR.even {
- top : auto;
-}
-
-TABLE.exception-display TR.odd {
- top : auto;
- background-color : #F6F6F6;
-}
-
-TABLE.exception-display TH {
- text-align : right;
- font-weight : bold;
-}
-
-TABLE.exception-display TD {
- text-align : left;
- width : 100%;
-}
-
-TABLE.exception-display TR.stack-trace TD {
- font-size : small;
- font-family: terminal,monospace;
- text-align : left;
-}
-
-SPAN.exception-header {
- font-size : large;
- font-weight : bold;
- color : Red;
-}
-
-SPAN.exception-top {
- display:block;
- background: #efefef;
- border-bottom: 2px solid #215E8A;
- padding:0.4em;
-}
-
-SPAN.exception-message {
- font-weight: bold;
-}
-
-SPAN.exception-block, DIV.displayBlock {
- margin:5px;
- display:block;
- border:1px solid #ccf;
- padding:6px;
- background:#f9f9f9;
-}
+TABLE.exception-display TR.even th { top : auto;}
+TABLE.exception-display TR.odd th { top : auto; background-color : #F6F6F6;}
+TABLE.exception-display TH { text-align : right; font-weight : bold;}
+TABLE.exception-display TD { text-align : left; width : 100%; }
+TABLE.exception-display TR.stack-trace TD { font-size : small; font-family:
terminal,monospace; text-align : left;}
+
+SPAN.exception-header { font-size : large; font-weight : bold; color : Red;}
+SPAN.exception-top { display:block; background: #efefef; border-bottom: 2px
solid #215E8A; padding:0.4em;}
+SPAN.exception-message {font-weight: bold;}
+SPAN.exception-block, DIV.displayBlock { margin:5px; display:table; width:
98%; border:1px solid #ccf; padding:6px; background:#f9f9f9;}
-UL {
- margin-top : 0;
- margin-bottom : 0;
- margin-left : 20px;
- list-style: none;
-}
+.stack-trace * UL { margin: 0 0 20px 0; list-style: none;}
+.stack-trace * ul li { background-color: white;}
TABLE.exception-display TR.exception-name TD {
font-size : larger;
font-weight : bold;
text-align : center;
- /*background-color : Blue;
- color : White;*/
-}
-
-TABLE.exception-display {
- width : 100%;
- margin:0;
- padding:0;
+ background-color : #3391D4;
+ color : White;
}
-
+TABLE.exception-display { width : 100%; margin:0; padding:0;}
TABLE.exception-display TR.exception-message TD {
border-width : 1px;
border-color : Black;
@@ -107,7 +47,6 @@
text-align : left;
font-style : italic;
}
-
TABLE.exception-display TR.strack-trace-label TD {
margin : 2px;
border-width : 1px;
@@ -116,74 +55,20 @@
text-align : center;
}
-TABLE.location-content
-{
- border: 1px solid black;
-}
-
-TABLE.location-content TR.target-line TD
-{
- background-color: yellow;
-}
-
-TABLE.location-content TR
-{
- padding: 0;
- margin: 0;
-}
-
-TABLE.location-content TD.line-number
-{
- width: 1px; /* Minimum; will expand to fit line numbers.*/
- align: right;
- border-right: 1px dotted grey;
-}
-
-TABLE.location-content TD
-{
- font-family: terminal,monospace;
- font-size: 10pt;
- padding: 0;
- margin: 0;
-}
-
-DIV.described-object-title
-{
- font-size: large;
- font-weight: bold;
- /*color: white;
- background-color: blue;*/
-}
-
-TABLE.described-object
-{
- border: 1px solid black;
- width: 100%;
- margin-bottom: 15px;
-}
-
-TABLE.described-object TR.section TH
-{
- /*color: white;
- background-color: blue;*/
- text-align: center;
-}
-
-TABLE.described-object TH
-{
- text-align: right;
- width: 1px; /* Will stretch to fit. */
-}
-
-TABLE.described-object TR.even
-{
- background-color: white;
-}
-
-TABLE.described-object TR.odd
-{
- background-color: #eee;
-}
+TABLE.location-content { border: 1px solid black;}
+TABLE.location-content .target-line TD { background-color: yellow;}
+TABLE.location-content TR { padding: 0; margin: 0;}
+TABLE.location-content TD.line-number { width: 1px; padding: 0 2px;
background-color: #2A76AD; text-align: right; border-right: 1px dotted gray;
color: #F6F6F6;}
+TABLE.location-content TD { font-family: terminal,monospace; font-size: 10pt;
padding: 1px 0 1px 7px; margin: 0; background-color: white; }
+
+DIV.described-object-title { font-size: large; font-weight: bold; }
+TABLE.described-object { border: 1px solid black; width: 100%; margin-bottom:
15px;}
+TABLE.described-object TR.section TH { text-align: center; color: #215E8A;}
+TABLE.described-object TH { text-align: right; width: 30%;}
+TABLE.described-object TD { padding-left: 2px;}
+TABLE.described-object TR.even { background-color: white; }
+TABLE.described-object TR.odd { background-color: #eee;}
+TABLE.described-object td, TABLE.described-object th { padding: 1px 0; }
a.toggle {
text-decoration:none;
@@ -195,13 +80,5 @@
font-size: 12px;
padding: 10px;
}
-
-a.toggleSelected, a.toggle:hover {
- /*background:#EDCC5F;*/
- background:#DDD;
-}
-
-.stackSelected {
- color:green;
- text-decoration:underline;
-}
+a.toggleSelected, a.toggle:hover { background:#DDD; }
+.stackSelected { color:green; text-decoration: underline;}
Modified:
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.html
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.html?rev=590460&r1=590459&r2=590460&view=diff
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.html
(original)
+++
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.html
Tue Oct 30 13:53:55 2007
@@ -14,8 +14,7 @@
limitations under the License.
-->
<span jwcid="$content$">
-<html jwcid="@Shell" title="Exception" stylesheet="asset:stylesheet"
- disableCaching="true" doctype="ognl:''">
+<html jwcid="@Shell" title="Exception" stylesheet="asset:stylesheet"
disableCaching="true" doctype="ognl:''">
<body>
<span jwcid="@If" condition="ognl:dynamic" renderTag="false">
Modified:
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.java?rev=590460&r1=590459&r2=590460&view=diff
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.java
(original)
+++
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pages/Exception.java
Tue Oct 30 13:53:55 2007
@@ -61,13 +61,15 @@
String comps = namespace.getPropertyValue(getComponentPackages());
StringBuffer sb = new StringBuffer();
- if (pages!=null)
+ if (pages != null)
{
sb.append(pages);
+
if (comps!=null)
sb.append(",");
}
- if (comps!=null)
+
+ if (comps != null)
sb.append(comps);
return TapestryUtils.split(sb.toString(), ',');
Modified:
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/util/exception/ExceptionAnalyzer.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/util/exception/ExceptionAnalyzer.java?rev=590460&r1=590459&r2=590460&view=diff
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/util/exception/ExceptionAnalyzer.java
(original)
+++
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/util/exception/ExceptionAnalyzer.java
Tue Oct 30 13:53:55 2007
@@ -18,12 +18,7 @@
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
-import java.io.CharArrayWriter;
-import java.io.IOException;
-import java.io.LineNumberReader;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.io.StringReader;
+import java.io.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
@@ -87,7 +82,6 @@
Throwable thrown = exception;
try
{
-
while (thrown != null)
{
thrown = buildDescription(thrown);
@@ -201,11 +195,9 @@
properties = new ExceptionProperty[propertyDescriptions.size()];
- ExceptionProperty[] propArray = (ExceptionProperty[])
propertyDescriptions
- .toArray(properties);
+ ExceptionProperty[] propArray = (ExceptionProperty[])
propertyDescriptions.toArray(properties);
- description = new ExceptionDescription(exceptionClass.getName(),
message, propArray,
- stackTrace);
+ description = new ExceptionDescription(exceptionClass.getName(),
message, propArray, stackTrace);
exceptionDescriptions.add(description);
@@ -403,7 +395,9 @@
stream.println(stackTrace[j]);
}
else
+ {
stream.println();
+ }
}
}
Modified:
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/describe/TestLocationRenderStrategy.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/describe/TestLocationRenderStrategy.java?rev=590460&r1=590459&r2=590460&view=diff
==============================================================================
---
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/describe/TestLocationRenderStrategy.java
(original)
+++
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/describe/TestLocationRenderStrategy.java
Tue Oct 30 13:53:55 2007
@@ -14,19 +14,18 @@
package org.apache.tapestry.describe;
-import static org.easymock.EasyMock.checkOrder;
-import static org.easymock.EasyMock.expect;
-
-import java.net.URL;
-
import org.apache.hivemind.Location;
import org.apache.hivemind.Resource;
import org.apache.hivemind.impl.LocationImpl;
import org.apache.hivemind.util.URLResource;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;
+import static org.easymock.EasyMock.checkOrder;
+import static org.easymock.EasyMock.expect;
import org.testng.annotations.Test;
+import java.net.URL;
+
/**
* Tests for [EMAIL PROTECTED]
org.apache.tapestry.describe.LocationRenderStrategy}.
*
@@ -60,6 +59,8 @@
writer.beginEmpty("br");
writer.begin("table");
writer.attribute("class", "location-content");
+ writer.attribute("cellspacing", "0");
+ writer.attribute("cellpadding", "0");
for (int i = 0; i < lines.length; i++)
{