All Downloads are FREE. Search and download functionalities are using the official Maven repository.

thredds.cataloggen.config.DatasetSource Maven / Gradle / Ivy

Go to download

The NetCDF-Java Library is a Java interface to NetCDF files, as well as to many other types of scientific data formats.

The newest version!
/*
 * Copyright 1998-2009 University Corporation for Atmospheric Research/Unidata
 *
 * Portions of this software were developed by the Unidata Program at the
 * University Corporation for Atmospheric Research.
 *
 * Access and use of this software shall impose the following obligations
 * and understandings on the user. The user is granted the right, without
 * any fee or cost, to use, copy, modify, alter, enhance and distribute
 * this software, and any derivative works thereof, and its supporting
 * documentation for any purpose whatsoever, provided that this entire
 * notice appears in all copies of the software, derivative works and
 * supporting documentation.  Further, UCAR requests that the user credit
 * UCAR/Unidata in any publications that result from the use of this
 * software or in any product that includes this software. The names UCAR
 * and/or Unidata, however, may not be used in any advertising or publicity
 * to endorse or promote any products or commercial entity unless specific
 * written permission is obtained from UCAR/Unidata. The user also
 * understands that UCAR/Unidata is not obligated to provide the user with
 * any support, consulting, training or assistance of any kind with regard
 * to the use, operation and performance of this software nor to provide
 * the user with any updates, revisions, new versions or "bug fixes."
 *
 * THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL,
 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 * WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE.
 */
// $Id: DatasetSource.java 63 2006-07-12 21:50:51Z edavis $

package thredds.cataloggen.config;

import thredds.catalog.*;
import thredds.cataloggen.config.CatalogRefInfo;
import thredds.cataloggen.DatasetEnhancer1;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

// @todo Add state machine to control what can happen when.
// State machine: 1) constructed and modified, 2) expanded, 3) named,
// 4) metadata-ified, and 5) sorted.

// @todo Implement DatasetSource type using Strategy pattern rather than subclassing.
// I.e., extract abstract methods into interface, config (type given to
// DatasetSource.factory()) determines the implementation used.
// Current subclassing is cumbersome and not so flexible as the factory must be
// modified when new implementation is added.

/**
 * Represents a source from which a collection of datasets can be found and
 * expanded into an InvCatalog. Besides expanding the DatasetSource, the datasets
 * in the resulting catalog can be named, sorted, and have metadata added to them.
 *
 * 

* Currently an abstract class, three abstract methods must be implemented to * make a concrete subclass. These methods are getTopLevelDataset():InvDataset, * isCollection():boolean, and expandThisLevel(InvDataset):List. (In previous * versions, expandThisType():void was the only abstract method.) *

* * @author Ethan Davis * @version $Id: DatasetSource.java 63 2006-07-12 21:50:51Z edavis $ */ abstract public class DatasetSource { static private org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DatasetSource.class); /** The catalog that results from expanding this DatasetSource. */ protected InvCatalog resultingCatalog; /** Top-level dataset of the catalog generated by this DatasetSource. */ protected InvDataset accessPointDataset; /** Information on the catalogRefs in the resulting catalog. */ protected List catalogRefInfoList = new ArrayList(); // attributes of the datasetSource element private String name; protected DatasetSourceType type; private DatasetSourceStructure structure; private boolean flatten = false; private String accessPoint; private String prefixUrlPath; // If true, create CatalogRefs for all collection datasets, otherwise // recurse into all collection datasets (default false). protected boolean createCatalogRefs = false; // protected boolean expandCatalogRef = false; // @todo Decide if expandCatalogRef is done here in DatasetSource or by CatalogGen (or other DatasetSource caller). // Required child ResultService private ResultService resultService; // list of optional children of the datasetNamer element protected List datasetNamerList = new ArrayList(); protected List datasetFilterList = new ArrayList(); protected DatasetSorter datasetSorter = null; protected List datasetEnhancerList = new ArrayList(); protected boolean addDatasetSize; // for validation protected boolean isValid = true; protected StringBuffer msgLog = new StringBuffer(); /** Default Constructor */ protected DatasetSource(){} /** * Factory method for this abstract class. * @param name * @param type * @param structure * @param accessPoint * * @throws IllegalArgumentException if DatasetSource type is null or unsupported. */ public static final DatasetSource newDatasetSource( String name, DatasetSourceType type, DatasetSourceStructure structure, String accessPoint, ResultService resultService ) { if ( type == null) { String tmpMsg = "DatasetSource type cannot be null"; logger.error( "newDatasetSource(): " + tmpMsg); throw new IllegalArgumentException( tmpMsg); } DatasetSource tmpDsSource = null; if ( type == DatasetSourceType.getType( "Local")) { tmpDsSource = new LocalDatasetSource(); } else if ( type == DatasetSourceType.getType( "DodsDir")) { tmpDsSource = new DodsDirDatasetSource(); } else if ( type == DatasetSourceType.getType( "DodsFileServer")) { tmpDsSource = new DodsFileServerDatasetSource(); } else if ( type == DatasetSourceType.getType( "GrADSDataServer")) { tmpDsSource = new GrADSDataServerDatasetSource(); } else { String tmpMsg = "Unsupported DatasetSource type <" + type.toString() + ">."; logger.error( "newDatasetSource(): " + tmpMsg); throw new IllegalArgumentException( tmpMsg); } tmpDsSource.setName( name); tmpDsSource.setStructure( structure); tmpDsSource.setAccessPoint( accessPoint); tmpDsSource.setResultService( resultService); // Test validity and append messages to log. logger.debug( "DatasetSource(): constructor done."); StringBuilder log = new StringBuilder(); if ( tmpDsSource.validate( log)) { logger.debug( "DatasetSource(): new DatasetSource is valid: {}", log.toString()); } else { logger.debug( "DatasetSource(): new DatasetSource is invalid: {}", log.toString()); } return( tmpDsSource); } public InvCatalog getResultingCatalog() { return( this.resultingCatalog); } public List getCatalogRefInfoList() { return catalogRefInfoList; } public String getName() { return( this.name); } public void setName( String name) { this.name = name; } public DatasetSourceType getType() { return( this.type); } public DatasetSourceStructure getStructure() { return( this.structure); } public void setStructure( DatasetSourceStructure structure) { this.structure = structure; if ( this.structure == DatasetSourceStructure.FLAT) flatten = true; else flatten = false; } public boolean isFlatten() { return( this.flatten); } public String getAccessPoint() { return( this.accessPoint); } public void setAccessPoint( String accessPoint) { this.accessPoint = accessPoint; } public String getPrefixUrlPath() { return( this.prefixUrlPath); } public void setPrefixUrlPath( String prefixUrlPath ) { this.prefixUrlPath = prefixUrlPath; } public ResultService getResultService() { return( this.resultService); } public void setResultService( ResultService resultService) { this.resultService = resultService; } public boolean isCreateCatalogRefs() { return( this.createCatalogRefs); } public void setCreateCatalogRefs( boolean createCatalogRefs) { this.createCatalogRefs = createCatalogRefs; } // public boolean isExpandCatalogRef() // { // return expandCatalogRef; // } // // public void setExpandCatalogRef( boolean expandCatalogRef ) // { // this.expandCatalogRef = expandCatalogRef; // } public java.util.List getDatasetNamerList() { return( this.datasetNamerList); } public void addDatasetNamer( DatasetNamer datasetNamer) { this.datasetNamerList.add( datasetNamer); } public java.util.List getDatasetFilterList() { return( this.datasetFilterList); } public void addDatasetFilter( DatasetFilter datasetFilter) { this.datasetFilterList.add( datasetFilter); } public DatasetSorter getDatasetSorter() { return ( this.datasetSorter ); } public void setDatasetSorter( DatasetSorter datasetSorter ) { this.datasetSorter = datasetSorter; } public java.util.List getDatasetEnhancerList() { return( this.datasetEnhancerList ); } public void addDatasetEnhancer( DatasetEnhancer1 dsEnhancer) { if ( this.datasetEnhancerList == null) this.datasetEnhancerList = new ArrayList(); this.datasetEnhancerList.add( dsEnhancer); } public boolean isAddDatasetSize() { return( this.addDatasetSize); } public void setAddDatasetSize( boolean addDatasetSize ) { this.addDatasetSize = addDatasetSize; } public boolean validate( StringBuilder out) { this.isValid = true; // If log from construction has content, append to validation output msg. if (this.msgLog.length() > 0) { out.append( this.msgLog); } // Check that name is not null (it can be an empty string). if ( this.getName() == null) { this.isValid = false; out.append(" ** DatasetSource (5): null value for name is not valid."); } // Check that type is not null. if ( this.getType() == null) { this.isValid = false; out.append(" ** DatasetSource (6): null value for type is not valid (set with bad string?)."); } // Check that structure is not null. if ( this.getStructure() == null) { this.isValid = false; out.append(" ** DatasetSource (7): null value for structure is not valid (set with bad string?)."); } // Validate ResultService child element. if ( this.getResultService() != null ) { this.isValid &= this.getResultService().validate( out); } // Validate DatasetNamer child elements. java.util.Iterator dsnIter = this.getDatasetNamerList().iterator(); while (dsnIter.hasNext()) { this.isValid &= ((DatasetNamer) dsnIter.next()).validate( out); } // Validate DatasetFilters child elements. java.util.Iterator dsfIter = this.getDatasetFilterList().iterator(); while (dsfIter.hasNext()) { this.isValid &= ((DatasetFilter) dsfIter.next()).validate( out); } return( this.isValid); } /** string representation */ public String toString() { StringBuffer tmp = new StringBuffer(); tmp.append( "DatasetSource[name:<" + this.getName() + "> type:<" + this.getType() + "> structure:<" + this.getStructure() + "> accessPoint:<" + this.getAccessPoint() + "> and children - " + "ResultService(" + this.getResultService().getName() + ") - " + "DatasetNamer(" + this.getDatasetNamerList().size() + ") - " + "DatasetFilter(" + this.getDatasetFilterList().size() + ")]"); return( tmp.toString()); } /** * Crawl this DatasetSource and generate a new InvCatalog, return the * top-level InvDataset. * * Each object found on the DatasetSource becomes an InvDataset if it is * accepted by at least one DatasetFilter. The catalog reflects the * heirarchical structure of the DatasetSource. All datasets are named * with the location of the object they represent on the dataset source. * * @return the top-level InvDataset in the generated InvCatalog. * * @throws IOException if the accessPoint for this DatasetSource is not a container dataset. */ public InvDataset expand() throws IOException { // Get the new catalog being generated and its top-level dataset. this.resultingCatalog = this.createSkeletonCatalog( prefixUrlPath ); this.accessPointDataset = (InvDataset) this.resultingCatalog.getDatasets().get( 0); // IOException thrown by createSkeletonCatalog() so this check should not be necessary. if ( ! this.isCollection( this.accessPointDataset) ) { String tmpMsg = "The access point dataset <" + this.accessPointDataset.getName() + "> must be a collection dataset."; logger.warn( "expand(): {}", tmpMsg); throw new IOException( tmpMsg); } // Recurse into directory structure and expand. expandRecursive( this.accessPointDataset); // Finish the catalog. ((InvCatalogImpl) this.resultingCatalog).finish(); // Remove empty collection datasets. @todo HACK - should use filters instead. this.recursivelyRemoveEmptyCollectionDatasets( this.accessPointDataset); // Return the top-level dataset. return( this.accessPointDataset); } /** * * @param accessPoints * @return the top-level dataset * @throws IOException if the main access point for this DatasetSource is not a container dataset or any of the given access points do not exist or are not under the main access point. */ public InvDataset expand( List accessPoints) throws IOException { // Get the new catalog being generated and its top-level dataset. this.resultingCatalog = this.createSkeletonCatalog( prefixUrlPath ); this.accessPointDataset = (InvDataset) this.resultingCatalog.getDatasets().get( 0); for ( Iterator it = accessPoints.iterator(); it.hasNext(); ) { InvDataset curDs = this.createDataset( (String) it.next(), this.prefixUrlPath ); // Recurse into directory structure and expand. expandRecursiveCollection( this.accessPointDataset, curDs); } // Finish the catalog. ((InvCatalogImpl) this.resultingCatalog).finish(); // Remove empty collection datasets. @todo HACK - should use filters instead. this.recursivelyRemoveEmptyCollectionDatasets( this.accessPointDataset); // Return the top-level dataset. return( this.accessPointDataset); } private void expandRecursive( InvDataset collectionDataset) { // Get all datasets at this level. List listAllDatasets = this.expandThisLevel( collectionDataset, prefixUrlPath ); InvDataset curChildDs = null; for( Iterator i = listAllDatasets.iterator(); i.hasNext(); ) { curChildDs = (InvDataset) i.next(); // Filter out unwanted datasets. if ( ! DatasetFilter.acceptDatasetByFilterGroup( this.getDatasetFilterList(), curChildDs, this.isCollection( curChildDs))) continue; // Expand each collection dataset. if ( this.isCollection( curChildDs)) { expandRecursiveCollection( collectionDataset, curChildDs ); } // Otherwise, add dataset to collection. else { // If not flattening the directory structure, add current dataset to parent dataset. if ( ! this.isFlatten()) { ((InvDatasetImpl) collectionDataset).addDataset( (InvDatasetImpl) curChildDs); } // Otherwise, add current dataset to top-level dataset. else { ((InvDatasetImpl) this.accessPointDataset).addDataset( (InvDatasetImpl) curChildDs); } } } } private void expandRecursiveCollection( InvDataset collectionDataset, InvDataset childDs ) { // If not creating a catalogRef, expand the current dataset. // @todo Make this determination based on current dataset. if ( ! this.createCatalogRefs) { // If not flattening the directory structure, add current collection dataset to parent dataset. if ( ! this.isFlatten()) { ((InvDatasetImpl) collectionDataset).addDataset( (InvDatasetImpl) childDs); } this.expandRecursive( childDs); } // Otherwise, add current dataset as a catalogRef. else { // @todo Determine title and docName based on createCatalogRef object String title = childDs.getName(); String docName = (childDs.getName() == null || childDs.getName().equals( "")) ? "catalog.xml" : childDs.getName() + "/catalog.xml"; // if ( ! this.accessPoint.equals( this.resultService.getAccessPointHeader())) // { // // @todo HACK, HACK not always Files // String ap = new File( this.accessPoint).toURI().toString(); // String aph = new File( this.resultService.getAccessPointHeader()).toURI().toString(); // String relPath = ap.substring( aph.length() ); // docName = relPath + ((relPath.endsWith( "/")) ? "" : "/") + docName; // } // Add catalogRef to the current dataset. InvCatalogRef curCatRef = new InvCatalogRef( (InvDatasetImpl) collectionDataset, title, docName); ((InvDatasetImpl) collectionDataset).addDataset( curCatRef); // Create a DatasetSource for the catalogRef and add info to the catalogRefInfoList. DatasetSource catRefDsSrc = DatasetSource.newDatasetSource( childDs.getName(), this.getType(), this.getStructure(), childDs.getName(), new ResultService( this.getResultService())); this.catalogRefInfoList.add( new CatalogRefInfo( title, docName, childDs, catRefDsSrc)); } } /** * Crawl this DatasetSource and generate a new InvCatalog with all datasets * named, sorted, and organized as defined by this DatasetSource, return the * newly generated InvCatalog. * * @return the generated InvCatalog. * * @throws IOException if DatasetSource does not reference a container dataset. */ public InvCatalog fullExpand() throws IOException { logger.debug( "fullExpand(): expanding DatasetSource named \"{}\"", this.getName()); InvDataset topDs = this.expand(); InvCatalog generatedCat = topDs.getParentCatalog(); // Add metadata to all datasets. for ( Iterator it = this.getDatasetEnhancerList().iterator(); it.hasNext(); ) { DatasetEnhancer1 dsE = (DatasetEnhancer1) it.next(); dsE.addMetadata( topDs); } // Name all datasets. logger.debug( "fullExpand(): naming the datasets."); this.nameDatasets( (InvDatasetImpl) topDs ); // Sort all datasets logger.debug( "fullExpand(): sorting the datasets."); this.sortDatasets( topDs); // Return the generated catalog ((InvCatalogImpl) generatedCat).finish(); return( generatedCat); } /** * Creates an InvDataset to represent the dataset at the given location * on this DatasetSource. * * @param datasetLocation a String indicating the location of a dataset. * @param prefixUrlPath a path name to be prefixed on the urlPath * @return an InvDataset for the given dataset location. * @throws IOException if the dataset location does not correspond to an actual dataset or is not below the accessPointHeader directory. * @throws NullPointerException if the given dataset location is null. */ abstract protected InvDataset createDataset( String datasetLocation, String prefixUrlPath ) throws IOException; /** * Return true if the given dataset is a collection dataset, false otherwise. * * @param dataset - the InvDataset to test for being a collection dataset. * @return true if the given dataset is a collection dataset, false otherwise. * @throws NullPointerException if the given InvDataset is null. * @throws ClassCastException if the given InvDataset is not a LocalInvDataset. */ abstract protected boolean isCollection( InvDataset dataset); /** * Return a skeleton InvCatalog for this DatasetSource. The skeleton catalog * is unnamed with a single top-level dataset representing the DatasetSource * accessPoint and a service built from the DatasetSource ResultService. * * @param prefixUrlPath * @return a skeleton InvCatalog for this DatasetSource. * * @throws IOException if top-level dataset does not exist or is not a collection dataset. */ abstract protected InvCatalog createSkeletonCatalog( String prefixUrlPath ) throws IOException; /** * Return a list of the InvDatasets contained in the given collection dataset * on this DatasetSource. * * @param collectionDataset - the collection dataset to be expanded. * @param prefixUrlPath * @return A list of the InvDatasets contained in the given collection dataset. * @throws IllegalArgumentException when given dataset is not a collection dataset. * @throws NullPointerException if given dataset is null. * @throws ClassCastException if the given InvDataset is not a LocalInvDataset. */ abstract protected List expandThisLevel( InvDataset collectionDataset, String prefixUrlPath ); /** * Use the list of dsNamers to name the given list of datasets. * * @param datasetContainer - a InvDatasetImpl that contains one or * more datasets to be named. */ private void nameDatasets( InvDatasetImpl datasetContainer) { if ( this.getDatasetNamerList().isEmpty()) return; if ( this.isFlatten()) { logger.debug( "nameDatasets(): structure is FLAT calling nameDatasetList()"); this.nameDatasetList( datasetContainer); } else { logger.debug( "nameDatasets(): structure is DIRECTORY_TREE calling" + " nameDatasetTree() on each dataset in dataset container"); InvDatasetImpl curDs = null; for ( int j = 0; j < datasetContainer.getDatasets().size(); j++) { curDs = (InvDatasetImpl) datasetContainer.getDatasets().get( j); this.nameDatasetTree( curDs); } } return; } /** Name the datasets contained in the given dataset. * The given dataset contains a flat list of datasets. */ private void nameDatasetList( InvDatasetImpl dataset) { // Create temporary dataset in which to hold named datasets. InvDatasetImpl namedDs = new InvDatasetImpl( dataset, "nameDatastList() temp dataset", null, null, null); // InvDatasetImpl(parentDs, name, dataType, serviceName, urlPath) dataset.addDataset( namedDs); // Loop through the DatasetNamers DatasetNamer curNamer = null; for ( int i = 0; i < this.datasetNamerList.size(); i++) { curNamer = (DatasetNamer) this.datasetNamerList.get( i); logger.debug( "nameDatasetList(): trying namer ({})", curNamer.getName()); // If the current DatasetNamer adds a new level, create a new dataset. InvDatasetImpl addLevelDs = null; if ( curNamer.getAddLevel()) { addLevelDs = new InvDatasetImpl( null, curNamer.getName(), null, null, null ); } // Iterate over remaining unnamed datasets. InvDatasetImpl curDs = null; java.util.Iterator dsIter = dataset.getDatasets().iterator(); while ( dsIter.hasNext()) { curDs = (InvDatasetImpl) dsIter.next(); logger.debug( "nameDatasetList(): try namer on this ds ({}-{})", curDs.getName(), curDs.getUrlPath() ); // Try to name the current dataset. if ( curNamer.nameDataset( curDs)) { logger.debug( "nameDatasetList(): ds named ({})", curDs.getName()); // If adding a level, add named datasets to the added level dataset. if ( curNamer.getAddLevel()) { addLevelDs.addDataset( curDs); } // Otherwise, add the named datasets to namedDs. else { namedDs.addDataset( curDs); } // Remove the now-named dataset from list of unnamed datasets. dsIter.remove(); } } // END - InvDatasetImpl loop // If the namer added a level and a dataset was named by this namer, add the // new level to the list of named datasets. if ( curNamer.getAddLevel()) { if ( addLevelDs.hasNestedDatasets()) { namedDs.addDataset( addLevelDs); } } } // END - DatasetNamer loop namedDs.finish(); // Once all datasets are named (or unnamable with these DatasetNamers), // add all the datasets in namedDs back into the given containerDataset. if (logger.isDebugEnabled()) { logger.debug( "nameDatasetList(): number of unnamed datasets is " + dataset.getDatasets().size() + "."); logger.debug( "nameDatasetList(): add named datasets back to container."); } for ( int i = 0; i < namedDs.getDatasets().size(); i++) { dataset.addDataset( (InvDatasetImpl) namedDs.getDatasets().get( i)); } dataset.removeDataset( namedDs); return; } /** Name the datasets in the given dataset hierarchy using this * DatasetSource's list of datasetNamers. */ private void nameDatasetTree( InvDatasetImpl dataset) { // If dataset does not have a name, try naming it with dsNamers. // @todo Rethink naming of directories (look at how DatasetFilter deals with collection vs atomic datasets). if ( dataset.getName().equals("") || ! dataset.hasAccess()) { logger.debug( "nameDatasetTree(): naming dataset ({})...", dataset.getUrlPath()); DatasetNamer dsN = null; for ( int i = 0; i < this.datasetNamerList.size(); i++) { dsN = (DatasetNamer) this.datasetNamerList.get( i); if ( dsN.nameDataset( dataset)) { logger.debug( "nameDatasetTree(): ... used namer ({})", dsN.getName()); break; } } } // Try to name any child datasets. InvDatasetImpl curDs = null; for ( int j = 0; j < dataset.getDatasets().size(); j++) { curDs = (InvDatasetImpl) dataset.getDatasets().get( j); logger.debug( "nameDatasetTree(): recurse to name child dataset ({})", curDs.getUrlPath()); this.nameDatasetTree( curDs); } return; } private void sortDatasets( InvDataset dataset) { if ( this.getDatasetSorter() == null) { // Create default dataset Comparator (matches pre-DatasetSorter behaviour). DatasetSorter defaultSorter = new DatasetSorter( new java.util.Comparator() { public int compare( Object obj1, Object obj2 ) { InvDataset ds1 = (InvDataset) obj1; InvDataset ds2 = (InvDataset) obj2; return ( -ds1.getName().compareTo( ds2.getName() ) ); } } ); defaultSorter.sortNestedDatasets( dataset); } else { this.getDatasetSorter().sortNestedDatasets( dataset); } return; } private void recursivelyRemoveEmptyCollectionDatasets( InvDataset parentDataset) { InvDataset curDs = null; for ( Iterator it = parentDataset.getDatasets().iterator(); it.hasNext(); ) { curDs = (InvDataset) it.next(); // Do not remove accessible dataset. if ( curDs.hasAccess()) continue; // Do not remove catalogRef datasets. if ( curDs instanceof InvCatalogRef) continue; // Recurse into collection datasets children. if ( curDs.hasNestedDatasets()) { this.recursivelyRemoveEmptyCollectionDatasets( curDs); } // Remove any empty collection datasets. else { it.remove(); } } } public boolean equals( Object o ) { if ( this == o ) return true; if ( !( o instanceof DatasetSource ) ) return false; final DatasetSource datasetSource = (DatasetSource) o; if ( createCatalogRefs != datasetSource.createCatalogRefs ) return false; // if ( expandCatalogRef != datasetSource.expandCatalogRef ) return false; if ( flatten != datasetSource.flatten ) return false; if ( accessPoint != null ? !accessPoint.equals( datasetSource.accessPoint ) : datasetSource.accessPoint != null ) return false; if ( datasetFilterList != null ? !datasetFilterList.equals( datasetSource.datasetFilterList ) : datasetSource.datasetFilterList != null ) return false; if ( datasetNamerList != null ? !datasetNamerList.equals( datasetSource.datasetNamerList ) : datasetSource.datasetNamerList != null ) return false; if ( name != null ? !name.equals( datasetSource.name ) : datasetSource.name != null ) return false; if ( resultService != null ? !resultService.equals( datasetSource.resultService ) : datasetSource.resultService != null ) return false; if ( type != null ? !type.equals( datasetSource.type ) : datasetSource.type != null ) return false; return true; } public int hashCode() { if ( hashCode == 0) { int result = 17; result = ( name != null ? name.hashCode() : 0 ); result = 29 * result + ( type != null ? type.hashCode() : 0 ); result = 29 * result + ( flatten ? 1 : 0 ); result = 29 * result + ( accessPoint != null ? accessPoint.hashCode() : 0 ); result = 29 * result + ( createCatalogRefs ? 1 : 0 ); // result = 29 * result + ( expandCatalogRef ? 1 : 0 ); result = 29 * result + ( resultService != null ? resultService.hashCode() : 0 ); result = 29 * result + ( datasetNamerList != null ? datasetNamerList.hashCode() : 0 ); result = 29 * result + ( datasetFilterList != null ? datasetFilterList.hashCode() : 0 ); hashCode = result; } return hashCode; } private volatile int hashCode = 0; }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy