Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298HtmlMediaDecoratorTest.java =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298HtmlMediaDecoratorTest.java (revision 0) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298HtmlMediaDecoratorTest.java (revision 0) @@ -0,0 +1,19 @@ +package org.displaytag.jsptests; + +/** + * Tests decorator.media.html configuration. + * + * @author JBarroso + */ +public class Displ298HtmlMediaDecoratorTest extends Displ298HtmlTest +{ + + /** + * @see org.displaytag.test.DisplaytagCase#getJspName() + */ + public String getJspName() + { + return "DISPL-298-media-decorator.jsp"; + } + +} Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298PdfTest.java =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298PdfTest.java (revision 0) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298PdfTest.java (revision 0) @@ -0,0 +1,63 @@ +package org.displaytag.jsptests; + +import java.io.InputStream; + +import org.displaytag.export.ExportViewFactory; +import org.displaytag.properties.MediaTypeEnum; +import org.displaytag.tags.TableTagParameters; +import org.displaytag.test.DisplaytagCase; +import org.displaytag.util.ParamEncoder; + +import com.lowagie.text.pdf.PdfReader; +import com.meterware.httpunit.GetMethodWebRequest; +import com.meterware.httpunit.WebRequest; +import com.meterware.httpunit.WebResponse; + +public class Displ298PdfTest extends DisplaytagCase { + + /** + * @see org.displaytag.test.DisplaytagCase#getJspName() + */ + public String getJspName() + { + return "DISPL-298.jsp"; + } + + /** + * Check that model modifications made by table decorator specified + * with in the decorator property the table tag show up in the pdf export. + * + * @param jspName jsp name, with full path + * @throws Exception any axception thrown during test. + */ + public void doTest(String jspName) throws Exception + { + + ParamEncoder encoder = new ParamEncoder("table"); + String mediaParameter = encoder.encodeParameterName(TableTagParameters.PARAMETER_EXPORTTYPE); + WebRequest request = new GetMethodWebRequest(jspName); + + // this will force media type initialization + MediaTypeEnum.registerMediaType("wpdf"); + ExportViewFactory factory = ExportViewFactory.getInstance(); + factory.registerExportView("wpdf", "org.displaytag.export.DefaultPdfExportView"); + MediaTypeEnum pdfMedia = MediaTypeEnum.fromName("wpdf"); + assertNotNull("Pdf export view not correctly registered.", pdfMedia); + request.setParameter(mediaParameter, Integer.toString(pdfMedia.getCode())); + + WebResponse response = runner.getResponse(request); + + assertEquals("Expected a different content type.", "application/pdf", response.getContentType()); + + InputStream stream = response.getInputStream(); + byte[] result = new byte[3000]; + stream.read(result); + + PdfReader reader = new PdfReader(result); + assertEquals("Expected a valid pdf file with a single page", 1, reader.getNumberOfPages()); + + // TODO: assert expected content. + + } + +} Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298RtfTest.java =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298RtfTest.java (revision 0) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298RtfTest.java (revision 0) @@ -0,0 +1,62 @@ +package org.displaytag.jsptests; + +import org.displaytag.export.ExportViewFactory; +import org.displaytag.properties.MediaTypeEnum; +import org.displaytag.tags.TableTagParameters; +import org.displaytag.test.DisplaytagCase; +import org.displaytag.util.ParamEncoder; + +import com.meterware.httpunit.GetMethodWebRequest; +import com.meterware.httpunit.WebRequest; +import com.meterware.httpunit.WebResponse; + +public class Displ298RtfTest extends DisplaytagCase +{ + /** + * @see org.displaytag.test.DisplaytagCase#getJspName() + */ + public String getJspName() + { + return "DISPL-298.jsp"; + } + + + /** + * Check that model modifications made by table decorator specified + * with in the decorator property the table tag show up in the rtf export. + * + * @param jspName jsp name, with full path + * @throws Exception any axception thrown during test. + */ + public void doTest(String jspName) throws Exception + { + + ParamEncoder encoder = new ParamEncoder("table"); + String mediaParameter = encoder.encodeParameterName(TableTagParameters.PARAMETER_EXPORTTYPE); + WebRequest request = new GetMethodWebRequest(jspName); + + // this will force media type initialization + MediaTypeEnum.registerMediaType("rtf"); + ExportViewFactory factory = ExportViewFactory.getInstance(); + factory.registerExportView("rtf", "org.displaytag.export.DefaultRtfExportView"); + MediaTypeEnum rtfMedia = MediaTypeEnum.fromName("rtf"); + assertNotNull("Pdf export view not correctly registered.", rtfMedia); + request.setParameter(mediaParameter, Integer.toString(rtfMedia.getCode())); + + WebResponse response = runner.getResponse(request); + + assertEquals("Expected a different content type.", "application/rtf", response.getContentType()); + + /* + TODO: assert expected content. No Rtf reader. + InputStream stream = response.getInputStream(); + byte[] result = new byte[3000]; + stream.read(result); + + PdfReader reader = new PdfReader(result); + assertEquals("Expected a valid pdf file with a single page", 1, reader.getNumberOfPages()); + */ + + } + +} Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298HtmlTest.java =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298HtmlTest.java (revision 0) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298HtmlTest.java (revision 0) @@ -0,0 +1,40 @@ +package org.displaytag.jsptests; + +import org.displaytag.decorator.ModelDecorator; +import org.displaytag.test.DisplaytagCase; + +import com.meterware.httpunit.GetMethodWebRequest; +import com.meterware.httpunit.WebRequest; +import com.meterware.httpunit.WebResponse; + +public class Displ298HtmlTest extends DisplaytagCase +{ + + /** + * @see org.displaytag.test.DisplaytagCase#getJspName() + */ + public String getJspName() + { + return "DISPL-298.jsp"; + } + + /** + * Check that model modifications made by table decorator specified + * with in the decorator property the table tag show up in the html output. + * + * @param jspName jsp name, with full path + * @throws Exception any axception thrown during test. + */ + public void doTest(String jspName) throws Exception + { + WebRequest request = new GetMethodWebRequest(jspName); + WebResponse response = runner.getResponse(request); + + assertEquals("Expected a different content type.", "text/html", response.getContentType()); + String responseText = response.getText(); + boolean expectedTextPresent = responseText != null && + responseText.indexOf(ModelDecorator.DECORATED_VALUE) > -1; + assertTrue("Missing content.", expectedTextPresent); + } + +} Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298CsvTest.java =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298CsvTest.java (revision 0) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/jsptests/Displ298CsvTest.java (revision 0) @@ -0,0 +1,55 @@ +package org.displaytag.jsptests; + +import org.displaytag.decorator.ModelDecorator; +import org.displaytag.properties.MediaTypeEnum; +import org.displaytag.tags.TableTagParameters; +import org.displaytag.test.DisplaytagCase; +import org.displaytag.util.ParamEncoder; + +import com.meterware.httpunit.GetMethodWebRequest; +import com.meterware.httpunit.WebRequest; +import com.meterware.httpunit.WebResponse; + +public class Displ298CsvTest extends DisplaytagCase { + + protected String getMimeType() { + return "text/csv"; + } + + protected int getCode() { + return MediaTypeEnum.CSV.getCode(); + } + + /** + * @see org.displaytag.test.DisplaytagCase#getJspName() + */ + public String getJspName() + { + return "DISPL-298.jsp"; + } + + /** + * Check that model modifications made by table decorator specified + * with in the decorator property the table tag show up in the csv export. + * + * @param jspName jsp name, with full path + * @throws Exception any axception thrown during test. + */ + public void doTest(String jspName) throws Exception + { + ParamEncoder encoder = new ParamEncoder("table"); + String mediaParameter = encoder.encodeParameterName(TableTagParameters.PARAMETER_EXPORTTYPE); + + WebRequest request = new GetMethodWebRequest(jspName); + request.setParameter(mediaParameter, Integer.toString(this.getCode())); + + WebResponse response = runner.getResponse(request); + + assertEquals("Expected a different content type.", this.getMimeType(), response.getContentType()); + String responseText = response.getText(); + boolean expectedTextPresent = responseText != null && + responseText.indexOf(ModelDecorator.DECORATED_VALUE) > -1; + assertTrue("Missing content.", expectedTextPresent); + } + +} Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/decorator/ModelDecorator.java =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/decorator/ModelDecorator.java (revision 0) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/java/org/displaytag/decorator/ModelDecorator.java (revision 0) @@ -0,0 +1,12 @@ +package org.displaytag.decorator; + +public class ModelDecorator extends TableDecorator +{ + public static final String DECORATED_VALUE = "decoratedValue"; + + public String getDecoratedValue() + { + return DECORATED_VALUE; + } + +} Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/displaytag.properties =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/displaytag.properties (revision 1071) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/displaytag.properties (working copy) @@ -1,2 +0,0 @@ -# test the sample pdf view, not enabled by default in distribution -export.pdf=true Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/el/DISPL-298.jsp =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/el/DISPL-298.jsp (revision 0) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/el/DISPL-298.jsp (revision 0) @@ -0,0 +1,25 @@ + + ]]> + + + + + Displaytag unit test + + + + + + + + + \ No newline at end of file Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/el/DISPL-298-media-decorator.jsp =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/el/DISPL-298-media-decorator.jsp (revision 0) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/el/DISPL-298-media-decorator.jsp (revision 0) @@ -0,0 +1,32 @@ + + ]]> + + + + + Displaytag unit test + + + + + + + + + + + + + \ No newline at end of file Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/standard/DISPL-298.jsp =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/standard/DISPL-298.jsp (revision 0) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/standard/DISPL-298.jsp (revision 0) @@ -0,0 +1,25 @@ + + ]]> + + + + + Displaytag unit test + + + + + + + + + \ No newline at end of file Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/standard/DISPL-298-media-decorator.jsp =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/standard/DISPL-298-media-decorator.jsp (revision 0) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/test/resources/standard/DISPL-298-media-decorator.jsp (revision 0) @@ -0,0 +1,26 @@ + + ]]> + + + + + Displaytag unit test + + + + + + + + + + \ No newline at end of file Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/main/java/org/displaytag/render/ItextTableWriter.java =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/main/java/org/displaytag/render/ItextTableWriter.java (revision 1071) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/main/java/org/displaytag/render/ItextTableWriter.java (working copy) @@ -237,14 +237,19 @@ } /** + * Decorators that help render the table to an iText document must implement ItextDecorator. * @see org.displaytag.render.TableWriterTemplate#writeDecoratedRowStart(org.displaytag.model.TableModel) */ protected void writeDecoratedRowStart(TableModel model) { - ItextDecorator decorator = (ItextDecorator) model.getTableDecorator(); - decorator.setTable(this.table); - decorator.setFont(this.defaultFont); - ((TableDecorator) decorator).startRow(); + TableDecorator decorator = model.getTableDecorator(); + if (decorator instanceof ItextDecorator) + { + ItextDecorator idecorator = (ItextDecorator) decorator; + idecorator.setTable(this.table); + idecorator.setFont(this.defaultFont); + } + decorator.startRow(); } /** Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/main/java/org/displaytag/properties/TableProperties.java =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/main/java/org/displaytag/properties/TableProperties.java (revision 1071) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/main/java/org/displaytag/properties/TableProperties.java (working copy) @@ -264,12 +264,18 @@ public static final String PROPERTY_EXPORT_PREFIX = "export"; //$NON-NLS-1$ /** - * suffix used to set the export decorator property name. The full property name is export. - * [export type].decorator + * prefix used to set the media decorator property name. The full property name is + * decorator.media.[export type]. */ - public static final String PROPERTY_EXPORT_DECORATOR_SUFFIX = "decorator"; //$NON-NLS-1$ + public static final String PROPERTY_DECORATOR_SUFFIX = "decorator"; //$NON-NLS-1$ /** + * used to set the media decorator property name. The full property name is + * decorator.media.[export type] + */ + public static final String PROPERTY_DECORATOR_MEDIA = "media"; //$NON-NLS-1$ + + /** * property export.types: holds the list of export available export types. */ public static final String PROPERTY_EXPORTTYPES = "export.types"; //$NON-NLS-1$ @@ -1314,9 +1320,20 @@ * Obtain the name of the decorator configured for a given media type. * @param thatEnum A media type * @return The name of the decorator configured for a given media type. + * @deprecated Use getMediaTypeDecoratorName instead. */ public String getExportDecoratorName(MediaTypeEnum thatEnum) { - return getProperty(PROPERTY_EXPORT_PREFIX + SEP + thatEnum + SEP + PROPERTY_EXPORT_DECORATOR_SUFFIX); + return getProperty(PROPERTY_EXPORT_PREFIX + SEP + thatEnum + SEP + PROPERTY_DECORATOR_SUFFIX); } + + /** + * Obtain the name of the decorator configured for a given media type. + * @param thatEnum A media type + * @return The name of the decorator configured for a given media type. + */ + public String getMediaTypeDecoratorName(MediaTypeEnum thatEnum) + { + return getProperty(PROPERTY_DECORATOR_SUFFIX + SEP + PROPERTY_DECORATOR_MEDIA + SEP + thatEnum); + } } \ No newline at end of file Index: C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/main/java/org/displaytag/tags/TableTag.java =================================================================== --- C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/main/java/org/displaytag/tags/TableTag.java (revision 1071) +++ C:/Workshop/jluix/displaytag_now/displaytag/displaytag/src/main/java/org/displaytag/tags/TableTag.java (working copy) @@ -1173,21 +1173,8 @@ describeEmptyTable(); } - // TableDecorator tableDecorator = DecoratorFactory.loadTableDecorator(this.decoratorName); - String tableDecoratorName = null; - Object previousMediaType = this.pageContext.getAttribute(PAGE_ATTRIBUTE_MEDIA); - if (MediaTypeEnum.HTML.equals(this.currentMediaType) - && (previousMediaType == null || MediaTypeEnum.HTML.equals(previousMediaType))) - { - tableDecoratorName = this.decoratorName; - } - else if (!MediaTypeEnum.HTML.equals(this.currentMediaType)) - { - tableDecoratorName = this.properties.getExportDecoratorName(this.currentMediaType); - } - TableDecorator tableDecorator = this.properties.getDecoratorFactoryInstance().loadTableDecorator( - this.pageContext, - tableDecoratorName); + TableDecorator tableDecorator = this.properties.getDecoratorFactoryInstance(). + loadTableDecorator(this.pageContext, getConfiguredDecoratorName()); if (tableDecorator != null) { @@ -1212,6 +1199,7 @@ // check for nested tables // Object previousMediaType = this.pageContext.getAttribute(PAGE_ATTRIBUTE_MEDIA); + Object previousMediaType = this.pageContext.getAttribute(PAGE_ATTRIBUTE_MEDIA); if (MediaTypeEnum.HTML.equals(this.currentMediaType) && (previousMediaType == null || MediaTypeEnum.HTML.equals(previousMediaType))) { @@ -1240,6 +1228,26 @@ } /** + * Returns the name of the table decorator that should be applied to this table, + * which is either the decorator configured in the property "decorator", or if + * none is configured in said property, a decorator configured with the + * "decorator.media.[media type]" property, or null if none is configured. + * + * @return Name of the table decorator that should be applied to this table. + */ + private String getConfiguredDecoratorName() + { + String + tableDecoratorName = (this.decoratorName == null) ? + this.properties.getMediaTypeDecoratorName(this.currentMediaType) : + this.decoratorName; + tableDecoratorName = (tableDecoratorName == null) ? + this.properties.getExportDecoratorName(this.currentMediaType) : + tableDecoratorName; + return tableDecoratorName; + } + + /** * clean up instance variables, but not the ones representing tag attributes. */ private void cleanUp()