venerdì 27 dicembre 2013

Localizzazione 1/2

Un oggetto di tipo Locale rappresenta un insieme di caratteristiche peculiari di un paese, ossia linguaggio, cultura, formattazione di numeri e di date.
La classe java.util.Locale possiede alcune importanti proprietà riferite a 3 entità fondamentali, il nome del paese, il nome della lingua e il nome del cosiddetto VARIANT, che indica la variazione del linguaggio all'interno del paese (praticamente il dialetto):
  • getCountry() che torna il codice del paese;
  • getDisplayCountry() che torna il nome del paese;
  • getLanguage() che torna il codice del linguaggio del paese;
  • getDisplayLanguage() che torna la descrizione del linguaggio del paese;
  • getVariant() che torna il variant code;
  • getDisplayVariant() che torna la descrizione del variant.
 Con questo semplice codice possiamo avere informazioni sui Locale presenti nella nostra JVM.
Oltre alle 3 informazioni fondamentali su paese-linguaggio-dialetto abbiamo anche informazioni aggiuntive in alcuni linguaggi (script ed extensions) che vedremo poi negli esempi.


public static void main(String[] args) {
  Locale[] lista=Locale.getAvailableLocales();
  System.out.println(Locale.getDefault());
  System.out.printf("Numero locale presenti %s",lista.length);
  System.out.println();
  for(Locale l:lista){
   //if(l.getLanguage().equals("it"))
   System.out.println(l+" - "+l.getDisplayName());
   
  }
  

 }


L'output può essere filtrato se si inserisce il commento, stampando soltanto quello che corrisponde al country code desiderato.
Se ad esempio mettiamo "en" nel filtro avremo il seguente output:

it_IT
Numero locale presenti 156
en_MT - inglese (Malta)
en_GB - inglese (Regno Unito)
en_CA - inglese (Canada)
en_US - inglese (Stati Uniti)
en_ZA - inglese (Sudafrica)
en - inglese
en_SG - inglese (Singapore)
en_IE - inglese (Irlanda)
en_IN - inglese (India)
en_AU - inglese (Australia)
en_NZ - inglese (Nuova Zelanda)
en_PH - inglese (Filippine)

I primi 2 caratteri rappresentano il codice del linguaggio, quindi abbiamo il codice del Paese (es en_GB ).
Ci possono poi essere anche il codice variant. Ad esempio abbiamo (se filtriamo per language "no") tra gli output questa stringa:
no_NO_NY ossia norvegese (Norvegia,Nynorsk)
Il Nyorsk è infatti un dialetto norvegese utilizzato da circa il 10-15% della popolazione norvegese.

In alcuni casi sono presenti anche gli script e le extension, ossia altre informazioni aggiuntive oltre al dialetto (variant)  . Ad esempio se scegliamo come codice "th" otteniamo tra gli altri risultati:
th_TH_TH_#u-nu-thai - thai (Thailandia,TH)


qui non abbiamo lo script ma abbiamo le extension, in questo caso u-nu-thai.
Per vedere un esempio di script possiamo provare il codice linguaggio "sr".
Vedremo in output ad esempio:
sr_ME_#Latn - serbo (Latino,Montenegro)

Latn è un esempio di script, deve essere  fatto da 4 lettere di cui la prima maiuscola (e. Latn,Cyrl).

domenica 22 dicembre 2013

Java implementazione pattern observer

Il pattern OBSERVER rientra nella categoria dei pattern "comportamentali".
Esistono 3 categorie principali di pattern:
  • CREAZIONALI ( es. SINGLETON, FACTORY, ABSTRACT FACTORY)
  • STRUTTURALI  (es. DECORATOR, PROXY, FACADE)
  • COMPORTAMENTALI (es. OBSERVER, STATE,STRATEGY)
Per realizzare questo pattern la classe che deve "segnalare" le modifiche agli osservatori dovrà estendere la classe java.util.Observable, mentre le classi che ricevono la segnalazione dovranno implementare l'interfaccia java.util.Observer che definisce il metodo  update.

Vediamo un semplice esempio.

CLASSE OBSERVABLE


package it.pattern;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
public class Lista extends Observable {
 private List<String> lista=new ArrayList<>();
 public List<String> getLista() {
  return lista;
 }
 public void addString(String elemento){
  setChanged();
  notifyObservers(elemento);
  lista.add(elemento);
 }
}


CLASSE OBSERVER

package it.pattern;
import java.util.Observable;
import java.util.Observer;
public class ListaObserver implements Observer {
 @Override
 public void update(Observable o, Object arg) {
  System.out.println("Aggiunto elemento "+arg);
 }
}


Vediamo di seguito un esempio di utilizzo:

package it.pattern;

public class Test {
 public static void main(String[] args) {
  Lista l=new Lista();
  l.addObserver(new ListaObserver());
  l.addString("dsjksdkjd");
  l.addString("dsddsds");

 }

}


Il risultato dell'esecuzione del codice sarà il seguente:

Aggiunto elemento dsjksdkjd
Aggiunto elemento dsddsds


domenica 8 dicembre 2013

Esempio zip file con Java 7

Di seguito un esempio su come zippare un file in Java utilizzando le features della Java7 in particolare:
  1. Il try with resources, che ci risparmia la fatica di dover chiudere gli stream aperti, basta dichiarare tutte le aperture nel blocco di parentesi tonde del try;
  2. Le suppressed exceptions, ossia la possibilità di farsi stampare nel catch anche tutte le altre eccezioni eventualmente riscontrate nel blocco delle parentesi tonde del try. 
Esempio


package it.varie;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipFile {
public static final int CHUNK=1024;
public static final String DIR="C:\\lav\\workspace\\wsTest\\Java7Cert\\src\\";
public static void main(String[] args) {
  if(args.length==0){
   System.err.println("Attenzione passare come parametro il nome file");
   System.exit(-1);
  }
  String fileName=args[0];
  String zipFileName=fileName+".zip";
  byte[] buffer=new byte[CHUNK];
  try( ZipOutputStream zipFile=new ZipOutputStream(new FileOutputStream(zipFileName));
    FileInputStream fis=new FileInputStream(DIR+fileName);
    )
    {
            zipFile.putNextEntry(new ZipEntry(zipFileName));
            int lenRead=0;
            while((lenRead=fis.read(buffer))>0){
             zipFile.write(buffer, 0, lenRead);
            }
    }
  catch(Exception e){
   System.out.println("Eccezione: "+e);
   System.out.println("Eventuali eccezioni soppresse");
   for(Throwable t: e.getSuppressed()){
    System.out.println(t);
   }
  }
 }
}


giovedì 28 novembre 2013

Tomcat 7 personalizzare parametri allo start up

Per modificare dei parametri specifici per un singolo Tomcat (es per cambiare il path oppure per definire una variabile di utilità) occorre modificare lo script startup.bat inserendo all'inizio istruzioni di questo tipo. Qui cambiamo la CATALINA_HOME, inseriamo un percorso diverso dallo standard nel path e definiamo una variabile di ambiente valida solo per questo tomcat senza definirla sul S.O.:


set CATALINA_HOME=d:\prove\apache-tomcat-7.0.39
set path=d:\miaDirectory;%path%
set @TESTVARIABILE=c:\pippo 

sabato 23 novembre 2013

Tomcat 7 settare connessione HTTPS

In questo post vediamo come:
  1. Creare un certificato per l'https;
  2. Visionare le caratteristiche del certificato;
  3. Configurare Tomcat 7 in modo da poter rispondere in https.
CREARE UN CERTIFICATO PER L'HTTPS

 Per effettuare questa operazione si utilizza la JDK 1.6, in particolare il programma keytool.
L'opzione -keystore consente di specificare dove creare il file. Attenzione è obbligatorio specificare un nome di file; va bene anche se non esistente, l'importante è che non sia  una directory la procedura va in errore dicendo "Errore keytool: java.lang.Exception: Il file keystore esiste ma Þ vuoto: c:\lav\certificati"

Da cmd:

C:\lav\ApplicationServers\apache-tomcat-7.0.23\bin>keytool -genkey -alias carlo
-keyalg RSA -keystore c:\lav\certificati\certificato.txt
Immettere la password del keystore:
Immettere nuovamente la nuova password:
Specificare nome e cognome
 [Unknown]:  MARIO BREGA
Specificare il nome dell'unitÓ aziendale
 [Unknown]:  AZIENDA ABC
Specificare il nome dell'azienda
 [Unknown]:  AZIENDA TEST
Specificare la localitÓ
 [Unknown]:  ROMA
Specificare la provincia
 [Unknown]:  RM
Specificare il codice a due lettere del paese in cui si trova l'unitÓ
 [Unknown]:  IT
Il dato CN=MARIO BREGA, OU=AZIENDA ABC, O=AZIENDA TEST, L=ROMA, ST=RM, C=IT Þ co
rretto?
 [no]:  s

Immettere la password della chiave per <carlo>
        (INVIO se corrisponde alla password del keystore):


VISIONARE LE CARATTERISTICHE DEL CERTIFICATO

Sempre utilizzando la keytool con l'opzione -list e specificando il keystore è possibile visionare le caratteristiche del certificato appena creato:


C:\lav\ApplicationServers\apache-tomcat-7.0.23\bin>keytool -list -keystore c:\la
v\certificati\certificato.txt
Immettere la password del keystore:

Tipo keystore: JKS
Provider keystore: SUN

Il keystore contiene 1 entry

carlo, 23-nov-2013, PrivateKeyEntry,
Impronta digitale certificato (MD5): F5:F9:15:AB:98:31:2D:19:C3:65:5C:EF:EA:7E:4
8:B1


CONFIGURARE TOMCAT7 IN HTTPS

Per configurare Tomcat7 in modo da essere raggiungibile in HTTPS con il certificato appena creato è sufficiente agire sul file server.xml presente nella directory conf dell'application server.
Bisogna scommentare il nodo Connector dove troviamo il commento:
Define a SSL HTTP/1.1 Connector on port 8443 e modificarlo nel nostro caso così:

 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" keystorePass="xxxx" keystoreFile="c:\lav\certificati\certificato.txt "
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />


aggiungendo le opzioni keystoreFile e keystorePass.

Per testare il tutto è sufficiente andare via browser all'indirizzo https://localhost:8443. Il certificato ovviamente non è trusted e quindi dovremmo aggiungere una eccezione di sicurezza al browser per accettarlo.

mercoledì 20 novembre 2013

Passare più di 9 parametri ad un file .bat

Se passiamo più di 9 parametri ad un .bat ci sono dei problemi.
Infatti scrivendo %10 in realtà prende il parametro 1 (%1) e poi vede uno zero.
Per gestire più parametri occorre usare l'operatore shift che trasla la lista di parametri.
Nell'esempio riportato sotto vogliamo passare 11 parametri e quindi, dopo aver letto il parametro 9,con un doppio shift "perdiamo" i valori 1 e 2 e quindi i valori %8 e %9 letti dopo saranno il decimo e undicesimo parametro inviato.
L'esempio seguente scrive questi parametri su di un file txt.

set arg1=%1
set arg2=%2
set arg3=%3
set arg4=%4
set arg5=%5
set arg6=%6
set arg7=%7
set arg8=%8
set arg9=%9
shift
shift
set arg10=%8
set arg11=%9
set
echo Utente %arg1% ci invia i parametri %arg2% %arg3% %arg4% %arg5% %arg6% %arg7% %arg8% %arg9% %arg10% %arg11% > risultato.txt


lunedì 18 novembre 2013

Java invocare bat file passando parametri

Supponiamo di voler invocare un semplic bat di questo tipo:

echo %1 %2
echo Ciao %1 %2 > pippo.txt

Quindi un bat che prende in input dei parametri e li scrive su un file (creandolo ex novo), in un path RELATIVO rispetto alla posizione del path.

Via java è possibile utilizzare la seguente istruzione:

Runtime.getRuntime().exec("cmd /c start  C:\\excel\\test.bat ciao sam");


E in effetti funziona ma il file non viene creato nella directory relativa c:excel bensì in quella dove stiamo eseguendo il nostro pgm Java.

Non sono riuscito a capire come fare (sicuramente ci deve essere un modo) per fare in modo che non scrivesse il file nel percorso relativo al pgm Java ma inutilmente.
Ho provato anche a fare una cosa del tipo:

System.setProperty("user.dir","c:\\excel");

ma niente da fare.

Per risolvere ho utilizzato la libreria commons-exec-1.1.jar.

DefaultExecutor df=new DefaultExecutor();
df.setWorkingDirectory(new File("c:\\excel"));
CommandLine cl=new CommandLine("c:\\excel\\test.bat");
cl.addArgument("uno");
cl.addArgument("due");
df.execute(cl)

Si noti che se si commenta il rigo 2 (il setWorkingDirectory) torniamo alla situazione precedente, mentre se non si specifica nel CommandLine il percorso assoluto e si mette quello relativo comunque non funziona (nonostante abbia settata la working directory) e da proprio errore lamentando la mancanza del file bat.