/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2007-2013, 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.gce.imagemosaic.catalogbuilder;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.geotools.factory.Hints;
import org.geotools.gce.imagemosaic.Utils;
import org.geotools.gce.imagemosaic.Utils.Prop;
import org.geotools.gce.imagemosaic.catalog.index.Indexer;
import org.geotools.gce.imagemosaic.catalog.index.IndexerUtils;
import org.geotools.gce.imagemosaic.catalog.index.ParametersType.Parameter;
import org.geotools.gce.imagemosaic.catalog.index.SchemaType;
import org.geotools.gce.imagemosaic.catalog.index.SchemasType;
import org.geotools.util.Utilities;
/**
* Simple bean that conveys the information needed by the CatalogBuilder to create a catalogue of granules
*
* @author Simone Giannecchini, GeoSolutions SAS
*
*
*
* @source $URL$
*/
public class CatalogBuilderConfiguration {
private Hints hints;
private String timeAttribute;
private String runtimeAttribute;
private Indexer indexer;
/**
* @deprecated parse indexer parameters instead.
* @return
*/
public String getEnvelope2D() {
return getParameter(Prop.ENVELOPE2D);
}
public CatalogBuilderConfiguration() {
initDefaultsParam();
}
private void initDefaultsParam() {
this.indexer = IndexerUtils.createDefaultIndexer();
}
public CatalogBuilderConfiguration(final CatalogBuilderConfiguration that) {
Utilities.ensureNonNull("CatalogBuilderConfiguration", that);
initDefaultsParam();
try {
BeanUtils.copyProperties(this, that);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new IllegalArgumentException(e);
}
}
/**
* @return the hints
*/
public Hints getHints() {
return hints;
}
/**
* @param hints the hints to set
*/
public void setHints(Hints hints) {
this.hints = hints;
}
/**
* @deprecated parse indexer parameters instead.
* @return
*/
public boolean isRecursive() {
return Boolean.parseBoolean(getParameter(Prop.RECURSIVE));
}
/**
* @deprecated parse indexer parameters instead.
* @return
*/
public boolean isCaching() {
return Boolean.parseBoolean(getParameter(Prop.CACHING));
}
/**
* Get the schema with the specified name
*
* @param name
* @return
*/
public String getSchema(String name) {
// return schema;
SchemasType schemas = indexer.getSchemas();
if (schemas != null) {
List<SchemaType> schemaList = schemas.getSchema();
for (SchemaType schema : schemaList) {
if (schema.getName().equalsIgnoreCase(name)) {
return schema.getAttributes();
}
}
}
return null;
}
/**
* Set the indexer parameter
*
* @param parameterName
* @param parameterValue
*/
public void setParameter(String parameterName, String parameterValue) {
List<Parameter> params = indexer.getParameters().getParameter();
parameterValue = IndexerUtils.refineParameterValue(parameterName, parameterValue);
for (Parameter param : params) {
if (param.getName().equalsIgnoreCase(parameterName)) {
param.setValue(parameterValue);
return;
}
}
Parameter param = Utils.OBJECT_FACTORY.createParametersTypeParameter();
param.setName(parameterName);
param.setValue(parameterValue);
params.add(param);
}
public String getParameter(String parameterName) {
return IndexerUtils.getParameter(parameterName, indexer);
}
public String getTimeAttribute() {
return timeAttribute;
}
public Indexer getIndexer() {
return indexer;
}
public void setIndexer(Indexer indexer) {
this.indexer = indexer;
}
public String getRuntimeAttribute() {
return runtimeAttribute;
}
public void setRuntimeAttribute(String runtimeAttribute) {
this.runtimeAttribute = runtimeAttribute;
}
/**
* @deprecated parse indexer parameters instead.
* @return
*/
public String getIndexName() {
return getParameter(Prop.INDEX_NAME);
}
/**
* @deprecated parse indexer parameters instead.
* @return
*/
public boolean isFootprintManagement() {
return Boolean.parseBoolean(getParameter(Prop.FOOTPRINT_MANAGEMENT));
}
/**
* @deprecated parse indexer parameters instead.
* @return
*/
public String getLocationAttribute() {
return getParameter(Prop.LOCATION_ATTRIBUTE);
}
/**
* @deprecated parse indexer parameters instead.
* @return
*/
public String getRootMosaicDirectory() {
return getParameter(Prop.ROOT_MOSAIC_DIR);
}
/**
* @deprecated parse Indexer parameters instead.
* @return
*/
public String getWildcard() {
return getParameter(Prop.WILDCARD);
}
/**
* @deprecated parse Indexer parameters instead.
* @return
*/
public boolean isAbsolute() {
return Boolean.parseBoolean(getParameter(Prop.ABSOLUTE_PATH));
}
@Override
public CatalogBuilderConfiguration clone() throws CloneNotSupportedException {
return new CatalogBuilderConfiguration(this);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof CatalogBuilderConfiguration))
return false;
final CatalogBuilderConfiguration that = (CatalogBuilderConfiguration) obj;
if (!equalsParameter(this, that, Prop.ABSOLUTE_PATH))
return false;
if (!equalsParameter(this, that, Prop.CACHING))
return false;
if (!equalsParameter(this, that, Prop.RECURSIVE))
return false;
if (!equalsParameter(this, that, Prop.FOOTPRINT_MANAGEMENT))
return false;
if (!equalsParameter(this, that, Prop.INDEX_NAME))
return false;
if (!equalsParameter(this, that, Prop.LOCATION_ATTRIBUTE))
return false;
if (!equalsParameter(this, that, Prop.ROOT_MOSAIC_DIR))
return false;
return true;
}
private static boolean equalsParameter(CatalogBuilderConfiguration thisConfig,
CatalogBuilderConfiguration thatConfig, String parameterName) {
String thisValue = thisConfig.getParameter(parameterName);
String thatValue = thatConfig.getParameter(parameterName);
if (!(thisValue == null && thatValue == null) && !thisValue.equals(thatValue)) {
return false;
}
return true;
}
@Override
public int hashCode() {
int seed = 37;
seed = Utilities.hash(Boolean.parseBoolean(getParameter(Prop.ABSOLUTE_PATH)), seed);
seed = Utilities.hash(Boolean.parseBoolean(getParameter(Prop.RECURSIVE)), seed);
seed = Utilities.hash(Boolean.parseBoolean(getParameter(Prop.CACHING)), seed);
seed = Utilities.hash(Boolean.parseBoolean(getParameter(Prop.FOOTPRINT_MANAGEMENT)), seed);
seed = Utilities.hash(getParameter(Prop.LOCATION_ATTRIBUTE), seed);
seed = Utilities.hash(getParameter(Prop.INDEX_NAME), seed);
seed = Utilities.hash(getParameter(Prop.WILDCARD), seed);
seed = Utilities.hash(getParameter(Prop.ROOT_MOSAIC_DIR), seed);
return seed;
}
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append("CatalogBuilderConfiguration").append("\n");
builder.append("wildcardString:\t\t\t").append(getParameter(Prop.WILDCARD)).append("\n");
builder.append("indexName:\t\t\t").append(getParameter(Prop.INDEX_NAME)).append("\n");
builder.append("absolute:\t\t\t")
.append(Boolean.parseBoolean(getParameter(Prop.ABSOLUTE_PATH))).append("\n");
builder.append("caching:\t\t\t").append(Boolean.parseBoolean(getParameter(Prop.CACHING)))
.append("\n");
builder.append("recursive:\t\t\t")
.append(Boolean.parseBoolean(getParameter(Prop.RECURSIVE))).append("\n");
builder.append("footprintManagement:\t\t\t")
.append(Boolean.parseBoolean(getParameter(Prop.FOOTPRINT_MANAGEMENT))).append("\n");
builder.append("locationAttribute:\t\t\t").append(getParameter(Prop.LOCATION_ATTRIBUTE))
.append("\n");
builder.append("rootMosaicDirectory:\t\t\t").append(getParameter(Prop.ROOT_MOSAIC_DIR))
.append("\n");
return builder.toString();
}
public void check() {
// check parameters
// Check the indexing directories
String indexingDirs = getParameter(Prop.INDEXING_DIRECTORIES);
if (indexingDirs == null) {
// check whether we are on harvesting so check the Harvest directory param.
String customDirs = getParameter(Prop.HARVEST_DIRECTORY);
indexingDirs = customDirs;
}
if (indexingDirs == null) {
throw new IllegalStateException("Indexing directories are empty");
} else {
String[] indexingDirectoriesString = indexingDirs.split("\\s*,\\s*");
if (indexingDirectoriesString == null || indexingDirectoriesString.length <= 0)
throw new IllegalStateException("Indexing directories are empty");
// final List<String> directories = new ArrayList<String>();
// for (String dir : indexingDirectoriesString)
// directories.add(Utils.checkDirectory(dir,false));
// indexingDirectories = directories;
}
String indexName = getParameter(Prop.INDEX_NAME);
if (indexName == null || indexName.length() == 0)
throw new IllegalStateException("Index name cannot be empty");
// Check the root mosaic directory
String rootMosaicDirectory = getParameter(Prop.ROOT_MOSAIC_DIR);
if (rootMosaicDirectory == null || rootMosaicDirectory.length() == 0)
throw new IllegalStateException("RootMosaicDirectory name cannot be empty");
rootMosaicDirectory = Utils.checkDirectory(rootMosaicDirectory, true);
String wildcard = getParameter(Prop.WILDCARD);
if (wildcard == null || wildcard.length() == 0)
throw new IllegalStateException("WildcardString name cannot be empty");
}
}