At line 8 added 3 lines. |
Please note, the resulting PDF document does not look very pretty. This is because the XSL stylesheet is very basic and does not really apply much FO formatting tags/attributes. It would be very easy to modify the XSL to include images, bold, grey background cells etc.. but this is best left for the FOP documentation to describe. |
|
|
At line 12 changed 2 lines. |
* [4] Modify User Junit test |
* [5] Run User Junit test |
* [4] Modify UserManagerTest Junit test |
* [5] Run UserManagerTest Junit test |
At line 25 added 2 lines. |
UserInputSource needs to extend interface FOPSource which should be in src/service/**/fop/FOPSource.java (source attached at the end of this tutorial). |
|
At line 34 changed 1 line. |
public class UserInputSource extends InputSource { |
public class UserInputSource extends InputSource implements FOPSource { |
At line 69 added 2 lines. |
|
|
At line 79 added 2 lines. |
|
|
At line 78 changed 1 line. |
This class depends on two helper classes, AbstractObjectReader and EasyGenerationContentHandlerProxy that need to be added to src/service/**/util. These files are downloadable at the end of this tutorial. |
This class depends on two helper classes, AbstractObjectReader and EasyGenerationContentHandlerProxy that need to be added to src/service/**/fop. These files are downloadable at the end of this tutorial. |
At line 98 changed 1 line. |
import org.appfuse.util.AbstractObjectReader; |
import org.appfuse.fop.AbstractObjectReader; |
At line 146 added 3 lines. |
|
|
|
At line 166 changed 1 line. |
processUserDetails(user); |
processUserDetails(user); |
At line 197 added 1 line. |
|
At line 204 changed 1 line. |
Place the user2fo.xsl stylesheet in src/web/**/fop/user2fo.xsl. |
Place the user2fo.xsl stylesheet in src/service/**/fop/xsl/user2fo.xsl. |
At line 330 added 1 line. |
%% |
At line 333 added 1 line. |
!!Modify UserManagerTest.java Junit test [#4] |
At line 320 changed 1 line. |
!!Modify User Junit test [#4] |
To support the execution of the User service level test, we need another helper file. This file (attached at the end) is called FOPHelper.java and lives in src/service/**/fop. |
At line 337 added 68 lines. |
Add the following imports and method to UserManagerTest.java: |
|
[{Java2HtmlPlugin |
|
import java.io.File; |
import java.io.OutputStream; |
import java.io.IOException; |
|
//JAXP |
import javax.xml.transform.Transformer; |
import javax.xml.transform.TransformerFactory; |
import javax.xml.transform.TransformerException; |
import javax.xml.transform.Source; |
import javax.xml.transform.Result; |
import javax.xml.transform.stream.StreamSource; |
import javax.xml.transform.sax.SAXResult; |
|
//Avalon |
import org.apache.avalon.framework.ExceptionUtil; |
import org.apache.avalon.framework.logger.ConsoleLogger; |
import org.apache.avalon.framework.logger.Logger; |
|
//FOP |
import org.apache.fop.apps.Driver; |
import org.apache.fop.apps.FOPException; |
import org.apache.fop.messaging.MessageHandler; |
|
//Appfuse |
import org.appfuse.fop.UserInputSource; |
import org.appfuse.fop.FOPHelper; |
|
|
public void testGeneratePDF() throws Exception { |
|
log.info("Inside testGeneratePSF"); |
User testData = new User(); |
testData.setUsername("tomcat"); |
testData.getRoles().add(new Role("user")); |
// set expected behavior on dao |
userDAO.expects(once()).method("getUser") |
.with(eq("tomcat")).will(returnValue(testData)); |
|
user = userManager.getUser("tomcat"); |
UserInputSource uis = new UserInputSource(user); |
|
// Setup directories |
File baseDir = new File("."); |
File outDir = new File("."); |
outDir.mkdirs(); |
|
//Setup input and output |
File xslFile = new File(baseDir, "./src/service/org/appfuse/fop/xsl/user2fo.xsl"); |
File pdfFile = new File(outDir, "user.pdf"); |
File xmlFile = new File(outDir, "user.xml"); |
File foFile = new File(outDir, "user.fo"); |
|
log.debug("Input: a UserInputSource object"); |
log.debug("Stylesheet: " + xslFile); |
log.debug("Output: PDF (" + pdfFile + ")"); |
log.debug("Output: FO (" + foFile + ")"); |
log.debug("Transforming..."); |
|
FOPHelper fopHelper = new FOPHelper(); |
fopHelper.convertPOJO2PDF(uis, xslFile, pdfFile, foFile); |
fopHelper.convertPOJO2XML(uis, xmlFile); |
} |
}] |
|
At line 407 added 13 lines. |
Now execute ant test-service. The testGeneratePDF method will execute and generate the 3 files involved in the PDF generation |
process. user.xml, user.fo and user.pdf (all three attached at the end of this tutorial). |
|
You should see output: |
|
{{{ |
[junit] [appfuse] INFO [main] UserManagerTest.testGeneratePDF(83) | xslFile exists |
[junit] [appfuse] DEBUG [main] UserManagerTest.testGeneratePDF(88) | Input: a UserInputSource object |
[junit] [appfuse] DEBUG [main] UserManagerTest.testGeneratePDF(89) | Stylesheet: ././src/service/org/appfuse/fop/xsl/user2fo.xsl |
[junit] [appfuse] DEBUG [main] UserManagerTest.testGeneratePDF(90) | Output: PDF (./user.pdf) |
[junit] [appfuse] DEBUG [main] UserManagerTest.testGeneratePDF(91) | Transforming... |
}}} |
|
At line 333 changed 1 line. |
|
|
At line 337 changed 1 line. |
|
import org.appfuse.fop.UserXMLReader; |
import org.appfuse.fop.FOPHelper; |
|
At line 344 changed 5 lines. |
|
import java.io.ByteArrayOutputStream; |
import java.io.File; |
import java.io.IOException; |
|
|
import java.io.*; |
import java.util.Date; |
|
At line 354 changed 1 line. |
|
|
At line 358 changed 1 line. |
|
import org.springframework.core.io.*; |
import org.xml.sax.InputSource; |
|
At line 463 added 1 line. |
import javax.xml.transform.sax.SAXSource; |
At line 365 changed 1 line. |
|
|
At line 370 changed 1 line. |
* <p><a href="FopServlet.java.html"><i>View Source</i></a></p> |
* <p><a href="FOPServlet.java.html"><i>View Source</i></a></p> |
At line 376 changed 1 line. |
* display-name="Fop Servlet" |
* display-name="FOP Servlet" |
At line 383 changed 4 lines. |
|
public class FopServlet extends HttpServlet { |
|
private Logger logger = null; |
|
public class FOPServlet extends HttpServlet { |
|
private Logger logger = null; |
At line 389 changed 2 lines. |
|
|
|
|
At line 392 changed 3 lines. |
this.servletContext = getServletContext(); |
this.ctx = |
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); |
this.servletContext = getServletContext(); |
this.ctx = |
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); |
At line 396 changed 1 line. |
|
|
At line 410 changed 1 line. |
|
|
At line 424 changed 1 line. |
|
|
At line 437 changed 4 lines. |
|
ByteArrayOutputStream out = null; |
|
try { |
|
ByteArrayOutputStream out = null; |
|
try { |
At line 442 changed 1 line. |
|
|
At line 445 changed 31 lines. |
|
Driver driver = new Driver(); |
Logger logger = new ConsoleLogger(ConsoleLogger.LEVEL_INFO); |
driver.setLogger(logger); |
MessageHandler.setScreenLogger(logger); |
driver.setRenderer(Driver.RENDER_PDF); |
|
|
// Start with a bigger buffer to avoid too many buffer reallocations |
out = new ByteArrayOutputStream(16384); |
driver.setOutputStream(out); |
|
ServletContextResource resource = |
new ServletContextResource(servletContext, |
"/WEB-INF/classes/org/appfuse/webapp/fop/user2fo.xsl"); |
File xslFile = resource.getFile(); |
|
//Setup XSLT |
TransformerFactory factory = TransformerFactory.newInstance(); |
Transformer transformer = factory.newTransformer(new StreamSource(xslFile)); |
|
//Setup input for XSLT transformation |
Source src = new UserInputSource(user).getSource(); |
|
//Resulting SAX events (the generated FO) must be piped through to FOP |
Result res = new SAXResult(driver.getContentHandler()); |
|
//Start XSLT transformation and FOP processing |
transformer.transform(src, res); |
|
byte[] content = out.toByteArray(); |
UserInputSource uis = new UserInputSource(user); |
|
ClassPathResource resource = |
new ClassPathResource("/org/appfuse/fop/xsl/user2fo.xsl"); |
|
byte[] content = FOPHelper.createPDF(uis, resource); |
response.setHeader("Content-Disposition", |
"attachment; filename=user-" + user.getUsername() + ".pdf"); |
At line 480 changed 1 line. |
|
|
At line 484 changed 3 lines. |
if (out!=null) { |
out.close(); |
} |
if (out!=null) { |
out.close(); |
} |
At line 490 removed 1 line. |
|
At line 530 removed 1 line. |
# |
At line 624 added 1 line. |
|
At line 647 added 2 lines. |
|
|
At line 575 changed 1 line. |
Also inside the package-web target add this line: |
Also inside the package-web target add this block: |
At line 578 changed 1 line. |
<include name="**/*.xsl"/> |
|
<fileset dir="src/service"> |
<include name="**/*.xsl"/> |
</fileset> |
|
At line 587 removed 1 line. |
<include name="**/*.xsl"/> |
At line 670 added 3 lines. |
<fileset dir="src/service"> |
<include name="**/*.xsl"/> |
</fileset> |
At line 591 removed 1 line. |
which ensures the xsl file is deployed. |
At line 676 added 2 lines. |
which ensures the xsl file is deployed into our runtime classpath. |
|
At line 597 removed 2 lines. |
*src/web/org/appfuse/webapp/fop/user2fo.xsl |
*src/web/org/appfuse/webapp/action/FopServlet.java |
At line 683 added 3 lines. |
*src/web/org/appfuse/webapp/action/FOPServlet.java |
|
*src/service/org/appfuse/fop/xsl/user2fo.xsl |
At line 688 added 4 lines. |
*src/service/org/appfuse/fop/FOPSource.java |
*src/service/org/appfuse/fop/FOPHelper.java |
*src/service/org/appfuse/fop/AbstractObjectReader.java |
*src/service/org/appfuse/fop/EasyGenerationContentHandlerProxy.java |
At line 603 removed 3 lines. |
*src/service/org/appfuse/util/AbstractObjectReader.java |
*src/service/org/appfuse/util/EasyGenerationContentHandlerProxy.java |
|
At line 611 changed 2 lines. |
*Ensure the xsl file is within your webapps/appfuse/WEB-INF/classes/** runtime directory somewhere |
*Ensure the path in the FopServlet is correct for this XSL file (if you moved it) |
*Ensure the xsl file is within your webapps/appfuse/WEB-INF/classes/** runtime directory |
*Ensure the path to load the user2fo.xsl file, specified in FOPServlet, is correct (in case you moved it) |