Package org.boco.seamwebappgen.utils

Source Code of org.boco.seamwebappgen.utils.Utils

/***************************************************************************
*  Copyright (c) 2004 - 2008  Fabrizio Boco fabboco@users.sourceforge.net *
*                                                                         *
*                                                                         *
*   This is free software; you can redistribute it and/or                 *
*   modify it under the terms of the GNU Library General Public           *
*   License (version 2.1) as published by the Free Software Foundation    *
*                                                                         *
*   This library  is distributed in the hope that it will be useful,      *
*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
*   GNU Library General Public License for more details.                  *
*                                                                         *
*   You should have received a copy of the GNU Library General Public     *
*   License along with this library; see the file COPYING.LIB. If not,    *
*   write to the Free Software Foundation, Inc., 59 Temple Place,         *
*   Suite 330, Boston, MA  02111-1307, USA                                *
*                                                                         *
***************************************************************************/

/**
- $Header: /usr/local/cvslocalrepository/SeamWebAppGenerator/src/org/boco/seamwebappgen/utils/Attic/Utils.java,v 1.1.2.6 2008/06/05 17:16:13 fab Exp $
- $Author: fab $
- $Revision: 1.1.2.6 $
- $Date: 2008/06/05 17:16:13 $

- $Log: Utils.java,v $
- Revision 1.1.2.6  2008/06/05 17:16:13  fab
- Modifiche per
-
- - Ajax support on bean fields
- - disableOnCreateIf and disableOnEditIf for the relationship
- - listFormatOff added to @ShowInForm
-
- Revision 1.1.2.5  2008/05/10 05:06:49  fab
- *** empty log message ***
-
- Revision 1.1.2.4  2008/05/05 14:30:01  fab
- Modifiche alla procedura di installazione
- Modifiche per gestione entity home
-
- Revision 1.1.2.3.2.1  2008/05/05 14:21:46  fab
- *** empty log message ***
-
- Revision 1.1.2.3  2008/04/22 05:37:55  fab
- Aggiornamento indirizzo di posta
-
- Revision 1.1.2.2  2008/04/21 13:08:21  fab
- Fix 0599/C
-
- Revision 1.1.2.1  2008/04/19 13:12:38  fab
- Modifiche varie per rafactoring
-
- Revision 1.1.2.1  2008/04/19 11:18:33  fab
- Refactoring
-
- Revision 1.10.4.4  2008/04/19 10:07:02  fab
- Aggiornamento riferimenti licenza
-
- Revision 1.10.4.3  2008/03/24 08:30:57  fab
- *** empty log message ***
-
- Revision 1.10.4.2  2008/03/23 07:48:32  fab
- *** empty log message ***
-
- Revision 1.10.4.1  2008/03/23 07:40:41  fab
- *** empty log message ***
-
- Revision 1.10  2008/01/16 13:15:53  fab
- Ancora un fix per la corretta sostituzione di tag multipli in codice completamente generato
-
- Revision 1.9  2008/01/07 19:49:52  bob
- Fix bug
-
- Revision 1.8  2008/01/05 09:21:22  fab
- Fix per la corretta sostituzione di tag multipli in codice completamente generato
-
- Revision 1.7  2007/12/30 12:23:15  fab
- Inserimento HtmlEditor
- Fix generazione jar
-
- Revision 1.6  2007/10/25 09:54:25  fab
- Dopo merge TRINIDAD_1.2.2
-
- Revision 1.1.2.5  2007/10/24 06:51:06  fab
- Fix vari dal ramo head
-
- Revision 1.5  2007/10/23 13:19:08  fab
- *** empty log message ***
-
- Revision 1.4  2007/10/13 11:56:07  fab
- Fix 0229/B
-
- Revision 1.1.2.4  2007/10/13 11:51:28  fab
- Fix 0229/B
-
- Revision 1.1.2.3  2007/10/13 10:53:53  fab
- Fix 0228/B
-
- Revision 1.1.2.2  2007/10/12 16:38:20  fab
- *** empty log message ***
-
- Revision 1.2  2007/10/06 07:06:50  fab
- *** empty log message ***
-
- Revision 1.1  2007/09/29 13:17:22  fab
- Nuova versione iniziale del 29/09/2007
-
- Revision 1.10.2.19  2007/08/30 13:26:47  fab
- Fix per la cancellazione dei file temporanei su windows
-
- Revision 1.10.2.18  2007/08/29 12:46:23  bob
- Tolta 'a' ed 'e' accentate
-
- Revision 1.10.2.17  2007/08/01 14:25:00  fab
- Fix per la corretta gestione dei selectionAttributes nel caso di attributi con più di una relazione
-
- Revision 1.10.2.16  2007/07/28 10:10:25  fab
- Eliminate println
-
- Revision 1.10.2.15  2007/06/23 09:15:48  fab
- Fix per la gestione di relatedAndNewItemsOnlyInPopUp con chiavi a componenti multiple
-
- Revision 1.10.2.14  2007/06/19 15:14:08  fab
- Fix per l'individuazione automatica del MASTER nelle relazione MASTER-DETAIL con cardinalita' 1:1
-
- Revision 1.10.2.13  2007/06/19 14:48:57  fab
- Fix nella makeShowAttributeVector per la corretta gestione degli attributi di slezione quando sono nella forma
- [relationship.]*attribute
-
- Revision 1.10.2.12  2007/06/19 06:58:53  fab
- Fix per la corretta gestione dei @ShowRelationshipAttributesInForm quando gli attributi sono nella forma [relationship.]*attribute
-
- Revision 1.10.2.11  2007/06/18 10:26:57  bob
- Fix per la corretta lettura da tastiera nella isMaster
-
- Revision 1.10.2.10  2007/06/16 12:25:11  fab
- Modifiche per supportare l'upload dei files con Trinidad - La versione esistente con Seam non funzionava
-
- Revision 1.10.2.9  2007/05/30 11:42:20  fab
- Fix sulla makeAdd per la corretta generazione delle relazioni N:M
-
- Revision 1.10.2.8  2007/03/25 09:30:39  dev
- Inserita la makeRolesCheckCondition
-
- Revision 1.10.2.7  2007/03/24 17:26:42  dev
- Fix sulle funzioni makeFirstLetterLowerCase e makeFirstLetterUpperCase
-
- Revision 1.10.2.6  2007/03/24 00:42:01  dev
- Reingegnerizzazione della creazione del progetto
-
- Revision 1.10.2.5  2007/03/06 10:06:13  dev
- Introdotta la funzione makeMethod2SingularField
- Modificata la ShowAttributeVector
-
- Revision 1.10.2.4  2007/02/14 13:02:08  dev
- Fix sulla makeRemoveAll
-
- Revision 1.10.2.3  2007/02/09 11:23:56  dev
- Fix sulla funzione SeamReplaceTag2String
-
- Revision 1.10.2.2  2007/02/07 21:04:29  dev
- Modifiche per supportare caratteri accentati nel file delle etichette
-
- Revision 1.10.2.1  2007/01/20 09:11:06  dev
- Tante modifiche che non sono descrivibili
-
- Revision 1.9  2007/01/07 14:35:08  dev
- Modifiche Dicembre 2006
-
- Revision 1.8  2007/01/02 20:22:04  dev
- Fix nella makeRemove
-
- Revision 1.7  2006/12/28 18:32:30  dev
- Modifiche per gestione della search
-
- Revision 1.6  2006/12/01 09:32:02  dev
- Fix per la gestione del codice custom
-
- Revision 1.5  2006/11/27 21:46:38  dev
- Modifiche per supportare gli attributi nella forma
-
- [relazione]*.attributo
-
- come attributi di selezione nelle PopUp
-
- Revision 1.4  2006/11/25 21:40:51  dev
- *** empty log message ***
-
- Revision 1.3  2006/11/25 21:39:51  dev
- Modificati il tipo di commenti per il codice custom
-
-
- Revision 1.2  2006/11/05 18:35:54  dev
- Aggiunta la makeRemoveAll
-
- Revision 1.1  2006/10/23 08:25:32  dev
- Prima versione separata dal generatore struts
-
- Revision 1.17  2006/09/03 14:29:58  dev
- Modifiche per le relazioni MASTER_DETAIL
-
- Revision 1.16  2006/08/25 10:10:37  dev
- Modifiche per la gestione delle PopUp
-
- Revision 1.15  2006/07/09 17:10:51  dev
- Fix sulla SeamReplaceTagAndSave
-
- Revision 1.14  2006/07/02 16:36:24  dev
- Inserita funzione SeamReplaceTagAndSave che dovrebbe evitare la riscrittura del file generato se uguale a quello esistente.
- Funziona ?
-
- Revision 1.13  2006/06/16 18:13:04  dev
- Fix vari più modifiche alla search ROTTA
-
- Revision 1.12  2006/06/14 18:26:21  dev
- Fix per evitare che le relazioni :1 implementate come listbox vengano inizializzate anche quando non sono utilizzte
-
- Revision 1.11  2006/06/12 16:16:39  dev
- Modificata la replaceTagAndSave
-
- Revision 1.10  2006/06/08 10:16:22  dev
- Modifiche per la nuova gestione del path nella list di bean detail in relazioni MASTER-DETAIL
-
- Revision 1.9  2006/05/25 09:12:26  dev
- gestione dell'annotazione ShowRelationshipAttributesInForm in azione init con attributi nella forma
-
- [relazione.]*attributo
-
- Revision 1.8  2006/05/25 08:31:06  dev
- gestione dell'annotazione ShowRelationshipAttributesInForm in azione init
-
- Revision 1.7  2006/05/24 20:13:53  dev
- Da completare i campi di sola visualizzazione nei form
-
- Revision 1.6  2006/05/23 08:30:29  dev
- Fix per supportare attributi nella forma
- [relazione.]*attributo
- nelle liste
-
- Revision 1.5  2006/04/20 10:15:11  dev
- Fix nella generazione delle pagine di ricerca sui listbox
**/

package org.boco.seamwebappgen.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.Vector;

import org.apache.commons.io.IOUtils;
import org.boco.seamwebappgen.info.Bean;
import org.boco.seamwebappgen.info.InfoReader;
import org.boco.seamwebappgen.info.Relationship;
import org.boco.seamwebappgen.info.SearchAttribute;
import org.boco.seamwebappgen.info.ShowAttribute;


/**
* Classe con funzioni di utilita'
*
*/
public class Utils
{

  public static String makeFirstLetterUpperCase(String in)
  {
    if (in.equals(""))
      return "";

    String tmp = in.toUpperCase();

    return tmp.substring(0, 1) + in.substring(1, in.length());
  }

  public static String makeFirstLetterLowerCase(String in)
  {
    if (in.equals(""))
      return "";

    String tmp = in.toLowerCase();

    return tmp.substring(0, 1) + in.substring(1, in.length());
  }

  /**
   * Dato un nome di un campo genera il metodo getter
   *
   * @param field
   * Nome del campo
   *
   * @return Nome del metodo getter
   */
  public static String makeGet(String field)
  {
    if (field == null || field.equals(""))
      return "";

    String tmp = field.toUpperCase();
    String tmp1 = tmp.substring(0, 1);

    return "get" + tmp1 + field.substring(1);
  }

  /**
   * Dato un nome di un campo genera il metodo adder
   *
   * @param field
   * Nome del campo
   *
   * @return Nome del metodo adder
   */
  public static String makeAdd(String field)
  {
    String field1 = field;

    //    if(field1.endsWith("s"))
    //    {
    //      field1 = field1.substring(0,field1.length()-1);
    //    }

    String tmp = field1.toUpperCase();
    String tmp1 = tmp.substring(0, 1);

    return "add" + tmp1 + field1.substring(1);
  }

  /**
   * Dato un nome di un campo genera il metodo removeAll
   *
   * @param field
   * Nome del campo
   *
   * @return Nome del metodo adder
   */
  public static String makeRemoveAll(String field)
  {
    String field1 = field;

    String tmp = field1.toUpperCase();
    String tmp1 = tmp.substring(0, 1);

    return "removeAll" + tmp1 + field1.substring(1);
  }

  /**
   * Dato un nome di un campo genera il metodo remover
   *
   * @param field
   * Nome del campo
   *
   * @return Nome del metodo remover
   */
  public static String makeRemove(String field)
  {
    String field1 = field;

    //    if(field1.endsWith("s"))
    //    {
    //      field1 = field1.substring(0,field1.length()-1);
    //    }

    String tmp = field1.toUpperCase();
    String tmp1 = tmp.substring(0, 1);

    return "remove" + tmp1 + field1.substring(1);
  }

  /**
   * Restitruisce true se il bean ha almeno una relazione categorizzata
   *
   */
  public static boolean hasCategorizedRelationships(Bean bean)
  {
    Vector<Relationship> relationships = bean.getRelationships();

    for (Relationship relationship : relationships)
    {
      if (relationship.isCategorized())
        return true;
    }

    return false;
  }

  /**
   * Restituisce il contenuto di header.txt presente nella directory html del
   * progetto
   *
   * @throws FileNotFoundException
   * @throws IOException
   */
  public static String getHeader(String sourceDir) throws FileNotFoundException, IOException
  {
    String template = sourceDir + ".." + File.separator + "html" + File.separator + "header.txt";
    String line;

    String tmp = "";

    LineNumberReader br = new LineNumberReader(new FileReader(template));

    while ((line = br.readLine()) != null)
    {
      tmp += line;
    }

    br.close();

    return tmp;
  }

  /**
   * Restituisce tutti i frammenti di codice custom presenti in una pagina
   *
   * @param file
   * @param type
   * @throws IOException
   */
  public static LinkedList<String> getYourCode(String file, CustomCodeType type) throws IOException, FileNotFoundException
  {
    LineNumberReader lr;
    LinkedList<String> tmp = new LinkedList<String>();
    String yourCode = "";
    String line;
    String startString = "";
    String endString = "";
    boolean yourCodeStarted = false;

    if (type == CustomCodeType.JAVA)
    {

      startString = "// YOUR CODE GOES HERE";
      endString = "// END OF YOUR CODE";

    }
    if (type == CustomCodeType.JSP)
    {
      startString = "<!-- YOUR CODE GOES HERE -->";
      endString = "<!-- END OF YOUR CODE -->";
      //startString = "<%/* YOUR CODE GOES HERE */%>";
      //endString = "<%/* END OF YOUR CODE */%>";
    }

    try
    {
      lr = new LineNumberReader(new FileReader(file));
    }
    catch (FileNotFoundException e)
    {
      // Si entra qui se il file target ancora non e' mai
      // stato generato
//      System.out.println("************ File da creare ****************");
//      System.out.println(file);
//      System.out.println("********************************************");
      return tmp;
    }

    try
    {
      while ((line = lr.readLine()) != null)
      {
        line = line.replaceAll("//\t", "// ");

        if (line.contains(startString))
        {
          yourCodeStarted = true;
          line = lr.readLine();
          line = line.replaceAll("//\t", "// ");
        }

        if (yourCodeStarted)
        {
          if (line.contains(endString))
          {
            tmp.addLast(yourCode);
            yourCode = "";

            yourCodeStarted = false;
          }
          else
          {
            yourCode += line;

            if (!line.equals("\r\n"))
              yourCode += "\r\n";
          }
        }
      }
    }
    catch (NullPointerException e)
    {
      System.out.println("File " + file + "\r\n");

      throw new NullPointerException();
    }

    return tmp;
  }

  public static void SeamReplaceTagAndSave(HashMap<String, String> tags, LinkedList<String> yourJavaScriptCode, LinkedList<String> yourCode, String template, String targetFile) throws FileNotFoundException, IOException
  {
    LineNumberReader br;
    FileWriter fileOutput;

    try
    {
      br = new LineNumberReader(new FileReader(template));
    }
    catch (FileNotFoundException e)
    {
      JarFileReader jfr = new JarFileReader();
     
      br = new LineNumberReader(new InputStreamReader(jfr.readFile(template)));
    }

    try
    {
      fileOutput = new FileWriter(new File(targetFile + "NEW"));
    }
    catch (FileNotFoundException e)
    {
      //      System.out.println("FILE: " + targetFile + "NEW");
      //      System.out.println(e.getMessage());

      throw new FileNotFoundException(e.getMessage());
    }

    String line;

    while ((line = br.readLine()) != null)
    {
      Set<String> keys = tags.keySet();

      // Per ogni linea tenta la sostituzione di ogni tag
      for (String key : keys)
      {
        line = line.replaceAll(key, tags.get(key));
      }

      if (!line.equals("\r\n") && (!line.equals("@YourJavaScriptCode")) && (!line.equals("@YourCode")))
        line += "\r\n";

      // if (line.contains("@YourCode"))
      if (numberOfYourCodeTags(line) == 1)
      {
        String code;

        if (yourCode.isEmpty())
          code = "";
        else
        {
          code = yourCode.removeFirst();
          code = code.replaceAll("\"", "\\\\\"");
        }

        line = line.replaceAll("@YourCode", code);
      }

      if (numberOfYourCodeTags(line) > 1)
      {
        String code;

        while (line.contains("@YourCode"))
        {
          if (yourCode.size() > 0)
          {
            code = yourCode.removeFirst();
            code = code.replaceAll("\"", "\\\\\"");
          }
          else
          {
            code = "";
          }
          line = line.replaceFirst("@YourCode", code);
        }
      }

      if (line.contains("@YourJavaScriptCode"))
      {
        String code;

        if (yourJavaScriptCode.isEmpty())
          code = "";
        else
        {
          code = yourJavaScriptCode.removeFirst();
          code = code.replaceAll("\"", "\\\\\"");
        }
        line = line.replaceAll("@YourJavaScriptCode", code);
      }

      fileOutput.write(line);
      fileOutput.flush();
    }

    fileOutput.flush();
    fileOutput.close();

    File oldTargetFile = new File(targetFile);
    if (!oldTargetFile.exists())
    {
      //System.out.println("File " + targetFile + " e' stato creato");

      /**
       * Nel file target debbono essere inseriti i tag per CVS
       */
    }

    if (oldTargetFile.exists() && IOUtils.contentEquals(new FileInputStream(new File(targetFile + "NEW")), new FileInputStream(oldTargetFile)))
    {
      // Il nuovo file generato e' uguale al precedente
      // Il nuovo viene cancellato
      File f = new File(targetFile + "NEW");
      f.deleteOnExit();
    }
    else
    {
      // Il nuovo file generato e' diverso da quello gia' esistente
      // Il nuovo file viene copiato su quello esistente e poi cancellato
      IOUtils.copy(new FileInputStream(new File(targetFile + "NEW")), new FileOutputStream(new File(targetFile)));

      File f = new File(targetFile + "NEW");
      f.deleteOnExit();
    }

  }

  public static void SeamReplaceTagAndSave(HashMap<String, String> tags, LinkedList<String> yourCode, String template, String targetFile) throws FileNotFoundException, IOException
  {
    SeamReplaceTagAndSave(tags, null, yourCode, template, targetFile);
  }

  public static String SeamReplaceTag2String(HashMap<String, String> tags, LinkedList<String> yourJavaScriptCode, LinkedList<String> yourCode, String template) throws FileNotFoundException, IOException
  {
    LineNumberReader br;
    String ret = "";

    try
    {
      br = new LineNumberReader(new FileReader(template));
    }
    catch (FileNotFoundException e)
    {
      JarFileReader jfr = new JarFileReader();

      br = new LineNumberReader(new InputStreamReader(jfr.readFile(template)));

      //      System.out.println("FILE: " + template);
      //      System.out.println(e.getMessage());
      //
      //      throw new FileNotFoundException();
    }

    String line;

    while ((line = br.readLine()) != null)
    {
      Set<String> keys = tags.keySet();

      // Per ogni linea tenta la sostituzione di ogni tag
      for (String key : keys)
      {
        line = line.replaceAll(key + "\r\n", tags.get(key));
        line = line.replaceAll(key, tags.get(key));
      }

      if (!line.equals("\r\n") && (!line.equals("@YourJavaScriptCode")) && (!line.equals("@YourCode")))
        line += "\r\n";

      if (line.contains("@YourCode"))
      {
        String code;

        if (yourCode.isEmpty())
          code = "";
        else
          code = yourCode.removeFirst();

        line = line.replaceAll("@YourCode", code);
      }

      if (line.contains("@YourJavaScriptCode"))
      {
        String code;

        if (yourJavaScriptCode.isEmpty())
          code = "";
        else
          code = yourJavaScriptCode.removeFirst();

        line = line.replaceAll("@YourJavaScriptCode", code);
      }

      ret += line;
    }

    return ret;
  }

  /**
   * Se il campo e' nella forma
   *
   * relazione.nome_campo
   *
   * restituisce solo
   *
   * nome_campo
   *
   * altrimenti restituisce il campo inalterato
   *
   */
  public static String stripDot(String field)
  {
    String ret = "";

    int dotIndex = field.indexOf(".");

    if (dotIndex == -1)
      return field;

    ret = field.substring(dotIndex + 1, field.length());

    return ret;
  }

  /**
   *
   * Se un campo e' nella forma
   *
   * relazione.campo
   *
   * restituisce
   *
   * relazione_campo
   *
   * Viene utilizzato per gli attributi di selezione delle relazioni
   *
   */
  public static String dot2Underscore(String field)
  {
    return field.replaceAll("[.]", "_");
  }

  /**
   * Restitruisce la prima relazione categorizzata
   *
   */
  public static Relationship getCategorizedRelationship(Bean bean)
  {
    Vector<Relationship> relationships = bean.getRelationships();

    for (Relationship relationship : relationships)
    {
      if (relationship.isCategorized())
        return relationship;
    }

    return null;
  }

  /**
   * Dato un campo nella forma
   *
   * relazione.campo
   *
   * restituisce la relazione
   *
   */

  /*
  public static String splitRelation(String field)
  {
    return field.substring(0, field.indexOf("."));
  }
  */

  /**
   * Dato un campo nella forma
   *
   * relazione.campo
   *
   * restituisce il campo
   *
   */
  /*
  public static String splitAttribute(String field)
  {
    return field.substring(field.indexOf(".") + 1, field.length());
  }
   */
  /**
   * Dato un metodo get<Field> o set<Field> restituisce <Field>
   *
   *
   */
  public static String makeMethod2Field(String getMethod)
  {
    return makeFirstLetterLowerCase(getMethod.substring(3, getMethod.length()));
  }

  /**
   * Dato un metodo di una relazione :N
   * <br>
   * get<Field>s o set<Field>s
   *<br>
   * restituisce <Field>
   *
   */
  public static String makeMethod2SingularField(String getMethod)
  {
    return makeFirstLetterLowerCase(getMethod.substring(3, getMethod.length() - 1));
  }

  /**
   * Dato un campo <Field> restituisce il metodo
   *
   * set<Field>
   *
   */
  public static String makeSet(String field)
  {
    String tmp = field.toUpperCase();
    String tmp1 = tmp.substring(0, 1);

    return "set" + tmp1 + field.substring(1);
  }

  /**
   * Dato un metodo
   *
   * get<Field>
   *
   * restituisce il metodo
   *
   * set<Field>
   *
   */
  public static String switchGet2Set(String method)
  {
    String field = method.substring(3, method.length());

    return makeSet(field);
  }

  /**
   *
   * Definisce se il bean di partenza il lato master di una relazione di tipo master-detail
   * utilizzando le cardinalita' e dei mappedby
   *
   *  @throws IOException
   */
  public static boolean isMaster(Relationship rel) throws IOException
  {
    if (rel.isFromMany() && rel.isToMany())
    {
      if (rel.getMappedBy() == null || rel.getMappedBy().equals(""))
      {
        // Il master deve essere il bean che non e' owner della relazione
        // Un bean e' owner della relazione se non contiene mappedby

        return false;
      }
     
      return true;
    }

    if (!rel.isFromMany() && !rel.isToMany())
    {
      /** Relazione 1:1 di tipo MASTER-DETAIL **/

      if (rel.getMappedBy() == null || rel.getMappedBy().equals(""))
      {
        // Il master deve essere il bean che non e' owner della relazione
        // Un bean e' owner della relazione se non contiene mappedby

        return false;
      }

      return true;
    }

    if (rel.isToMany())
    {
      return true;
    }
    else
    {
      return false;
    }
  }

  /**
   * Data una lista di nomi di attributi, restituisce un vettore con gli
   * attributi
   *
   */
  public static Vector<ShowAttribute> makeShowAttributeVector(String beanName, String showAttributes[], InfoReader infoReader) throws Exception
  {
    Vector<ShowAttribute> ret = new Vector<ShowAttribute>();

    for (int i = 0; i < showAttributes.length; i++)
    {
      ShowAttribute tmp = null;

      if (showAttributes[i].contains("."))
      {
        // L'attributo contiene anche i riferimenti a relazioni

        Vector<String> items = Utils.splitRelationships(showAttributes[i]);

        tmp = new ShowAttribute(items.lastElement());

        String toBeanName = beanName;

        for (int m = 0; m < items.size() - 1; m++)
        {
          Relationship rel = infoReader.getRelationship(toBeanName, items.get(m));

          tmp.addRelationship(rel);

          toBeanName = rel.getToBeanName();
        }

        tmp.setType(infoReader.getBeanAttribute(tmp.getRelationship().getToBeanName(), tmp.getName()).getType());
        tmp.setImplementationType(infoReader.getBeanAttribute(toBeanName, tmp.getName()).getImplementationType());
        tmp.setFormFormatOff(infoReader.getBeanAttribute(toBeanName, tmp.getName()).isFormFormatOff());
        tmp.setListFormatOff(infoReader.getBeanAttribute(toBeanName, tmp.getName()).isListFormatOff());
      }
      else
      {
        tmp = new ShowAttribute(showAttributes[i]);
        tmp.setType(infoReader.getBeanAttribute(beanName, tmp.getName()).getType());
        tmp.setImplementationType(infoReader.getBeanAttribute(beanName, tmp.getName()).getImplementationType());
        tmp.setFormFormatOff(infoReader.getBeanAttribute(beanName, tmp.getName()).isFormFormatOff());
        tmp.setListFormatOff(infoReader.getBeanAttribute(beanName, tmp.getName()).isListFormatOff());
      }

      ret.add(tmp);
    }

    return ret;
  }

  /**
   * Dato un bean, restituisce per ciascuna relazione su cui viene effettuata una ricerca il numero di attributi
   * che le appartengono in un HashMap
   * <br>
   * <ul>
   * <li>Chiave: nome della relaizione</li>
   * <li>Proprieta': numero di attrinuti che sono riferiti alla relazione
   * </ul>
   *
   *
   */
  public static HashMap<String, Integer> searchUsedRelationshipCount(Bean bean)
  {
    HashMap<String, Integer> relationshipCounts = new HashMap<String, Integer>();

    for (int i = 0; i < bean.getSearchAttributes().size(); i++)
    {
      SearchAttribute sAttr = bean.getSearchAttributes().get(i);

      if (sAttr.belongsToRelationship())
      {
        String relName;

        if (sAttr.getName().contains("."))
        {
          Vector<String> items = Utils.splitRelationships(sAttr.getName());

          relName = items.get(items.size() - 2);
        }
        else
        {
          relName = sAttr.getRelationship().getName();
        }

        if (relationshipCounts.containsKey(relName))
        {
          Integer count;

          count = (Integer) relationshipCounts.get(relName);

          relationshipCounts.remove(relName);
          relationshipCounts.put(relName, new Integer(count.intValue() + 1));
        }
        else
        {
          relationshipCounts.put(relName, new Integer(1));
        }

      }
    }

    return relationshipCounts;
  }

  /**
   * Dato un attributo nella forma
   * <br>
   * [relazione.]*attributo
   * <br>
   * restituisce un array contenente le relazioni e l'attributo
   *
   */
  public static Vector<String> splitRelationships(String attributeName)
  {
    Vector<String> ret = new Vector<String>();

    StringTokenizer st = new StringTokenizer(attributeName, ".");

    while (st.hasMoreTokens())
    {
      ret.add(st.nextToken());
    }

    return ret;
  }

  /**
   * Restituisce true se la relazione deve essere utilizzata per visualizzare degli attributi nel form del bean
   *
   */
  /*
   public static boolean RelationshipUsedToShowAttributes(Vector<ShowAttribute> showInFormAttributes, String relationshipName)
   {
   for(int i=0; i<showInFormAttributes.size(); i++)
   {
   ShowAttribute attr = showInFormAttributes.get(i);
  
   if (attr.getRelationship().getName().equals(relationshipName))
   return true;
   }
  
   return false;
   }
   */

  /**
   * Data una relazione, restituisce tutti gli attributi di sola visualzizzazione nel form
   *
   */
  public static Vector<ShowAttribute> getShowInFormAttributes(Vector<ShowAttribute> showInFormAttributes, String relationshipName)
  {
    Vector<ShowAttribute> ret = new Vector<ShowAttribute>();

    for (int i = 0; i < showInFormAttributes.size(); i++)
    {
      ShowAttribute attr = showInFormAttributes.get(i);

      if (attr.getRelationship() != null && attr.getRelationship().getName().equals(relationshipName))
        ret.add(attr);
    }

    return ret;
  }

  /**
   * Data una lista di attributi di ricerca e una relazione, verifica se questa
   * e' utilizzata per uno degli attributi
   */
  public static boolean isUsedInSearch(Vector<SearchAttribute> searchAttributes, Relationship rel)
  {
    for (int i = 0; i < searchAttributes.size(); i++)
    {
      SearchAttribute attr = searchAttributes.get(i);

      if (attr.getRelationship() != null && attr.getRelationship().equals(rel))
      {
        return true;
      }
    }

    return false;
  }

  /**
   * Data una lista di ruoli abilitati restituisce la condizione di controllo
   */
  public static String makeRolesCheckCondition(Vector<String> rolesList)
  {
    String rolesCheck = "#{";

    for (int i = 0; i < rolesList.size(); i++)
    {
      if (i > 0)
        rolesCheck += " or ";

      rolesCheck += "s:hasRole('" + rolesList.get(i) + "')";
    }

    rolesCheck += "}";

    return rolesCheck;
  }

  private static int numberOfYourCodeTags(String buffer)
  {
    int pos = 0;
    int ret = 0;

    while ((pos = buffer.indexOf("@YourCode", pos)) != -1)
    {
      pos += 9;
      ret++;
    }

    return ret;
  }
}
TOP

Related Classes of org.boco.seamwebappgen.utils.Utils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.