/*******************************************************************************
* 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.studio.components.geocoder.component;
import java.io.Serializable;
import javax.swing.Icon;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import com.opendoorlogistics.api.ODLApi;
import com.opendoorlogistics.api.components.ComponentConfigurationEditorAPI;
import com.opendoorlogistics.api.components.ComponentControlLauncherApi;
import com.opendoorlogistics.api.components.ComponentControlLauncherApi.ControlLauncherCallback;
import com.opendoorlogistics.api.components.ComponentExecutionApi;
import com.opendoorlogistics.api.components.ODLComponent;
import com.opendoorlogistics.api.scripts.ScriptTemplatesBuilder;
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.ODLTableReadOnly;
import com.opendoorlogistics.core.tables.decorators.datastores.RowFilterDecorator;
import com.opendoorlogistics.studio.components.geocoder.InteractiveGeocoderPanel;
import com.opendoorlogistics.studio.components.geocoder.model.GeocodeModel;
import com.opendoorlogistics.utils.ui.Icons;
final public class NominatimGeocoderComponent implements ODLComponent {
@Override
public String getId() {
return "com.opendoorlogistics.studio.components.geocoder.nominatim";
}
@Override
public String getName() {
return "Geocode addresses using Nominatim";
}
@Override
public ODLDatastore<? extends ODLTableDefinition> getIODsDefinition(ODLApi api, Serializable configuration) {
return GeocodeModel.getDsDefn();
}
@Override
public ODLDatastore<? extends ODLTableDefinition> getOutputDsDefinition(ODLApi api, int mode, Serializable configuration) {
// TODO Auto-generated method stub
return null;
}
@Override
public void execute(final ComponentExecutionApi gui, int mode, final Object configuration, final ODLDatastore<? extends ODLTable> ioDb, final ODLDatastoreAlterable<? extends ODLTableAlterable> outputDb) {
gui.submitControlLauncher(new ControlLauncherCallback() {
@Override
public void launchControls(ComponentControlLauncherApi launcherApi) {
// filter if needed
final ODLDatastore<? extends ODLTable> selDB;
if (((NominatimConfig) configuration).isSkipAlreadyGeocoded()) {
ODLTableReadOnly table = ioDb.getTableAt(0);
RowFilterDecorator<? extends ODLTable> filter = new RowFilterDecorator<ODLTable>(ioDb, table.getImmutableId());
for (int i = 0; i < table.getRowCount(); i++) {
if (table.getValueAt(i, GeocodeModel.LAT_COL) == null || table.getValueAt(i, GeocodeModel.LNG_COL) == null) {
filter.addRowToFilter(table.getImmutableId(), table.getRowId(i));
}
}
selDB = filter;
} else {
selDB = ioDb;
}
if (selDB.getTableAt(0).getRowCount() > 0) {
InteractiveGeocoderPanel panel = new InteractiveGeocoderPanel((NominatimConfig) configuration, selDB, launcherApi);
try {
gui.showModalPanel(panel, "Nominatim geocoder");
} catch (Throwable e) {
throw new RuntimeException(e);
} finally {
panel.dispose();
}
} else {
if (((NominatimConfig) configuration).isSkipAlreadyGeocoded()) {
throw new RuntimeException("No input rows without geocodes found.");
} else {
throw new RuntimeException("No input rows found.");
}
}
}
});
}
@Override
public Class<? extends Serializable> getConfigClass() {
return NominatimConfig.class;
}
@Override
public JPanel createConfigEditorPanel(ComponentConfigurationEditorAPI factory, int mode, Serializable config, boolean isFixedIO) {
return new NominatimConfigPanel((NominatimConfig) config);
}
@Override
public long getFlags(ODLApi api, int mode) {
return ODLComponent.FLAG_OUTPUT_WINDOWS_ALWAYS_SYNCHRONISED;
}
// @Override
// public Iterable<ODLWizardTemplateConfig> getWizardTemplateConfigs(ODLApi api) {
// return Arrays.asList(
// new ODLWizardTemplateConfig("Nominatim", getName(), "Interactive geocoding of a table using an OpenStreetMap Nominatim webservice.", new
// NominatimConfig())
// // ,new ODLWizardTemplateConfig("TEST","TEST", "TEST", new NominatimConfig())
//
// );
// }
@Override
public Icon getIcon(ODLApi api, int mode) {
return Icons.loadFromStandardPath("nominatim-geocode.png");
}
@Override
public boolean isModeSupported(ODLApi api, int mode) {
return mode == ODLComponent.MODE_DEFAULT;
}
@Override
public void registerScriptTemplates(ScriptTemplatesBuilder templatesApi) {
templatesApi.registerTemplate("Nominatim", getName(), "Interactive geocoding of a table using an OpenStreetMap Nominatim webservice.", getIODsDefinition(templatesApi.getApi(), new NominatimConfig()), new NominatimConfig());
}
}