mercoledì 31 ottobre 2012

Elencare tutti i db presenti

Per trovare tutti i db presenti su un Sql Server


SELECT name 
    FROM master..sysdatabases 
    ORDER BY name

martedì 23 ottobre 2012

Java ottenere il content-type di un file

Un metodo Java per ottenere il content-type di un file dato il nome.
Esiste una funzione ad hoc nella jdk, nella classe astratta java.net.URLConnection, denominata guessContentTypeFromName che prende in input una Stringa.
Solo che non funziona con alcuni tipi (es .doc,.xls) anche abbastanza comuni.

public static String getContentTypeFromFileName(String s){
  String retVal="";
  if(!(s==null || s.trim().equals(""))){
   
  int punto=s.indexOf(".");
  String extension=s.substring(punto);
  if(".pdf".equals(extension)){
   retVal="application/pdf";
  }
  else if(".doc".equals(extension)){
   retVal="application/msword";
  }
  else if(".docx".equals(extension)){
   retVal="application/vnd.openxmlformats-officedocument.wordprocessingml.document";
  }
  else if(".csv".equals(extension)){
   retVal="text/csv";
  }
  else if(".xls".equals(extension)){
   retVal="application/vnd.ms-excel";
  }
  else if(".xlsx".equals(extension)){
   retVal="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
  }
  else if(".ppt".equals(extension)){
   retVal="application/vnd.ms-powerpoint";
  }
  else if(".pptx".equals(extension)){
   retVal="application/vnd.openxmlformats-officedocument.presentationml.presentation";
  }
  else
  {
   if("".equals(retVal)){
    retVal=URLConnection.guessContentTypeFromName(s);
   }
  }
  }
  return retVal;
 }


giovedì 18 ottobre 2012

Hash MD5 con Sql Server

In sql server esiste la funzione HashBytes che prende in input 2 parametri:
  • L'algoritmo usato;
  • La Stringa di cui calcolare l'hash.
Per cui scrivendo

select HashBytes('MD5','carlo')
>> 0x6E6BC4E49DD477EBC98EF4046C067B5F

Abbiamo il risultato in bytes, per ottenere invece il valore in varchar non funziona il classico metodo CONVERT dell'sql  ma bisogna utilizzare la funzione fn_varbintohexstr definita nel master.


select SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'ciao')), 3, 32);
>> 6e6bc4e49dd477ebc98ef4046c067b5f

Si noti che è fondamentale il passaggio per la funzione fn_varbintohexstr altrimenti il substring si applicherebbe a dei bytes e non a delle stringhe con risultati errati.
Esempio:


select substring(HashBytes('MD5','ciao'),3,32); 
>> 0xC4E49DD477EBC98EF4046C067B5F


mercoledì 17 ottobre 2012

Configurare filtro ISAPI su IIS 7.5 per Tomcat 7.0

L'operazione di configurazione del filtro isapi  consente di avere IIS come Web Server e di delegare l'esecuzione di codice Java Server Side (servlet,jsp, etc.) direttamente a Tomcat.
Le  entità necessarie per questa configurazione sono:
  • isapi_redirect.dll  plug in per iis (scaricabili qui ) prestando attenzione alle versioni a 64 bit o 32 bit a seconda del sistema operativo;
  • workers.properties , file dove si indicano host e porte usate dai cosiddetti "workers";
  • uriworkermap.properties, file che effettua la mappatura URL-workers;
  • isapi_redirect.properties,  file che definisce la locazione dei file uriworkermap e workers così come il percorso del file di log e i livelli di log
Si noti che in versioni precedenti di IIS non esisteva la possibilità di specificare il file isapi_redirect.properties e era necessario inserire chiavi di registro sul S.O.

Esempio di file .reg per il registro di Windows


REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0]
"server_root"="C:\\connettore\\"
"extension_uri"="/jakarta/isapi_redirector.dll"
"worker_file"="c:\\connettore\\conf\\workers.properties"
"log_file"="c:\\connettore\\logs\\isapi_redirect.log" 
"worker_mount_file"="c:\\connettore\\conf\\uriworkermap.properties"
"log_level"="DEBUG"


Tale opzione è ancora possibile ma sconsigliata in quanto il meccanismo del file di properties è più flessibile.
La isapi_redirect.dll può essere messa in una qualsiasi directory del server.
In questo esempio si trova sotto c:\connettore e il sistema operativo è windows Server 2008 a 64 bit.

isapi_redirect.properties

extension_uri=/jakarta/isapi_redirect.dll
log_file=c:\connettore\logs\isapi.log
log_level=debug
worker_file=c:\connettore\conf\workers.properties
worker_mount_file=c:\connettore\conf\uriworkermap.properties

L' extension_uri indica il path all'extension dell'isapi redirect, il nome jakarta in questo caso dovrà essere il nome della directory virtuale definita sotto IIS.
Da IIS infatti, nel Web Site scelto, si crea tale directory virtuale e quindi si aggiunge il filtro isapi che punta al percorso del file system dove si trova la isapi_redirect.dll ( vedi qui per ulteriori dettagli).

workers.properties


worker.list=myWorker
worker.myWorker.port=8009
worker.myWorker.host=localhost
worker.myWorker.type=ajp13
Questi dati si riferiscono alla configurazione del Tomcat che vogliamo esporre.
La porta utilizzata è la porta del connettore AJP di Tomcat. Tale configurazione si trova nel file server.xml dentro la directory conf di Tomcat. Il valore 8009 è quello di default.

uriworkermap.properties


/myApp=myWorker
/myApp/*=myWorker

Dove myApp sarà il nome del nostro war dentro Tomcat.


A questo punto se tutto è andato a buon fine digitando http://NOME_SERVER/myApp si verrà ridirezionati direttamente alla porta 8080 di Tomcat (http://NOME_SERVER:8080/myApp ), ovviamente l'indicazione ella porta non comparirà più nell'url perchè il raccordo tra indirizzo e applicazione deployata sotto Tomcat è fatto dal  filtro ISAPI


sabato 6 ottobre 2012

Autocomplete con Jquery


In questo post vediamo come effettuare un autocompletamento utilizzando jquery e con la chiamata Ajax ad una classe Java per il recupero delle occorrenze.
La pagina html si compone di un form con 2 text box nome e cognome, digitando il cognome dal secondo carattere in poi parte la chiamata Ajax che suggerisce sotto la lista dei nominativi che iniziano con quelle lettere.
I nominativi proposti sono sotto forma di cognome/nome, alla selezione di ognuno di essi è invocato un metodo javascript che splitta la stringa e inserisce il nome nella casella di testo del nome e il cognome in quella del cognome.

Ho utilizzato jquery versione 1.3.2.

Il metodo autocomplete è il seguente:

 $("#cognome").autocomplete("data.jsp",{minChars: 2,onItemSelect: function(item) {
                var text = item.innerHTML;
                var splitResult=text.split("  ");
                var nom=splitResult[1];
                var cog=splitResult[0];
                document.getElementById("nome").value=nom;
                document.getElementById("cognome").value=cog;
                $("#testoProva").html(text);
            }});


Data.jsp è la pagina java che torna i dati in formato stringa, tra parentesi graffe si possono specificare varie proprietà del metodo, in questo caso la minLength che indica dopo quante lettere si dovrà effettuare la chiamata e l' onItemSelect che ci dice cosa fare una volta che dalla lista di proposte di nominativi se ne sceglie uno.

Di seguito incollo il codice

index.jsp
<html>
<head>
    <link href="css/jquery.autocomplete.css" rel="stylesheet" type="text/css"></link>
    <script src="js/jquery_1.3.2_min.js" type="text/javascript"></script>
    <script src="js/jquery.autocomplete.js"></script> 
    <style>
        input {
            font-size: 120%;
        }
    </style>
</head>
<body>

 <h3>
Nome</h3>
<input id="nome" name="nome" type="text" />
    <h3>
Cognome</h3>
<input id="cognome" name="cognome" type="text" />
     <div id="testoProva">
     
     </div>
<script>
       
            $("#cognome").autocomplete("data.jsp",{minChars: 2,onItemSelect: function(item) {
                var text = item.innerHTML;
                var splitResult=text.split("  ");
                var nom=splitResult[1];
                var cog=splitResult[0];
                document.getElementById("nome").value=nom;
                document.getElementById("cognome").value=cog;
                $("#testoProva").html(text);
            }});

        
       
    </script>
</body>
</html>


data.jsp

<%@page import="it.db.Caricamento"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.List"%>

<%
    
    Caricamento db = new Caricamento();
    
    String query = request.getParameter("q");
    
    List<String> nomi = db.getData(query);
   
    Iterator<String> iterator = nomi.iterator();
    while(iterator.hasNext()) {
        String nome = (String)iterator.next();
        out.println(nome);
    }
%>


Caricamento.java (classe che simula accesso al db)
 
package it.db;
import java.util.*;
public class Caricamento {
  private int totale;
     private String nomi = "Zegna  Mario Alberto,Zorro  Marco,Abate  Matteo,Abatino  Carlo,Sgarbi  Vittorio,Selvaggio  Mario";
     private List<String> nomiL;
     public Caricamento() {
         nomiL= new ArrayList<String>();
         StringTokenizer st = new StringTokenizer(nomi, ",");
          
         while(st.hasMoreTokens()) {
             nomiL.add(st.nextToken().trim());
         }
         totale = nomiL.size();
     }
      
     public List<String> getData(String query) {
         String nom= null;
         query = query.toLowerCase();
         List<String> matched = new ArrayList<String>();
         for(int i=0; i<totale; i++) {
             nom= countries.get(i).toLowerCase();
             if(nom.startsWith(query)) {
                 matched.add(nomiL.get(i));
             }
         }
         return matched;
     }
}