/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2016 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
package org.pentaho.di.shapefilereader;
import java.util.List;
import java.util.Map;
import org.pentaho.di.core.annotations.Step;
import org.pentaho.di.core.CheckResult;
import org.pentaho.di.core.CheckResultInterface;
import org.pentaho.di.core.Counter;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleStepException;
import org.pentaho.di.core.exception.KettleXMLException;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMeta;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.core.variables.VariableSpace;
import org.pentaho.di.core.vfs.KettleVFS;
import org.pentaho.di.core.xml.XMLHandler;
import org.pentaho.di.repository.ObjectId;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.BaseStepMeta;
import org.pentaho.di.trans.step.StepDataInterface;
import org.pentaho.di.trans.step.StepInterface;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.step.StepMetaInterface;
import org.pentaho.di.trans.steps.xbaseinput.XBase;
import org.w3c.dom.Node;
/**
* Contains the meta-data for the ShapeFileReader plugin
*
* @author Matt
* @since 25-apr-2005
*/
@Step( id = "ShapeFileReader",
image = "ESRI.svg",
i18nPackageName="org.pentaho.di.shapefilereader",
name="ShapeFileReader.Step.Name",
description = "ShapeFileReader.Step.Description",
documentationUrl = "http://wiki.pentaho.com/display/EAI/ESRI+Shapefile+Reader",
categoryDescription="Input" )
public class ShapeFileReaderMeta extends BaseStepMeta implements StepMetaInterface
{
/** The filename of the shape file */
public String shapeFilename;
/** The filename of the DBF file */
public String dbfFilename;
public ShapeFileReaderMeta()
{
super(); // allocate BaseStepMeta
}
/**
* @return Returns the shapeFilename.
*/
public String getShapeFilename()
{
return shapeFilename;
}
/**
* @param shapeFilename The shapeFilename to set.
*/
public void setShapeFilename(String shapeFilename)
{
this.shapeFilename = shapeFilename;
}
/**
* @return Returns the dbfFilename.
*/
public String getDbfFilename()
{
return dbfFilename;
}
/**
* @param dbfFilename The dbfFilename to set.
*/
public void setDbfFilename(String dbfFilename)
{
this.dbfFilename = dbfFilename;
}
public void loadXML(Node stepnode, List<DatabaseMeta> databases, Map<String, Counter> counters) throws KettleXMLException {
readData(stepnode);
}
public Object clone()
{
ShapeFileReaderMeta retval = (ShapeFileReaderMeta)super.clone();
return retval;
}
private void readData(Node stepnode) throws KettleXMLException
{
try
{
shapeFilename = XMLHandler.getTagValue(stepnode, "shapefilename");
dbfFilename = XMLHandler.getTagValue(stepnode, "dbffilename");
}
catch(Exception e)
{
throw new KettleXMLException("Unable to load step info from XML", e);
}
}
public void setDefault()
{
shapeFilename = "";
dbfFilename = "";
}
public void getFields(RowMetaInterface row, String name, RowMetaInterface[] info, StepMeta nextStep, VariableSpace space) throws KettleStepException {
// The filename...
ValueMetaInterface filename = new ValueMeta("filename", ValueMetaInterface.TYPE_STRING);
filename.setOrigin(name);
filename.setLength(255);
row.addValueMeta(filename);
// The file type
ValueMetaInterface ft = new ValueMeta("filetype", ValueMetaInterface.TYPE_STRING);
ft.setLength(50);
ft.setOrigin(name);
row.addValueMeta( ft );
// The shape nr
ValueMetaInterface shnr = new ValueMeta("shapenr", ValueMetaInterface.TYPE_INTEGER);
shnr.setOrigin(name);
row.addValueMeta( shnr );
// The part nr
ValueMetaInterface pnr = new ValueMeta("partnr", ValueMetaInterface.TYPE_INTEGER);
pnr.setOrigin(name);
row.addValueMeta( pnr );
// The part nr
ValueMetaInterface nrp = new ValueMeta("nrparts", ValueMetaInterface.TYPE_INTEGER);
nrp.setOrigin(name);
row.addValueMeta( nrp );
// The point nr
ValueMetaInterface ptnr = new ValueMeta("pointnr", ValueMetaInterface.TYPE_INTEGER);
ptnr.setOrigin(name);
row.addValueMeta( ptnr );
// The nr of points
ValueMetaInterface nrpt = new ValueMeta("nrpointS", ValueMetaInterface.TYPE_INTEGER);
nrpt.setOrigin(name);
row.addValueMeta( nrpt );
// The X coordinate
ValueMetaInterface x = new ValueMeta("x", ValueMetaInterface.TYPE_NUMBER);
x.setOrigin(name);
row.addValueMeta( x );
// The Y coordinate
ValueMetaInterface y = new ValueMeta("y", ValueMetaInterface.TYPE_NUMBER);
y.setOrigin(name);
row.addValueMeta( y );
// The measure
ValueMetaInterface m = new ValueMeta("measure", ValueMetaInterface.TYPE_NUMBER);
m.setOrigin(name);
row.addValueMeta( m );
if (getDbfFilename()!=null)
{
XBase xbase = new XBase(getLog(), getDbfFilename());
try
{
xbase.setDbfFile(getDbfFilename());
xbase.open();
RowMetaInterface fields = xbase.getFields();
for (int i=0;i<fields.size();i++)
{
fields.getValueMeta(i).setOrigin(name);
row.addValueMeta( fields.getValueMeta(i) );
}
}
catch(Throwable e)
{
throw new KettleStepException("Unable to read from DBF file", e);
}
finally
{
xbase.close();
}
}
else
{
throw new KettleStepException("Unable to read from DBF file: no filename specfied");
}
}
public String getXML()
{
String retval="";
retval+=" "+XMLHandler.addTagValue("shapefilename", shapeFilename);
retval+=" "+XMLHandler.addTagValue("dbffilename", dbfFilename);
return retval;
}
public void readRep(Repository rep, ObjectId id_step, List<DatabaseMeta> databases, Map<String, Counter> counters) throws KettleException
{
try
{
shapeFilename = rep.getStepAttributeString (id_step, "shapefilename" );
dbfFilename = rep.getStepAttributeString (id_step, "dbffilename" );
}
catch(Exception e)
{
throw new KettleException("Unexpected error reading step information from the repository", e);
}
}
public void saveRep(Repository rep, ObjectId id_transformation, ObjectId id_step) throws KettleException
{
try
{
rep.saveStepAttribute(id_transformation, id_step, "shapefilename", shapeFilename);
rep.saveStepAttribute(id_transformation, id_step, "dbffilename", dbfFilename);
}
catch(Exception e)
{
throw new KettleException("Unable to save step information to the repository for id_step="+id_step, e);
}
}
public void check(List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepinfo, RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info)
{
CheckResult cr;
// See if we get input...
if (input.length>0)
{
cr = new CheckResult(CheckResult.TYPE_RESULT_ERROR, "This step is not expecting nor reading any input", stepinfo);
remarks.add(cr);
}
else
{
cr = new CheckResult(CheckResult.TYPE_RESULT_OK, "Not receiving any input from other steps.", stepinfo);
remarks.add(cr);
}
if (shapeFilename==null || dbfFilename==null || shapeFilename.length()==0 || dbfFilename.length()==0 )
{
cr = new CheckResult(CheckResult.TYPE_RESULT_ERROR, "No files can be found to read.", stepinfo);
remarks.add(cr);
}
else
{
cr = new CheckResult(CheckResult.TYPE_RESULT_OK, "Both shape file and the DBF file are defined.", stepinfo);
remarks.add(cr);
}
}
public StepInterface getStep(StepMeta si, StepDataInterface stepDataInterface, int cnr, TransMeta tr, Trans disp)
{
return new ShapeFileReader(si, stepDataInterface, cnr, tr, disp);
}
public StepDataInterface getStepData()
{
return new ShapeFileReaderData();
}
}