Archive

Archive for the ‘Java’ Category

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: , ,

Installare Eclipse 3.4 su Ubuntu 8.10

March 12th, 2009 Nicola 4 comments

Scaricare l’ultima release disponibile su www.eclipse.org. Per esempio:

eclipse-jee-ganymede-SR2-linux-gtk.tar.gz

scompattate il tag.gz dove volete posizionare eclipse. Per esempio in /opt. Assicuratevi che tutti i permessi siano giusti.

sudo chmod 777 /opt
cd /opt
tar -xvzf eclipse-jee-ganymede-SR2-linux-gtk.tar.gz

Provate a lanciarlo:
cd eclipse
./eclipse

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: , ,