/* * Copyright (c) 2012 Data Harmonisation Panel * * All rights reserved. This program and the accompanying materials are made * available under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution. If not, see <http://www.gnu.org/licenses/>. * * Contributors: * 1Spatial PLC <http://www.1spatial.com> * HUMBOLDT EU Integrated Project #030962 * Data Harmonisation Panel <http://www.dhpanel.eu> */ package com.onespatial.jrc.tns.oml_to_rif.digest; import org.geotools.filter.AbstractFilter; import org.geotools.filter.AndImpl; import org.geotools.filter.CompareFilterImpl; import org.geotools.filter.GeometryFilterImpl; import org.geotools.filter.IsEqualsToImpl; import org.geotools.filter.IsGreaterThanImpl; import org.geotools.filter.IsLessThenImpl; import org.geotools.filter.LikeFilterImpl; import org.geotools.filter.LogicFilterImpl; import org.geotools.filter.NotImpl; import org.geotools.filter.OrImpl; import org.geotools.filter.spatial.ContainsImpl; import org.geotools.filter.spatial.IntersectsImpl; import org.geotools.filter.spatial.WithinImpl; import com.onespatial.jrc.tns.oml_to_rif.model.rif.filter.nonterminal.FilterNode; import com.onespatial.jrc.tns.oml_to_rif.model.rif.filter.nonterminal.comparison.AbstractComparisonNode; import com.onespatial.jrc.tns.oml_to_rif.model.rif.filter.nonterminal.comparison.EqualToNode; import com.onespatial.jrc.tns.oml_to_rif.model.rif.filter.nonterminal.comparison.GreaterThanNode; import com.onespatial.jrc.tns.oml_to_rif.model.rif.filter.nonterminal.comparison.LessThanNode; import com.onespatial.jrc.tns.oml_to_rif.model.rif.filter.nonterminal.comparison.LikeNode; import com.onespatial.jrc.tns.oml_to_rif.model.rif.filter.nonterminal.geometric.AbstractGeometricNode; import com.onespatial.jrc.tns.oml_to_rif.model.rif.filter.nonterminal.geometric.ContainsNode; import com.onespatial.jrc.tns.oml_to_rif.model.rif.filter.nonterminal.geometric.IntersectsNode; import com.onespatial.jrc.tns.oml_to_rif.model.rif.filter.nonterminal.geometric.WithinNode; import com.onespatial.jrc.tns.oml_to_rif.model.rif.filter.nonterminal.logical.AndNode; import com.onespatial.jrc.tns.oml_to_rif.model.rif.filter.nonterminal.logical.NotNode; import com.onespatial.jrc.tns.oml_to_rif.model.rif.filter.nonterminal.logical.OrNode; /** * A factory to create filters nodes as required. * * @author Simon Payne (Simon.Payne@1spatial.com) / 1Spatial Group Ltd. * @author Richard Sunderland (Richard.Sunderland@1spatial.com) / 1Spatial Group Ltd. */ public class FilterNodeFactory { /** * @param source * {@link CompareFilterImpl} * @return {@link AbstractComparisonNode} */ public AbstractComparisonNode createComparisonNode(AbstractFilter source) { if (source instanceof IsEqualsToImpl) { return createIsEqualToNode(); } else if (source instanceof IsGreaterThanImpl) { return createIsGreaterThanNode(); } else if (source instanceof IsLessThenImpl) { return createIsLessThanNode(); } else if (source instanceof LikeFilterImpl) { return createLikeNode(); } throw new UnsupportedOperationException("Filter is not supported: " //$NON-NLS-1$ + source.getClass().getCanonicalName()); } /** * @param logicFilter * {@link LogicFilterImpl} * @return {@link FilterNode} */ public FilterNode createLogicNode(LogicFilterImpl logicFilter) { if (logicFilter instanceof AndImpl) { return createAndNode(); } else if (logicFilter instanceof OrImpl) { return createOrNode((OrImpl) logicFilter); } else if (logicFilter instanceof NotImpl) { return createNotNode((NotImpl) logicFilter); } throw new UnsupportedOperationException("Unrecognised type " //$NON-NLS-1$ + logicFilter.getClass().getCanonicalName()); } /** * @param geometricFilter * {@link GeometryFilterImpl} * @return {@link FilterNode} */ public AbstractGeometricNode createGeometricNode(GeometryFilterImpl geometricFilter) { if (geometricFilter instanceof ContainsImpl) { return createContainsNode(); } else if (geometricFilter instanceof WithinImpl) { return createWithinNode(); } else if (geometricFilter instanceof IntersectsImpl) { return createIntersectsNode(); } throw new UnsupportedOperationException("Unsupported filter type: " //$NON-NLS-1$ + geometricFilter.getClass().getCanonicalName()); } AndNode createAndNode() { return new AndNode(); } OrNode createOrNode(OrImpl filter) { return new OrNode(); } NotNode createNotNode(NotImpl filter) { return new NotNode(); } EqualToNode createIsEqualToNode() { EqualToNode node = new EqualToNode(); return node; } GreaterThanNode createIsGreaterThanNode() { return new GreaterThanNode(); } LessThanNode createIsLessThanNode() { return new LessThanNode(); } ContainsNode createContainsNode() { return new ContainsNode(); } WithinNode createWithinNode() { return new WithinNode(); } AbstractGeometricNode createIntersectsNode() { return new IntersectsNode(); } LikeNode createLikeNode() { return new LikeNode(); } }