martedì 20 marzo 2012

Java stampare contenuto file come Stringa

Un semplice metodo per stampare il contenuto di un file come Stringa


public static String getStringFileContent(File f) throws IOException {
  StringBuffer sb=new StringBuffer();
  if(!f.exists())
   throw new IllegalArgumentException("Attenzione file non esistente");
  BufferedReader bf=new BufferedReader(new FileReader(f));
  String l=null;
  do
  {
    l=bf.readLine();
    if(l!=null)
    sb.append(l);
  }
  while(l!=null);
  bf.close();
  return sb.toString();
 }

domenica 11 marzo 2012

JPA FETCH JOIN

Nelle query con JPA si utilizza questa clausola per forzare l' EAGER LOADING delle Entity associate nella query.
Ad esempio, supponiamo di avere questa situazione:

@Entity
public class Presentation
{
........
@ManyToOne
private Student presenter;
......

}


@Entity
public class Student
{
 ......
private int score;
@OneToMany(cascade=CascadeType.ALL,fetch=LAZY,mappedBy="presenter")
private Collection <Presentation> presentations;

}

Se in una sola query vogliamo tirare fuori tutti gli studenti assieme alle loro presentazioni allora scriveremo:

SELECT s from Student s left join fetch s.presentations;

sabato 10 marzo 2012

Override ejb-jar.xml rispetto alle annotations

La regola base degli EJB 3.0 è che si possono specificare le informazioni di configurazione sia a livello di annotation (quindi nel codice dell'Ejb) sia nel deployment descriptor (il file ejb-jar.xml).
Nel caso in cui una informazione sia specificata sia a livello di metodo EJB che a livello di deployment descriptor è preminente quest'ultimo.
Con una particolarità (che mi ha fregato...) : se nell'xml non è specificato il valore <method-param> allora tutti i metodi con il nome specificato nel file xml (inclusi i metodi con overload)  sono guidati nelle impostazioni dal file Xml e non dalle loro proprie annotation.
Esempio:

@Stateless
public class TestBean implements TestInterface
{
    @RolesAllowed("user")
    public void doStuff(String str){ }
    public void doStuff(){ }
}


Snippet del deployment descriptor:

<method-permission>
   <role-name>customer</role-name>
   <method>
      <ejb-name>EnthuBean</ejb-name>
      <method-name>doStuff</method-name>
   </method>
</method-permission>




In questo caso soltanto il ruolo customer può accedere i due metodi.

giovedì 8 marzo 2012

Utilizzo utility TCP-MON errore "Failed to load Main-Class manifest..."

Ho scaricato dal sito http://code.google.com/p/tcpmon/downloads/detail?name=tcpmon-1.1.jar&can=2&q= l'utility TCP-MONITOR per fare dei test.

Sulla documentazione è scritto che per farla funzionare in ambiente windows basta fare doppio click sul jar.
Ho provato (su Windows XP con jvm 6) ma non mi ha funzionato, allora ho tentato da linea di comando digitando il comando

java -jar tcpmon-1.1.jar

e in questo caso l'errore apparso a console è stato:

Failed to load Main-Class manifest attribute from
tcpmon-1.1.jar


A questo punto ho decompilato il jar, ho visto che in effetti nel manifest non è presente l'attributo Main-Class.
Ho quindi cercato la classe che contiene il main e che fa partire l'interfaccia swing , ossia la com.codegoogle.tcpmon.MainWindow.

Quindi ho digitato, sempre da console il comando:

java -cp  tcpmon-1.1.jar com.codegoogle.tcpmon.MainWindow


Ora il TCP monitor funziona correttamente e appare a video la schermata



domenica 4 marzo 2012

EntityManager merge vs flush

La differenza fondamentale tra l'usare il metodo merge e il persist dell' EntityManager è che il metodo persist lascia l'entità in uno stato "managed" anche dopo la sua invocazione, mentre il metodo merge no.
Si può verificare il comportamento con un semplice esempio, supponiamo che il nostro Ejb abbia i 2 seguenti metodi:

.......
public void inserisci(Persona p) {
        System.out.println("Inserisco la persona");
        em.persist(p);
        p.setEta(99);

    }

public void inserisciM(Persona p) {
        System.out.println("Inserisco la persona");
        em.merge(p);
        p.setEta(99);
    }
.....


Il codice client che richiama i metodi è il seguente:

public static void main(String[] args) throws Exception {
        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);
        GestoreDao gd=(GestoreDao)ctx.lookup("Anagrafe/remote");
        System.out.println("Ok alla lookup");
        Persona p1=new Persona();
        p1.setCognome("Rossi");
        p1.setNome("marco");
        p1.setEta(32);
        gd.inserisci(p1);
        Persona p2=new Persona();
        p2.setCognome("Verdi");
        p2.setNome("Gino");
        p2.setEta(32);
        gd.inserisciM(p2);
    }


Nel primo caso, chiamando il metodo persist, il valore dell'età della persona Marco Rossi sarà settata a 99, nel secondo caso, chiamando il metodo merge invece resterà al valore base di 32.