venerdì 26 aprile 2013

Sql Server creare un database da file .bak

Con Sql Server 2008 per ripristinare su una istanza di db il back up di un back up (file con estensione .bak) si procede in questo modo:
Per prima cosa dal nodo database con il tasto destro del mouse selezionare l'opzione "Ripristina file e datagroup".

Dalla schermata che appare specificare il nome del db di destinazione (può essere già esistente o meno, nel caso non lo sia sarà generato da sql server).

Una volta specificato il database di destinazione, il dispositivo di origine (il file .bak) e selezionata la check box in basso, prima di procedere al back up occorre abilitare le impostazioni di sovrascrittura cliccando sulla sinistra in opzioni e quindi selezionando "Sovrascrivi il database esistente /WITH REPLACE)


Nel caso in cui non si avesse questa accortezza il back up andrà in errore dandoci un messaggio del tipo: "Il set di backup include un backup di un database diverso dal "nome_db" esistente"

giovedì 25 aprile 2013

Web Service name,portName e serviceName

Tramite annotation è possibile specificare e personalizzare il wsdl.
In particolare l'annotazione @javax.jws.WebService consente di impostare:
  • serviceName - il nome del servizio Web, per capirci quello che si trova come attributo del nodo padre "definitions";
  • name - l'attributo name del nodo portType (sezione contenente i dettagli generali delle operation esposte);
  • portName - l'attributo name del nodo binding (sezione contenente i dettagli specifici delle operation esposte).

mercoledì 24 aprile 2013

Sql Server express impostare la porta 1433 come default TCP/IP

Per poter raggiungere Sql Server tramite TCP/IP bisogna abilitare la funzionalità da Sql Server Configuration Manager.


Questo tuttavia non basta, di default infatti il server prende una porta casuale per cui si può incappare in problemi di connessione quando si prova a connettersi tramite datasource esterno (nel mio caso datasource definito su Tomcat).
E' necessario quindi andare con il tasto destro su TCP/IP poi su proprietà e quindi sul tab "Indirizzi IP" e quindi settare la porta nella sezione denominata "IP ALL".
A questo punto si può restartare il db e modificare il datasource in questo modo:



<?xml version="1.0" encoding="UTF-8"?>

<Context>

  <Resource name="jdbc/gianospro"
  auth="Container"
  type="javax.sql.DataSource"
  factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
  testWhileIdle="true"
  testOnBorrow="true"
  testOnReturn="false"
  validationQuery="SELECT 1"
  validationInterval="30000"
  timeBetweenEvictionRunsMillis="30000"
  maxActive="100"
  minIdle="10"
  maxWait="10000"
  initialSize="10"
  removeAbandonedTimeout="60"
  removeAbandoned="true"
  logAbandoned="true"
  minEvictableIdleTimeMillis="30000"
  jmxEnabled="true"
  jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
  username="root"
  password="admin"
  driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
  url="jdbc:sqlserver://127.0.0.1:1433;databaseName=nome_db"/>

</Context>



Abilitare telnet su Windows 7

Di default non è abilitato il servizio di telnet in Windows 7.
Per abilitarlo occorre andare in Pannello di controllo / Programmi /Attivazione/Disattivazione funzioni di Windows.
Nel dettaglio:




mercoledì 17 aprile 2013

Salvare un file in percorso temporaneo

Per utilizzare un percorso temporaneo è molto utile la variabile java.io.tmpdir, definita così

"java.io.tmpdir is a standard Java system property which is used by the disk-based storage policies. It determines where the JVM writes temporary files, including those written by these storage policies (see Section 4 and Appendix A.6). The default value is typically "/tmp" on Unix-like platforms."

 L'unica piccola seccatura è che a seconda del sistema operativo o anche della singola distribuzione nel mondo Linux il percorso può avere o non avere lo slash finale.

Di solito uso questo metodo per ottenere il percorso di un file temporaneo:


private static String getFileTempName(String nomeFile){
 StringBuffer sb=new StringBuffer();
 String td=System.getProperty("java.io.tmpdir");
 sb.append(System.getProperty("java.io.tmpdir"));
 if ( !(td.endsWith("/") || td.endsWith("\\")) ){
  sb.append(File.separator);
 }
 sb.append(nomeFile);
 log.debug("File temporaneo di salvataggio: "+sb.toString());
 return sb.toString();
 }

venerdì 12 aprile 2013

Web Service gestire zip file

Sotto il codice di realizzazione di un Web Service con un operation che, data in input una directory torna lo zip di tutti i file presenti dentro la directory stessa.
Tralasciando il codice di definizione del Web Service (si tratta di annotare una classe con @WebService e utilizzare @MTOM per ottimizzare il passaggio dati) il metodo è il seguente:

public DataHandler provaDownloadAllegati(String dir) throws Exception
 {
  
 File f=new File(dir);
 File filezip=new File(dir+File.separator+"result.zip");
 ZipOutputStream out = new ZipOutputStream(new FileOutputStream(filezip));
 if(f.isDirectory()){
   String[] fileNames=f.list();
   for(String s: fileNames)
   {
    log.debug("Zippo file "+s);
    if("result.zip".equals(s)){
     continue;
    }
    byte[] b=FileUtil.load(dir+File.separator+s);
    ZipEntry ze=new ZipEntry(s);
    out.putNextEntry(ze);
    out.write(b);
    out.closeEntry();
    
   }
   out.close();
   DataHandler retVal= new DataHandler(new FileDataSource(new File(dir+File.separator+"result.zip")));
   return retVal;
 }
 else
 {
   throw new Exception("Specificare path corretto directory");
 }
  
 }



Ho provato anche ad evitarmi il salvataggio su File System, tornando quindi solo lo stream, ma, pur tornandomi il dato con la size corretta, purtroppo lo stream risulta sempre corrotto, quindi non riesco ad aprirlo.
Posto il codice, non si sa mai se qualcuno ci sia riuscito


......
 ByteArrayOutputStream bos = new ByteArrayOutputStream();
 ZipOutputStream out = new ZipOutputStream(bos);
for(String s:fileNames){
         byte[] allegatoBytes=getBytesFromFileName(dir+file.separator+s);
         out.putNextEntry(new ZipEntry(s));
         out.write(allegatoBytes);
            out.closeEntry();
         }
  return bos.toByteArray();
......

Il metodo getBytesFromFileName è il seguente:


.....
 FileInputStream fin=new FileInputStream(new File(name));
 byte readBuf[] = new byte[512*1024];
   
 try { 
 ByteArrayOutputStream bout = new ByteArrayOutputStream();    
 int readCnt = fin.read(readBuf);
 while (0 < readCnt) {
         bout.write(readBuf, 0, readCnt);
         readCnt = fin.read(readBuf);
 }     
 fin.close();
 return bout.toByteArray();
}
catch(Exception ex ){
.....gestire eccezione......
}


mercoledì 3 aprile 2013

Ant errore "com.sun.tools.javac.Main is not on the classpath. Perhaps JAVA_HOME does not point to the JDK."

Sono incappato in questo errore configurando un nuovo pc.
L'errore avveniva in fase di compilazione del build.xml di ant.
Per risolvere il problema da Eclipse  (trattasi di encoding non riconosciuto) occorre inserire l'opzione
-Dfile.encoding=Cp1252
Nel tab JRE , sezione VM arguments dell' "External Tool Configurations" dell'ant.