package com.constellio.model.packaging.custom; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.commons.io.IOUtils; import org.jdom.Document; import org.jdom.Element; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; import org.joda.time.LocalDateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import com.constellio.data.io.services.facades.FileService; import com.constellio.data.io.services.zip.ZipService; import com.constellio.data.io.services.zip.ZipServiceException; //import org.apache.james.mime4j.dom.datetime.DateTime; public class CustomPluginsPackagingService { private static final String TEMP_FOLDER = "CustomPluginsPackagingService_TempFolder"; public static final String CUSTOMER_CODE = "getCustomerCode()"; public static final String CUSTOMER_NAME = "getCustomerName()"; public static final String INSTALLATION_DATE = "getInstallationDateYYYYMMDD()"; public static final String SUPPORT_PLAN_START = "getSupportPlanStartYYYYMMDD()"; public static final String SUPPORT_PLAN_END = "getSupportPlanEndYYYYMMDD()"; private final FileService fileService; private final ZipService zipService; public CustomPluginsPackagingService(FileService fileService, ZipService zipService) { this.fileService = fileService; this.zipService = zipService; } public void buildJars(File sourceFolder, File binFolder, File jarsDestinationFolder) { for (Customer customer : detectCustomers(sourceFolder)) { buildCustomerJar(customer, binFolder, jarsDestinationFolder); } } public List<Customer> detectCustomers(File sourceFolder) { List<Customer> customers = new ArrayList<Customer>(); for (File licenseFile : fileService.listRecursiveFilesWithName(sourceFolder, "License.java")) { customers.add(buildCustomerFromLicense(licenseFile)); } return customers; } public Customer buildCustomerFromLicense(File licenseFile) { String licenseContent = fileService.readFileToStringWithoutExpectableIOException(licenseFile); String code = extractLicenseAttribute(licenseFile, licenseContent, CUSTOMER_CODE); String name = extractLicenseAttribute(licenseFile, licenseContent, CUSTOMER_NAME); String thePackage = extractLicensePackage(licenseFile, licenseContent); LocalDateTime installationDate = extractLicenseDateAttribute(licenseFile, licenseContent, INSTALLATION_DATE); LocalDateTime supportPlanStart = extractLicenseDateAttribute(licenseFile, licenseContent, SUPPORT_PLAN_START); LocalDateTime supportPlanEnd = extractLicenseDateAttribute(licenseFile, licenseContent, SUPPORT_PLAN_END); Customer customer = new Customer(); customer.setCode(code); customer.setName(name); customer.setLicensePackage(thePackage); customer.setInstallationDate(installationDate); customer.setSupportPlanStart(supportPlanStart); customer.setSupportPlanEnd(supportPlanEnd); return customer; } public void buildCustomerJar(Customer customer, File binFolder, File jarDestinationFolder) { File customerJar = new File(jarDestinationFolder, "constellio-" + customer.getCode() + ".jar"); File tempFolder = null; try { String customerPackagePath = customer.getLicensePackage().replace(".", File.separator); tempFolder = fileService.newTemporaryFolder(TEMP_FOLDER); File classPackage = new File(binFolder, customerPackagePath); File clientWorkPackage = new File(tempFolder, customerPackagePath); clientWorkPackage.mkdirs(); clientWorkPackage.mkdir(); fileService.copyDirectoryWithoutExpectableIOException(classPackage, clientWorkPackage); try { zipService.zip(customerJar, Arrays.asList(tempFolder.listFiles())); } catch (ZipServiceException e) { throw new CustomPluginsPackagingServiceRuntimeException.CannotBuildCustumerJar(customer.getName(), binFolder.getPath(), jarDestinationFolder.getPath(), e); } } finally { fileService.deleteDirectoryWithoutExpectableIOException(tempFolder); } } public String extractLicenseAttribute(File licenseFile, String theLicenseContent, String method) { List<String> lines = Arrays.asList(theLicenseContent.split("\n")); int index = 0; for (int i = 0; i < lines.size(); i++) { String line = lines.get(i); if (line.contains(method)) { index = i; } } String value = lines.get(index + 1).replace("\t", "").trim(); if (!value.startsWith("return \"") || !value.endsWith("\";")) { throw new CustomPluginsPackagingServiceException.MethodCannotBeParsed(licenseFile, method); } else { return value.replace("return \"", "").replace("\";", ""); } } public String extractLicensePackage(File licenseFile, String theLicenseContent) { List<String> lines = Arrays.asList(theLicenseContent.split("\n")); int index = 0; for (int i = 0; i < lines.size(); i++) { String line = lines.get(i); if (line.startsWith("package")) { index = i; } } return lines.get(index).replace("package ", "").replace(";", "").trim(); } public LocalDateTime extractLicenseDateAttribute(File licenseFile, String theLicenseContent, String method) { String value = extractLicenseAttribute(licenseFile, theLicenseContent, method); try { DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyyMMdd"); return LocalDateTime.parse(value.replace("-", ""), formatter); } catch (IllegalArgumentException e) { throw new CustomPluginsPackagingServiceException.InvalidDate(licenseFile, method, e); } } public void buildLicensesFiles(File src, File tempLicensesDir) { List<Customer> customers = detectCustomers(src); for (Customer customer : customers) { writeCustomerLicense(customer, tempLicensesDir); } } void writeCustomerLicense(Customer customer, File tempLicensesDir) { Writer writer = null; try { Element client = new Element("client"); Document document = new Document(client); client.addContent(new Element("code").setText(customer.getCode())); client.addContent(new Element("name").setText(customer.getName())); client.addContent(new Element("plan").setText(customer.getPlan())); client.addContent(new Element("installationDate").setText(format(customer.getInstallationDate()))); client.addContent(new Element("supportPlanStart").setText(format(customer.getSupportPlanStart()))); client.addContent(new Element("supportPlanEnd").setText(format(customer.getSupportPlanEnd()))); XMLOutputter xmlOutput = new XMLOutputter(); xmlOutput.setFormat(Format.getPrettyFormat().setIndent(" ")); writer = new FileWriter(new File(tempLicensesDir, customer.getCode() + ".xml")); xmlOutput.output(document, writer); } catch (IOException io) { throw new CustomPluginsPackagingServiceRuntimeException.CannotWriteCustumerLicense(customer.getName(), tempLicensesDir.getPath(), io); } finally { IOUtils.closeQuietly(writer); } } private String format(LocalDateTime localDateTime) { // return new SimpleDateFormat("yyyy-MM-dd").format(localDateTime); return localDateTime.toString("yyyy-MM-dd"); } }