/** * 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 15 avr. 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.lazyLoading; import java.util.Enumeration; import java.util.Hashtable; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.validator.GenericValidator; import org.squale.welcom.outils.Util; import org.squale.welcom.outils.WelcomConfigurator; import org.squale.welcom.struts.lazyLoading.font.WFontSimulator; /** * @author M327836 Pour changer le mod�le de ce commentaire de type g�n�r�, allez � : * Fen�tre>Pr�f�rences>Java>G�n�ration de code>Code et commentaires */ public class WLazyUtil { /** * recherche les parametres dans un tag * * @param s chaine contenant le script du tag * @return une hashtable contenant les param�tres et leur valeur. */ private static Hashtable searchParameter( final String s ) { final Hashtable parameters = new Hashtable(); final Pattern pattern = Pattern.compile( "(name|type|value|checked)\\s*=\\s*([\"\'])", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); final Matcher matcher = pattern.matcher( s ); int pos = 0; while ( matcher.find( pos ) ) { final String name = matcher.group( 1 ); char charDelimiter = ' '; if ( !GenericValidator.isBlankOrNull( matcher.group( 2 ) ) ) { charDelimiter = matcher.group( 2 ).charAt( 0 ); } final int posStart = matcher.end( 2 ); final int posEnd = s.indexOf( charDelimiter, posStart ); final String value = s.substring( posStart, posEnd ); parameters.put( name.toLowerCase(), charDelimiter + value + charDelimiter ); pos = matcher.end( 2 ); } return parameters; } /** * @param lazyTag le tag est en lazy * @return si le lazy loadin doit �tre appliqu� */ public static boolean isLazy( final boolean lazyTag ) { final boolean lazyGlobal = new Boolean( WelcomConfigurator.getMessage( WelcomConfigurator.LAZYLOADING_KEY ) ).booleanValue(); return lazyTag && lazyGlobal; } /** * converti un select en champ input classique * * @param s chaine contenant le flux � modifier * @return le flux mis � jour */ public static String convertSelectToLightInput( final String s ) { final StringBuffer smallInput = new StringBuffer(); smallInput.append( "<input " ); // try { // Search name // RE reSelect=new RE("<\\s*select([^>]*)>",RE.MATCH_CASEINDEPENDENT); final Pattern reSelect = Pattern.compile( "<\\s*select([^>]*)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); // RE reOptionSelected = new RE ("<\\s*option[^>]+selected[^>]*>",RE.MATCH_CASEINDEPENDENT); final Pattern reOptionSelected = Pattern.compile( "<\\s*option[^>]+selected[^>]*>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); // RE reOption = new RE ("<\\s*option[^>]*>",RE.MATCH_CASEINDEPENDENT); final Pattern reOption = Pattern.compile( "<\\s*option[^>]*>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); final Matcher maSelect = reSelect.matcher( s ); if ( maSelect.find() ) { Hashtable parameters = searchParameter( s ); if ( parameters.containsKey( "name" ) ) { smallInput.append( "name=" ); smallInput.append( parameters.get( "name" ) ); smallInput.append( " " ); } else { return s; } final Matcher maOptionSelected = reOptionSelected.matcher( s ); if ( maOptionSelected.find() ) { parameters = searchParameter( maOptionSelected.group( 0 ) ); if ( parameters.containsKey( "value" ) ) { smallInput.append( "value=" ); smallInput.append( parameters.get( "value" ) ); } else { final int posStart = maOptionSelected.end( 0 ); final Pattern reOptionEnd = Pattern.compile( "([^<]*)<\\s*\\/option\\s*>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); final Matcher maOptionEnd = reOptionEnd.matcher( s ); // RE reOptionEnd= new RE ("([^<]*)<\\s*\\/option\\s*>"); if ( maOptionEnd.find( posStart ) ) { final String value = maOptionEnd.group( 1 ); smallInput.append( "value=" ); smallInput.append( parameters.get( "value" ) ); } else { return s; } } } else { final Matcher maOption = reOption.matcher( s ); if ( maOption.find() ) { parameters = searchParameter( maOption.group( 0 ) ); if ( parameters.containsKey( "value" ) ) { smallInput.append( "value=" ); smallInput.append( parameters.get( "value" ) ); } else { final int posStart = maOption.end( 0 ); final Pattern reOptionEnd = Pattern.compile( "([^<]*)<\\s*\\/option\\s*>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); final Matcher maOptionEnd = reOptionEnd.matcher( s ); // RE reOptionEnd= new RE ("([^<]*)<\\s*\\/option\\s*>"); if ( maOptionEnd.find( posStart ) ) { final String value = maOptionEnd.group( 1 ); smallInput.append( "value=" ); smallInput.append( parameters.get( "value" ) ); } else { return s; } } } else { return s; } } } smallInput.append( ">" ); return smallInput.toString(); } /** * convertie un champs de type input text en champs input classique * * @param s chaine contenant le flux � modifier * @return le flux mis � jour */ public static String convertInputToLightInput( final String s ) { final StringBuffer smallInput = new StringBuffer(); final Hashtable parameters = searchParameter( s ); final Enumeration enumeration = parameters.keys(); smallInput.append( "<input " ); while ( enumeration.hasMoreElements() ) { final String key = (String) enumeration.nextElement(); smallInput.append( key ); smallInput.append( "=" ); smallInput.append( parameters.get( key ) ); smallInput.append( " " ); } smallInput.append( ">" ); return smallInput.toString(); } /** * �pure le corps d'une page * * @param corps chaine contenant le flux � modifier * @return le flux modifi� */ public static String getLightBody( final String corps ) { final StringBuffer buf = new StringBuffer(); // try { // Cherche les inputs Pattern reg = Pattern.compile( "(<\\s*input[^>]*>)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); Matcher mat = reg.matcher( corps ); // RE reg=new RE("(<\\s*input[^>]*>)",RE.MATCH_CASEINDEPENDENT); int pos = 0; while ( mat.find( pos ) ) { buf.append( convertInputToLightInput( mat.group( 0 ) ) ); pos = mat.end( 0 ); } // Cherche les textarea reg = Pattern.compile( "(<\\s*textarea[^>]*>[^<]*<\\/\\s*textarea\\s*>)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); mat = reg.matcher( corps ); // reg=new RE("(<\\s*textarea[^>]*>[^<]*<\\/\\s*textarea\\s*>)",RE.MATCH_CASEINDEPENDENT); pos = 0; while ( mat.find( pos ) ) { buf.append( mat.group( 0 ) ); pos = mat.end( 0 ); } // cherche les selects // RE regstart=new RE("(<select)",RE.MATCH_CASEINDEPENDENT); final Pattern regstart = Pattern.compile( "(<\\s*select)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); // RE regstop=new RE("(</select>)",RE.MATCH_CASEINDEPENDENT); final Pattern regstop = Pattern.compile( "(<\\s*/select>\\s*)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); final Matcher mastart = regstart.matcher( corps ); final Matcher mastop = regstop.matcher( corps ); pos = 0; while ( mastart.find( pos ) ) { final int posStart = mastart.start( 1 ); int posStop = mastart.end( 1 ); if ( mastop.find( posStart ) ) { posStop = mastop.end( 1 ); final String value = corps.substring( posStart, posStop ); buf.append( convertSelectToLightInput( value ) ); } pos = posStop; } return buf.toString(); } /** * �pure le corps d'une page * * @param corps chaine contenant le flux � modifier * @return le flux modifi� */ public static String getSuperLightBody( final String corps ) { final StringBuffer buf = new StringBuffer(); // Cherche les chechbox final Pattern reg = Pattern.compile( "(<\\s*input[^>]*>)", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE ); final Matcher mat = reg.matcher( corps ); // RE reg=new RE("(<\\s*input[^>]*>)",RE.MATCH_CASEINDEPENDENT); int pos = 0; while ( mat.find( pos ) ) { final Hashtable parameters = searchParameter( mat.group( 0 ) ); if ( Util.isEqualsIgnoreCase( Util.removeQuotes( (String) parameters.get( "type" ) ), "checkbox" ) && parameters.containsKey( "checked" ) ) { buf.append( convertInputToLightInput( mat.group( 0 ) ) ); } pos = mat.end( 0 ); } return buf.toString(); } /** * �pure le corps d'un combo * * @param s chaine contenant le flux � modifier * @return le flux modifi� */ public static String getLightCombo( final String s ) { final StringBuffer options = new StringBuffer(); // Search name final Pattern reOptionSelected = Pattern.compile( "<\\s*option[^>]+selected[^>]*>[^<]*<\\/\\s*option\\s*>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); final Pattern reOption = Pattern.compile( "<\\s*option[^>]*>([^<]*)<\\/\\s*option\\s*>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); final Matcher maOptionSelected = reOptionSelected.matcher( s ); final Matcher maOption = reOption.matcher( s ); // RE reOptionSelected = new RE // ("<\\s*option[^>]+selected[^>]*>[^<]*<\\/\\s*option\\s*>",RE.MATCH_CASEINDEPENDENT); // RE reOption = new RE ("<\\s*option[^>]*>([^<]*)<\\/\\s*option\\s*>",RE.MATCH_CASEINDEPENDENT); if ( maOptionSelected.find() ) { options.append( maOptionSelected.group( 0 ) ); } else { if ( maOption.find() ) { options.append( maOption.group( 0 ) ); } else { return s; } } int pos = 0; String longer = ""; while ( maOption.find( pos ) ) { if ( WFontSimulator.getSize( maOption.group( 1 ) ) > WFontSimulator.getSize( longer ) ) { longer = maOption.group( 1 ); } pos = maOption.end( 0 ); } if ( options.toString().indexOf( longer ) < 0 ) { options.append( "<option>" + longer + "</option>" ); } return options.toString(); } }