org.olivier.ihm.FramePUMLCleanerControler.java Source code

Java tutorial

Introduction

Here is the source code for org.olivier.ihm.FramePUMLCleanerControler.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 org.olivier.ihm;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.filechooser.FileFilter;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import org.apache.commons.io.FilenameUtils;
import static org.olivier.component.MyLogger.LOGGER;
import org.olivier.component.MyProperties;
import org.olivier.component.NodeInfo;
import org.olivier.component.jtreecheckbox.check.CheckTreeManager;
import org.olivier.util.Util;

/**
 *
 * @author o.leliboux
 */
public class FramePUMLCleanerControler {

    private final static JFileChooser fileChooser = new JFileChooser();
    private final static FileFilter pumlFilter = new FileFilter() {

        @Override
        public boolean accept(File pathname) {
            return pathname.isDirectory() || pathname.getName().endsWith("puml");
        }

        @Override
        public String getDescription() {
            return "Fichier PUML";
        }
    };
    private final String fichierProperties = "pumlcleaner.properties";
    private final String nomFichierPropertie = "fichierpuml";
    private final String listeCategories = "categories";
    private final Properties myProperties;
    private String[] lines;
    private final String[] categories;// = {"abstract", "annotation", "class", "enum", "interface"};
    private final CheckTreeManager checkTreeManager;

    public FramePUMLCleanerControler(JTree jTreeFiltre) {
        myProperties = MyProperties.loadProperties(fichierProperties);
        categories = getCategories().split(",");
        checkTreeManager = new CheckTreeManager(jTreeFiltre, true, null);
    }

    /**
     * Slectionner un fichier PUML
     *
     * @param jTextFieldFichier le composant contenant le nom du fichier PUML en
     * cours d'utilisation
     */
    public void selectInputFile(JTextField jTextFieldFichier) {
        final File fichier = new File(jTextFieldFichier.getText());
        if (fichier.exists()) {
            fileChooser.setCurrentDirectory(fichier.getParentFile());
        }
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        fileChooser.setFileFilter(pumlFilter);
        fileChooser.addChoosableFileFilter(pumlFilter);
        fileChooser.setDialogTitle("Choisir un fichier PUML ...");

        final int returnVal = fileChooser.showOpenDialog(null);

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            final File file = fileChooser.getSelectedFile();
            if (file.exists()) {
                jTextFieldFichier.setText(file.getPath());
                myProperties.setProperty(nomFichierPropertie, jTextFieldFichier.getText());
            }
        }
    }

    /**
     * Rcupre le nom du fichier conserv dans les properties
     * @return Le nom du fichier sauvegard
     */
    public String getNomFichier() {
        return myProperties.getProperty(nomFichierPropertie, "Choisir un fichier ...");
    }

    /**
     * Rcupre les noms des catgories sauvegardes dans le fichier properties
     * @return Les noms des catgories sauvegardes
     */
    private String getCategories() {
        return myProperties.getProperty(listeCategories, "abstract class,annotation,class,enum,interface");
    }

    /**
     * Lire le fichier PUML, l'analyser et l'afficher
     *
     * @param filename Le fichier PUML
     * @param jTextAreaFichier La zone d'affichage du fichier
     * @param jTreeFiltre La zone de filtrage
     */
    public void analyseInputFile(String filename, JTextArea jTextAreaFichier, JTree jTreeFiltre) {
        readInputFile(filename, jTextAreaFichier);

        analyserFichier(jTextAreaFichier, jTreeFiltre);
    }

    /**
     * Filtrer et sauver le fichier PUML dans un nouveau fichier
     *
     * @param filename Le fichier PUML
     * @param jTextAreaFichier La zone d'affichage du fichier
     * @param jTreeFiltre La zone de filtrage
     */
    public void filterInputFile(String filename, JTextArea jTextAreaFichier, JTree jTreeFiltre) {
        filtrerFichier(jTextAreaFichier, jTreeFiltre);

        saveFile(filename, jTextAreaFichier);
    }

    /**
     * Analyser le fichier PUML et initialiser le filtre
     *
     * @param jTextAreaFichier Le contenu du fichier PUML
     * @param jTreeFiltre Le filtre  initialiser
     */
    private void analyserFichier(JTextArea jTextAreaFichier, JTree jTreeFiltre) {
        lines = jTextAreaFichier.getText().split("[\\r\\n]+");

        final DefaultMutableTreeNode newFilter = initaliserNodes();

        // parcours de chaque ligne du fichier pour analyse
        for (String line : lines) {
            if (line.contains(">")) {
                break;
            } else {
                String categ = "";
                String noeud = null;
                // recherche de la catgorie
                for (String categorie : categories) {
                    if (line.contains(categorie)) {
                        categ = categorie;
                        noeud = line.replaceFirst(categorie, "").replaceAll(" ", "");
                        // ajout du noeud dans la bonne catgorie de l'arbre
                        for (int i = 0; i < newFilter.getChildCount(); i++) {
                            final DefaultMutableTreeNode dmtr = (DefaultMutableTreeNode) newFilter.getChildAt(i);
                            if (dmtr.toString().equals(categ)) {
                                final DefaultMutableTreeNode node = new DefaultMutableTreeNode(new NodeInfo(noeud));
                                dmtr.add(node);
                            }
                        }
                        break;
                    }
                }
            }
        }
        jTreeFiltre.setModel(new DefaultTreeModel(newFilter));
        jTextAreaFichier.requestFocus();
    }

    /**
     * Filtre le fichier PUML stock dans le textArea  partir du filtre contenu
     * dans le JTree
     *
     * @param jTextAreaFichier
     * @param jTreeFiltre
     */
    private void filtrerFichier(JTextArea jTextAreaFichier, JTree jTreeFiltre) {
        jTextAreaFichier.setText("");
        // Liste des noeuds  supprimer
        final DefaultMutableTreeNode nodeToDelete = getNodeToDelete(
                (DefaultMutableTreeNode) jTreeFiltre.getModel().getRoot(),
                checkTreeManager.getSelectionModel().getSelectionPaths());

        // traitement des lignes
        for (String line : lines) {
            if (isLinePrintable(line, nodeToDelete)) {
                jTextAreaFichier.append(line + "\n");
            }
        }
        jTextAreaFichier.requestFocus();
    }

    /**
     * Analyse une ligne et dtermine si elle est imprimable ou pas
     *
     * @param line La ligne  analyser
     * @param nodeToDelete Liste des noeuds  supprimer
     * @return True si la ligne doit etre imprime, false sinon
     */
    private boolean isLinePrintable(String line, DefaultMutableTreeNode nodeToDelete) {
        boolean isPrintable = true;

        // parcours des catgories
        for (int i = 0; i < nodeToDelete.getChildCount(); i++) {
            final TreeNode categ = nodeToDelete.getChildAt(i);
            // parcours des noeuds  supprimer
            for (int j = 0; j < categ.getChildCount(); j++) {
                final DefaultMutableTreeNode noeudToDelete = (DefaultMutableTreeNode) categ.getChildAt(j);
                final String nomNoeudToDelete = noeudToDelete.toString();

                if (line.contains(nomNoeudToDelete)) {
                    isPrintable = false;
                    break;
                }
            }
            if (!isPrintable) {
                break;
            }
        }
        return isPrintable;
    }

    /**
     * Renvoi la liste des noeuds non slectionns
     *
     * @param allTreeNode Liste de tous les noeuds
     * @param selectedPath Chemins slectionns
     * @return Liste des noeuds non slectionns
     */
    private DefaultMutableTreeNode getNodeToDelete(DefaultMutableTreeNode allTreeNode, TreePath[] selectedPath) {
        final DefaultMutableTreeNode nodeToDelete = new DefaultMutableTreeNode("Node to delete");
        // Parcours de l'arbre pour supprimer les noeuds slectionns
        // Parcours des catgories  
        for (int i = 0; i < allTreeNode.getChildCount(); i++) {
            final DefaultMutableTreeNode tnCateg = (DefaultMutableTreeNode) allTreeNode.getChildAt(i);
            // les catgories sont systmatiquement ajoutes
            final DefaultMutableTreeNode newTnCateg = new DefaultMutableTreeNode(tnCateg.toString());//) allTreeNode.getChildAt(i);
            nodeToDelete.add(newTnCateg);
            // parcours des noeuds
            for (int j = 0; j < tnCateg.getChildCount(); j++) {
                final DefaultMutableTreeNode tnNoeud = (DefaultMutableTreeNode) tnCateg.getChildAt(j);
                // Ajout du noeud s'il n'est pas slectionn
                if (!isNoeudSelected(tnNoeud, selectedPath)) {
                    /* 
                     Il est impratif de crer un nouveau noeud !
                     Si on se contente d'ajouter tnNoeud dans newTnCateg, celui-ci est supprim de tnCateg !
                     Visiblement, un noeud ne peut pas appartenir  2 arbres diffrents. Cela semble logique 
                     car la dfinition des anctres risque de poser problme.
                     A approfondir quand j'aurai le temps ...
                     */
                    final DefaultMutableTreeNode newTnNoeud = new DefaultMutableTreeNode(
                            new NodeInfo(tnNoeud.toString()));
                    newTnCateg.add(newTnNoeud);
                }
            }
        }
        return nodeToDelete;
    }

    /**
     * Indique si un noeud est slectionn ou pas
     *
     * @param noeudATester Le noeud  tester
     * @param selectedPath La liste des noeuds slectionns
     * @return True si le noeud est slectionn, false sinon
     */
    private boolean isNoeudSelected(final DefaultMutableTreeNode noeudATester, final TreePath[] selectedPath) {
        boolean isSelected = false;

        // parcours des categories
        for (TreePath path : selectedPath) {
            try {
                // Cette ligne plante quand on slectionne une catgorie complte d'ou le try-catch !
                final DefaultMutableTreeNode unNoeudSelectionner = (DefaultMutableTreeNode) path.getPath()[2];
                isSelected = noeudATester.toString().equals(unNoeudSelectionner.toString());
            } catch (ArrayIndexOutOfBoundsException ex) {
                // Quand on choisit une catgorie complte, il faut parcourir les noeuds de cette manire :
                // recup de la categorie
                final DefaultMutableTreeNode categ = (DefaultMutableTreeNode) path.getLastPathComponent();
                // parcours des noeuds dans la catgorie
                for (int j = 0; j < categ.getChildCount(); j++) {
                    final TreeNode unNoeudSelectionner = categ.getChildAt(j);
                    isSelected = noeudATester.toString().equals(unNoeudSelectionner.toString());
                    if (isSelected) {
                        break;
                    }
                }
            }
            // on sort de la boucle ds qu'on a la rponse
            if (isSelected) {
                break;
            }
        }

        return isSelected;
    }

    /**
     * Initialiser un arbre avec les catgories
     *
     * @return L'arbre initialis
     */
    public DefaultMutableTreeNode initaliserNodes() {
        DefaultMutableTreeNode top = new DefaultMutableTreeNode("PUML filter");
        DefaultMutableTreeNode category = null;
        DefaultMutableTreeNode node = null;

        for (String categorie : categories) {
            category = new DefaultMutableTreeNode(categorie);
            top.add(category);
        }

        //      //original Tutorial
        //      node = new DefaultMutableTreeNode(new NodeInfo("The Java Tutorial: A Short Course on the Basics"));
        //      category.add(node);
        //
        //      //Tutorial Continued
        //      node = new DefaultMutableTreeNode(new NodeInfo("The Java Tutorial Continued: The Rest of the JDK"));
        //      category.add(node);
        //
        //      //Swing Tutorial
        //      node = new DefaultMutableTreeNode(new NodeInfo("The Swing Tutorial: A Guide to Constructing GUIs"));
        //      category.add(node);
        //
        //      //...add more books for programmers...
        //      category = new DefaultMutableTreeNode("Books for Java Implementers");
        //      top.add(category);
        //
        //      //VM
        //      node = new DefaultMutableTreeNode(new NodeInfo("The Java Virtual Machine Specification"));
        //      category.add(node);
        //
        //      //Language Spec
        //      node = new DefaultMutableTreeNode(new NodeInfo("The Java Language Specification"));
        //      category.add(node);
        return top;
    }

    /**
     * Close the windows
     */
    public void closeWindows() {
        // transformation des categories en String
        final StringBuffer categ = new StringBuffer("");

        for (int i = 0; i < categories.length - 1; i++) {
            categ.append(categories[i]);
            categ.append(",");
        }
        categ.append(categories[categories.length - 1]);

        myProperties.setProperty(listeCategories, categ.toString());
        MyProperties.writeProperties(myProperties, fichierProperties);
        LOGGER.log(Level.INFO, "=====     STOP    =====");
    }

    /**
     * Sauve le contenu du Text Area dans un nouveau fichier
     *
     * @param filename Le nom du fichier source
     */
    private void saveFile(String filename, JTextArea jTextAreaFichier) {
        // sauvegarde du contenu du text area dans un nouveau fichier
        final File file = new File(filename);
        if (file.exists()) {
            // cration du nouveau nom du fichier
            final String newfilename = getNewName(filename);
            ;
            // sauvegarde
            final FileWriter writer;
            try {
                writer = new FileWriter(newfilename);
                final BufferedWriter bw = new BufferedWriter(writer);
                jTextAreaFichier.write(bw);
                bw.close();
            } catch (IOException ex) {
                LOGGER.log(Level.SEVERE, "IOException", ex);
            }
        } else {
            JOptionPane.showMessageDialog(null, filename + " n'existe pas !", "Erreur",
                    JOptionPane.WARNING_MESSAGE);
        }
    }

    /**
     * Fourni un nouveau nom de fichier  partir de l'ancien
     *
     * @param filename L'ancien nom de fichier
     * @return Le nouveau nom de fichier
     */
    private String getNewName(String filename) {
        return FilenameUtils.getFullPath(filename) + FilenameUtils.getBaseName(filename) + "_clean."
                + FilenameUtils.getExtension(filename);
    }

    /**
     * Charge le fichier dans un Text Area
     *
     * @param filename Le fichier  charger
     */
    private void readInputFile(String filename, JTextArea jTextAreaFichier) {
        final FileReader reader;
        try {
            reader = new FileReader(filename);
            final BufferedReader br = new BufferedReader(reader);
            jTextAreaFichier.read(br, null);
            br.close();
            jTextAreaFichier.requestFocus();
        } catch (FileNotFoundException ex) {
            LOGGER.log(Level.SEVERE, "FileNotFoundException", ex);
            JOptionPane.showMessageDialog(null, filename + " n'existe pas !", "Erreur",
                    JOptionPane.WARNING_MESSAGE);
        } catch (IOException ex) {
            LOGGER.log(Level.SEVERE, "IOException", ex);
        }
    }

    /**
     * Slectionne les noeuds dans l'arbre de filtrage corespondant au motif
     * @param motif Le motif pour slectionner les noeuds
     * @param jTreeFiltre L'arbre de filtrage
     */
    public void selectionnerNoeud(String motif, JTree jTreeFiltre) {
        // TODO :  finir

        TreePath[] allPath = Util.getPaths(jTreeFiltre, true);
        // parcours des categories
        for (TreePath path : allPath) {
            // recup de la racine
            final DefaultMutableTreeNode root = (DefaultMutableTreeNode) path.getLastPathComponent();

            // parcours des catgories
            for (int j = 0; j < root.getChildCount(); j++) {
                final TreeNode categ = root.getChildAt(j);

                // parcours des noeuds
                for (j = 0; j < categ.getChildCount(); j++) {
                    final TreeNode unNoeudSelectionner = categ.getChildAt(j);
                    if (!unNoeudSelectionner.toString().contains(motif)) {

                    }
                }
            }
        }
        checkTreeManager.getSelectionModel().setSelectionPaths(allPath);
    }
}