/*******************************************************************************
* Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt
******************************************************************************/
package com.opendoorlogistics.components.geocode.postcodes;
import java.io.File;
import java.io.Serializable;
import javax.swing.Icon;
import javax.swing.JPanel;
import com.opendoorlogistics.api.ODLApi;
import com.opendoorlogistics.api.components.ComponentConfigurationEditorAPI;
import com.opendoorlogistics.api.components.ComponentExecutionApi;
import com.opendoorlogistics.api.components.ODLComponent;
import com.opendoorlogistics.api.components.PredefinedTags;
import com.opendoorlogistics.api.scripts.ScriptTemplatesBuilder;
import com.opendoorlogistics.api.tables.ODLColumnType;
import com.opendoorlogistics.api.tables.ODLDatastore;
import com.opendoorlogistics.api.tables.ODLDatastoreAlterable;
import com.opendoorlogistics.api.tables.ODLTable;
import com.opendoorlogistics.api.tables.ODLTableAlterable;
import com.opendoorlogistics.api.tables.ODLTableDefinition;
import com.opendoorlogistics.api.tables.ODLTableDefinitionAlterable;
import com.opendoorlogistics.components.geocode.postcodes.impl.PCConstants;
import com.opendoorlogistics.components.geocode.postcodes.impl.PCGeocodeFile;
import com.opendoorlogistics.components.geocode.postcodes.impl.PCRecord;
import com.opendoorlogistics.components.geocode.postcodes.impl.PCRecord.StrField;
import com.opendoorlogistics.core.tables.ODLFactory;
import com.opendoorlogistics.core.tables.utils.TableUtils;
import com.opendoorlogistics.utils.ui.Icons;
final public class PCImporterComponent implements ODLComponent {
@Override
public Class<? extends Serializable> getConfigClass() {
return PCImporterConfig.class;
}
@Override
public JPanel createConfigEditorPanel(final ComponentConfigurationEditorAPI factory,int mode,Serializable config, boolean isFixedIO) {
return PCImporterConfig.createConfigEditorPanel(factory,(PCImporterConfig) config, "Import");
}
@Override
public String getId() {
return getClass().getName();
}
@Override
public String getName() {
return "Import postcodes";
}
@Override
public ODLDatastore<ODLTableDefinition> getIODsDefinition(ODLApi api,Serializable configuration) {
return null;
}
@Override
public ODLDatastore<? extends ODLTableDefinition> getOutputDsDefinition(ODLApi api,int mode, Serializable configuration) {
ODLDatastoreAlterable<ODLTableDefinitionAlterable> ret = ODLFactory.createDefinition();
ret.createTable("Postcodes", -1);
ODLTableDefinitionAlterable dfn = ret.getTableAt(0);
for (StrField fld : StrField.values()) {
TableUtils.addColumn(dfn, fld.getDisplayText(), ODLColumnType.STRING, 0 ,null, fld.getTags());
}
TableUtils.addColumn(dfn,"Latitude", ODLColumnType.DOUBLE, 0, "Latitude of the postcode", PredefinedTags.LATITUDE);
TableUtils.addColumn(dfn,"Longitude", ODLColumnType.DOUBLE, 0, "Longitude of the postcode", PredefinedTags.LONGITUDE);
return ret;
}
@Override
public void execute(ComponentExecutionApi reporter,int mode,Object configuration, ODLDatastore<? extends ODLTable> input, ODLDatastoreAlterable<? extends ODLTableAlterable> output) {
PCImporterConfig pic = (PCImporterConfig) configuration;
if(reporter.getApi().stringConventions().isEmptyString(pic.getGeocoderDbFilename())){
throw new RuntimeException("Postcode database file does not exist");
}
File file = PCConstants.resolvePostcodeFile(reporter.getApi(), new File(pic.getGeocoderDbFilename()));
if (file.exists() == false) {
throw new RuntimeException("Postcode database file does not exist");
}
reporter.postStatusMessage("Started postcode import.");
PCGeocodeFile pc = new PCGeocodeFile(file);
ODLTable table = output.getTableAt(0);
long nbImported = 0;
for (PCRecord record : pc.getPostcodes(pic.getLevel(), reporter)) {
if (reporter.isFinishNow() || reporter.isCancelled()) {
break;
}
int col = 0;
int row = table.createEmptyRow(-1);
for (StrField fld : StrField.values()) {
table.setValueAt(record.getField(fld), row, col++);
}
table.setValueAt(record.getLatitude(), row, col++);
table.setValueAt(record.getLongitude(), row, col++);
nbImported++;
if (nbImported % 10000 == 0) {
reporter.postStatusMessage("Imported " + nbImported + " postcodes.");
}
}
pc.close();
reporter.postStatusMessage("Finished postcode import.");
}
@Override
public long getFlags(ODLApi api,int mode) {
// TODO Auto-generated method stub
return 0;
}
@Override
public Icon getIcon(ODLApi api,int mode) {
return Icons.loadFromStandardPath("postcode-importer.png");
}
// @Override
// public Iterable<ODLWizardTemplateConfig> getWizardTemplateConfigs(ODLApi api) {
// return Arrays.asList(new ODLWizardTemplateConfig(getName(), getName(), "Import postcodes for a country, using data derived from www.geonames.org", new PCDatabaseSelectionConfig()));
// }
// @Override
// public ComponentType getComponentType() {
// // TODO Auto-generated method stub
// return null;
// }
@Override
public boolean isModeSupported(ODLApi api,int mode) {
return mode==ODLComponent.MODE_DEFAULT;
}
@Override
public void registerScriptTemplates(ScriptTemplatesBuilder templatesApi) {
templatesApi.registerTemplate(getName(), getName(), "Import postcodes for a country, using data derived from www.geonames.org",
getIODsDefinition(templatesApi.getApi(), new PCImporterConfig()),
new PCImporterConfig());
}
}