/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2005-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library 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;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*/
package org.geotools.renderer.lite.gridcoverage2d;
import java.util.List;
import org.geotools.coverage.grid.GridCoverageFactory;
import org.geotools.factory.Hints;
import org.geotools.renderer.i18n.ErrorKeys;
import org.geotools.renderer.i18n.Errors;
import org.geotools.styling.RasterSymbolizer;
import org.geotools.styling.Style;
import org.geotools.styling.StyleVisitor;
import org.opengis.coverage.grid.GridCoverage;
import org.opengis.util.InternationalString;
/**
* This class implements an adapter to allow a {@link CoverageProcessingNode} to feed itself by visiting an SLD {@link Style} . <p> This class can be used to tie together {@link CoverageProcessingNode} s built from a chains as specified by the {@link RasterSymbolizer} SLd element.
* @author Simone Giannecchini, GeoSolutions
*
*
* @source $URL$
*/
public abstract class StyleVisitorCoverageProcessingNodeAdapter extends
StyleVisitorAdapter implements StyleVisitor, CoverageProcessingNode {
/**
* Checks whether the provided source object is null or not. If it is null
* it throws an {@link IllegalArgumentException} exception.
*
* @param source
* the object to check.
* @param node
* the operation we are trying to run.
*/
protected static void ensureSourceNotNull(final Object source,
final String name) {
if (source == null)
throw new IllegalArgumentException(Errors.format(
ErrorKeys.SOURCE_CANT_BE_NULL_$1, name));
}
/**
* Checks whether the provided object is null or not. If it is null it
* throws an {@link IllegalArgumentException} exception.
*
* @param source
* the object to check.
* @param node
* the operation we are trying to run.
*/
protected static void ensureNotNull(final Object source, final String name) {
if (source == null)
throw new IllegalArgumentException(Errors.format(
ErrorKeys.NULL_ARGUMENT_$1, name));
}
/**
* Allows subclasses to access the {@link CoverageProcessingNode} we are adapting.
* @return the adaptee
* @uml.property name="adaptee"
*/
protected CoverageProcessingNode getAdaptee() {
return adaptee;
}
/**
* Instance of {@link CoverageProcessingNode} that we are adapting.
*/
private final CoverageProcessingNode adaptee;
/**
*
* @param adaptee
*/
public StyleVisitorCoverageProcessingNodeAdapter(
CoverageProcessingNode adaptee) {
ensureNotNull(adaptee, "CoverageProcessingNode");
this.adaptee = adaptee;
}
/**
* Default constructor for {@link StyleVisitorCoverageProcessingNodeAdapter}
*/
public StyleVisitorCoverageProcessingNodeAdapter(InternationalString name,
InternationalString description) {
this(-1, name, description);
}
/**
* Default constructor that gives users the possibility
*
* @param maxSources
* maximum number of sources allowed for this node.
*/
public StyleVisitorCoverageProcessingNodeAdapter(int maxSources,
InternationalString name, InternationalString description) {
this(maxSources, null, name, description);
}
/**
* Default constructor that gives users the possibility
*
* @param maxSources
* maximum number of sources allowed for this node.
* @param hints
* instance of {@link Hints} class to control creation of
* internal factories. It can be <code>null</code>.
*/
public StyleVisitorCoverageProcessingNodeAdapter(int maxSources,
Hints hints, InternationalString name,
InternationalString description) {
adaptee = new BaseCoverageProcessingNode(maxSources,
hints != null ? (Hints) hints.clone() : null, name, description) {
protected GridCoverage execute() {
synchronized (StyleVisitorCoverageProcessingNodeAdapter.this) {
return StyleVisitorCoverageProcessingNodeAdapter.this
.execute();
}
}
};
}
/**
*
* @see BaseCoverageProcessingNode#execute()
*/
protected abstract GridCoverage execute();
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#addSink(org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode)
*/
public void addSink(CoverageProcessingNode sink) {
adaptee.addSink(sink);
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#addSource(org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode)
*/
public boolean addSource(CoverageProcessingNode source) {
return adaptee.addSource(source);
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#getOutput()
*/
public GridCoverage getOutput() {
return adaptee.getOutput();
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#getSink(int)
*/
public CoverageProcessingNode getSink(int index) {
return adaptee.getSink(index);
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#getSinks()
*/
public List <CoverageProcessingNode> getSinks() {
return adaptee.getSinks();
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#getSource(int)
*/
public CoverageProcessingNode getSource(int index) {
return adaptee.getSource(index);
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#getSources()
*/
public List<CoverageProcessingNode>getSources() {
return adaptee.getSources();
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#removeSink(org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode)
*/
public boolean removeSink(CoverageProcessingNode sink) {
return adaptee.removeSink(sink);
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#removeSink(int)
*/
public CoverageProcessingNode removeSink(int index) {
return adaptee.removeSink(index);
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#removeSource(org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode)
*/
public boolean removeSource(CoverageProcessingNode source) {
return adaptee.removeSource(source);
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#removeSource(int)
*/
public CoverageProcessingNode removeSource(int index) {
return adaptee.removeSource(index);
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#dispose(boolean)
*/
public void dispose(boolean force) {
adaptee.dispose(force);
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#getHints()
*/
public Hints getHints() {
return adaptee.getHints();
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#getCoverageFactory()
*/
public GridCoverageFactory getCoverageFactory() {
return adaptee.getCoverageFactory();
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#getNumberOfSinks()
*/
public int getNumberOfSinks() {
return adaptee.getNumberOfSinks();
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#getNumberOfSources()
*/
public int getNumberOfSources() {
return adaptee.getNumberOfSources();
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#getDescription()
*/
public InternationalString getDescription() {
return adaptee.getDescription();
}
/*
* (non-Javadoc)
*
* @see org.geotools.renderer.lite.gridcoverage2d.CoverageProcessingNode#getName()
*/
public InternationalString getName() {
return adaptee.getName();
}
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return adaptee.toString();
}
}