Skip to content

Commit

Permalink
renamed project and added changes to optimise thymeleaf usage
Browse files Browse the repository at this point in the history
  • Loading branch information
devrishal committed Mar 29, 2024
1 parent 9946ab5 commit cf80b26
Show file tree
Hide file tree
Showing 8 changed files with 107 additions and 36 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.rds.barcodegen</groupId>
<artifactId>barcode-generator</artifactId>
<artifactId>document-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>barcode-generator</name>
<description>Code39 Barcode generator</description>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import java.io.IOException;

import com.rds.barcodegen.api.rest.DocumentResource;
import com.rds.barcodegen.service.DocumentServiceApacheFOP;
import com.rds.barcodegen.service.impl.BarcodeDocumentServiceImpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
Expand All @@ -17,13 +17,13 @@
@RestController
@RequiredArgsConstructor
public class DocumentResourceImpl implements DocumentResource {
private final DocumentServiceApacheFOP documentServiceApacheFOP;
private final BarcodeDocumentServiceImpl barcodeDocumentServiceImpl;

@Override
public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
response.setContentType(MediaType.APPLICATION_PDF_VALUE);
response.setStatus(HttpStatus.OK.value());
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=Test.pdf");
documentServiceApacheFOP.generatePDF(request, response);
barcodeDocumentServiceImpl.generatePDF(request, response);
}
}
19 changes: 11 additions & 8 deletions src/main/java/com/rds/barcodegen/config/ApplicationConfig.java
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
package com.rds.barcodegen.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {
@Bean
public SpringResourceTemplateResolver templateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
public ITemplateResolver foTemplateResolver() {
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setTemplateMode(TemplateMode.XML);
templateResolver.setPrefix("classpath:/templates/");
templateResolver.setOrder(1);
templateResolver.setPrefix("/templates/");
templateResolver.setSuffix(".fo");
return templateResolver;
}

@Bean
public TemplateEngine templateProcessorEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
final SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setEnableSpringELCompiler(true);
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setTemplateResolver(foTemplateResolver());
return templateEngine;
}
}
16 changes: 16 additions & 0 deletions src/main/java/com/rds/barcodegen/model/CustomerInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.rds.barcodegen.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CustomerInfo {
private String name;

private String id;

private String address;
}
16 changes: 16 additions & 0 deletions src/main/java/com/rds/barcodegen/model/Item.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.rds.barcodegen.model;

import lombok.Data;

@Data
public class Item {
private String itemId;

private double quantity;

private String itemName;

private double perUnitPrice;

private double itemPrice;
}
21 changes: 21 additions & 0 deletions src/main/java/com/rds/barcodegen/model/OrderDetail.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.rds.barcodegen.model;

import java.util.List;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderDetail {
private CustomerInfo customerInfo;

private List<Item> items;

private double reductionPercentage;

private double totalAmount;
private double totalDiscount;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
import java.io.StringReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Locale;
import java.util.Map;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
Expand All @@ -16,47 +14,33 @@
import javax.xml.transform.stream.StreamSource;

import com.rds.barcodegen.exception.DocumentServiceException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.apache.xmlgraphics.util.MimeConstants;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;

import static java.lang.Boolean.FALSE;
import static net.sf.saxon.lib.FeatureKeys.ALLOWED_PROTOCOLS;
import static net.sf.saxon.lib.FeatureKeys.ALLOW_EXTERNAL_FUNCTIONS;
import static net.sf.saxon.lib.FeatureKeys.DTD_VALIDATION;

@Slf4j
@Service
@RequiredArgsConstructor
public class DocumentServiceApacheFOP {
private final TemplateEngine templateEngine;
public abstract class AbstractDocumentService {

public void generatePDF(HttpServletRequest request, HttpServletResponse response) {
String data = RandomStringUtils.random(20, 0, 0, true, true, null).toUpperCase();
Context context = new Context(Locale.getDefault(), Map.of("model", Map.of(
"title", "BarCode Generation Using Apache FOP",
"titleLine1", "and Barcode4J",
"code39Message", data)));
String xmlTemplate = templateEngine.process("code39", context);
public static final String CONFIGURATION_XCONF = "configuration.xconf";

public static final String FACTORY_IMPL = "net.sf.saxon.TransformerFactoryImpl";

public void generateDocument(HttpServletResponse response, String xmlTemplate) {
try {
InputStream inputStream = new ClassPathResource("configuration.xconf").getInputStream();
InputStream inputStream = new ClassPathResource(CONFIGURATION_XCONF).getInputStream();
FopFactory fopFactory = FopFactory.newInstance(new URI("./"), inputStream);
DefaultHandler defaultHandler = fopFactory.newFop(MimeConstants.MIME_PDF, response.getOutputStream()).getDefaultHandler();
Source src = new StreamSource(new StringReader(xmlTemplate));
Result result = new SAXResult(defaultHandler);
TransformerFactory transformerFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null);
TransformerFactory transformerFactory = TransformerFactory.newInstance(FACTORY_IMPL, null);
transformerFactory.setFeature(DTD_VALIDATION, FALSE);
transformerFactory.setFeature(ALLOW_EXTERNAL_FUNCTIONS, FALSE);
transformerFactory.setAttribute(ALLOWED_PROTOCOLS, "");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.rds.barcodegen.service.impl;

import java.util.Locale;
import java.util.Map;

import com.rds.barcodegen.service.AbstractDocumentService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.RandomStringUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor
public class BarcodeDocumentServiceImpl extends AbstractDocumentService {
private final TemplateEngine templateEngine;

public void generatePDF(HttpServletRequest request, HttpServletResponse response) {
String data = RandomStringUtils.random(20, 0, 0, true, true, null).toUpperCase();
Context context = new Context(Locale.getDefault(), Map.of("model", Map.of(
"title", "BarCode Generation Using Apache FOP",
"titleLine1", "and Barcode4J",
"code39Message", data)));
generateDocument(response, templateEngine.process("code39", context));
}
}

0 comments on commit cf80b26

Please sign in to comment.