com.amitycoin.enterprisetool.diagramInputServlet.java Source code

Java tutorial

Introduction

Here is the source code for com.amitycoin.enterprisetool.diagramInputServlet.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.amitycoin.enterprisetool;

import com.mxgraph.layout.mxFastOrganicLayout;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.swing.util.mxMorphing;
import com.mxgraph.util.mxCellRenderer;
import com.mxgraph.util.mxConstants;
import com.mxgraph.util.mxEvent;
import com.mxgraph.util.mxEventObject;
import com.mxgraph.util.mxEventSource.mxIEventListener;
import com.mxgraph.util.mxRectangle;
import com.mxgraph.util.mxUtils;
import com.mxgraph.view.mxGraph;
import com.mxgraph.view.mxStylesheet;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.beans.XMLEncoder;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import org.apache.commons.io.FilenameUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.w3c.dom.Document;

/**
 *
 * @author Sandeep
 */
@WebServlet("/diagramInput")

public class diagramInputServlet extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //Get Code
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    public mxGraph graph;
    public JFrame fr;
    public mxGraphComponent graphComponent;

    @Override
    @SuppressWarnings({ "null", "ValueOfIncrementOrDecrementUsed", "UnusedAssignment" })
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String filePath;
        String docids;
        String userid;
        String a[][];
        a = new String[200][200];
        // database connection settings
        String dbURL = "jdbc:mysql://localhost:3306/enterprisedb";
        String dbUser = "root";
        String dbPass = "sandy";

        @SuppressWarnings("UnusedAssignment")
        Connection conn = null; // connection to the database
        userid = (String) request.getAttribute("uidM");
        String fname = (String) request.getAttribute("fnameM");
        int docid = (Integer) request.getAttribute("docidM");

        docids = "" + docid;
        String pathToWeb;
        pathToWeb = getServletContext().getRealPath(File.separator);
        System.out.println("pathtoweb:\t" + pathToWeb);
        filePath = pathToWeb + "readFiles\\";
        filePath = filePath + docids + userid + fname; //+.xls
        File myFile = new File(filePath);

        //boolean newExcel;
        //boolean oldExcel;
        String ext = FilenameUtils.getExtension(filePath);
        System.out.println("Extension: " + ext);

        FileInputStream fis = new FileInputStream(myFile);
        Workbook wb = null;
        if ("xls".equals(ext)) {
            // Finds the workbook instance for the file
            wb = new HSSFWorkbook(fis);

        } else if ("xlsx".equals(ext)) {
            wb = new XSSFWorkbook(fis);

        }

        @SuppressWarnings("null")
        Sheet mySheet;
        mySheet = wb.getSheetAt(0);

        // Get iterator to all the rows in current sheet
        Iterator<Row> rowIterator = mySheet.iterator();

        @SuppressWarnings("UnusedAssignment")
        int rowct = 0, colct = 0, colit = 0, ci = 0, ri = 0;

        // Traversing over each row of XLSX file
        while (rowIterator.hasNext()) {
            ri++;
            System.out.println("\nRi:\t" + ri);
            //Iterate over Rows
            Row row = rowIterator.next();

            if (1 == rowct) {
                colct = colit;
            }
            // For each row, iterate through each columns
            Iterator<Cell> cellIterator = row.cellIterator();
            ci = 0;
            while (cellIterator.hasNext()) {

                ci++;

                System.out.println("\nCi:\t" + ci);
                //Iterate over Columns
                Cell cell = cellIterator.next();

                switch (cell.getCellType()) {
                case Cell.CELL_TYPE_STRING:
                    System.out.print(cell.getStringCellValue() + "\t");
                    a[ri][ci] = cell.getStringCellValue();
                    break;
                case Cell.CELL_TYPE_NUMERIC:
                    System.out.print(cell.getNumericCellValue() + "\t");
                    double temp = cell.getNumericCellValue();
                    String dblValue = "" + temp;
                    a[ri][ci] = dblValue;
                    break;
                case Cell.CELL_TYPE_BOOLEAN:
                    System.out.print(cell.getBooleanCellValue() + "\t");
                    String tmp = "" + cell.getBooleanCellValue();
                    a[ri][ci] = tmp;
                    break;
                default:

                }
                colit++;

            }
            //rowit++;
            rowct++;
            //increase row count
        }

        System.out.println("Row Count:\t" + rowct);
        System.out.println("Column Count:\t" + colct);
        for (int i = 1; i <= rowct; i++) {
            for (int j = 1; j <= colct; j++) {
                System.out.println("a[" + i + "][" + j + "]=" + a[i][j] + "\n");
            }
        }
        try {
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            conn = DriverManager.getConnection(dbURL, dbUser, dbPass);
            String append = "?, ?";
            String quest = ", ?";

            for (int j = 1; j <= colct; j++) {
                append += quest;
            }

            String crsql;
            String cappend = "`uid`,`doc_id`";
            for (int j = 1; j <= colct; j++) {
                cappend = cappend + ",`" + j + "`";
            }
            crsql = "CREATE TABLE IF NOT EXISTS `data" + userid + docid + "` (\n"
                    + "`row_id` INT(11) NOT NULL AUTO_INCREMENT,\n" + "`uid` VARCHAR(50) NOT NULL,\n"
                    + "`doc_id` INT(11) NOT NULL";
            System.out.println(crsql);

            for (int j = 1; j <= colct; j++) {
                System.out.println("j:\t" + (j));
                crsql = crsql + ",\n`" + (j) + "` VARCHAR(50)";
            }
            crsql += ",\nPRIMARY KEY (`row_id`)\n)";

            System.out.println(crsql);

            PreparedStatement cstmt = conn.prepareStatement(crsql);
            int c = cstmt.executeUpdate();

            String sql = "INSERT INTO data" + userid + docid + "(" + cappend + ")" + " values (" + append + ")";
            System.out.println("Append=\t" + append);
            PreparedStatement statement = conn.prepareStatement(sql);
            statement.setString(1, userid);
            statement.setInt(2, docid);
            for (int i = 1; i <= rowct; i++) {
                for (int j = 1; j <= (colct); j++) {
                    statement.setString(j + 2, a[i][j]);
                    System.out.println("j=" + (j) + "\ta[" + i + "][" + (j) + "]=" + a[i][j] + "\n");
                }
                System.out.println("\n");
                System.out.println("\nstatement:\t" + statement);
                int res = statement.executeUpdate();
            }
        } catch (SQLException ex) {
            Logger.getLogger(diagramInputServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
        for (int i = 1; i <= rowct; i++) {
            for (int j = 1; j <= colct; j++) {
                System.out.println("a[" + i + "][" + j + "]=" + a[i][j] + "\n");
            }
        }
        System.out.println("Rowct:\t" + rowct + "\nColct:\t" + colct);
        @SuppressWarnings("UseOfObsoleteCollectionType")
        Hashtable<String, Object> style = new Hashtable<String, Object>();
        style.put(mxConstants.STYLE_FILLCOLOR, mxUtils.getHexColorString(Color.WHITE));
        style.put(mxConstants.STYLE_STROKEWIDTH, 1.5);
        style.put(mxConstants.STYLE_STROKECOLOR, mxUtils.getHexColorString(new Color(0, 0, 170)));
        style.put(mxConstants.STYLE_SHAPE, mxConstants.SHAPE_ELLIPSE);
        style.put(mxConstants.STYLE_PERIMETER, mxConstants.PERIMETER_ELLIPSE);

        graph = new mxGraph();

        mxStylesheet stylesheet = graph.getStylesheet();
        stylesheet.putCellStyle("process", createProcessStyle());
        stylesheet.putCellStyle("object", createObjectStyle());
        stylesheet.putCellStyle("state", createStateStyle());
        stylesheet.putCellStyle("agent", createAgentLinkStyle());
        fr = new JFrame("Enterprise Architecture Diagram");

        fr.setSize(2000, 2000);
        graph.setMinimumGraphSize(new mxRectangle(0, 0, 1000, 1500));
        graph.setMaximumGraphBounds(new mxRectangle(0, 0, 2000, 2000));
        graph.setMinimumGraphSize(new mxRectangle(0, 0, 1000, 1000));

        double rech1 = 200;
        double rech2 = 200;
        double rech3 = 170;
        double rech3e = 180;
        double rech4 = 120;
        Object defaultParent = graph.getDefaultParent();

        graph.setConstrainChildren(true);
        graph.setExtendParents(true);
        graph.setExtendParentsOnAdd(true);
        graph.setDefaultOverlap(0);
        graph.setCellsMovable(true); // Moving cells in the graph. Note that an edge is also a cell.
        graph.setCellsEditable(true);
        graph.setCellsResizable(true); // Inhibit cell re-sizing.

        graph.getModel().beginUpdate();

        Object[] obj = new Object[100];
        int k = 1;
        for (int i = 2; i <= rowct; i++) {
            for (int j = 1; j <= 2; j++) {
                obj[k] = a[i][j];
                k++;
            }

        }

        //print debug info
        for (int l = 1; l <= (rowct * 2) - 2; l++) {
            System.out.println("obj[" + l + "]:\t" + obj[l]);
        }

        List<Object> list = new ArrayList<Object>();
        for (Object val : obj) {
            if (!list.contains(val)) {
                list.add(val);
            }
        }

        list.remove(null);
        list.toArray(new Object[0]);
        System.out.println("list:" + list);

        Object[] array = new Object[list.size()];
        list.toArray(array); // fill the array
        System.out.println("Array:\t" + Arrays.toString(array));

        Object[] gArray = new Object[array.length];
        String[] sArray = new String[array.length];

        for (int i = 0; i < array.length; i++) {
            sArray[i] = array[i].toString();
            if (sArray[i].contains("Database") || sArray[i].contains("Server") || sArray[i].contains("DATABASE")
                    || sArray[i].contains("SERVER") || sArray[i].contains("DB")) {
                System.out.println("Object type");
                gArray[i] = graph.insertVertex(defaultParent, null, sArray[i], rech1, rech2, rech3, rech4,
                        "object");

            } else {
                System.out.println("Process type");
                gArray[i] = graph.insertVertex(defaultParent, null, sArray[i], rech1, rech2, rech3e, rech4,
                        "process");
            }
            rech1 += 100;
            rech2 += 100;
        }

        for (int i = 2; i <= rowct; i++) {

            if (a[i][3].equals("Two Way") || a[i][3].equals("TWO WAY") || a[i][3].equals("TwoWay")
                    || a[i][3].equals("TWOWAY") || a[i][3].equals("2 Way") || a[i][3].equals("Two way")) {
                System.out.println("Double Edges");
                int l1 = 0, l2 = 0;
                for (int l = 1; l < gArray.length; l++) {
                    System.out.println("gArray.toString=\t" + sArray[l]);
                    System.out.println("gArray.length=\t" + sArray.length);
                    if (sArray[l].equals(a[i][1])) {
                        l1 = l;
                        System.out.println("l2:\t" + l1);
                    }
                    if (sArray[l].equals(a[i][2])) {
                        l2 = l;
                        System.out.println("l2:\t" + l2);
                    }
                }
                graph.insertEdge(defaultParent, null, a[i][4], gArray[l1], gArray[l2], "agent");
                graph.insertEdge(defaultParent, null, a[i][4], gArray[l2], gArray[l1], "agent");

            } else {
                System.out.println("Single Edges");
                int l1 = 0, l2 = 0;
                for (int l = 1; l < gArray.length; l++) {
                    System.out.println("gArray.toString=\t" + sArray[l]);
                    System.out.println("gArray.length=\t" + sArray.length);
                    if (sArray[l].equals(a[i][1])) {
                        l1 = l;
                        System.out.println("l2:\t" + l2);
                    }
                    if (sArray[l].equals(a[i][2])) {
                        l2 = l;
                        System.out.println("l2:\t" + l2);
                    }
                }
                graph.insertEdge(defaultParent, null, a[i][4], gArray[l1], gArray[l2], "agent");
            }
        }

        graph.setEnabled(true);

        graph.setAutoSizeCells(true);

        graph.getModel().endUpdate();

        graphComponent = new mxGraphComponent(graph);
        mxFastOrganicLayout layout = new mxFastOrganicLayout(graph);
        // define layout

        //set all properties
        layout.setMinDistanceLimit(1);
        //layout.setInitialTemp(5);
        //layout.setInitialTemp(10);
        //layout.setForceConstant(10);
        //layout.setDisableEdgeStyle(true);
        //layout graph
        //layout.execute(graph.getDefaultParent());
        // layout using morphing
        String fileWPath;

        graph.getModel().beginUpdate();
        try {
            layout.execute(graph.getDefaultParent());
        } finally {
            mxMorphing morph = new mxMorphing(graphComponent, 20, 1.2, 20);

            morph.addListener(mxEvent.DONE, new mxIEventListener() {

                @Override
                public void invoke(Object arg0, mxEventObject arg1) {
                    graph.getModel().endUpdate();
                    // fitViewport();
                }

            });

            BufferedImage image;
            image = mxCellRenderer.createBufferedImage(graph, null, 2, Color.WHITE, true, null);
            Document d = mxCellRenderer.createVmlDocument(graph, null, 1, Color.WHITE, null);
            pathToWeb = getServletContext().getRealPath(File.separator);
            System.out.println("pathtoweb:\t" + pathToWeb);
            fileWPath = pathToWeb + "genImg\\" + userid + docid + ".png";
            System.out.println("filewpath:\t" + fileWPath);
            //System.out.println(pathToWeb + userid + docid + ".svg");
            ImageIO.write(image, "PNG", new File(fileWPath));
            XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(
                    new FileOutputStream(new File(pathToWeb + "genXML\\" + userid + docid + ".xml"))));
            encoder.writeObject(graph);
            encoder.close();
            morph.startAnimation();
        }

        graphComponent.setConnectable(false);
        fr.getRootPane().setBorder(BorderFactory.createMatteBorder(4, 4, 4, 4, Color.WHITE));
        // Inhibit edge creation in the graph.
        fr.getContentPane().add(graphComponent);

        //fr.setVisible(true);

        request.setAttribute("docidM", docid);
        request.setAttribute("useridM", userid);
        request.setAttribute("colCountM", colct);
        request.setAttribute("rowCountM", rowct);
        request.setAttribute("fileLinkM", fileWPath);
        request.setAttribute("pathToWebM", pathToWeb);
        System.out.println("Iteration Complete");

        getServletContext().getRequestDispatcher("/success.jsp").forward(request, response);

    }

    /**
     * General graph settings.
     *
     * @param graph the graph to configure.
     */
    private void configureGraph(mxGraph graph) {
        graph.setEnabled(true);
        graph.setCellsResizable(true);
        graph.setConstrainChildren(true);
        graph.setExtendParents(true);
        graph.setExtendParentsOnAdd(true);
        graph.setDefaultOverlap(0);
    }

    /**
     * General graph component settings.
     *
     * @param graphComponent
     */
    private void configureGraphComponent(mxGraphComponent graphComponent) {
        graphComponent.getViewport().setOpaque(true);
        graphComponent.getViewport().setBackground(Color.WHITE);
        graphComponent.setConnectable(false);
    }

    /**
     * Create a new style for process vertices.
     *
     * @return the created style.
     */
    @SuppressWarnings("UseOfObsoleteCollectionType")
    private Hashtable<String, Object> createProcessStyle() {
        Hashtable<String, Object> style = new Hashtable<String, Object>();
        style.put(mxConstants.STYLE_FILLCOLOR, mxUtils.getHexColorString(Color.WHITE));
        style.put(mxConstants.STYLE_STROKEWIDTH, 1.5);

        style.put(mxConstants.STYLE_STROKECOLOR, mxUtils.getHexColorString(new Color(0, 0, 170)));
        style.put(mxConstants.STYLE_SHAPE, mxConstants.SHAPE_ELLIPSE);

        style.put(mxConstants.STYLE_PERIMETER, mxConstants.PERIMETER_ELLIPSE);
        return style;
    }

    /**
     * Create a new style for object vertices.
     *
     * @return the created style.
     */
    @SuppressWarnings("UseOfObsoleteCollectionType")
    private Hashtable<String, Object> createObjectStyle() {
        Hashtable<String, Object> style = new Hashtable<String, Object>();
        style.put(mxConstants.STYLE_FILLCOLOR, mxUtils.getHexColorString(Color.WHITE));
        style.put(mxConstants.STYLE_STROKECOLOR, mxUtils.getHexColorString(new Color(0, 110, 0)));
        style.put(mxConstants.STYLE_STROKEWIDTH, 1.5);
        style.put(mxConstants.STYLE_SHAPE, mxConstants.SHAPE_CYLINDER);
        style.put(mxConstants.STYLE_PERIMETER, mxConstants.PERIMETER_ELLIPSE);
        return style;
    }

    /**
     * Create a new style for state vertices.
     *
     * @return the created style.
     */
    @SuppressWarnings("UseOfObsoleteCollectionType")
    private Hashtable<String, Object> createStateStyle() {
        Hashtable<String, Object> style = new Hashtable<String, Object>();
        style.put(mxConstants.STYLE_FILLCOLOR, mxUtils.getHexColorString(Color.WHITE));
        style.put(mxConstants.STYLE_STROKECOLOR, mxUtils.getHexColorString(new Color(91, 91, 0)));
        style.put(mxConstants.STYLE_STROKEWIDTH, 1.5);
        style.put(mxConstants.STYLE_SHAPE, mxConstants.SHAPE_RECTANGLE);
        style.put(mxConstants.STYLE_PERIMETER, mxConstants.PERIMETER_RECTANGLE);
        style.put(mxConstants.STYLE_ROUNDED, true);
        return style;
    }

    /**
     * Create a new style for agent links.
     *
     * @return the created style.
     */
    @SuppressWarnings("UseOfObsoleteCollectionType")
    private Hashtable<String, Object> createAgentLinkStyle() {
        Hashtable<String, Object> style = new Hashtable<String, Object>();
        style.put(mxConstants.STYLE_STROKECOLOR, mxUtils.getHexColorString(Color.BLACK));
        style.put(mxConstants.STYLE_ENDARROW, mxConstants.ARROW_CLASSIC);
        return style;
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}