www.pudn.com > gvSIG-1_1-rc1-src.zip > CSWFilter.java



/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
*
* Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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 General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
*
* For more information, contact:
*
*  Generalitat Valenciana
*   Conselleria d'Infraestructures i Transport
*   Av. Blasco Ibáñez, 50
*   46010 VALENCIA
*   SPAIN
*
*      +34 963862235
*   gvsig@gva.es
*      www.gvsig.gva.es
*
*    or
*
*   IVER T.I. S.A
*   Salamanca 50
*   46005 Valencia
*   Spain
*
*   +34 963163400
*   dac@iver.es
*/
package es.gva.cit.catalogClient.csw.filters;
import org.gvsig.i18n.Messages;

import es.gva.cit.catalogClient.csw.drivers.CSWMessages;
import es.gva.cit.catalogClient.filters.AbstractFilter;
import es.gva.cit.catalogClient.filters.AdditionalClauses;
import es.gva.cit.catalogClient.languages.FilterEncoding;
import es.gva.cit.catalogClient.querys.Query;
import es.gva.cit.catalogClient.schemas.DublinCoreSchema;
import es.gva.cit.catalogClient.schemas.EbRIMSchema;
import es.gva.cit.catalogClient.schemas.ISO19115Schema;
import es.gva.cit.catalogClient.schemas.ISchemas;
import es.gva.cit.catalogClient.schemas.Schemas;
import es.gva.cit.catalogClient.utils.Strings;

/**
 * This class creates a CSW query. It can create querys using the Filter Encoding Language with ebXML or ISO19115/19119 profiles
 * 
 * 
 * @author Jorge Piera Llodra (piera_jor@gva.es)
 */
public class CSWFilter extends AbstractFilter {
/**
 * 
 * 
 */
    private ISchemas equiv = null;

/**
 * 
 * 
 */
    public  CSWFilter() {        
        super();
    } 

/**
 * Return a CQL-Text query
 * 
 * 
 * @param query 
 * @return String
 * @param profile 
 */
    public String getQuery(Query query, String profile) {        
        String pregunta = null;
        setProfile(profile);
      FilterEncoding filter = new FilterEncoding("ogc:", "*", "?", "\\",
                "xmlns:ogc=\"http://www.opengis.net/ogc\"");
        
        addAdditionalClauses(filter);
        
        if (query.getTitle() != null) {
        	if (CSWMessages.getUrl().getHost().equals("laits.gmu.edu")){
            	if (query.getSearchType() == Query.SEARCH_DATA){
            		StringBuffer buffer = new StringBuffer();
            		buffer.append("");
            		buffer.append("");
            		buffer.append("/DataGranule/name");
            		buffer.append("*" + query.getTitle() + "*");
            		buffer.append("");
            		buffer.append("");
            		return buffer.toString();
            	}else{
            		StringBuffer buffer = new StringBuffer();
            		buffer.append("");
            		buffer.append("");
            		buffer.append("");
            		buffer.append("/Service/@id");
            		buffer.append("/Classification/@classifiedObject");
            		buffer.append("");
            		buffer.append("");
            		buffer.append("/Classification/@classificationNode");
            		buffer.append("/ClassificationNode/@id");
            		buffer.append("");
            		buffer.append("");
            		buffer.append("/ClassificationNode/@code");
            		buffer.append("" + query.getTitle() + "");
            		buffer.append("");
            		buffer.append("");
            		buffer.append("");
            		return buffer.toString();
            	}
            }else{
            	filter.addClauses(equiv.getTitle(), equiv.getTitleValue(query.getTitle(),query.getTitleFilter()), query.getTitleFilter(),
                        "PropertyIsLike", "L", "And");
            }
        }     
        
        if (query.isMinimized()){
            if (query.getAbstract() != null) {
                filter.addClauses(equiv.getAbstract(), Strings.addAsteriscsFromAnArray(query.getAbstract()),
                    "Y", "PropertyIsLike", "L", "Or");
            }
        }else{
              if (query.getAbstract() != null) {
                  filter.addClauses(equiv.getAbstract(), Strings.addAsteriscsFromAnArray(query.getAbstract()),
                          "Y", "PropertyIsLike", "L", "And");
              }
        
              if (query.getThemeKey() != null) {
                filter.addClauses(equiv.getThemeKey(), query.getThemeKey(), "Y",
                        "PropertyIsLike", "L", "And");
              }
            if ((query.getTopic() != null) && (!query.getTopic().equals(Messages.getText("cathegoryAny")))) {
                    filter.addClauses(equiv.getTopic(), equiv.getTopicValue(query.getTopic()),
                        "E", "PropertyIsEqualTo", "L", "And");
              }
             /*
             if (this.getScale() != null) {
             query.addClauses(equiv.getScale(), this.getScale(), "E");
             }
             */
        
             if (query.getProvider() != null) {
                filter.addClauses(equiv.getProvider(), equiv.getProviderValue(query.getProvider()),
                        "E", "PropertyIsEqualTo" , "L", "And");
             }
        
            if (query.getDateFrom() != null) {
                filter.addClauses(equiv.getDateFrom(), query.getDateFrom(), "E", "PropertyIsGeaterThan" ,"L", "And");
            }
            if (query.getDateTo() != null) {
                filter.addClauses(equiv.getDateTo(), query.getDateTo(), "E", "PropertyIsLessThan", "L", "And");
            }
        }
        if ((query.getCoordenates() != null) && (query.isCoordinatesClicked())){
            filter.addBoundingBox(query.getCoordenates(), equiv.getCoordinates(), getCoordinatesOption(query.getCoordenatesFilter()));
            
        }
        pregunta = filter.toString();
        return pregunta;
    } 

/**
 * This function returns true only when the user has choosen the
 * "Fully Outside Of" of the coordinates option.
 * 
 * 
 * @return 
 * @param translator 
 * @param coordinatesOption 
 */
    public boolean getCoordinatesOption(String coordinatesOption) {        
        if ((coordinatesOption.equals(Messages.getText("coordinatesEqual"))) ||
                (coordinatesOption.equals(Messages.getText("coordinatesContains"))) ||
                (coordinatesOption.equals(Messages.getText("coordinatesEnclose"))))
            return false;
       
        return true; 
    } 

/**
 * It sets the CSW profile
 * 
 * 
 * @param profile 
 */
    public void setProfile(String profile) {        
        if (profile.equals(Schemas.ISO19115)) {
            setEquiv(new ISO19115Schema());
        } else if (profile.equals(Schemas.DUBLINCORE))
            setEquiv(new DublinCoreSchema());
            else{
                setEquiv(new EbRIMSchema());
        }
    } 

/**
 * It adds the aditional clauses (for each profile)
 * 
 * 
 * @param filter 
 */
    public void addAdditionalClauses(FilterEncoding filter) {        
        AdditionalClauses[] ac = equiv.getAdditionalClauses(null);
        for (int i = 0; i < ac.length; i++)
            filter.addClauses(ac[i].getProperty(), ac[i].getValue(),
                ac[i].getConcorancia(), ac[i].getRelationship(), ac[i].getType(),"And");
    } 

/**
 * 
 * 
 * 
 * @return Returns the equiv.
 */
    public ISchemas getEquiv() {        
        return equiv;
    } 

/**
 * 
 * 
 * 
 * @param equiv The equiv to set.
 */
    public void setEquiv(ISchemas equiv) {        
        this.equiv = equiv;
    } 
 }