package com.esri; import com.esri.arcgis.datasourcesfile.DEFile; import com.esri.arcgis.datasourcesfile.DEFileType; import com.esri.arcgis.datasourcesfile.DELayerType; import com.esri.arcgis.geodatabase.DEFeatureClassType; import com.esri.arcgis.geodatabase.DETable; import com.esri.arcgis.geodatabase.DETableType; import com.esri.arcgis.geodatabase.FeatureClass; import com.esri.arcgis.geodatabase.IGPMessages; import com.esri.arcgis.geometry.ISpatialReference; import com.esri.arcgis.geometry.ISpatialReferenceAuthority; import com.esri.arcgis.geometry.esriSRGeoCSType; import com.esri.arcgis.geoprocessing.BaseGeoprocessingTool; import com.esri.arcgis.geoprocessing.GPCompositeDataType; import com.esri.arcgis.geoprocessing.GPFeatureLayer; import com.esri.arcgis.geoprocessing.GPFeatureLayerType; import com.esri.arcgis.geoprocessing.GPFeatureRecordSetLayerType; import com.esri.arcgis.geoprocessing.GPLayerType; import com.esri.arcgis.geoprocessing.GPParameter; import com.esri.arcgis.geoprocessing.GPString; import com.esri.arcgis.geoprocessing.GPStringType; import com.esri.arcgis.geoprocessing.GPTableSchema; import com.esri.arcgis.geoprocessing.IGPEnvironmentManager; import com.esri.arcgis.geoprocessing.esriGPParameterDirection; import com.esri.arcgis.geoprocessing.esriGPParameterType; import com.esri.arcgis.interop.AutomationException; import com.esri.arcgis.interop.Cleaner; import com.esri.arcgis.system.IArray; import com.esri.arcgis.system.IName; import com.esri.arcgis.system.ITrackCancel; import org.apache.hadoop.conf.Configuration; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Map; import java.util.Properties; /** */ public abstract class AbstractTool extends BaseGeoprocessingTool { private final static HBaseToolbox FACTORY = new HBaseToolbox(); @Override public IName getFullName() throws IOException, AutomationException { return (IName) FACTORY.getFunctionName(getName()); } @Override public boolean isLicensed() throws IOException, AutomationException { return true; } @Override public void updateMessages( final IArray parameters, final IGPEnvironmentManager environmentManager, final IGPMessages messages) { } @Override public void updateParameters( final IArray parameters, final IGPEnvironmentManager environmentManager) { } @Override public String getMetadataFile() throws IOException, AutomationException { return null; } @Override public void execute( final IArray parameters, final ITrackCancel trackCancel, final IGPEnvironmentManager environmentManager, final IGPMessages messages) throws IOException, AutomationException { try { Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader()); doExecute(parameters, messages, environmentManager); } catch (Throwable t) { messages.addAbort(t.toString()); for (final StackTraceElement stackTraceElement : t.getStackTrace()) { messages.addAbort(stackTraceElement.toString()); } } } protected void addParamString( final IArray parameters, final String displayName, final String name, final String value) throws IOException { final GPParameter parameter = new GPParameter(); parameter.setDirection(esriGPParameterDirection.esriGPParameterDirectionInput); parameter.setDisplayName(displayName); parameter.setName(name); parameter.setParameterType(esriGPParameterType.esriGPParameterTypeRequired); parameter.setDataTypeByRef(new GPStringType()); final GPString gpString = new GPString(); gpString.setValue(value); parameter.setValueByRef(gpString); parameters.add(parameter); } protected void addParamFile( final IArray parameters, final String displayName, final String name, final String catalogPath ) throws IOException { final GPParameter parameter = new GPParameter(); parameter.setDirection(esriGPParameterDirection.esriGPParameterDirectionInput); parameter.setDisplayName(displayName); parameter.setName(name); parameter.setParameterType(esriGPParameterType.esriGPParameterTypeRequired); parameter.setDataTypeByRef(new DEFileType()); final DEFile file = new DEFile(); file.setCatalogPath(catalogPath); parameter.setValueByRef(file); parameters.add(parameter); } protected void addParamFeatureLayer( final IArray parameters, final String displayName, final String name) throws IOException { final GPCompositeDataType compositeDataType = new GPCompositeDataType(); compositeDataType.addDataType(new GPFeatureLayerType()); compositeDataType.addDataType(new DEFeatureClassType()); compositeDataType.addDataType(new GPLayerType()); compositeDataType.addDataType(new DELayerType()); compositeDataType.addDataType(new GPFeatureRecordSetLayerType()); final GPParameter parameter = new GPParameter(); parameter.setDirection(esriGPParameterDirection.esriGPParameterDirectionInput); parameter.setDisplayName(displayName); parameter.setName(name); parameter.setParameterType(esriGPParameterType.esriGPParameterTypeRequired); parameter.setDataTypeByRef(compositeDataType); parameter.setValueByRef(new GPFeatureLayer()); parameters.add(parameter); } protected void addParamTable( final IArray parameters, final String displayName, final String name, final String value) throws IOException { final GPTableSchema tableSchema = new GPTableSchema(); tableSchema.setCloneDependency(true); final GPParameter parameterOut = new GPParameter(); parameterOut.setDirection(esriGPParameterDirection.esriGPParameterDirectionOutput); parameterOut.setDisplayName(displayName); parameterOut.setName(name); parameterOut.setParameterType(esriGPParameterType.esriGPParameterTypeRequired); parameterOut.setDataTypeByRef(new DETableType()); final DETable table = new DETable(); table.setAsText(value); parameterOut.setValueByRef(table); parameterOut.setSchemaByRef(tableSchema); parameters.add(parameterOut); } protected void loadProperties( final Configuration configuration, final String propertiesPath) throws IOException { final Properties properties = new Properties(); final InputStream inputStream = new FileInputStream(propertiesPath); try { properties.load(inputStream); } finally { inputStream.close(); } for (final Map.Entry<Object, Object> entry : properties.entrySet()) { configuration.set(entry.getKey().toString(), entry.getValue().toString()); } } protected abstract void doExecute( final IArray parameters, final IGPMessages messages, final IGPEnvironmentManager environmentManager) throws Throwable; protected Configuration createConfiguration( final String propertiesPath) throws IOException { final Configuration configuration = new Configuration(); configuration.setClassLoader(ClassLoader.getSystemClassLoader()); loadProperties(configuration, propertiesPath); return configuration; } protected int getWkid(final FeatureClass featureClass) throws IOException { final int wkid; final ISpatialReference spatialReference = featureClass.getSpatialReference(); try { if (spatialReference instanceof ISpatialReferenceAuthority) { final ISpatialReferenceAuthority spatialReferenceAuthority = (ISpatialReferenceAuthority) spatialReference; final int code = spatialReferenceAuthority.getCode(); wkid = code == 0 ? esriSRGeoCSType.esriSRGeoCS_WGS1984 : code; } else { wkid = esriSRGeoCSType.esriSRGeoCS_WGS1984; } } finally { Cleaner.release(spatialReference); } return wkid; } }