001/*
002 * Copyright (c) 2014-2015 The Regents of the University of California.
003 * All rights reserved.
004 *
005 * '$Author: crawl $'
006 * '$Date: 2015-12-09 21:41:37 +0000 (Wed, 09 Dec 2015) $' 
007 * '$Revision: 34322 $'
008 * 
009 * Permission is hereby granted, without written agreement and without
010 * license or royalty fees, to use, copy, modify, and distribute this
011 * software and its documentation for any purpose, provided that the above
012 * copyright notice and the following two paragraphs appear in all copies
013 * of this software.
014 *
015 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
016 * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
017 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
018 * THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
019 * SUCH DAMAGE.
020 *
021 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
022 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
023 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
024 * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
025 * CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
026 * ENHANCEMENTS, OR MODIFICATIONS.
027 *
028 */
029package org.kepler.gis.data;
030
031import java.io.File;
032import java.io.Serializable;
033
034import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader;
035import org.opengis.coverage.grid.GridCoverage;
036
037import ptolemy.data.BooleanToken;
038import ptolemy.data.Token;
039import ptolemy.data.type.Type;
040import ptolemy.kernel.util.IllegalActionException;
041
042/** Token containing a GIS raster.
043 * 
044 *  @author Daniel Crawl
045 *  @version $Id: RasterToken.java 34322 2015-12-09 21:41:37Z crawl $
046 *  
047 */
048public class RasterToken extends Token {
049
050    /** Create a new RasterToken from a coverage. */
051    public RasterToken(GridCoverage coverage) throws IllegalActionException {
052        if(coverage == null) {
053            throw new IllegalActionException("Cannot create RasterToken with null coverage.");
054        }
055        _coverage = coverage;
056    }
057
058    /** Create a new RasterToken from a reader. */
059    public RasterToken(AbstractGridCoverage2DReader reader) throws IllegalActionException {
060        if(reader == null) {
061            throw new IllegalActionException("Cannot create RasterToken with null reader.");
062        }
063        _reader = reader;
064    }
065    
066    /** Create a new RasterToken from a file. */
067    public RasterToken(File file) {
068        _file = file;
069    }
070
071    /** Get the coverage. */
072    public GridCoverage coverageValue() {
073        return _coverage;
074    }
075    
076    /** Get the reader. */
077    public AbstractGridCoverage2DReader reader() {
078        return _reader;
079    }
080    
081    /** Get the file. */
082    public File rasterFile() {
083        return _file;
084    }
085    
086    
087    @Override
088    public Type getType() {
089        return RASTER;
090    }
091    
092    /**
093     * Test for equality of the values of this Token and the argument Token. If
094     * the value of this token or the value of the rightArgument token is null,
095     * then we return False.
096     * 
097     * @param rightArgument
098     *            The Token to test against.
099     * @exception IllegalActionException
100     *                Not thrown in this base class.
101     * @return A boolean token that contains the value true if the dates are the
102     *         same.
103     */
104    @Override
105    public final BooleanToken isEqualTo(Token rightArgument)
106            throws IllegalActionException {
107        GridCoverage rightData = ((RasterToken) rightArgument).coverageValue();
108        GridCoverage leftData = coverageValue();
109
110        if ((rightData == null) || (leftData == null)) {
111            return BooleanToken.FALSE;
112        } else if (rightData.equals(leftData)) {
113            return BooleanToken.TRUE;
114        } else {
115            return BooleanToken.FALSE;
116        }
117    }
118
119    /**
120     * Return a String representation of the DateToken. The string is surrounded
121     * by double-quotes; without them, the Ptolemy expression parser fails to
122     * parse it.
123     * 
124     * @return A String representation of the DateToken.
125     */
126    @Override
127    public String toString() {
128        if (_coverage == null) {
129            return "";
130        } else {
131            return _coverage.toString();
132        }
133    }
134
135    public static class RasterType implements Cloneable, Type, Serializable {
136
137        @Override
138        public Type add(Type rightArgumentType) {
139            // TODO Auto-generated method stub
140            return this;
141        }
142
143        @Override
144        public Object clone() {
145            return this;
146        }
147        
148        @Override
149        public Token convert(Token token) throws IllegalActionException {
150            if (token instanceof RasterToken) {
151                return token;
152            } else {
153                throw new IllegalActionException("Attempt to convert token "
154                        + token + " into a Raster token, which is not possible.");
155            }
156        }
157
158        @Override
159        public Type divide(Type rightArgumentType) {
160            // TODO Auto-generated method stub
161            return this;
162        }
163
164        @Override
165        public int getTypeHash() {
166            // TODO Auto-generated method stub
167            return 0;
168        }
169
170        @Override
171        public Class<?> getTokenClass() {
172            return RasterToken.class;
173        }
174
175        @Override
176        public boolean isAbstract() {
177            return false;
178        }
179
180        @Override
181        public boolean isCompatible(Type type) {
182            return type == this;
183        }
184
185        @Override
186        public boolean isConstant() {
187            return true;
188        }
189
190        @Override
191        public boolean isInstantiable() {
192            return true;
193        }
194
195        @Override
196        public boolean isSubstitutionInstance(Type type) {
197            return type == this;
198        }
199
200        @Override
201        public Type modulo(Type rightArgumentType) {
202            // TODO Auto-generated method stub
203            return this;
204        }
205
206        @Override
207        public Type multiply(Type rightArgumentType) {
208            // TODO Auto-generated method stub
209            return this;
210        }
211
212        @Override
213        public Type one() {
214            // TODO Auto-generated method stub
215            return this;
216        }
217
218        @Override
219        public Type subtract(Type rightArgumentType) {
220            // TODO Auto-generated method stub
221            return this;
222        }
223
224        @Override
225        public String toString() {
226            return "raster";
227        }
228        
229        @Override
230        public Type zero() {
231            // TODO Auto-generated method stub
232            return this;
233        }
234
235    }
236    
237    public static final RasterType RASTER = new RasterType();
238
239    private GridCoverage _coverage;
240    private AbstractGridCoverage2DReader _reader;
241    private File _file;
242    
243}