venerdì 19 luglio 2013

Trim in javascript

Per effettuare il trim di una stringa Javascript non ha funzioni built in.
Si può utilizzare la seguente funzione


function trim(s)
{ 
   return s.replace(/^\s+|\s+$/g, ''); 
}



Per testarla scrivi un testo e premi il pulsante, il testo trimmato è racchiuso tra i caratteri "*"


lunedì 15 luglio 2013

Rilanciamento eccezioni con "type-checking" inclusivo

Questa feature introdotta con la Java 7 e ben spiegata nel sito oracle (http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html#rethrow) consente di rilanciare eccezioni specifiche senza dover utilizzare la generica Exception.
Il compilatore infatti a Runtime è in grado di capire di quale eccezione si tratta.
Vediamo un esempio:


public class Exceptions {
   static class Eccezione1 extends Exception { }
   static class Eccezione2 extends Exception { }
   public static  void rethrowException(String exceptionName) throws Eccezione1,Eccezione2 {
     try {
      switch(exceptionName){
      case "uno":
       throw new Eccezione1();
      case "due":
      throw new Eccezione2();
      default:
       System.out.println("Nessuna eccezione");
      
      }
      
     } catch (Exception e) {
       throw e;
     }
   }
}


Nelle versioni precedenti di Java saremmo stati costretti a mettere nel throws Exception, adesso invece possiamo rilanciare le nostre eccezioni specifiche.


mercoledì 10 luglio 2013

Content is not allowed in prolog

Questo errore generico si verifica durante la lettura di un xml, il motivo è che c'è uno spazio (o comunque un qualche carattere, prima dell'inizio del tag  <?xml

sabato 22 giugno 2013

Validazione nel marshalling di un xml

Utilizzando JAXB tipicamente quando effettuiamo l'operazione di lettura dall'xml per popolare i nostri oggetti di business (UNMARSHALLING), si può abilitare la validazione in questo modo:


JAXBContext context=JAXBContext.newInstance("it.esempio");
Unmarshaller um= context.createUnmarshaller();
um.setValidating(true);


Nel caso inverso però (il cosiddetto marshalling) non è disponibile questa feature.
Quindi bisogna utilizzare il seguente costrutto:

Item item=....
JAXBContext context=JAXBContext.newInstance("it.esempio");
Marshaller m= context.createMarshaller();
Validator v=context.createValidator();
v.validate(item);
m.marshal(item,new FileOutputStream("newItem.xml");

domenica 16 giugno 2013

XML Signature

Per la firma digitale di un xml sono disponibili 3 modalità:

ENVELOPING SIGNATURE

L'oggetto da firmare è racchiuso all'interno del contenitore della firma.
Un esempio (preso dal sito Microsoft):

<?xml version="1.0" encoding="UTF-8"?>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
  <ds:SignedInfo>
    <ds:CanonicalizationMethod 
         Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
    <ds:SignatureMethod 
         Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
    <ds:Reference URI="#obj">
      <ds:DigestMethod 
          Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
      <ds:DigestValue/>
    </ds:Reference>
  </ds:SignedInfo>
  <ds:SignatureValue/>
  <ds:Object Id="obj">Hello, World!</ds:Object>
</ds:Signature>


ENVELOPED SIGNATURE

Al contrario dell'enveloping in questo caso è l'oggetto che al suo interno ha un nodo firma. Se ci si pensa è una soluzione più vicina al modello che abbiamo in mente noi quando parliamo di firmare un documento, la firma diventa un attributo del documento.
Sempre dal sito Microsoft un esempio molto calzante, che fa riferimento proprio ad un oggetto di tipo lettera:

<Letter>
   <Return-address>address</Return-address>
   <To>You</To>
   <Message>msg body</Message>
   <From>
      <ds:Signature xmlns:ds="&ds;">
         <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm=
                "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            <ds:SignatureMethod Algorithm=
                "http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
            <ds:Reference URI="">
               <ds:Transforms>
                  <ds:Transform Algorithm="&enveloped;">
                  </ds:Transform>
               </ds:Transforms>
               <ds:DigestMethod Algorithm="&digest;"/>
               <ds:DigestValue></ds:DigestValue>
           </ds:Reference>
         </ds:SignedInfo>
         <ds:SignatureValue/>
      </ds:Signature>
   </From>
   <Attach>attachement</Attach>
</Letter>
DETACHED SIGNATURE In questo caso la firma è esterna al documento, può essere in un file separato oppure possono comparire entrambe nello stesso file ma come elementi "fratelli" separati:


<internally-detached>
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
      <ds:CanonicalizationMethod 
         Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
      <ds:SignatureMethod 
         Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
      <ds:Reference URI="#data">
        <ds:DigestMethod 
          Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
        <ds:DigestValue/>
      </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue/>
  </ds:Signature>

  <document Id="data">
     <title>title</title>
     <author>writer</author>
     <date>today</date>
     <content>
        <para>First paragraph</para>
        <para>Second paragraph</para>
     </content>
  </document>
</internally-detached>


sabato 15 giugno 2013

Note sugli Handlers

Gli Handlers possono essere di 2 tipi:

  • SOAPHandler , che implementano l'interfaccia java.xml.ws.handler.SOAPHandler e che hanno accesso sia al payload del messaggio che alla sezione header e a quella degli attachments;
  • LogicalHandler, che implementano l'interfaccia javax.xml.ws.handler.LogicalHandler e che hanno accesso solo al payload del messaggio.
Gli handler sono dichiarati in un file xml, di solito denominato handler-chain.xml (ma possiamo chiamarlo come vogliamo) .
L'ordine di esecuzione cambia a seconda se il messaggio è in uscita o in entrata.
In un messaggio in entrata (incoming message) vengono eseguiti prima i SOAPHandler e poi i logical handler (nell'oridine inverso stabilito nel file xml!!).
In un messaggio in uscita (outgoing message) invece sono prima coinvolti i LogicalHandler e poi i SOAPHandler(nell'ordine stabilito nel file handler-chain.xml).
E' possibile anche filtrare l'esecuzione degli handler secondo determinate condizioni, in particolare nel file handler-chain.xml, prima della lista degli handler, si possono filtrare:

  1. SERVIZI con alcuni name pattern usando l'elemento   javaee:service-name-patter;
  2. PORTE utilizzando javaee:port-name-pattern;
  3. PROTOCOLLI DI BINDING specifici inserendo l'elemento javaee:protocol-bindings

venerdì 14 giugno 2013

Stampare variabili di ambiente

Per avere una lista completa delle variabili d'ambiente del pc:


Map map= System.getenv();
   Set chiavi= map.keySet();
   for(String s: chiavi){
    System.out.println("Chiave: "+s+" Valore: "+map.get(s));
   }