/** * Copyright (C) 2008-2010, Squale Project - http://www.squale.org * * This file is part of Squale. * * Squale is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or any later version. * * Squale is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Squale. If not, see <http://www.gnu.org/licenses/>. */ /* * Cr�� le 1 juin 05 * * Pour changer le mod�le de ce fichier g�n�r�, allez � : * Fen�tre>Pr�f�rences>Java>G�n�ration de code>Code et commentaires */ package org.squale.welcom.struts.action; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.Collection; import java.util.Enumeration; import java.util.Iterator; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.collections.iterators.EnumerationIterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.validator.GenericValidator; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.squale.welcom.outils.WelcomConfigurator; import org.squale.welcom.struts.ajax.WHttpEasyCompleteResponse; import org.squale.welcom.struts.bean.WComboValueLabel; import org.squale.welcom.struts.bean.WCouple; import org.squale.welcom.struts.easycomplete.WEasyCompleteUtil; /** * @author M327836 Action par d�faut pour l'auto completion */ public class WEasyCompleteAction extends Action { /** logger */ private static Log log = LogFactory.getLog( WEasyCompleteAction.class ); /** Nombre max d'�l�ment � retourner. */ private static final int MAX_RETURNED_ELEMENTS = 10; /** * @see (org.apache.struts.action.ActionForm.execute()) */ public ActionForward execute( final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response ) throws IOException, ServletException { String ch = request.getParameter( "ch" ); final String name = request.getParameter( "name" ); final String property = request.getParameter( "property" ); final String valuename = request.getParameter( "value" ); final String labelname = request.getParameter( "label" ); int maxReturnedElements = MAX_RETURNED_ELEMENTS; try { maxReturnedElements = Integer.parseInt( WelcomConfigurator.getMessage( WelcomConfigurator.EASY_COMPLETE_DEFAULT_MAXIMUM_RETURNED_ELEMENTS ) ); } catch ( final NumberFormatException e ) { } ch = WEasyCompleteUtil.filter( ch ); if ( name != null ) { final WHttpEasyCompleteResponse easyComplete = new WHttpEasyCompleteResponse( response ); int i = 0; for ( final Iterator collIterator = getIterator( name, property, request ); collIterator.hasNext() && ( i < maxReturnedElements ); ) { final Object bean = collIterator.next(); String value = null; String label = null; try { if ( bean instanceof WCouple ) { value = ( (WCouple) bean ).getValue(); label = ( (WCouple) bean ).getLabel(); } else { if ( !GenericValidator.isBlankOrNull( valuename ) ) { value = (String) PropertyUtils.getProperty( bean, valuename ); } if ( !GenericValidator.isBlankOrNull( labelname ) ) { label = (String) PropertyUtils.getProperty( bean, labelname ); } } if ( value == null ) { value = ""; } if ( label == null ) { label = ""; } final Pattern p = Pattern.compile( "\\b" + ch, Pattern.CASE_INSENSITIVE ); final Matcher mv = p.matcher( value ); final Matcher ml = p.matcher( label ); if ( mv.find() || ml.find() ) { easyComplete.addValueLabel( value, label ); i++; } } catch ( final IllegalAccessException _ex ) { log.error( _ex, _ex ); throw new ServletException( _ex ); } catch ( final InvocationTargetException e ) { log.error( e, e ); throw new ServletException( e ); } catch ( final NoSuchMethodException _ex ) { log.error( _ex, _ex ); throw new ServletException( _ex ); } } easyComplete.close(); } return null; } /** * Retourne un iterator quelque soit le types de collection * * @param name nom du bean * @param property property contenant la collection * @param request requette http * @return un it�rator * @throws ServletException ServletException */ protected Iterator getIterator( final String name, final String property, final HttpServletRequest request ) throws ServletException { String beanName = name; if ( beanName == null ) { beanName = "org.apache.struts.taglib.html.BEAN"; } final Object bean = lookUp( beanName, request ); if ( bean == null ) { System.err.println( "impossible de trouver le bean" + beanName ); throw new ServletException( "impossible de trouver le bean" + beanName ); } Object collection = bean; if ( property != null ) { try { collection = PropertyUtils.getProperty( bean, property ); if ( collection == null ) { System.err.println( "impossible de trouver la propri�t� " + property + " dans le bean " + beanName ); throw new ServletException( "impossible de trouver la propri�t� " + property + " dans le bean " + beanName ); } } catch ( final IllegalAccessException _ex ) { log.error( _ex, _ex ); } catch ( final InvocationTargetException e ) { log.error( e, e ); } catch ( final NoSuchMethodException _ex ) { log.error( _ex, _ex ); } } if ( collection.getClass().isArray() ) { collection = Arrays.asList( (Object[]) collection ); } if ( collection instanceof Collection ) { return ( (Collection) collection ).iterator(); } if ( collection instanceof Iterator ) { return (Iterator) collection; } if ( collection instanceof WComboValueLabel ) { return ( (WComboValueLabel) collection ).iterator(); } if ( collection instanceof Map ) { return ( (Map) collection ).entrySet().iterator(); } if ( collection instanceof Enumeration ) { return new EnumerationIterator( (Enumeration) collection ); } else { throw new ServletException( "impossible de trouver un iterator" ); } } /** * Recherche l'objet * * @param name : nom * @param request request * @return :lobjet */ protected Object lookUp( final String name, final HttpServletRequest request ) { Object o = null; o = request.getAttribute( name ); if ( o == null ) { o = request.getSession().getAttribute( name ); } if ( o == null ) { o = servlet.getServletContext().getAttribute( name ); } return o; } }