Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.csv/src/main/java/org/gvsig/fmap/dal/store/csv/CSVStoreParameters.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.csv/src/main/java/org/gvsig/fmap/dal/store/csv/CSVStoreParameters.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.csv/src/main/java/org/gvsig/fmap/dal/store/csv/CSVStoreParameters.java	(revision 43088)
@@ -31,7 +31,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.cresques.cts.IProjection;
 import org.gvsig.fmap.dal.FileHelper;
-import org.gvsig.fmap.dal.OpenDataStoreParameters;
+import org.gvsig.fmap.dal.feature.OpenFeatureStoreParameters;
 import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
 import org.gvsig.fmap.dal.spi.AbstractDataParameters;
 import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
@@ -45,7 +45,7 @@
 import org.supercsv.quote.QuoteMode;
 
 public class CSVStoreParameters extends AbstractDataParameters implements
-        OpenDataStoreParameters, FilesystemStoreParameters {
+        OpenFeatureStoreParameters, FilesystemStoreParameters {
 
     private static final Logger logger = LoggerFactory.getLogger(CSVStoreParameters.class);
 
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultFeatureStore.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultFeatureStore.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultFeatureStore.java	(revision 43088)
@@ -46,6 +46,7 @@
 import org.gvsig.fmap.dal.DataStoreNotification;
 import org.gvsig.fmap.dal.DataStoreParameters;
 import org.gvsig.fmap.dal.ExpressionBuilder;
+import org.gvsig.fmap.dal.ExpressionEvaluator;
 import org.gvsig.fmap.dal.exception.CloneException;
 import org.gvsig.fmap.dal.exception.CloseException;
 import org.gvsig.fmap.dal.exception.CreateException;
@@ -2255,9 +2256,9 @@
     }
 
     @Override
-    public ExpressionBuilder createExpressionBuilder() {
+    public ExpressionEvaluator createExpression() {
         if( this.provider instanceof FeatureStoreProvider_v2 ) {
-            return ((FeatureStoreProvider_v2)this.provider).createExpressionBuilder();
+            return ((FeatureStoreProvider_v2)this.provider).createExpression();
         }
         return new SQLBuilderBase();
     }
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultFeatureSelection.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultFeatureSelection.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultFeatureSelection.java	(revision 43088)
@@ -44,6 +44,7 @@
 import org.gvsig.fmap.dal.feature.impl.dynobjectutils.DynObjectSetFeatureSetFacade;
 import org.gvsig.tools.ToolsLocator;
 import org.gvsig.tools.dispose.DisposableIterator;
+import org.gvsig.tools.dispose.DisposeUtils;
 import org.gvsig.tools.dynobject.DynObjectSet;
 import org.gvsig.tools.dynobject.DynStruct;
 import org.gvsig.tools.exception.BaseException;
@@ -317,6 +318,21 @@
 	public DisposableIterator fastIterator() {
 		return fastIterator(0);
 	}
+        
+        @Override
+        public Feature first() {
+            DisposableIterator it = null;
+            try {
+                it = this.iterator();
+                if( it == null ) {
+                    return null;
+                }
+                Feature f = (Feature) it.next();
+                return f;
+            } finally {
+                DisposeUtils.disposeQuietly(it);
+            }
+        }
 
 	/**
 	 * Returns the list of selected values, or the deselected ones if the
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/featureset/DefaultFeatureSet.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/featureset/DefaultFeatureSet.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/featureset/DefaultFeatureSet.java	(revision 43088)
@@ -48,6 +48,7 @@
 import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStoreTransforms;
 import org.gvsig.fmap.dal.feature.spi.FeatureSetProvider;
 import org.gvsig.tools.dispose.DisposableIterator;
+import org.gvsig.tools.dispose.DisposeUtils;
 import org.gvsig.tools.dynobject.DynObjectSet;
 import org.gvsig.tools.evaluator.Evaluator;
 import org.gvsig.tools.exception.BaseException;
@@ -349,6 +350,22 @@
         return this.getSize() == 0;
     }
 
+    @Override
+    public Feature first() {
+        DisposableIterator it = null;
+        try {
+            it = this.iterator();
+            if( it == null ) {
+                return null;
+            }
+            Feature f = (Feature) it.next();
+            return f;
+        } finally {
+            DisposeUtils.disposeQuietly(it);
+        }
+    }
+
+
     public DisposableIterator fastIterator() throws DataException {
         return this.fastIterator(0);
     }
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/FeatureStoreFactory.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/FeatureStoreFactory.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/FeatureStoreFactory.java	(revision 43088)
@@ -10,7 +10,7 @@
 import org.gvsig.fmap.dal.impl.DefaultDataManager;
 import org.gvsig.fmap.dal.spi.DataStoreInitializer2;
 import org.gvsig.fmap.dal.DataStoreProvider;
-import org.gvsig.fmap.dal.OpenDataStoreParameters;
+import org.gvsig.fmap.dal.feature.OpenFeatureStoreParameters;
 import org.gvsig.tools.dynobject.DynObject;
 import org.gvsig.tools.service.spi.Services;
 
@@ -49,7 +49,7 @@
     
     @Override
     public boolean canUse(DataParameters parameters) {
-        boolean use = parameters instanceof OpenDataStoreParameters;
+        boolean use = parameters instanceof OpenFeatureStoreParameters;
         return use;
     }
     
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/impl/DefaultDataManager.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/impl/DefaultDataManager.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/impl/DefaultDataManager.java	(revision 43088)
@@ -1,5 +1,6 @@
 package org.gvsig.fmap.dal.impl;
 
+import org.gvsig.fmap.dal.feature.spi.ExpressionEvaluatorBase;
 import java.io.File;
 import java.io.InputStream;
 import java.net.URL;
@@ -21,6 +22,7 @@
 import org.gvsig.fmap.dal.DataStoreProviderFactory;
 import org.gvsig.fmap.dal.DataTypes;
 import org.gvsig.fmap.dal.ExpressionBuilder;
+import org.gvsig.fmap.dal.ExpressionEvaluator;
 import org.gvsig.fmap.dal.NewDataStoreParameters;
 import org.gvsig.fmap.dal.OpenErrorHandler;
 import org.gvsig.fmap.dal.Register;
@@ -342,6 +344,8 @@
             throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
         }
 
+        parameters.validate();
+        
         String storeName = this.getStoreName(parameters);
 
         DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
@@ -570,6 +574,11 @@
     }
 
     @Override
+    public  ExpressionEvaluator createExpresion() {
+        return new ExpressionEvaluatorBase();
+    }
+    
+    @Override
     public FeaturePagingHelper createFeaturePagingHelper(
             FeatureStore featureStore, int pageSize) throws BaseException {
         return new FeaturePagingHelperImpl(featureStore, pageSize);
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/pom.xml
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/pom.xml	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/pom.xml	(revision 43088)
@@ -11,7 +11,7 @@
         <version>2.0.169-SNAPSHOT</version>
     </parent>
 
-    <dependencies>
+    <dependencies>      
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/operations/CalculateEnvelopeOfColumnOperation.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/operations/CalculateEnvelopeOfColumnOperation.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/operations/CalculateEnvelopeOfColumnOperation.java	(revision 43088)
@@ -75,6 +75,14 @@
             IProjection crs
     ) throws DataException {
 
+        //
+        // Parece ser que en versiones anteriores a SQL Server 2012 no esta
+        // disponible la funcion ST_ExtentAggregate.
+        // Habria que determinar si es necesario implementar una alternativa
+        // para estos casos.
+        //
+        // https://alastaira.wordpress.com/2011/07/26/determining-the-geographic-extent-of-spatial-features-in-a-sql-server-table/
+        //
         JDBCSQLBuilderBase sqlbuilder = this.createSQLBuilder();
         sqlbuilder.select().column().value(
             sqlbuilder.getAsGeometry(
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/JDBCStoreProviderBase.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/JDBCStoreProviderBase.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/JDBCStoreProviderBase.java	(revision 43088)
@@ -191,7 +191,7 @@
 
     
     @Override
-    public JDBCSQLBuilderBase createExpressionBuilder() {
+    public JDBCSQLBuilderBase createExpression() {
         return this.getHelper().createSQLBuilder();
     }
 
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/test/java/org/gvsig/fmap/dal/feature/DummyFetureStore.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/test/java/org/gvsig/fmap/dal/feature/DummyFetureStore.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/test/java/org/gvsig/fmap/dal/feature/DummyFetureStore.java	(revision 43088)
@@ -11,6 +11,7 @@
 import org.gvsig.fmap.dal.DataSet;
 import org.gvsig.fmap.dal.DataStoreParameters;
 import org.gvsig.fmap.dal.ExpressionBuilder;
+import org.gvsig.fmap.dal.ExpressionEvaluator;
 import org.gvsig.fmap.dal.exception.DataException;
 import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
 import org.gvsig.fmap.dal.feature.exception.NeedEditingModeException;
@@ -574,7 +575,7 @@
     }
 
     @Override
-    public ExpressionBuilder createExpressionBuilder() {
+    public ExpressionEvaluator createExpression() {
         return null;
     }
 
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/ExpressionEvaluator.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/ExpressionEvaluator.java	(revision 0)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/ExpressionEvaluator.java	(revision 43088)
@@ -0,0 +1,9 @@
+
+package org.gvsig.fmap.dal;
+
+import org.gvsig.tools.evaluator.Evaluator;
+
+
+public interface ExpressionEvaluator extends ExpressionBuilder, Evaluator {
+    
+}
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/feature/FeatureSet.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/feature/FeatureSet.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/feature/FeatureSet.java	(revision 43088)
@@ -228,6 +228,20 @@
 	 */
 	boolean isEmpty() throws DataException;
 
+        /**
+         * Return the first feature of the set.
+         * If the set is empty return null.
+         * 
+         * This not is a good method to determine if the set is empty.
+         * Use isEmpty instead.
+         * 
+         * This is a utility method that call iterator and retrieve the
+         * first feature of the iterator.
+         * 
+         * @return the first fearure of the set or null. 
+         */
+        public Feature first();
+        
 	/**
 	 * Updates a {@link Feature} with the given {@link EditableFeature}.<br>
 	 * 
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/feature/FeatureStore.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/feature/FeatureStore.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/feature/FeatureStore.java	(revision 43088)
@@ -32,6 +32,7 @@
 import org.gvsig.fmap.dal.DataStore;
 import org.gvsig.fmap.dal.DataStoreParameters;
 import org.gvsig.fmap.dal.ExpressionBuilder;
+import org.gvsig.fmap.dal.ExpressionEvaluator;
 import org.gvsig.fmap.dal.exception.CreateException;
 import org.gvsig.fmap.dal.exception.DataException;
 import org.gvsig.fmap.dal.exception.ReadException;
@@ -845,7 +846,7 @@
     
     public Iterator iterator();
     
-    public ExpressionBuilder createExpressionBuilder();
+    public ExpressionEvaluator createExpression();
     
     public void createCache(String name, DynObject parameters)
         throws DataException;
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/DataManager.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/DataManager.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/DataManager.java	(revision 43088)
@@ -281,7 +281,14 @@
      */
     public Evaluator createExpresion(String expression)
             throws InitializeException;
-
+    
+    /**
+     * Creates an instance of Evaluator to evaluate a expression.
+     *
+     * @return instance of ExpressionEvaluator representing the given expression.
+     */
+    public ExpressionEvaluator createExpresion();
+    
     /*
      * ====================================================================
      *
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/AbstractFeatureStoreProvider.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/AbstractFeatureStoreProvider.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/AbstractFeatureStoreProvider.java	(revision 43088)
@@ -38,7 +38,7 @@
 import org.gvsig.fmap.dal.DALLocator;
 import org.gvsig.fmap.dal.DataServerExplorer;
 import org.gvsig.fmap.dal.DataStoreParameters;
-import org.gvsig.fmap.dal.ExpressionBuilder;
+import org.gvsig.fmap.dal.ExpressionEvaluator;
 import org.gvsig.fmap.dal.exception.CloseException;
 import org.gvsig.fmap.dal.exception.DataException;
 import org.gvsig.fmap.dal.exception.InitializeException;
@@ -552,7 +552,7 @@
     }
 
     @Override
-    public ExpressionBuilder createExpressionBuilder() {
+    public ExpressionEvaluator createExpression() {
         return new SQLBuilderBase();
     }
 
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/ExpressionEvaluatorBase.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/ExpressionEvaluatorBase.java	(revision 0)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/ExpressionEvaluatorBase.java	(revision 43088)
@@ -0,0 +1,407 @@
+
+package org.gvsig.fmap.dal.feature.spi;
+
+import gnu.jel.CompilationException;
+import gnu.jel.CompiledExpression;
+import gnu.jel.DVMap;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.cresques.cts.IProjection;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.Find_SRID;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_AsBinary;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_AsEWKB;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_AsText;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_Contains;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_Crosses;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_Disjoint;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_Envelope;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_Equals;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_GeomFromEWKB;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_GeomFromText;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_GeomFromWKB;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_Intersects;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_IsClosed;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_Overlaps;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_SRID;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_Touches;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ST_Within;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.isNull;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.lcase;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.notIsNull;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.operator_AND;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.operator_EQ;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.operator_GE;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.operator_GT;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.operator_ILIKE;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.operator_LE;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.operator_LIKE;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.operator_LT;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.operator_NE;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.operator_OR;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.operator_not;
+import static org.gvsig.fmap.dal.ExpressionBuilder.Config.ucase;
+import org.gvsig.fmap.dal.ExpressionEvaluator;
+import org.gvsig.fmap.geom.Geometry;
+import org.gvsig.fmap.geom.GeometryException;
+import org.gvsig.fmap.geom.GeometryLocator;
+import org.gvsig.fmap.geom.GeometryManager;
+import org.gvsig.fmap.geom.operation.GeometryOperationException;
+import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
+import org.gvsig.fmap.geom.primitive.Envelope;
+import org.gvsig.tools.evaluator.EvaluatorData;
+import org.gvsig.tools.evaluator.EvaluatorException;
+import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
+
+
+public class ExpressionEvaluatorBase extends ExpressionBuilderBase implements ExpressionEvaluator {
+
+    public class JELConfig extends ConfigBase {
+        
+        public JELConfig() {
+            super();
+            
+            this.set(has_spatial_functions,true);
+            this.set(constant_true, "true");
+            this.set(constant_false, "false");
+            this.set(quote_for_identifiers, "");
+            this.set(quote_for_strings, "\"");
+            this.set(geometry_type_support, GeometrySupportType.WKT);
+            this.set(group, "( {0} )");
+            
+            this.set(Find_SRID , "Find_SRID(({0}), ({1}), ({2}))");
+            this.set(ST_SRID , "ST_SRID({0})");
+            this.set(ST_AsText , "ST_AsText({0})");
+            this.set(ST_AsBinary, "ST_AsBinary({0})");
+            this.set(ST_AsEWKB, "ST_AsWKB({0})");
+            this.set(ST_Contains, "ST_Contains(({0}), ({1}))");            
+            this.set(ST_Crosses,  "ST_Crosses(({0}), ({1}))");
+            this.set(ST_Disjoint ,  "ST_Disjoint(({0}), ({1}))");
+            this.set(ST_Equals ,  "ST_Equals(({0}), ({1}))");
+            this.set(ST_IsClosed,  "ST_IsClosed({0})");
+            this.set(ST_Overlaps,  "ST_Overlaps(({0}), ({1}))");
+            this.set(ST_Touches,  "ST_Touches(({0}), ({1}))");
+            this.set(ST_Within, "ST_Within(({0}), ({1}))");            
+            this.set(ST_Envelope, "ST_Envelope({0})");
+            this.set(ST_Intersects, "ST_Intersects(({0}), ({1}))");
+            this.set(ST_GeomFromText, "ST_GeomFromText({0}, ({1}))");
+            this.set(ST_GeomFromWKB, "ST_GeomFromWKB(({0}), ({1}))");
+            this.set(ST_GeomFromEWKB, "ST_GeomFromEWKB(({0}), ({1}))");
+            this.set(lcase, "LCASE({0})");
+            this.set(ucase, "UCASE({0})");
+            this.set(isNull, "( ({0}) == null )");
+            this.set(notIsNull, "( ! (({0}) == null) )");
+            this.set(operator_not, "( ! ({0}) )");
+            
+            this.set(operator_AND, "{0} && {1}");
+            this.set(operator_OR, "{0} || {1}");
+            this.set(operator_EQ, "( ({0}) == ({1}) )");
+            this.set(operator_NE, "( ({0}) != ({1}) )");
+            this.set(operator_GT, "( ({0}) > ({1}) )");
+            this.set(operator_GE, "( ({0}) >= ({1}) )");
+            this.set(operator_LT, "( ({0}) < ({1}) )");
+            this.set(operator_LE, "( ({0}) <= ({1}) )");
+            this.set(operator_LIKE, "LIKE( ({0}), ({1}) )");
+            this.set(operator_ILIKE, "ILIKE( ({0}), ({1}) )");
+
+            this.set(operator_add, "{0} + {1}");
+            this.set(operator_subst, "{0} - {1}");
+            this.set(operator_mult, "{0} * {1}");
+            this.set(operator_div, "{0} / {1}");
+            this.set(operator_concat, "{0} + {1}");
+        }
+    }
+    
+    public static class JELFunctions {
+        public static String Find_SRID(Object a, Object b, Object c) {
+            return null;
+        }
+        
+        public static String ST_SRID(Geometry geom) {
+            return null;
+        }
+        
+        public static String ST_AsText(Geometry geom) throws GeometryOperationException, GeometryOperationNotSupportedException {
+            return geom.convertToWKT();
+        }
+        
+        public static byte[] ST_AsBinary(Geometry geom) throws GeometryOperationException, GeometryOperationNotSupportedException {
+            return geom.convertToWKB();
+        }
+        
+        public static byte[] ST_AsEWKB(Geometry geom) throws GeometryOperationException, GeometryOperationNotSupportedException {
+            return geom.convertToEWKB();
+        }
+        
+        public static Envelope ST_Envelope(Geometry geom) throws GeometryOperationException, GeometryOperationNotSupportedException {
+            return geom.getEnvelope();
+        }            
+        
+        public static boolean ST_Contains(Geometry geom1, Geometry geom2) throws GeometryOperationException, GeometryOperationNotSupportedException {
+            return geom1.contains(geom2);
+        }            
+        
+        public static boolean ST_Crosses(Geometry geom1, Geometry geom2) throws GeometryOperationException, GeometryOperationNotSupportedException {
+            return geom1.crosses(geom2);
+        }            
+        
+        public static boolean ST_Disjoint(Geometry geom1, Geometry geom2) throws GeometryOperationException, GeometryOperationNotSupportedException {
+            return geom1.disjoint(geom2);
+        }            
+        
+        public static boolean ST_Overlaps(Geometry geom1, Geometry geom2) throws GeometryOperationException, GeometryOperationNotSupportedException {
+            return geom1.overlaps(geom2);
+        }            
+        
+        public static boolean ST_Touches(Geometry geom1, Geometry geom2) throws GeometryOperationException, GeometryOperationNotSupportedException {
+            return geom1.touches(geom2);
+        }            
+        
+        public static boolean ST_Within(Geometry geom1, Geometry geom2) throws GeometryOperationException, GeometryOperationNotSupportedException {
+            return geom1.within(geom2);
+        }            
+        
+        public static boolean ST_Intersects(Geometry geom1, Geometry geom2) throws GeometryOperationException, GeometryOperationNotSupportedException {
+            return geom1.intersects(geom2);
+        }            
+        
+        public static boolean ST_Equals(Geometry geom1, Geometry geom2) {
+            return geom1.equals(geom2);
+        }            
+        
+        public static boolean ST_IsClosed(Geometry geom1) throws GeometryOperationException, GeometryOperationNotSupportedException {
+            return geom1.isClossed();
+        }            
+        
+        public static Geometry ST_GeomFromText(String geom, IProjection srs) throws GeometryException {
+            GeometryManager manager = GeometryLocator.getGeometryManager();
+            return manager.createFrom(geom,srs);
+        }            
+        
+        public static Geometry ST_GeomFromWKB(byte[] geom, IProjection srs) throws GeometryException {
+            GeometryManager manager = GeometryLocator.getGeometryManager();
+            return manager.createFrom(geom,srs);
+        }            
+        
+        public static Geometry ST_GeomFromEWKB(byte[] geom, IProjection srs) throws GeometryException {
+            GeometryManager manager = GeometryLocator.getGeometryManager();
+            return manager.createFrom(geom,srs);
+        }            
+            
+        public static String LCASE(Object x) {
+            if( x == null ) {
+                return null;
+            }
+            return x.toString().toLowerCase();
+        }            
+            
+        public static String UCASE(Object x) {
+            if( x == null ) {
+                return null;
+            }
+            return x.toString().toLowerCase();
+        }            
+          
+        private static final Integer ZERO_OR_MORE_CHARS = 0;
+        private static final Integer ONE_CHAR = 1;
+
+        public static boolean LIKE(Object x1, Object x2) {
+            if (x1 == null || x2 == null) {
+                return false;
+            }
+            String source = x1.toString();
+            String match = x2.toString();
+
+            List<Object> format = new ArrayList<>();
+            StringBuilder fill = new StringBuilder();
+            final int plen = match.length();
+            Character lastSymbol = null;
+            for (int i = 0; i < plen; i++) {
+                boolean f = false;
+                char c = match.charAt(i);
+                if (lastSymbol == '\\') {
+                    lastSymbol = null;
+                    fill.append(c);
+                } else {
+                    if (c == '%') {
+                        if (fill.length() > 0) {
+                            format.add(fill.toString());
+                            fill.setLength(0);
+                        }
+                        format.add(ZERO_OR_MORE_CHARS);
+                    } else if (c == '_') {
+                        if (fill.length() > 0) {
+                            format.add(fill.toString());
+                            fill.setLength(0);
+                        }
+                        format.add(ONE_CHAR);
+                    } else {
+                        fill.append(c);
+                    }
+                    lastSymbol = c;
+                }
+                if (fill.length() > 0) {
+                    format.add(fill.toString());
+                }
+            }
+
+            StringBuilder repattern = new StringBuilder("^");
+            for (Object o : format) {
+                if (o == ZERO_OR_MORE_CHARS) {
+                    repattern.append(".*?");
+                } else if (o == ONE_CHAR) {
+                    repattern.append(".?");
+                } else {
+                    repattern.append((String) o);
+                }
+            }
+
+            Pattern pattern = Pattern.compile(repattern.toString());
+            Matcher m = pattern.matcher(source);
+            return m.find();
+        }
+            
+        public static boolean ILIKE(Object x1, Object x2) {
+            if (x1 == null || x2 == null) {
+                return false;
+            }
+            x1 = x1.toString().toLowerCase();
+            x2 = x2.toString().toLowerCase();
+            return LIKE(x1, x2);
+        }
+            
+    }
+    
+    protected class VariableProvider extends DVMap {
+        private EvaluatorData data;
+
+        public VariableProvider() {
+        }
+        
+        public void setValues(EvaluatorData data) {
+            this.data = data;
+        }
+        
+        @Override
+        public String getTypeName(String name) {
+            Object value = this.data.getDataValue(name);
+            return value.getClass().getSimpleName();
+        }
+
+        public double getDoubleProperty(String name) {
+            Object value = this.data.getDataValue(name);
+            return (double) value;
+        }        
+
+        public float getFloatProperty(String name) {
+            Object value = this.data.getDataValue(name);
+            return (float) (double) value;
+        }        
+        
+        public int getIntegerProperty(String name) {
+            Object value = this.data.getDataValue(name);
+            return (int) (double) value;
+        }        
+        
+        public long getLongProperty(String name) {
+            Object value = this.data.getDataValue(name);
+            return (long) (double) value;
+        }        
+        
+        public String getStringProperty(String name) {
+            Object value = this.data.getDataValue(name);
+            return (String) value;
+        }        
+
+        public Date getDateProperty(String name) {
+            Object value = this.data.getDataValue(name);
+            return (Date) value;
+        }        
+    }
+    
+    protected VariableProvider jel_variables = null;
+    protected Object[] jel_context = null;
+    protected CompiledExpression jel_expression = null;
+    protected Config jel_config = new JELConfig();
+    protected EvaluatorFieldsInfo fieldsInfo = null; // For compatibility 
+    
+    public ExpressionEvaluatorBase() {
+        super();
+    }
+    
+    public void compile() {
+        jel_variables = new VariableProvider();
+        gnu.jel.Library lib = new gnu.jel.Library(
+                new Class[]{ Math.class, JELFunctions.class }, 
+                new Class[]{ jel_variables.getClass() }, 
+                new Class[0],
+                jel_variables,
+                null
+        );
+        jel_context = new Object[] { jel_variables };
+        Config config = this.config;
+        try {
+            this.config = jel_config;
+            String expr = this.value.toString();
+            jel_expression = gnu.jel.Evaluator.compile(expr, lib);
+        } catch (CompilationException ex) {
+            throw new RuntimeException("Can't compile expression.", ex);
+        } finally {
+            this.config = config;
+        }
+    }
+    
+    public void clear() {
+        this.set(null);
+        this.jel_expression = null;
+    }
+    
+    @Override
+    public Object evaluate(EvaluatorData data) throws EvaluatorException {
+        try {
+            if( jel_variables == null ) {
+                this.compile();
+            }
+            jel_variables.setValues(data);
+            return jel_expression.evaluate(jel_context);
+        } catch (Throwable th) {
+            throw new EvaluatorException(
+                    "Can't evaluate expression", 
+                    th, 
+                    "ExpressionEvaluatorBase_evaluate_error", 
+                    0
+                );
+        }
+    }
+
+    @Override
+    public String getName() {
+        return "Generic expression evaluator";
+    }
+
+    @Override
+    public String getDescription() {
+        return "";
+    }
+
+    @Override
+    public String getSQL() {
+        return this.value.toString();
+    }
+
+    @Override
+    public EvaluatorFieldsInfo getFieldsInfo() {
+        if( this.fieldsInfo==null ) {
+            this.fieldsInfo = new EvaluatorFieldsInfo();
+            for( Variable var : this.getVariables() ) {
+                this.fieldsInfo.addFieldValue(var.getName());
+            }
+        }
+        return this.fieldsInfo;
+    }
+
+    
+    
+}
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/FeatureStoreProvider_v2.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/FeatureStoreProvider_v2.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/FeatureStoreProvider_v2.java	(revision 43088)
@@ -1,10 +1,10 @@
 
 package org.gvsig.fmap.dal.feature.spi;
 
-import org.gvsig.fmap.dal.ExpressionBuilder;
+import org.gvsig.fmap.dal.ExpressionEvaluator;
 
 
 public interface FeatureStoreProvider_v2 extends FeatureStoreProvider {
     
-    public ExpressionBuilder createExpressionBuilder();
+    public ExpressionEvaluator createExpression();
 }
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/SQLBuilderBase.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/SQLBuilderBase.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/SQLBuilderBase.java	(revision 43088)
@@ -33,7 +33,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class SQLBuilderBase extends ExpressionBuilderBase implements SQLBuilder {
+public class SQLBuilderBase extends ExpressionEvaluatorBase implements SQLBuilder {
     
     protected static final Logger logger = LoggerFactory.getLogger(SQLBuilderBase.class);
     
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/pom.xml
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/pom.xml	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/pom.xml	(revision 43088)
@@ -29,6 +29,11 @@
       <artifactId>org.gvsig.fmap.dal.api</artifactId>
       <scope>compile</scope>
     </dependency>
+    <dependency>
+        <groupId>org.gnu</groupId>
+        <artifactId>jel</artifactId>
+        <scope>compile</scope>
+    </dependency>
   </dependencies>
 
   <description>This project contains the SPI of the Data Access Library used to implement providers of data.</description>
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/src/main/java/org/gvsig/fmap/mapcontext/layers/vectorial/SpatialEvaluatorsFactory.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/src/main/java/org/gvsig/fmap/mapcontext/layers/vectorial/SpatialEvaluatorsFactory.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/src/main/java/org/gvsig/fmap/mapcontext/layers/vectorial/SpatialEvaluatorsFactory.java	(revision 43088)
@@ -57,7 +57,7 @@
         try {
             FeatureType featureType = store.getDefaultFeatureType();
             String geomName = featureType.getDefaultGeometryAttributeName();
-            ExpressionBuilder builder = store.createExpressionBuilder();
+            ExpressionBuilder builder = store.createExpression();
             return intersects(geometry, projection, featureType, geomName,builder);
         } catch (DataException ex) {
             throw new RuntimeException("Can't create intersects evaluator.",ex);
@@ -72,7 +72,7 @@
         try {
             FeatureType featureType = store.getDefaultFeatureType();
             String geomName = featureType.getDefaultGeometryAttributeName();
-            ExpressionBuilder builder = store.createExpressionBuilder();
+            ExpressionBuilder builder = store.createExpression();
             return intersects(envelope, projection, featureType, geomName,builder);
         } catch (DataException ex) {
             throw new RuntimeException("Can't create intersects evaluator.",ex);
@@ -107,7 +107,7 @@
         try {
             FeatureType featureType = store.getDefaultFeatureType();
             String geomName = featureType.getDefaultGeometryAttributeName();
-            ExpressionBuilder builder = store.createExpressionBuilder();
+            ExpressionBuilder builder = store.createExpression();
             return this.contains(geometry, projection, featureType, geomName,builder);
         } catch (DataException ex) {
             throw new RuntimeException("Can't create contains evaluator.",ex);
@@ -122,7 +122,7 @@
         try {
             FeatureType featureType = store.getDefaultFeatureType();
             String geomName = featureType.getDefaultGeometryAttributeName();
-            ExpressionBuilder builder = store.createExpressionBuilder();
+            ExpressionBuilder builder = store.createExpression();
             return this.contains(envelope, projection, featureType, geomName,builder);
         } catch (DataException ex) {
             throw new RuntimeException("Can't create contains evaluator.",ex);
@@ -147,7 +147,7 @@
         try {
             FeatureType featureType = store.getDefaultFeatureType();
             String geomName = featureType.getDefaultGeometryAttributeName();
-            ExpressionBuilder builder = store.createExpressionBuilder();
+            ExpressionBuilder builder = store.createExpression();
             return this.not_contains(geometry, projection, featureType, geomName,builder);
         } catch (DataException ex) {
             throw new RuntimeException("Can't create not_contains evaluator.",ex);
@@ -182,7 +182,7 @@
         try {
             FeatureType featureType = store.getDefaultFeatureType();
             String geomName = featureType.getDefaultGeometryAttributeName();
-            ExpressionBuilder builder = store.createExpressionBuilder();
+            ExpressionBuilder builder = store.createExpression();
             return this.crosses(geometry, projection, featureType, geomName,builder);
         } catch (DataException ex) {
             throw new RuntimeException("Can't create crosses evaluator.",ex);
@@ -197,7 +197,7 @@
         try {
             FeatureType featureType = store.getDefaultFeatureType();
             String geomName = featureType.getDefaultGeometryAttributeName();
-            ExpressionBuilder builder = store.createExpressionBuilder();
+            ExpressionBuilder builder = store.createExpression();
             return this.crosses(envelope, projection, featureType, geomName,builder);
         } catch (DataException ex) {
             throw new RuntimeException("Can't create crosses evaluator.",ex);
@@ -222,7 +222,7 @@
         try {
             FeatureType featureType = store.getDefaultFeatureType();
             String geomName = featureType.getDefaultGeometryAttributeName();
-            ExpressionBuilder builder = store.createExpressionBuilder();
+            ExpressionBuilder builder = store.createExpression();
             return this.disjoint(geometry, projection, featureType, geomName,builder);
         } catch (DataException ex) {
             throw new RuntimeException("Can't create disjoint evaluator.",ex);
@@ -247,7 +247,7 @@
         try {
             FeatureType featureType = store.getDefaultFeatureType();
             String geomName = featureType.getDefaultGeometryAttributeName();
-            ExpressionBuilder builder = store.createExpressionBuilder();
+            ExpressionBuilder builder = store.createExpression();
             return this.overlaps(geometry, projection, featureType, geomName,builder);
         } catch (DataException ex) {
             throw new RuntimeException("Can't create overlaps evaluator.",ex);
@@ -272,7 +272,7 @@
         try {
             FeatureType featureType = store.getDefaultFeatureType();
             String geomName = featureType.getDefaultGeometryAttributeName();
-            ExpressionBuilder builder = store.createExpressionBuilder();
+            ExpressionBuilder builder = store.createExpression();
             return this.touches(geometry, projection, featureType, geomName,builder);
         } catch (DataException ex) {
             throw new RuntimeException("Can't create touches evaluator.",ex);
@@ -297,7 +297,7 @@
         try {
             FeatureType featureType = store.getDefaultFeatureType();
             String geomName = featureType.getDefaultGeometryAttributeName();
-            ExpressionBuilder builder = store.createExpressionBuilder();
+            ExpressionBuilder builder = store.createExpression();
             return this.within(geometry, projection, featureType, geomName,builder);
         } catch (DataException ex) {
             throw new RuntimeException("Can't create within evaluator.",ex);
@@ -322,7 +322,7 @@
         try {
             FeatureType featureType = store.getDefaultFeatureType();
             String geomName = featureType.getDefaultGeometryAttributeName();
-            ExpressionBuilder builder = store.createExpressionBuilder();
+            ExpressionBuilder builder = store.createExpression();
             return this.equals(geometry, projection, featureType, geomName,builder);
         } catch (DataException ex) {
             throw new RuntimeException("Can't create equals evaluator.",ex);
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.framework/org.gvsig.andami/pom.xml
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.framework/org.gvsig.andami/pom.xml	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.framework/org.gvsig.andami/pom.xml	(revision 43088)
@@ -124,6 +124,16 @@
         <scope>compile</scope>
     </dependency>
     <dependency>
+        <groupId>commons-collections</groupId>
+        <artifactId>commons-collections</artifactId>
+        <scope>compile</scope>
+    </dependency>
+    <dependency>
+        <groupId>org.gnu</groupId>
+        <artifactId>jel</artifactId>
+        <scope>compile</scope>
+    </dependency>
+    <dependency>
         <groupId>jwizardcomponent</groupId>
         <artifactId>jwizardcomponent</artifactId>
         <scope>compile</scope>
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/pom.xml
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/pom.xml	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/pom.xml	(revision 43088)
@@ -13,7 +13,7 @@
     </parent>
 
     <properties>
-      <gvsig.package.info.state>final</gvsig.package.info.state>
+      <gvsig.package.info.state>devel</gvsig.package.info.state>
       <!--
       <gvsig.package.info.state>devel</gvsig.package.info.state>
       <gvsig.package.info.state>testing</gvsig.package.info.state>
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/pkg_description_en.html
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/pkg_description_en.html	(revision 0)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/pkg_description_en.html	(revision 43088)
@@ -0,0 +1,20 @@
+<h1>${gvsig.package.info.name}</h1>
+<pre>${gvsig.package.info.description}</pre>
+<ul>
+    <li>Package <i>${gvsig.package.info.official.label}</i></li>
+    <li>Organization:<br>
+        &nbsp;&nbsp;<i>${gvsig.package.info.owner}</i><br>
+        &nbsp;&nbsp;<i>${gvsig.package.info.webURL}</i>
+    </li>
+    <li>Categories: <i>${gvsig.package.info.categories}</i></li>
+    <li>Sources:&nbsp;<i>${gvsig.package.info.sourcesURL}</i></li>
+    <li>Code: <i>${gvsig.package.info.code}</i></li>
+    <li>Dependencies: <i>${gvsig.package.info.dependencies}</i></li>
+    <li>Version: <i>${gvsig.package.info.version}</i></li>
+    <li>State: <i>${gvsig.package.info.state}</i></li>
+    <li>Operating system: <i>${gvsig.package.info.operatingSystem}</i></li>
+    <li>Architecture: <i>${gvsig.package.info.architecture}</i></li>
+    <li>Required JVM: <i>${gvsig.package.info.javaVM}</i></li>
+</ul>
+<br>
+<br>
\ No newline at end of file
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/pkg_description_es.html
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/pkg_description_es.html	(revision 0)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/pkg_description_es.html	(revision 43088)
@@ -0,0 +1,20 @@
+<h1>${gvsig.package.info.name}</h1>
+<pre>${gvsig.package.info.description}</pre>
+<ul>
+    <li>Paquete <i>${gvsig.package.info.official.label}</i></li>
+    <li>Organizaci&oacute;n:<br>
+        &nbsp;&nbsp;<i>${gvsig.package.info.owner}</i><br>
+        &nbsp;&nbsp;<i>${gvsig.package.info.webURL}</i>
+    </li>    
+    <li>Categorias: <i>${gvsig.package.info.categories}</i></li>
+    <li>Fuentes: <i>${gvsig.package.info.sourcesURL}</i></li>
+    <li>Codigo:&nbsp;<i>${gvsig.package.info.code}</i></li>
+    <li>Dependencias: <i>${gvsig.package.info.dependencies}</i></li>
+    <li>Versi&oacute;n: <i>${gvsig.package.info.version}</i></li>
+    <li>Estado: <i>${gvsig.package.info.state}</i></li>
+    <li>Sistema operativo: <i>${gvsig.package.info.operatingSystem}</i></li>
+    <li>Arquitectura: <i>${gvsig.package.info.architecture}</i></li>
+    <li>Java requerida: <i>${gvsig.package.info.javaVM}</i></li>
+</ul>
+<br>
+<br>
\ No newline at end of file
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/text.properties
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/text.properties	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/text.properties	(revision 43088)
@@ -1,29 +1,29 @@
 # Resource bundle texts for the Spanish language locale (es)
-_select_the_folder_to_create_the_package_with=Selecciona el directorio con el que se creará el paquete
+_select_the_folder_to_create_the_package_with=Selecciona el directorio con el que se crear\u00e1 el paquete
 _output_options=Opciones de salida
 _the_package_file_folder_does_not_exist=La carpeta del paquete no existe
-_the_package_index_file_folder_does_not_exist=La carpeta del paquete de índices no existe
-_package_description=Descripción del paquete
+_the_package_index_file_folder_does_not_exist=La carpeta del paquete de \u00edndices no existe
+_package_description=Descripci\u00f3n del paquete
 _installer_progress=Progreso del instalador
 _Compressing=Comprimiendo
-_Creating_index=Creando índice
+_Creating_index=Creando \u00edndice
 _Finished=Finalizado
 _cant_create_the_package=No se pudo crear el paquete
-_create_package=Creación del paquete
-_select_symbol_folder=Selecciona carpeta de símbolos
+_create_package=Creaci\u00f3n del paquete
+_select_symbol_folder=Selecciona carpeta de s\u00edmbolos
 _Create_package_symbols=Crear paquete de simbolos
-_typical_installation=Instalación típica
-_advanced_installation=Instalación avanzada
-_fast_filter=Filtro rápido
+_typical_installation=Instalaci\u00f3n t\u00edpica
+_advanced_installation=Instalaci\u00f3n avanzada
+_fast_filter=Filtro r\u00e1pido
 _search=Buscar
 _reset_filters=Restaurar filtros
-_categories=Categorías
+_categories=Categor\u00edas
 _types=Tipos
-_standard_installation=Instalación estándar
-_installation_from_file=Instalación desde archivo
-_installation_from_url=Instalación desde URL
+_standard_installation=Instalaci\u00f3n est\u00e1ndar
+_installation_from_file=Instalaci\u00f3n desde archivo
+_installation_from_url=Instalaci\u00f3n desde URL
 _name=Nombre
-_version=Versión
+_version=Versi\u00f3n
 _type=Tipo
 _already_installed,_check_to_reinstall=Ya instalado, marca para reinstalar.
 _checked_to_reinstall=Marcado para reinstalar.
@@ -32,22 +32,22 @@
 _already_installed_but_not_installable=Ya instalado pero no instalable.
 _official_recommended=Official y recomendado
 _official=Oficial
-_not_official_recommended=No oficial, recomendado
-_not_official=No oficial
+_community_recommended=Comunidad, recomendado
+_community=Comunidad
 _downloading=Descargando
 _start_download=Comenzar descarga
 _download_progress=Progreso de la descarga
 _Cant_download_package_files=No se han podido descargar los ficheros del paquete
-_do_you_want_to_continue=¿Desea continuar?
+_do_you_want_to_continue=\u00bfDesea continuar?
 _Download_error=Error en la descarga
 _finished=Terminado
 _the_selected_file_does_not_exist=El archivo seleccionado no existe.
-_execute_adding_error=Error al añadir
+_execute_adding_error=Error al a\u00f1adir
 _progress=Progreso
 _select_plugins=Selecciona paquetes
-_There_are_no_packages_in_typical_installation_to_select=No hay paquetes en la instalación típica para seleccionar
-_do_you_want_to_continue=¿Desea continuar?
-_do_you_want_to_continue_anyway=¿Desea continuar de todas formas?
+_There_are_no_packages_in_typical_installation_to_select=No hay paquetes en la instalaci\u00f3n t\u00edpica para seleccionar
+_do_you_want_to_continue=\u00bfDesea continuar?
+_do_you_want_to_continue_anyway=\u00bfDesea continuar de todas formas?
 _Some_of_the_selected_addons_should_not_be_installed_simultaneously=Algunos de los complementos seleccionados no deben ser instalados simultaneamente.
 _Installing_these_addons_may_cause_errors=La instalacion de estos complementos puede causar errores 
 _you_have_selected_in_development_or_not_official_versions=Ha seleccionado versiones de desarrollo o no oficiales
@@ -55,53 +55,53 @@
 _the_selected_packages_require_to_install_or_update_the_following_packages=Los complementos seleccionados requieren instalar o actualizar los siguientes complementos
 _an_error_has_occurred_when_calculating_the_dependecies_of_the_packages_to_install=Se ha producido un error calculando las dependencias de los paquetes a instalar.
 _an_error_has_occurred_when_calculating_the_dependecies_of_the_selected_packages=Se ha producido un error calculando las dependencias de los paquetes seleccionados.
-_it_is_not_possible_to_verify_if_any_additional_package_is_needed_to_install_the_selected_packages=No es posible verificar si precisa algún paquete adicional para instalar los paquetes que ha seleccionado.
+_it_is_not_possible_to_verify_if_any_additional_package_is_needed_to_install_the_selected_packages=No es posible verificar si precisa alg\u00fan paquete adicional para instalar los paquetes que ha seleccionado.
 _a_problem_has_occurred_when_calculating_the_dependencies=Ha ocurrido un problema calculando las dependencias.
 _if_you_want_you_can_select_again_manually_the_packets_that_might_be_necessary=Si lo desea puede volver a seleccionar manualmente los paquetes que estime pueden ser necesarios.
-_do_you_want_to_continue_and_install_the_packages_you_already_have_selected=¿Desea continuar instalando los paquetes que ya ha seleccionado?
+_do_you_want_to_continue_and_install_the_packages_you_already_have_selected=\u00bfDesea continuar instalando los paquetes que ya ha seleccionado?
 _cancel=Cancelar
 _continue=Continuar
 _error_creating_the_wizard=Error creando el asistente.
-_malformed_url=Dirección URL incorrecta.
-_the_package_source_files_url_is_malformed._Please_review_it=La URL de los archivos fuente del paquete es incorrecta. Por favor, revísala.
-_the_owners_url_is_malformed._Please_review_it=La URL del propietario es incorrecta. Por favor, revísala.
+_malformed_url=Direcci\u00f3n URL incorrecta.
+_the_package_source_files_url_is_malformed._Please_review_it=La URL de los archivos fuente del paquete es incorrecta. Por favor, rev\u00edsala.
+_the_owners_url_is_malformed._Please_review_it=La URL del propietario es incorrecta. Por favor, rev\u00edsala.
 _advanced_options=Opciones avanzadas
 _select_an_option=Selecciona una opcion.
 _the_folder_install_already_exists._do_you_want_to_delete_it_before_proceeding?=El directorio install ya existe. Quieres borrarlo antes de continuar?
 _Couldn't_delete_the_directory=No se pudo borrar el directorio.
-_advanced_mode=El modo avanzado permite copiar recursos que están alojados fuera del directorio del plugin. No se recomienda usar esta opción.
+_advanced_mode=El modo avanzado permite copiar recursos que est\u00e1n alojados fuera del directorio del plugin. No se recomienda usar esta opci\u00f3n.
 _name=Nombre
-_description=Descripción
-_version=Versión
+_description=Descripci\u00f3n
+_version=Versi\u00f3n
 _build=Build
 _is_official=Es oficial?
 _status=Estado
-_code=Código
+_code=C\u00f3digo
 _operating_system=Sistema operativo
 _architecture=Arquitectura
-_java_version=Versión java
-_gvSIG_desktop_version=Versión gvSIG desktop
+_java_version=Versi\u00f3n java
+_gvSIG_desktop_version=Versi\u00f3n gvSIG desktop
 _package_owner=Propietario del paquete
 _package_URL_owner=URL del propietario del paquete 
-_sources_url=URL del código fuente
+_sources_url=URL del c\u00f3digo fuente
 _dependencies=Dependencias
 _plugin_description=Description del plugin
 _plugin_to_install=Plugin a instalar
 _enable_advanced_mode=Habilitar modo avanzado.
 _package_file=Archivo del paquete
-_package_index_file=Archivo del índice del paquete
+_package_index_file=Archivo del \u00edndice del paquete
 _download_url=URL de descarga
-_create_package_index=Crear índice del paquete
+_create_package_index=Crear \u00edndice del paquete
 _output_options=Opciones de salida
 _invalid_download_url=URL de descarga incorrecta.
 _files_to_copy=Archivos a copiar
 _the_folder_install/files_already_exists_do_you_want_to_delete_it_before_proceeding?=El directorio install/files ya existe. Desea borrarlo antes de continuar?
 _ant_script=Script de ant
-_select_installation_source=Selecciona fuente de instalación
-_select_installation_mode=Selecciona modo de instalación
-_gvSIG_packages_and_packages_and_index_sets=Paquetes gvSIG y sets de paquetes e índices
+_select_installation_source=Selecciona fuente de instalaci\u00f3n
+_select_installation_mode=Selecciona modo de instalaci\u00f3n
+_gvSIG_packages_and_packages_and_index_sets=Paquetes gvSIG y sets de paquetes e \u00edndices
 _broken_package=Paquete roto
-_install_addons_in_gvsig_standard_dist=instalar complementos incluidos en la distribución gvSIG standard
+_install_addons_in_gvsig_standard_dist=instalar complementos incluidos en la distribuci\u00f3n gvSIG standard
 _install_addons_in_gvspki_or_gvspks_file=instalar complementos contenidos en un archivo .gvspki o .gvspks
 _install_addons_from_remote_repo=instalar complementos desde un repositorio remoto
 _These_packages_not_downloaded=No se han podido descargar estos paquetes
@@ -110,11 +110,11 @@
 _Install_package=Instalar paquetes
 _finished_Some_files_not_downloaded=Terminado. Algunos archivos no se pudieron descargar.
 _downloading_files=Descargar archivos
-_Installing_devel_addons_may_cause_errors=Instalar complementos en desarrollo puede provocar errores de funcionamiento en la aplicación
+_Installing_devel_addons_may_cause_errors=Instalar complementos en desarrollo puede provocar errores de funcionamiento en la aplicaci\u00f3n
 _This_may_cause_issues_in_gvSIG=Esto puede provocar un mal funcionamiento de gvSIG
 
 select_package_location=Indique la ubicacion en la que se generara el paquete
-create_package_index=¿Desea crear el indice para este paquete?
+create_package_index=\u00bfDesea crear el indice para este paquete?
 create_index_for_package=Crear indice para el paquete
 select_package_index_location=Indique la ubicacion en la que se generara el indice
 destination_package_url=Para crear un indice debera indicar la url desde la que se podra descargar su paquete una vez generado.
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/text_en.properties
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/text_en.properties	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/text_en.properties	(revision 43088)
@@ -6,7 +6,7 @@
 _package_description=Package description
 _installer_progress=Installer progress
 _Compressing=Compressing
-_Creating_index=Creating índex
+_Creating_index=Creating \u00edndex
 _Finished=Finished
 _cant_create_the_package=Can't create the package
 _create_package=Create package
@@ -32,8 +32,8 @@
 _already_installed_but_not_installable=Already installed but not installable
 _official_recommended=Official and recommended
 _official=Official
-_not_official_recommended=Not official, recommended
-_not_official=Not official
+_community_recommended=Community, recommended
+_community=Community
 _downloading=Downloading
 _start_download=Start download
 _progress=Progress
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/creation/panel/formPackageinfo.xml
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/creation/panel/formPackageinfo.xml	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/resources/org/gvsig/installer/swing/impl/creation/panel/formPackageinfo.xml	(revision 43088)
@@ -67,7 +67,7 @@
         <field name="state" label="State" type="string" mandatory="false" defaultValue="testing" group="General">
           <description>State of the package</description>
           <availableValues>
-          	<value label="devel">devel</value>
+            <value label="devel">devel</value>
             <value label="testing">testing</value>
             <value label="pilot">pilot</value>
             <value label="prototype">prototype</value>
@@ -85,7 +85,11 @@
         </field>
         
         <field name="official" label="Official" type="boolean" group="General">
-          <description>Check if the package is a official package of gvSIG project</description>
+          <availableValues>
+            <value label="Official">true</value>
+            <value label="Community">false</value>
+          </availableValues>
+          <description>The package is a community or an official package of gvSIG project</description>
         </field>
 
         <field name="sources-url" label="Source code URL" type="URL" mandatory="false" group="General">
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/java/org/gvsig/installer/swing/impl/execution/panel/model/PackagesTableModel.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/java/org/gvsig/installer/swing/impl/execution/panel/model/PackagesTableModel.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/java/org/gvsig/installer/swing/impl/execution/panel/model/PackagesTableModel.java	(revision 43088)
@@ -64,7 +64,7 @@
 	}
 
 	public enum PackageOfficialRecommended {
-		OFFICIAL_NOT_RECOMMENDED, OFFICIAL_RECOMMENDED, NOT_OFFICIAL_RECOMMENDED, NOT_OFFICIAL_NOT_RECOMMENDED
+		OFFICIAL_NOT_RECOMMENDED, OFFICIAL_RECOMMENDED, COMMUNITY_RECOMMENDED, COMMUNITY_NOT_RECOMMENDED
 	}
 
 	public class PackageOsAndArchitecture {
@@ -437,9 +437,9 @@
 			}
 		} else {
 			if (currentlyVisiblePackages[rowIndex].isDefault()) {
-				return PackageOfficialRecommended.NOT_OFFICIAL_RECOMMENDED;
+				return PackageOfficialRecommended.COMMUNITY_RECOMMENDED;
 			} else {
-				return PackageOfficialRecommended.NOT_OFFICIAL_NOT_RECOMMENDED;
+				return PackageOfficialRecommended.COMMUNITY_NOT_RECOMMENDED;
 			}
 		}
 	}
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/java/org/gvsig/installer/swing/impl/execution/panel/PackagesTablePanel.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/java/org/gvsig/installer/swing/impl/execution/panel/PackagesTablePanel.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/java/org/gvsig/installer/swing/impl/execution/panel/PackagesTablePanel.java	(revision 43088)
@@ -34,8 +34,13 @@
 import java.awt.Insets;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
+import java.io.IOException;
+import java.io.InputStream;
 import java.net.URL;
 import java.util.List;
+import java.util.Locale;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.swing.JEditorPane;
 import javax.swing.JPanel;
@@ -44,6 +49,9 @@
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 import javax.swing.table.TableColumnModel;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import org.gvsig.installer.lib.api.PackageInfo;
 import org.gvsig.installer.swing.api.SwingInstallerLocator;
@@ -271,29 +279,63 @@
 			return;
 		}
 
-		PackageInfo pkginfo = ((PackagesTableModel) pluginsTable.getModel())
-				.getPackageInfoAt(row);
+		PackageInfo pkginfo = ((PackagesTableModel) pluginsTable.getModel()).getPackageInfoAt(row);
+		descriptionTextEditor.setText(getFullDescriptionAsHTML(pkginfo));
 
-		HTMLCoder html = new HTMLCoder();
-		html.addTitle(pkginfo.getName());
-		html.addParagraph(pkginfo.getDescription());
-		html.addBeginList();
-		html.addListItem("code", pkginfo.getCode());
-		html.addListItem("Organization", pkginfo.getOwner());
-		html.addListItem("Organization URL", pkginfo.getOwnerURL());
-		html.addListItem("Sources", pkginfo.getSourcesURL());
-		html.addListItem("Dependencies", pkginfo.getDependencies());
-		html.addListItem("Categories", pkginfo.getCategoriesAsString());
-		html.addListItem("Official", pkginfo.isOfficial());
-		html.addListItem("Signed", pkginfo.isSigned());
-		html.addEndList();
-
-		descriptionTextEditor.setText(html.toString());
-
 		// get the view area to the top-left corner
 		descriptionTextEditor.setCaretPosition(0);
 
 	}
+        
+        public String getFullDescriptionAsHTML(PackageInfo pkginfo) {
+            String html = null;
+            String lang = Locale.getDefault().getLanguage();
+            InputStream res = this.getClass().getClassLoader().getResourceAsStream("org/gvsig/installer/swing/impl/pkg_description_"+lang+".html");
+            if( res == null ) {
+                res = this.getClass().getClassLoader().getResourceAsStream("org/gvsig/installer/swing/impl/pkg_description_en.html");
+            }
+            if( res != null ) {
+                try {
+                    List<String> lines = IOUtils.readLines(res);
+                    html = StringUtils.join(lines,null);
+                    res.close();
+                } catch (Exception ex) {
+                    // Do nothing
+                }
+            }
+            if( html == null ) {
+		HTMLCoder coder = new HTMLCoder();
+		coder.addTitle(pkginfo.getName());
+		coder.addParagraph(pkginfo.getDescription());
+		coder.addBeginList();
+		coder.addListItem("code", pkginfo.getCode());
+		coder.addListItem("Organization", pkginfo.getOwner());
+		coder.addListItem("Organization URL", pkginfo.getOwnerURL());
+		coder.addListItem("Sources", pkginfo.getSourcesURL());
+		coder.addListItem("Dependencies", pkginfo.getDependencies());
+		coder.addListItem("Categories", pkginfo.getCategoriesAsString());
+		coder.addListItem("Official", pkginfo.isOfficial());
+		coder.addEndList();
+                return coder.toString();
+            }
+            
+            html = html.replace("${gvsig.package.info.name}",pkginfo.getName());
+            html = html.replace("${gvsig.package.info.description}",pkginfo.getDescription());
+            html = html.replace("${gvsig.package.info.official}",pkginfo.isOfficial()?"true":"false");
+            html = html.replace("${gvsig.package.info.official.label}",pkginfo.isOfficial()?"official":"community");
+            html = html.replace("${gvsig.package.info.owner}",pkginfo.getOwner());
+            html = html.replace("${gvsig.package.info.webURL}",pkginfo.getWebURL()==null? "":pkginfo.getWebURL().toString());
+            html = html.replace("${gvsig.package.info.categories}",pkginfo.getCategoriesAsString());
+            html = html.replace("${gvsig.package.info.sourcesURL}",pkginfo.getSourcesURL()==null?"":pkginfo.getSourcesURL().toString());
+            html = html.replace("${gvsig.package.info.code}",pkginfo.getCode());
+            html = html.replace("${gvsig.package.info.dependencies}",pkginfo.getDependencies()==null?"":pkginfo.getDependencies().toString());
+            html = html.replace("${gvsig.package.info.version}",pkginfo.getVersion()==null?"":pkginfo.getVersion().toString());
+            html = html.replace("${gvsig.package.info.state}",pkginfo.getState());
+            html = html.replace("${gvsig.package.info.operatingSystem}",pkginfo.getOperatingSystem());
+            html = html.replace("${gvsig.package.info.architecture}",pkginfo.getArchitecture());
+            html = html.replace("${gvsig.package.info.javaVM}",pkginfo.getJavaVM());
+            return html;
+        }
 
 	public void setFilter(PackageFilter filter) {
 		PackagesTableModel pluginsTableModel = (PackagesTableModel) pluginsTable
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/java/org/gvsig/installer/swing/impl/execution/panel/renderers/OfficialRecommendedCellRenderer.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/java/org/gvsig/installer/swing/impl/execution/panel/renderers/OfficialRecommendedCellRenderer.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/java/org/gvsig/installer/swing/impl/execution/panel/renderers/OfficialRecommendedCellRenderer.java	(revision 43088)
@@ -82,22 +82,22 @@
 
 			return check;
 
-		case NOT_OFFICIAL_RECOMMENDED:
+		case COMMUNITY_RECOMMENDED:
 			resource = this.getClass().getResource(
 					"/images/notOfficialRecommended.png");
 			icon = new ImageIcon(resource);
 			check.setIcon(icon);
 			check.setToolTipText(swingInstallerManager
-					.getText("_not_official_recommended"));
+					.getText("_community_recommended"));
 			return check;
 
-		case NOT_OFFICIAL_NOT_RECOMMENDED:
+		case COMMUNITY_NOT_RECOMMENDED:
 			resource = this.getClass().getResource("/images/notOfficial.png");
 			icon = new ImageIcon(resource);
 			check.setIcon(icon);
 			check
 					.setToolTipText(swingInstallerManager
-							.getText("_not_official"));
+							.getText("_community"));
 			return check;
 
 		default:
Index: trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/java/org/gvsig/installer/swing/impl/DefaultJShowPackageStatusAndAskContinuePanel.java
===================================================================
--- trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/java/org/gvsig/installer/swing/impl/DefaultJShowPackageStatusAndAskContinuePanel.java	(revision 43087)
+++ trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.installer/org.gvsig.installer.swing/org.gvsig.installer.swing.impl/src/main/java/org/gvsig/installer/swing/impl/DefaultJShowPackageStatusAndAskContinuePanel.java	(revision 43088)
@@ -60,19 +60,19 @@
 		this.createUI(manager, message);
 	}
 
-	private void buildPackageList(List<PackageInfo> packages) {
-		this.packages = new ArrayList<String>();
-		for (int i = 0; i < packages.size(); i++) {
-			PackageInfo pkg = packages.get(i);
-			if (!pkg.isOfficial()) {
-				this.packages.add(pkg.getName() + " ("
-						+ swingInstallerManager.getText("_not_official") + ")");
-			} else {
-			    
-			    if (InstallerManager.STATE.FINAL.equalsIgnoreCase(pkg.getState())) {
-			        continue;
-			    } else if (InstallerManager.STATE.TESTING.equalsIgnoreCase(pkg.getState())) {
-			        continue;
+    private void buildPackageList(List<PackageInfo> packages) {
+        this.packages = new ArrayList<>();
+        for (int i = 0; i < packages.size(); i++) {
+            PackageInfo pkg = packages.get(i);
+            if (!pkg.isOfficial()) {
+                this.packages.add(pkg.getName() + " ("
+                        + swingInstallerManager.getText("_community") + ")");
+            } else {
+
+                if (InstallerManager.STATE.FINAL.equalsIgnoreCase(pkg.getState())) {
+                    continue;
+                } else if (InstallerManager.STATE.TESTING.equalsIgnoreCase(pkg.getState())) {
+                    continue;
                 } else if (pkg.getState().toLowerCase().startsWith(InstallerManager.STATE.RC.toLowerCase())) {
                     continue;
                 } else if (pkg.getState().toLowerCase().startsWith(InstallerManager.STATE.BETA.toLowerCase())) {
@@ -80,9 +80,9 @@
                 } else {
                     this.packages.add(pkg.getName() + " (" + pkg.getState() + ")");
                 }
-			}
-		}
-	}
+            }
+        }
+    }
 
 	private void createUI(SwingInstallerManager manager, String message) {
 		this.setLayout(new BorderLayout());
