Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.anritsu.mcreleaseportal.docgeneration; import com.anritsu.mcreleaseportal.shared.MCPackage; import com.anritsu.mcreleaseportal.shared.MCPackageAvailabilities; import com.anritsu.mcreleaseportal.shared.MCPackageMail; import com.anritsu.mcreleaseportal.utils.Configuration; import com.anritsu.mcreleaseportal.xml.Activities; import com.anritsu.mcreleaseportal.xml.Enh; import com.anritsu.mcreleaseportal.xml.Feature; import com.anritsu.mcreleaseportal.xml.Global; import com.anritsu.mcreleaseportal.xml.Item; import com.anritsu.mcreleaseportal.xml.PartRelease; import com.anritsu.mcreleaseportal.xml.Reference; import com.anritsu.mcreleaseportal.xml.Release; import fr.opensagres.xdocreport.document.IXDocReport; import fr.opensagres.xdocreport.document.registry.XDocReportRegistry; import fr.opensagres.xdocreport.template.IContext; import fr.opensagres.xdocreport.template.TemplateEngineKind; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.poi.xwpf.converter.core.FileURIResolver; import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter; import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions; import org.apache.poi.xwpf.usermodel.XWPFDocument; /** * * @author ro100051 */ public class ReleaseMailGeneration { private OutputStream out = null; private Release release = null; private ArrayList<MCPackageMail> releaseMail = new ArrayList<>(); ArrayList<String> developerAvailabilities = new ArrayList<>(); ArrayList<String> releaseAvailabilities = new ArrayList<>(); String releasesMail = ""; String developerMail = ""; HashMap<String, String> mcVersionAvailabilities = new HashMap<>(); private MCPackage mcPack = null; Map<String, String> statusAction = new HashMap<>(); public ReleaseMailGeneration(Release release, MCPackage mcPack) throws Exception { this.release = release; this.mcPack = mcPack; statusAction = new HashMap<>(); statusAction.put("NEW", "released"); statusAction.put("CANCEL", "withdrawn"); statusAction.put("UPDATE", "updated"); developerAvailabilities = new ArrayList( Arrays.asList(Configuration.getInstance().getDeveloperAvailabilities().split(","))); releaseAvailabilities = new ArrayList( Arrays.asList(Configuration.getInstance().getReleasesAvailabilities().split(","))); developerMail = Configuration.getInstance().getDeveloperMail(); releasesMail = Configuration.getInstance().getReleasesMail(); MCPackageMail developerMPCPackageMail = new MCPackageMail(); developerMPCPackageMail.setStatus(mcPack.getStatus()); developerMPCPackageMail.setStatusReason(mcPack.getStatusReason()); developerMPCPackageMail.setSource(mcPack.getAuthorEmail()); developerMPCPackageMail.setAuthor(mcPack.getAuthor()); developerMPCPackageMail.setPackageName(mcPack.getPackageName()); developerMPCPackageMail.setPackageVersion(mcPack.getPackageVersion()); developerMPCPackageMail .setDestination((mcPack.getStatusReason().contains(Configuration.getInstance().getTestMailKeyword()) ? mcPack.getAuthorEmail() : developerMail)); MCPackageMail releaseMCPackageMail = new MCPackageMail(); releaseMCPackageMail.setStatus(mcPack.getStatus()); releaseMCPackageMail.setStatusReason(mcPack.getStatusReason()); releaseMCPackageMail.setSource(mcPack.getAuthorEmail()); releaseMCPackageMail.setAuthor(mcPack.getAuthor()); releaseMCPackageMail.setPackageName(mcPack.getPackageName()); releaseMCPackageMail.setPackageVersion(mcPack.getPackageVersion()); releaseMCPackageMail .setDestination((mcPack.getStatusReason().contains(Configuration.getInstance().getTestMailKeyword()) ? mcPack.getAuthorEmail() : releasesMail)); for (Global g : release.getPartReleases().get(0).getGlobalAvailabilities()) { mcVersionAvailabilities.put(g.getMcVersion(), g.getLevel()); } for (String s : developerAvailabilities) { if (mcVersionAvailabilities.containsValue(s)) { //Generate DEVELOPER release mail developerMPCPackageMail.setMail(generateReleaseMail(new ArrayList<String>(), release)); HashMap<String, String> developerAndReleasesAvailabilities = new HashMap<>(); developerAndReleasesAvailabilities .putAll(getMcVersionAvailabilitiesMap(releaseAvailabilities, mcPack)); developerAndReleasesAvailabilities .putAll(getMcVersionAvailabilitiesMap(developerAvailabilities, mcPack)); developerMPCPackageMail.setMcVersionAvailabilityMap(developerAndReleasesAvailabilities); developerMPCPackageMail.setSubject(getMailSubject(developerMPCPackageMail)); releaseMail.add(developerMPCPackageMail); break; } } for (String s : releaseAvailabilities) { if (mcVersionAvailabilities.containsValue(s)) { // Generate RELEASE release mail releaseMCPackageMail.setMail(generateReleaseMail(developerAvailabilities, release)); releaseMCPackageMail .setMcVersionAvailabilityMap(getMcVersionAvailabilitiesMap(releaseAvailabilities, mcPack)); releaseMCPackageMail.setSubject(getMailSubject(releaseMCPackageMail)); releaseMail.add(releaseMCPackageMail); break; } } } private String getMailSubject(MCPackageMail mcPackageMail) { String statusReasonSection = "[Reason: " + mcPackageMail.getStatusReason() + "]"; String statusActionSection = statusAction.get(mcPackageMail.getStatus()); if (mcPackageMail.getStatusReason().toLowerCase().contains("availability") && mcPackageMail.getStatusReason().toLowerCase().contains("change")) { statusReasonSection = ""; statusActionSection = "released"; } ArrayList<String> availabilitiesArray = new ArrayList<>(); Iterator it = mcPackageMail.getMcVersionAvailabilityMap().entrySet().iterator(); while (it.hasNext()) { Map.Entry versionAvailability = (Map.Entry) it.next(); availabilitiesArray.add(versionAvailability.getKey() + " " + versionAvailability.getValue()); } return mcPackageMail.getPackageName() + "-" + mcPackageMail.getPackageVersion() + " for MasterClaw " + Arrays.asList(availabilitiesArray.toArray()).toString() + " has been " + statusActionSection + ". " + ((mcPackageMail.getStatus().equalsIgnoreCase("NEW")) ? "" : statusReasonSection); } private HashMap<String, String> getMcVersionAvailabilitiesMap(ArrayList<String> availabilities, MCPackage mcPack) { HashMap<String, String> mcVersionAvailabilityMap = new HashMap<>(); ArrayList<MCPackageAvailabilities> mcPackAvailabilities = mcPack.getAvailabilities(); for (MCPackageAvailabilities mcpa : mcPackAvailabilities) { if (availabilities.contains(mcpa.getAvailability())) { mcVersionAvailabilityMap.put(mcpa.getMcVersion(), mcpa.getAvailability()); } } System.out.println(Arrays.asList(mcVersionAvailabilityMap.keySet().toArray()).toString()); return mcVersionAvailabilityMap; } public ArrayList<MCPackageMail> getReleaseMail() { System.out.println("Returning " + releaseMail.size() + " mails"); return releaseMail; } private String generateReleaseMail(ArrayList<String> excludeAvailabilities, Release release) throws Exception { String html; if (mcPack.getStatus().equalsIgnoreCase("cancel")) { html = "<html>This release is WITHDRAWN, please discard!<br/><p>Thank you,</p><p>" + mcPack.getAuthor() + "</p></html>"; return html; } InputStream template = new FileInputStream(new File(new File("").getAbsolutePath() + File.separator + Configuration.getInstance().getReleaseMailTemplatePath())); File fileMail = File.createTempFile( "releaseMail" + release.getName() + "-" + release.getVersion() + excludeAvailabilities.toString(), ".tmp"); out = new FileOutputStream(fileMail); IXDocReport report = XDocReportRegistry.getRegistry().loadReport(template, TemplateEngineKind.Velocity); IContext context = report.createContext(); PartRelease partRelease = (PartRelease) release.getPartReleases().get(0); context.put("release", release); // Add release note/str/IG&ULTR ArrayList<Reference> cmsReferences = release.getPartReleases().get(0).getReferences(); for (Reference r : cmsReferences) { if (r.getType().equalsIgnoreCase("RN")) { String releaseNote = r.getUri() + "/" + r.getDocName(); context.put("releaseNote", releaseNote); } if (r.getType().equalsIgnoreCase("STR")) { String str = r.getUri() + "/" + r.getDocName(); context.put("str", str); } if (r.getName() != null && r.getName().contains("Installation Guide")) { String installationGuide = r.getUri() + "/" + r.getDocName(); context.put("installationGuide", installationGuide); } if (r.getName() != null && r.getName().contains("ULTR")) { String ultr = r.getUri() + "/" + r.getDocName(); context.put("ultr", ultr); } } context.put("author", release.getAuthor()); context.put("contact", release.getContact()); context.put("release-name", release.getName()); context.put("release-version", release.getVersion()); // Logic to split globalAvailabilities SDR/TQR from SCR/FCA/GCA ArrayList<Global> globalAvailabilities = new ArrayList<>(partRelease.getGlobalAvailabilities()); for (Global gAvailability : new ArrayList<>(globalAvailabilities)) { if (excludeAvailabilities.contains(gAvailability.getLevel())) { globalAvailabilities.remove(gAvailability); } } context.put("globalAvailabilities", globalAvailabilities); //workaround to exclude specific items not meant for specific baseline // ArrayList<Item> items = release.getItems(); // Set<Item> itemsForRelease = new HashSet<>(); // for(Item i: items){ // for(Global g: globalAvailabilities){ // if(i.getName().endsWith("rpm") && !g.getMcVersion().startsWith("7")){ // itemsForRelease.add(i); // break; // }else if(!i.getName().endsWith("rpm") && g.getMcVersion().startsWith("7") ){ // itemsForRelease.add(i); // break; // } // } // } context.put("item", release.getItems()); context.put("partRelease", partRelease); context.put("purpose", partRelease.getPurpose()); // To be evaluated if needed context.put("baseline", partRelease.getBaselines()); // Logic to split featureAvailabilities SDR/TQR from SCR/FCA/GCA if (partRelease.getFeatureAvailabilities() != null) { ArrayList<Feature> featureAvailabilities = new ArrayList<>(partRelease.getFeatureAvailabilities()); for (Feature fAvailability : new ArrayList<>(featureAvailabilities)) { if (excludeAvailabilities.contains(fAvailability.getLevel())) { featureAvailabilities.remove(fAvailability); } } context.put("featureAvailabilities", featureAvailabilities); } context.put("otherAvailabilities", partRelease.getOtherAvailabilities()); context.put("reference", partRelease.getReferences()); context.put("dependencies", partRelease.getDependencies()); // Logic to split activities SDR/TQR from SCR/FCA/GCA ArrayList<Activities> activities = new ArrayList(partRelease.getActivities()); for (Activities a : new ArrayList<>(activities)) { activities.remove(a); Iterator i = mcVersionAvailabilities.entrySet().iterator(); if (a.getEnhs() == null) { continue; } ArrayList<Enh> enhancements = new ArrayList<>(a.getEnhs()); while (i.hasNext()) { Map.Entry<String, String> pair = (Map.Entry) i.next(); for (Enh enh : new ArrayList<>(enhancements)) { if (enh.getAvailability() != null && enh.getAvailability().equalsIgnoreCase(String.valueOf(pair.getValue())) && excludeAvailabilities.contains(pair.getValue())) { enhancements.remove(enh); } } } a.setEnhs(enhancements); activities.add(a); } context.put("activities", activities); context.put("baseline-summary", partRelease.getHumanRedableBaselineSummary()); report.process(context, out); out.flush(); html = convertDocToHtml(fileMail); out.close(); return html.replaceAll( "style=\"width:595.0pt;margin-bottom:72.0pt;margin-top:72.0pt;margin-left:72.0pt;margin-right:72.0pt;\"", ""); } private String convertDocToHtml(File fileMail) { String html = ""; try { InputStream is = new FileInputStream(fileMail); XWPFDocument document = new XWPFDocument(is); XHTMLOptions options = XHTMLOptions.create().URIResolver(new FileURIResolver(new File("word/media"))); OutputStream outStream = new ByteArrayOutputStream(); XHTMLConverter.getInstance().convert(document, outStream, options); html = outStream.toString(); System.out.println("####MAIL####\n" + html + "\n############\n"); } catch (IOException ex) { Logger.getLogger(ReleaseMailGeneration.class.getName()).log(Level.SEVERE, null, ex); } return html; } }