Sviluppo nuove customizzazioni su Adempiere, massima flessibilità e semplicità

Adempiere mette a disposizione degli sviluppatori alcuni tool che semplificano il processo di implementazione.

Se si vuole sviluppare una nuova feature la prima cosa da fare è modellizzare il database e creare lo strato di persistenza model all’interno del codice sorgente.

Come possiamo vedere dall’implementazione del configuratore di processo sono state create le classi model con i metodi modifiers getter e setter per la gestione dei dati. Queste classi rispecchiano il modello dati esistente sul database.

Ad esempio CP_ConfProc.java corrisponde alla tabella cp_confproc sul database, CP_ProcessFlow.java corrisponde alla tabella CP_ProcessFlow e così via.

Adempiere mette a disposizione degli sviluppatori alcuni strumenti che rendono più semplice e controllato lo sviluppo della parte model dell’applicazione. Basta quindi “costruire” il database della customizzazione (ricordarsi lo standard di implementazione delle tabelle: inserire il prefisso che ricoda il tipo di customizzazione e le colonne che devono essere obbligatoriamente presenti in ogni tabella).

Dal database è possibile “costruire” il “modello” dell’applicazione grazie ad una classe utility: /src/org/adempoiere/util/GenerateModel.java

Questa funzione permette la costruzione di tutte le classi che hanno come prefisso X_ e le interfaccie con prefisso I_ con i relativi getter e setter associati rispettivamente alla tabella ed alle colonne della customizzazione.

Le classi X_CP_ConfProc.java e I_CP_ConfProc.java sono autogenerate dal GenerateModel.

sezione del GenerateModel.java

    String tableLike = null;
    tableLike = "'%'";  //  All tables
    // tableLike = "'AD_OrgInfo', 'AD_Role', 'C_CashLine', 'C_Currency', 'C_Invoice', 'C_Order', 'C_Payment', 'M_InventoryLine', 'M_PriceList', 'M_Product', 'U_POSTerminal'";  //  Only specific tables
    if (args.length > 3)
      tableLike = args[3];
    log.info("Table Like: " + tableLike);

    //  complete sql
    sql.insert(0, "SELECT AD_Table_ID "
      + "FROM AD_Table "
      + "WHERE (TableName IN ('RV_WarehousePrice','RV_BPartner')"  //  special views
      + " OR IsView='N')"
      + " AND IsActive = 'Y' AND TableName NOT LIKE '%_Trl' AND ");
    // Autodetect if we need to use IN or LIKE clause - teo_sarca [ 3020640 ]
    if (tableLike.indexOf(",") == -1)
      sql.append(" AND TableName LIKE ").append(tableLike);
    else
      sql.append(" AND TableName IN (").append(tableLike).append(")"); // only specific tables

    sql.append(" ORDER BY TableName");
    
    //
    int count = 0;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    try
    {
      pstmt = DB.prepareStatement(sql.toString(), null);
      rs = pstmt.executeQuery();
      while (rs.next())
      {
        new ModelInterfaceGenerator(rs.getInt(1), directory, packageName);
        new ModelClassGenerator(rs.getInt(1), directory, packageName);
        count++;
      }
     }
    catch (Exception e)
    {
      log.log(Level.SEVERE, sql.toString(), e);
    }
    finally
    {
      DB.close(rs, pstmt);
      rs = null; pstmt = null;
    }
    log.info("Generated = " + count);
  }