martedì 27 dicembre 2011

Gestire permessi per i file da terminale

Esistono 3 permessi attribuibili a un file o directory (per Ubuntu sono la stessa cosa):
  • r  che sta per read
  • x che sta per execute
  • w che sta per write
Esistono poi 3 tipologie di utenti:
  • Proprietario indicato con la lettera u
  • Gruppo indicato con la lettera g
  • Altri indicati con la lettera o

Se creiamo in una directory due file di testo (es. f1.txt e f2.txt) e poi scriviamo
ls -l  sul terminale (ossi elenca file e permessi)
otteniamo un risultato di questo tipo:

-rw-rw-r-- 1 carlo carlo 0 2011-12-28 00:10 f1.txt
-rw-rw-r-- 1 carlo carlo 0 2011-12-28 00:09 f2.txt


Il primo carattere ci dice se si tratta di un file o di una directory , se è un file compare il carattere - altrimenti la lettera d.
In questo caso, essendo 2 file abbiamo 2 -.
Il prosieguo della stringa si legge a gruppi di 3 e indica i permessi del proprietario del gruppo e degli altri utenti.
Quindi la stringa sopra incollata significa che per i 2 file il proprietario ha diritti di read e write  così come l'utente Gruppo.
Gli "altri" hanno solo il privilegio di lettura.
Per aggiungere/togliere permessi si utilizza il comando chmod con sintassi

chmod [tipo_utente] +/- [permessi] [nome_file_o_directory]

Esempio: aggiungere permesso di esecuzione all'utente Proprietario

chmod u+x f1.txt

Se richiediamo ls -l abbiamo adesso:

-rwxrw-r-- 1 carlo carlo    0 2011-12-28 00:10 f1.txt


Per togliere il permesso di lettura all'utente "Altri"


chmod o-r f1.txt

 Se richiediamo ls -l abbiamo adesso:

 -rwxrw---- 1 carlo carlo    0 2011-12-28 00:10 f1.txt







Leggere File di Properties settandone i parametri

Supponiamo di avere un file di Properties con nel messaggio dei placeholder, che servono per inserire testo dinamico a completamento.

Esempio il file test.properties così composto:

test=ciao {0} il tuo cognome è {1}


Per leggere il file ed effettuare la sostituzione dei parametri si utilizza la classe MessageFormat.

Properties p=new Properties();
p.load(new FileInputStream(("out/test.properties")));
System.out.println(MessageFormat.format(p.getProperty("test"), "Mario","Rossi"));


L'output sarà :

ciao Mario il tuo cognome è Rossi

Per versioni precedenti di Java come Java 4 si può utilizzare il metodo:

MessageFormat.format(p.getProperty("test"), new Object[]{"Mario","Rossi"})

domenica 25 dicembre 2011

Esempio utilizzo MDB

Nel seguente esempio proviamo a :
  • Definire una coda JMS su Jboss 5.1;
  • Realizzare un programma client java che scriva sulla coda dei messaggi;
  • Realizzare un Message Driven Bean che legga il messaggio e lo tolga dalla coda JMS.
DEFINIRE CODA JMS

Sotto la directory default deploy creare una directory denominata code dove andremo a definire la nostra coda JMS.

A questo punto dalla console di amministrazione di Jboss (utenza e pwd di default sono admin admin).




Cliccando su Add a new Resource e seguendo il menu definiamo il nome della coda "MiaCoda" e il JNDI name "code/MiaCoda".
Una volta terminata la procedura possiamo verificare il corretto funzionamento guardando sotto la directory deploy/code, troveremo il file xml MiaCoda-service.xml.

DEFINIRE CLIENT JAVA

Definiamo un semplice progetto Java su eclipse, inserendo nel classpath tutte le librerie presenti nella directory client di Jboss.

Il codice nel main del programma è il seguente:

import java.util.Properties;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

public class MessageSender {

   
   
    public static void main(String[] args) throws Exception{
        ConnectionFactory connectionFactory;
        Destination destination;
        Properties p=new Properties();
        p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
        p.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099");
        Context ctx=new InitialContext(p);
        connectionFactory=(ConnectionFactory)ctx.lookup("/ConnectionFactory");
        destination=(Queue)ctx.lookup("/code/MiaCoda");
        System.out.println("La coda e la connessione sono stati recuperati");
        Connection connection=null;
        connection=connectionFactory.createConnection();
        Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageProducer mp=session.createProducer(destination);
         TextMessage msg = session.createTextMessage();
          for (int i = 0; i < 5; i++) {
          msg.setText("Questo è il messaggio " + (i + 1));
          mp.send(msg);
          }
          connection.close();
          System.out.println("Messaggi inviati correttamente");
         
    }
   
}


Vengono scritti e inviati 5 messaggi.
Se proviamo ad eseguire il programma con Jboss acceso vediamo che da Console ci compare il seguente messaggio:

La coda e la connessione sono stati recuperati
Messaggi inviati correttamente


Quindi andando sulla console di amministrazione di Jboss in corrispondenza della coda "MiaCoda" troviamo:

Vediamo che risultano 0 consumer (nessuno ha letto i messaggi, non essendoci ancora l'MDB) e 5 messaggi presenti nella coda.




DEFINIRE IL MESSAGE DRIVEN BEAN

L' MDB ha il compito di connettersi alla coda e leggere i messaggi presenti.
Per realizzarlo creiamo un progetto Java inserendo nel classpath le librerie client di Jboss 5.1.
Per definire l'MDB annotiamo la classe con @MessageDriven, mentre la classe deve implementare l'interfaccia MessageListener (del package javax.jms).
Da notare la definizione dell'elemento activationConfig dove si specifica il tipo di Destination (in questo caso una coda) e il nome della coda ("code/MiaCoda").

Il codice è il seguente:

import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

@MessageDriven(name="MessageBean",
activationConfig= {
        @ActivationConfigProperty(propertyName="destinationType",
                                    propertyValue="javax.jms.Queue"),
        @ActivationConfigProperty(propertyName="destination",
                                    propertyValue="code/MiaCoda")
                  }
        )

public class MessageBean implements MessageListener {
    @Resource
       private MessageDrivenContext mdc;

     
       public void onMessage(Message msg) {
         TextMessage tmsg = null;

       try
       {
             tmsg = (TextMessage) msg;
             System.out.println("MESSAGE BEAN: Messaggio ricevuto: " + tmsg.getText( ));
             System.out.println ("Metodo onMessage() richiamato");
       }
       catch (JMSException e) {
                               e.printStackTrace( );
                               mdc.setRollbackOnly( );
                              }
      catch (Throwable th)    {
                              th.printStackTrace();
                              }
       }
     
}


Una volta fatto ciò possiamo esportare il progetto come jar file all'interno della directory deploy di JBoss.

Una volta deployato subito si nota sulla console di Jboss che i messaggi messi nella coda sono stati consumati dall'MDB:


13:06:53,945 INFO  [STDOUT] MESSAGE BEAN: Messaggio ricevuto: Questo è il messaggio 2
13:06:53,945 INFO  [STDOUT] Metodo onMessage() richiamato
13:06:53,946 INFO  [STDOUT] MESSAGE BEAN: Messaggio ricevuto: Questo è il messaggio 3
13:06:53,946 INFO  [STDOUT] Metodo onMessage() richiamato
13:06:53,947 INFO  [STDOUT] MESSAGE BEAN: Messaggio ricevuto: Questo è il messaggio 1
13:06:53,947 INFO  [STDOUT] Metodo onMessage() richiamato
13:06:53,947 INFO  [STDOUT] MESSAGE BEAN: Messaggio ricevuto: Questo è il messaggio 4
13:06:53,948 INFO  [STDOUT] Metodo onMessage() richiamato
13:06:53,949 INFO  [STDOUT] MESSAGE BEAN: Messaggio ricevuto: Questo è il messaggio 5
13:06:53,950 INFO  [STDOUT] Metodo onMessage() richiamato


Andando sulla coda via console di amministrazione vediamo infatti che adesso il Campo Consumer count è pari a 1 mentre il Message Count a 0.
Tutti i messaggi sono stati letti quindi dall'MDB e la coda è stata svuotata.

SCRIVERE MESSAGGI SULLA CODA JMS VIA WEB APPLICATION

In questo caso realizziamo una semplice Web appplication con un form su cui si inserisce il messaggio in una textArea e si invia il tutto ad una servlet che si occupa di aggiungere il messaggio alla coda jms.
Si noti come in questo caso i riferimenti alla ConnectionFactory e alla Destination siano recuperati tramite l'annotazione @Resource e non tramite look up JNDI.

public class ScriviMessaggioSuCoda extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Resource(name="code/MiaCoda",mappedName="code/MiaCoda")
    private javax.jms.Destination codaTest;
    @Resource(name="ConnectionFactory",mappedName="ConnectionFactory")
    private javax.jms.ConnectionFactory connentionFactory;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ScriviMessaggioSuCoda() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        try
        {
        String messaggio=request.getParameter("txtMessage");
        Connection connection = connentionFactory.createConnection();
          connection=connentionFactory.createConnection();
        Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageProducer mp=session.createProducer(codaTest);
        TextMessage msg = session.createTextMessage();
        msg.setText(messaggio);
        mp.send(msg);
        connection.close();
        System.out.println("Sending message");
        session.close ();
        PrintWriter wr=response.getWriter();
        wr.write("<b>Messaggio inviato</b>");
        wr.flush();
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
         
       
    }

}

venerdì 23 dicembre 2011

Progetto di test Junit su Eclipse

Per creare un semplice progetto di Junit test su eclipse occorre:
  • Scaricarsi la libreria Junit da qui;
  • Inserire il jar di Junit nella lib del progetto e aggiungerla al classpath;
  • Scrivere una classe java che estenda la classe junit.framework.TestCase;
  • Definire una serie di metodi void con firma public void testXXXX();
  • Lanciare la classe scegliendo tra le opzioni run as Junit-test
Nel mio caso ad esempio volevo testare un metodo per la validazione della partita iva.
Ho preso quindi delle partite iva corrette e alcune sbagliate, scrivendo un metodo di questo tipo:

public void testPartitaIva(){
  PartitaIva p=PartitaIva.getInstance();
  System.out.println("Inizio test partita iva...");
  assertEquals(true, p.verificaPartitaIva("07973780013"));
  assertEquals(true, p.verificaPartitaIva("00875591000"));
  assertEquals(true, p.verificaPartitaIva("13212880150"));
  assertEquals(true, p.verificaPartitaIva("04914190824"));
  assertEquals(true, p.verificaPartitaIva("00905811006"));
  assertEquals(false, p.verificaPartitaIva("00905811007"));
  assertEquals(false, p.verificaPartitaIva("04914190825"));
  assertEquals(false, p.verificaPartitaIva("13212880151"));
  assertEquals(false, p.verificaPartitaIva("00875591009"));
  assertEquals(false, p.verificaPartitaIva("07973780016"));
  System.out.println("Partita iva ok");
       
    }


Eseguendolo come test Junit sulla console di Eclipse nel caso in cui non ci siano errori appare la seguente schermata:



mercoledì 21 dicembre 2011

Calcolare l'Md5 di una stringa

Un metodo statico per il calcolo dell'hash di una Stringa (MD5).


/**
  * Calcola l'hash
  * @param md5 la stringa in ingresso
  * @param encoding l'encoding (es utf-8,latin1...)
  * @return
  * @throws UnsupportedEncodingException
  */
 public static String MD5(String md5,String encoding) throws UnsupportedEncodingException {  
  try {        
   java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
   String s=new String(md5.getBytes(), encoding);
   byte[] array = md.digest(s.getBytes());       
   StringBuffer sb = new StringBuffer();       
   for (int i = 0; i < array.length; ++i) { 
    String hex=Integer.toHexString((array[i] & 0xFF)+0x100).substring(1);
    sb.append(hex);
   }        
   return sb.toString();     }
  catch (java.security.NoSuchAlgorithmException e) {   
   throw new IllegalArgumentException("Attenzione non esiste l'algoritmo di cifratura selezionato");
  }   
 } 


Ottenere informazioni sulla locazione di un War a runtime

Per conoscere esattamente il percorso completo (che varia da Sistemi Operativi ad Application Server) della context root della nostra web app a runtime è sufficiente eseguire il seguente codice sulla jsp:

<%ServletContext ctx=getServletContext(); %

Esempio risultati, su una web app deployata su jboss:

C:\ApplicationServers\jboss-5.1.0.GA\server\default\tmp\a6d6hk-yat7vh-gwg691ss-1-gwg69t38-9p\WebTest.war 
<%=ctx.getRealPath("") %>
>

mercoledì 14 dicembre 2011

Limitare via javascript il numero caratteri inseriti su textarea

Con questo javascript è possibile data una textarea limitare l'input dei caratteri inseriti avvisando l'utente di quanti caratteri stia inserendo (esponendogli il messaggio in una input text hidden).

Il javascript è il seguente:

function contaCaratteri(area, field, max){
    var cont= area.value.length;
    if (cont > max){
        area.value = area.value.substr(0, max);
       
        document.getElementById(field).value = 'Massimo ' + max + ' caratteri!';
      
       
       
      
    }else{
        if(cont>1){
        document.getElementById(field).value = 'Inseriti ' + cont + ' caratteri!';
        }
        else
        {
            document.getElementById(field).value = 'Inserito ' + cont + ' carattere!';
        }
    }
}


L'esempio HTML è questo (digitare all'interno della textarea):