com.anritsu.mcreleaseportal.docgeneration.ReleaseMailGeneration.java Source code

Java tutorial

Introduction

Here is the source code for com.anritsu.mcreleaseportal.docgeneration.ReleaseMailGeneration.java

Source

/*
 * 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;

    }

}