mercoledì 7 gennaio 2015

Internalizzazione con Struts 1.3

Con la vecchia versione di Struts per realizzare l'internazionalizzazione occorre:

1) definire nello struts-config.xml l'elemento message-resources
2) definire un package con i file di properties, tenendo conto che il parameter impostato al punto 1 dovrà puntare al nome del file di properties senza estensione nè localizzazione
3) caricare in sessione nella variabile org.apache.struts.Globals.LOCALE_KEY il locale prescelto

Esempio

definisco un package denominato org.common.i18

con dentro 3 files:
  • messages.properties;
  • messages_en.properties;
  • messages_it.properties
Ogni file ha una proprietà soltanto

welcome.message=Benvenuto (DEF) per il messages.properties
welcome.message=Benvenuto (EN)  per il messages_en.properties
welcome.message=Benvenuto (IT) per il messages_it.properties

Nello struts config definiamo il seguente elemento:


<message-resources key="localeBundle" parameter="org.common.i18.messages">
</message-resources>

La key serve ad individuare univocamente il bundle e quindi consente di definirne più di uno.

Sulla prima action chiamata dall'applicazione si setta il locale in questo modo:


request.getSession().setAttribute(Globals.LOCALE_KEY, request.getLocale());


Nella jsp occorre importare la taglib di struts


<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%> 


Per accedere alla proprietà è sufficiente quindi scrivere:


<bean:message key="welcome.message" bundle="localeBundle" />


sabato 15 novembre 2014

Primefaces combo con immagine

Primefaces (sto utilizzando la versione 3.5, ma la sintassi da utilizzare è la stessa nella  attuale 5.1)  consente agevolmente l'utilizzo di componenti web complessi, come ad esempio una combo in cui associamo una immagine per ogni elemento (esempio tipico per la scelta della lingua con la bandiera corrispondente).
Di seguito il codice utilizzato, prendendo spunto dallo showcase di PF.

POJO PER RAPPRESENTARE L'ELEMENTO DELLA COMBO


package it.test.managedBeans;

import java.io.Serializable;

public class Language implements Serializable {
 
 private static final long serialVersionUID = 442345384294917624L;
 private String code;
 private String descr;
 private String urlPath;
 
 public int hashCode() {
     return this.code.hashCode()+this.descr.hashCode()+this.urlPath.hashCode();
   }
 
 public boolean equals(Object o){
  if(o instanceof Language && o!=null) {
   Language l=(Language)o;
   
   if(l.getCode()!=null && l.getDescr()!=null 
&& l.getUrlPath()!=null && l.getCode().equals(this.code) && l.getDescr().equals(this.descr) 
&& l.getUrlPath().equals(this.urlPath)){
    return true;
   }
   else
   {
    return false;
   }
  }
  else
  {
   return false;
  }
 }
 public Language(){
  
 }
 public Language(String code,String descr,String urlPath){
  this.code=code;
  this.descr=descr;
  this.urlPath=urlPath;
 }
 public String getCode() {
  return code;
 }
 public void setCode(String code) {
  this.code = code;
 }
 public String getDescr() {
  return descr;
 }
 public void setDescr(String descr) {
  this.descr = descr;
 }
 public String getUrlPath() {
  return urlPath;
 }
 public void setUrlPath(String urlPath) {
  this.urlPath = urlPath;
 }
 
}


MANAGED BEAN

package it.test.managedBeans;
import it.dao.LanguageRetrievalDao;
import it.daoImpl.LanguageRetrievalDaoImpl;
import it.object.Language;
import it.util.Utility;
import java.util.List;
import java.util.Locale;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
@ManagedBean(name="languageLoader")
@SessionScoped
public class LanguageLoader {
 
 private  String locale = Locale.getDefault().getDisplayLanguage();

    public void setLocale(String locale1) {
      this.locale = locale1;
    }

    public synchronized String getLocale() {
      return locale;
    }
 
  private List listaLingue;
 
  private Language linguaSelezionata=null;
  @PostConstruct
     public void init() {
   try
   {
    
    LanguageRetrievalDao ldao=LanguageRetrievalDaoImpl.getInstance();
    this.listaLingue=ldao.getListaLinguaggi();
    Language loc=ldao.getLanguageByCode("it");
    this.locale=loc.getCode();
   this.linguaSelezionata=loc;
   }
   catch(Exception ex){
    Utility.aggiungiMessaggioErrore(ex.getMessage());
   }
  }

 public List getListaLingue() {
  return listaLingue;
 }

 public void setListaLingue(List listaLingue) {
  this.listaLingue = listaLingue;
 }

 public Language getLinguaSelezionata() {
  return linguaSelezionata;
 }

 public void setLinguaSelezionata(Language linguaSelezionata) {
  this.linguaSelezionata = linguaSelezionata;
 }
  

  
 public void prova(ActionEvent ev){
   
  Utility.aggiungiMessaggioInformativo("E' stato selezionato il valore "+this.linguaSelezionata.getDescr());
  this.setLocale(this.linguaSelezionata.getCode());
 
 }
 
 public void prova3(){
   
  Utility.aggiungiMessaggioInformativo("E' stato selezionato il valore "+this.linguaSelezionata.getDescr());
  this.setLocale(this.linguaSelezionata.getCode());
  Locale.setDefault(new Locale(this.linguaSelezionata.getCode()));
 
 }
}



I due metodi prova e prova3 sono invocati il primo ad un onchange della combo, l'altro invece è un metodo invocato da un actionlistener.

ESEMPIO XHTML CON EVENTO CHE SCATTA ALL'ONCHANGE


<html xmlns="http://www.w3c.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"  xmlns:f="http://java.sun.com/jsf/core" 
xmlns:ui="http://java.sun.com/jsf/facelets"   xmlns:p="http://primefaces.org/ui"  xmlns:fn="http://java.sun.com/jsp/jstl/functions">
<f:view contentType="text/html" locale="#{languageLoader.locale}">
<h:head >
</h:head>
<h:body> 
<h:form id="mainForm">
<br/>
<br/>
<br/>
 <p:growl id="msgs" showDetail="true"  />
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<p:selectOneMenu value="#{languageLoader.linguaSelezionata}"  var="immagine">
<f:converter converterId="myComboLanguageConverter"></f:converter>
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{languageLoader.listaLingue}" var="lingua"
itemLabel="#{lingua.descr}" itemValue="#{lingua}"/>
<p:ajax event="change" update="msgs"  
                            listener="#{languageLoader.prova3}" /> 
<p:column>
<p:graphicImage value="/images/lang/#{immagine.urlPath}" width="40" height="50"/>
</p:column>
<p:column>
#{immagine.code} - #{immagine.descr}
</p:column>
</p:selectOneMenu>
</h:form>
 </h:body>
 </f:view>
</html>


ESEMPIO XHTML CON EVENTO SCATENATO DA PRESSIONE DI BOTTONE


<html xmlns="http://www.w3c.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"  xmlns:f="http://java.sun.com/jsf/core" 
xmlns:ui="http://java.sun.com/jsf/facelets"   xmlns:p="http://primefaces.org/ui"  xmlns:fn="http://java.sun.com/jsp/jstl/functions">
<f:view contentType="text/html" locale="#{languageLoader.locale}">
<h:head >
</h:head>
<h:body> 
<h:form id="mainForm">
<br/>
<br/>
<br/>
 <p:growl id="msgs" showDetail="true"  />
<br/>
<br/>
<p:selectOneMenu value="#{languageLoader.linguaSelezionata}" id="combo1"  var="immagine">
<f:converter converterId="myComboLanguageConverter"></f:converter>
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{languageLoader.listaLingue}" var="lingua"
itemLabel="#{lingua.descr}" itemValue="#{lingua}"/>
<p:column>
<p:graphicImage value="/images/lang/#{immagine.urlPath}" width="40" height="50"/>
</p:column>
<p:column>
#{immagine.code} - #{immagine.descr}
</p:column>
</p:selectOneMenu>
<br/>
<p:commandButton actionListener="#{languageLoader.prova}" value="TEST"  update="msgs combo1"></p:commandButton>
<br/>
<br/>
<br/>
</h:form>
 </h:body>
 </f:view>
</html>


CONVERTER

Si noti che il converter si utilizza per trasformare l'oggetto in stringa e viceversa e non entra in gioco nella rappresentazione della combo stessa con le immagini ma negli eventi successivi al click del pulsante oppure al cambiamento della combo stessa.

package it.test.managedBeans;
import it.dao.LanguageRetrievalDao;
import it.daoImpl.LanguageRetrievalDaoImpl;
import it.object.Language;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
@FacesConverter("myComboLanguageConverter")
public class LanguageConverter implements Converter {

 @Override
 public Object getAsObject(FacesContext context, UIComponent
   component, String value) {
  LanguageRetrievalDao lr=LanguageRetrievalDaoImpl.getInstance();
  return lr.getLanguageByCode(value);
 }

 @Override
 public String getAsString(FacesContext context, UIComponent component, Object value) {
  if(value instanceof Language){
   return ((Language)value).getCode();
  }
  else
  {
   return "";
  }
  
 }

}



Attenzione è importantissimo nella selectOneMenu impostare l'itemValue direttamente con il valore dell'oggetto, non con il codice della lingua, infatti poi è il componente di primefaces che sfruttando i metodi equals ed hascode dell'oggetto Language associa correttamente immagini e descrizioni al codice dato ("it" oppure "en").

mercoledì 22 ottobre 2014

Inserire shared library su WAS 8.5

Per inserire una shared library su WAS 8.5
occorre entrare nella console di WebSphere cliccare su Ambiente/Librerie Condivise

Quindi creare una nuova libreria condivisa associando i 2 jar necessari comprensivi del percorso corretto

Esempio

 Ho specificato poi nell'ambito "Tutti gli ambiti" in modo che la mia shared library fosse visibile all'applicazione web di interesse.

A questo punto andare su applicazioni/Applicazioni Enterprise WebSphere e selezionare il progetto web di interesse.

Su Applicazioni Enterprise/NOME_WEB_APP/Riferimenti libreria condivisa
selezionare il nome della applicazione quindi andare su "Librerie condivise di riferimento".


Quindi occorre far ripartire la nostra applicazione che a questo punto avrà nel classpath la shared library.

lunedì 29 settembre 2014

Carattere fine riga (CRLF LF)

Il carattere di fine riga su file di testo è diverso a seconda del sistema operativo.
Su windows abbiamo CRLF dove CR ('\r') sta per Carriage Return e LF ('\n') per Line Feed.
Invece per Linux abbiamo solo LF.
In Java se utilizziamo il metodo newLine() della classe java.io.BufferedWriter questo si comporta in maniere platform dependant, ossia inserisce CRLF su Windows e LF su Linux.
Se da una programma Java su Windows si vuole creare un file di testo con carattere di fine riga compatibile con sistemi Linux allora invece di usare il metodo newLine() occorre esplicitamente fare la write del carattere \n.
In questo modo:


BufferedWriter bw=new BufferedWriter(new FileWriter(percorsoFileCopiato));
BufferedReader br = new BufferedReader(new FileReader(percorsoFileDaCopiare));
String line;
 while ((line = br.readLine()) != null) {
        bw.write(line);
      //  bw.newLine();
        bw.write("\n");
   }
 br.close();
 bw.flush();
 bw.close();


martedì 16 settembre 2014

Verificare su che porta risponde Sql Server

Si può eseguire il seguente comando sql

xp_readerrorlog 0, 1, N'Server in ascolto sulla porta'','any', NULL, NULL, N'asc'

mercoledì 20 agosto 2014

Query per trovare tabelle che hanno una FK verso la tabella in esame

Query per trovare tutte le foreign key verso una tabella, testato con Sql Server 2008

select t.name , fk.constraint_column_id  , c.name
from sys.foreign_key_columns as fk
inner join sys.tables as t on fk.parent_object_id = t.object_id
inner join sys.columns as c on fk.parent_object_id = c.object_id and fk.parent_column_id = c.column_id
where fk.referenced_object_id = (select object_id from sys.tables where name = 'NOME_TABELLA')
order by t.name , fk.constraint_column_id

lunedì 4 agosto 2014

Apache POI generare commenti su cella

Per creare un commento su una cella con Apache POI.

public static Comment addComment(HSSFCell cell,String testo){
  
    Drawing drawing = cell.getSheet().createDrawingPatriarch();
      CreationHelper factory = cell.getSheet().getWorkbook().getCreationHelper();
      ClientAnchor anchor = factory.createClientAnchor();
      anchor.setCol1(cell.getColumnIndex());
      anchor.setCol2(cell.getColumnIndex() + 3);
      anchor.setRow1(cell.getRowIndex());
      anchor.setRow2(cell.getRowIndex() + 2);
      Comment comment = drawing.createCellComment(anchor);
      RichTextString str = factory.createRichTextString(testo);
      comment.setString(str);
      return comment;
  
 }


Occorre importare i seguenti package:

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.RichTextString;