Archive

Posts Tagged ‘Java’

java, sshtools, knownhost e windows

March 26th, 2009 Nicola No comments

Sto cercando di utilizzare sshtool http://sourceforge.net/projects/sshtools/ per creare un client java per scaricare dei file via sFTP.

sshtools è molto semplice da usare, e almeno per quel che mi riguarda funziona benissimo. C’è solo un piccolo problema per quel che riguarda Windows, e dove lui posiziona la lista degli knowhosts.

Su linux il file si trova in /home/nicola/.ssh/known_hosts. Su windows, questo file si trova… insomma… è un pò ovunque. Ogni applicazione fa un pò come gli pare.

Su questo sito ho trovato un pò di chiarezza: http://www.jfitz.com/tips/ssh_for_windows.html. Per esempio:

PuTTY inserisce la lista degli host nel file di registro:

HKEY_CURRENT_USER->Software->SimonTatham->PuTTY->SshHostKeys

Anche WinSCP lo fa, ma in u’altra chiave:

HKEY_CURRENT_USER->Software->Martin Prikryl->WinSCP 2->SshHostKeys

Altri programmi usano directory e file diversi.

sshtools è convinto di essere su una macchina linux, basta andare a spulciare la classe:

ConsoleKnownHostsKeyVerification

e vedere il metodo

public ConsoleKnownHostsKeyVerification() throws InvalidHostFileException {

super(new File(System.getProperty("user.home"),
".ssh" + File.separator + "known_hosts").getAbsolutePath());

}

Va a cercare il file host esattamente dove ci aspetterebbe di trovarlo su una macchina linux.

Quindi, su una macchina windows, ogni volta che eseguo un collegamento, mi viene fatta sempre la domanda:

Do you want to allow this host key? [Yes|No|Always]:

Domanda a cui ovviamente bisogna rispondere Yes. Io per ovviare a questo inconveniente ho messo mano alle classi originali, a malincuore. Ed ho modificato il metodo getResponse della classe ConsoleKnownHostsKeyVerification del package com.sshtools.j2ssh.transport, in questo modo:

private void getResponse(String host, SshPublicKey pk) throws InvalidHostFileException, IOException {

allowHost(host, pk, false);

}

Non ho tempo di trovare una maniera migliore per ovviare la cosa.

Java e HttpURLConnection: upload di un file

March 24th, 2009 Nicola No comments

Partiamo dall’RFC 1867, che definisce le modalità con cui eseguire un upload verso una applicazione web.

http://www.ietf.org/rfc/rfc1867.txt

Non è il Signore del Anelli, ma è comunque una lettura interessante (e molto più corta), se vi interessa l’argomento.
Un piccolo sunto:

Nel paragrafo 6 del documento c’è un esempio che spiega quello che faremo poi in java. Questa è una form presente in una pagina HTML:

<FORM ACTION="http://server.dom/cgi/handle"
ENCTYPE="multipart/form-data"
METHOD=POST>
What is your name? <INPUT TYPE=TEXT NAME=submitter>
What files are you sending? <INPUT TYPE=FILE NAME=pics>
</FORM>

A fronte di questa form, in cui viene digitato “Joe Blow” alla domanda “What is your name” e file1.txt alla domanda”What files are you sending”, il client (browser o java nel nostro esempio) deve passare le seguenti informazioni:

Content-type: multipart/form-data, boundary=AaB03x

--AaB03x
content-disposition: form-data; name="field1"

Joe Blow
--AaB03x
content-disposition: form-data; name="pics"; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--AaB03x--

La variabile denominata boundary serve per delimitare il contenuto del file. Deve essere una stringa unica all’interno del MIME. Quando un post viene eseguito da un browser, è lui stesso che si preoccupa di questo.

Se l’utente avesse specificato anche una seconda immagine, ad esempio file2.gif, il cliente avrebbe dovuto comporre:

Content-type: multipart/form-data, boundary=AaB03x

--AaB03x
content-disposition: form-data; name="field1"

Joe Blow
--AaB03x
content-disposition: form-data; name="pics"
Content-type: multipart/mixed, boundary=BbC04y

--BbC04y
Content-disposition: attachment; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--BbC04y
Content-disposition: attachment; filename="file2.gif"

Content-type: image/gif
Content-Transfer-Encoding: binary

...contents of file2.gif...
--BbC04y--
--AaB03x--

Vengono usato due boundary, uno interno per delimitare i due file, ed uno esterno per delimitare il contenuto della form.
Quindi, attraverso le stringhe Content-disposition e Content-Type specifichiamo, di volta in volta, che tipo di dati stiamo passando nella chiamata POST, se campi, testo, immagini ecc…

Ecco come inviare, attraverso un client Java e la classe HttpURLConnection un file di testo.  Nel mio esempio l’url chiamato è una servlet:

HttpURLConnection conn = null;
DataOutputStream dos = null;
DataInputStream inStream = null;
String exsistingFileName = "C:\\spinea.txt";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;

//definisco un boundary
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";

//Url da chiamare
String urlString = "http://localhost:8080/TestUpload/servletupload";

try {

// Apro una connessione alla mia servlet
URL url = new URL(urlString);
// Apro una conessione HTTP
conn = (HttpURLConnection) url.openConnection();
// Imposto alcuni parametri per la connessione
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
//Il Content-Type della form
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

//Apro lo streaming verso la servlet
dos = new DataOutputStream( conn.getOutputStream() );

//Scrivo la prima riga
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"upload\";" + " filename=\"" + exsistingFileName +"\"" + lineEnd);
dos.writeBytes(lineEnd);

//Leggo il file di testo che devo inviare, e lo metto in un buffer.
//Nell'esempio qui sotto, viene definito un maxBufferSize,
//per limitare la grandezza del file che viene inviato.

int maxBufferSize = 1*1024*1024;
FileInputStream fileInputStream = new FileInputStream( new File("/home/nicola/documenti/prova.txt") );

//Creo un buffer con dimensione minima fra quella del file e quella impostata come massima.
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];

// leggo il file e invio i byte alla servlet
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {

dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);bytesRead = fileInputStream.read(buffer, 0, bufferSize);

}

//Chiudo il file
fileInputStream.close();
//Invio il boundary per delimitare la fine del file
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

//A questo punto devo rimanere in attesa della risposta della servlet, perchè altrimenti il file non sarà caricato
try {

inStream = new DataInputStream ( conn.getInputStream() );
String str;
while (( str = inStream.readLine()) != null) {

System.out.println("Server response is: "+str);
System.out.println("");

}
inStream.close();

}

catch (IOException ioex) {

System.out.println("From (ServerResponse): "+ioex);

}

}
//Seguono tutti i vari catch
catch (MalformedURLException ex) {

System.out.println("From ServletCom CLIENT REQUEST: " + ex);

}
catch (IOException ioe) {

System.out.println("From ServletCom CLIENT REQUEST:" + ioe);

}
catch (Exception ex) {

System.out.println("Eccezzione generica: " + ex);

}

Categories: Java, Web Tags: , , , ,

Eclipse 3.4 su Ubuntu: exception thrown while VM is initializing

March 13th, 2009 Nicola 1 comment

Mi dava questo errore in fase di lancio:

nicola@giacomino:/opt/eclipse$ ./eclipse
LOG: [0xb7f4a6b0] exception thrown while VM is initializing:
LOG: [0xb7f4a6b0] NULL: java.lang.Object
LOG: [0xb7f4a6b0] Aborting...
Aborted

spulciando nei forum di ubuntu ho capito il problema: ho due vm installate, e quella di default non era quella della sun. Per verificare una cosa del genere basta digitare: sudo update-alternatives –config java

Ho ottenuto il seguente risultato:

nicola@giacomino:/opt/eclipse$ sudo update-alternatives --config java

Ci sono 2 alternative che forniscono `java'.

Selezione Alternativa
-----------------------------------------------
1 /usr/lib/jvm/java-6-sun/jre/bin/java
*+ 2 /usr/lib/jvm/java-6-cacao/jre/bin/java

Premi invio per mantenere il default[*], o inserisci il numero da selezionare:1
Viene usato "/usr/lib/jvm/java-6-sun/jre/bin/java" per fornire "java".

Ho selezionato 1 e eclipse è partito correttamente.

Categories: Java, Linux Tags: , ,

Leggere i dati da un foglio Excel in Java

December 9th, 2008 Nicola No comments

Java e Excel… mah…

Prendete il foglio Excel, compilate una tabella ed assegnatele un nome:

excel21

A questo punto potete chiudere Excel e disinstallarlo. Non serve infatti che Excel sia installato sulla macchina in cui si trova il file che abbiamo appena creato.

Occorre però essere in ambiente Windows, perchè dobbiamo creare un ODBC verso quel file, utilizzando il driver per Excel della Microsoft. Se l’ODBC si chiama TESTODBC, il seguente codice:

Connection con;
Statement stmt;
ResultSet rs;try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:TESTODBC", "", "");
stmt = con.createStatement();

rs = stmt.executeQuery("SELECT * FROM TABELLAODBC");

while (rs.next()) {
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));
}

}
catch(SQLException e) {
System.out.println("Ops... " + e);
}
catch (ClassNotFoundException cl) {
System.out.println("Ops..." + cl);
}

Restituisce il risultato:

Mario
Bianchi
2
Mario
Rossi
3

Categories: Database, Java, Microsoft Office Tags: , ,

Eclipse e Tomcat, come integrarli.

November 10th, 2008 Nicola 13 comments

Ecco come utilizzare una installazione di Tomcat presente sulla macchina, per creare progetti Web basati sulla tecnologia jsp/servlet utilizzando Eclipse.

In questo esempio utilizzo Tomcat 5.5 e Eclipse 3.4, ma il modus operandi è il medesimo anche per versioni più vecchie.

Come prima cosa occorre creare un progetto Server:

Poi scegliere la versione del server installata sulla macchina, nel mio caso Tomcat 5.5:

E alla fine scegliere la directory di installazione di Tomcat:

A questo punto, se tutto è andato bene, nel Project Explorer dovremmo trovarci il progetto Server, contenente tutti i file di configurazione del nostro server Tomcat. In basso invece dovremmo trovare la tab Server, il punto di accesso per tutte le operazioni sul server:

Con un doppio click possiamo accedere alla configurazione di Tomcat, e possiamo decidere, per esempio, se usare i metadati del workspace, o se prendere il controllo direttamente dell’installazione di Tomcat. Eclipse può quindi gestire separatamente la configurazione di Tomcat, non andando a modificare i file di configurazione che avete magari già modificato sulla vostra installazione, magari per altre applicazioni (collegamenti JNDI ecc). Ecco il pannello delle opzioni:

Eclipse lancia tomcat in autonomia, quindi se il server è già attivo sulla vostra macchina, magari gestito come servizio, ricordatevi di disattivarlo, altrimenti segnalerà che la porta 8080 è già occupata. Se è tutto corretto possiamo fare una prova, e far partire Tomcat verificando dalla console che sia andato tutto bene.

A questo punto creiamo un progetto Web Dinamico, come lo chiama Eclipse:

Nella seconda videata, ci viene chiesto, oltre al nome del Project, anche di quale server vogliamo utilizzare il runtime. In questo esempio, essendoci definito solo Tomcat 5.5 viene proposto quello:

La parte di configurazione è finita. Se siamo arrivati più o meno a questo punto:

allora siamo pronti per fare JSP o Servlet.

In realtà ancora non siamo pronti per creare una serlvet. Se proviamo a farlo:

otteniamo una classe a cui mancano alcuni riferimenti, più in particolare al runtime del server che stiamo usando. Non abbiamo quindi per esempio la classe HttpServlet (non abbiamo javax.servlet.*):

Occorre quindi importare il runtime del server sotto forma di libreria:

Questo è il risultato:

Da notare che vengono importati tutti i jar all’interno della common di tomcat. Librerie esterne (parser xml, mail, crittografia ecc…) possono essere posizionate lì dentro per essere disponibili nelle servlet e nelle JSP della nostra applicazione.