package org.openjump.core.ui.plugin.file.open; import java.awt.Dimension; import java.awt.Point; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import org.openjump.core.model.TaskEvent; import org.openjump.core.model.TaskListener; import org.openjump.core.ui.images.IconLoader; import org.openjump.core.ui.plugin.file.FindFile; import org.openjump.core.ui.plugin.file.OpenRecentPlugIn; import org.openjump.core.ui.swing.wizard.AbstractWizardGroup; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jump.I18N; import com.vividsolutions.jump.coordsys.CoordinateSystemRegistry; import com.vividsolutions.jump.feature.FeatureCollection; import com.vividsolutions.jump.io.datasource.Connection; import com.vividsolutions.jump.io.datasource.DataSource; import com.vividsolutions.jump.io.datasource.DataSourceQuery; import com.vividsolutions.jump.task.TaskMonitor; import com.vividsolutions.jump.util.java2xml.XML2Java; import com.vividsolutions.jump.workbench.JUMPWorkbench; import com.vividsolutions.jump.workbench.WorkbenchContext; import com.vividsolutions.jump.workbench.model.Category; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.model.LayerManager; import com.vividsolutions.jump.workbench.model.Layerable; import com.vividsolutions.jump.workbench.model.Task; import com.vividsolutions.jump.workbench.plugin.PlugInManager; import com.vividsolutions.jump.workbench.ui.GUIUtil; import com.vividsolutions.jump.workbench.ui.TaskFrame; import com.vividsolutions.jump.workbench.ui.WorkbenchFrame; import com.vividsolutions.jump.workbench.ui.plugin.WorkbenchContextReference; import com.vividsolutions.jump.workbench.ui.wizard.WizardDialog; public class OpenProjectWizard extends AbstractWizardGroup { /** The key for the wizard. */ public static final String KEY = OpenProjectWizard.class.getName(); /** The workbench context. */ private WorkbenchContext workbenchContext; private SelectProjectFilesPanel selectProjectPanel; private Task sourceTask; private Task newTask; private File[] files; private Envelope savedTaskEnvelope = null; /** * Construct a new OpenFileWizard. * * @param workbenchContext The workbench context. */ public OpenProjectWizard(final WorkbenchContext workbenchContext) { super(I18N.get(KEY), IconLoader.icon("folder_layout_add.png"), SelectProjectFilesPanel.KEY); this.workbenchContext = workbenchContext; initPanels(workbenchContext); } public OpenProjectWizard(final WorkbenchContext workbenchContext, final File[] files) { this.workbenchContext = workbenchContext; this.files = files; initPanels(workbenchContext); } private void initPanels(final WorkbenchContext workbenchContext) { selectProjectPanel = new SelectProjectFilesPanel(workbenchContext); addPanel(selectProjectPanel); } public void initialize(WorkbenchContext workbenchContext, WizardDialog dialog) { selectProjectPanel.setDialog(dialog); } /** * Load the files selected in the wizard. * * @param monitor The task monitor. */ public void run(WizardDialog dialog, TaskMonitor monitor) { if (files == null) { File[] selectedFiles = selectProjectPanel.getSelectedFiles(); open(selectedFiles, monitor); } else { open(files, monitor); } } private void open(File[] files, TaskMonitor monitor) { for (File file : files) { open(file, monitor); } } public void open(File file, TaskMonitor monitor) { try { FileReader reader = new FileReader(file); try { JUMPWorkbench workbench = workbenchContext.getWorkbench(); WorkbenchFrame workbenchFrame = workbench.getFrame(); PlugInManager plugInManager = workbench.getPlugInManager(); ClassLoader pluginClassLoader = plugInManager.getClassLoader(); sourceTask = (Task)new XML2Java(pluginClassLoader).read(reader, Task.class); initializeDataSources(sourceTask, workbenchFrame.getContext()); newTask = new Task(); newTask.setName(GUIUtil.nameWithoutExtension(file)); newTask.setProjectFile(file); newTask.setProperties(sourceTask.getProperties()); newTask.setTaskWindowLocation(sourceTask.getTaskWindowLocation()); newTask.setTaskWindowSize(sourceTask.getTaskWindowSize()); newTask.setMaximized(sourceTask.getMaximized()); newTask.setSavedViewEnvelope(sourceTask.getSavedViewEnvelope()); TaskFrame frame = workbenchFrame.addTaskFrame(newTask); Dimension size = newTask.getTaskWindowSize(); if (size != null) frame.setSize(size); Point location = newTask.getTaskWindowLocation(); if ( (location != null) && (location.x < workbenchFrame.getSize().width) && (location.y < workbenchFrame.getSize().height)) frame.setLocation(location); if (newTask.getMaximized()) frame.setMaximum(true); savedTaskEnvelope = newTask.getSavedViewEnvelope(); LayerManager sourceLayerManager = sourceTask.getLayerManager(); LayerManager newLayerManager = newTask.getLayerManager(); CoordinateSystemRegistry crsRegistry = CoordinateSystemRegistry.instance(workbenchContext.getBlackboard()); workbenchContext.getLayerViewPanel().setDeferLayerEvents(true); loadLayers(sourceLayerManager, newLayerManager, crsRegistry, monitor); workbenchContext.getLayerViewPanel().setDeferLayerEvents(false); OpenRecentPlugIn.get(workbenchContext).addRecentProject(file); } finally { reader.close(); } } catch (Exception e) { monitor.report(e); } } private void initializeDataSources(Task task, WorkbenchContext context) { LayerManager layerManager = task.getLayerManager(); List<Layer> layers = layerManager.getLayers(); for (Layer layer : layers) { DataSourceQuery dataSourceQuery = layer.getDataSourceQuery(); DataSource dataSource = dataSourceQuery.getDataSource(); if (dataSource instanceof WorkbenchContextReference) { WorkbenchContextReference workbenchRef = (WorkbenchContextReference)dataSource; workbenchRef.setWorkbenchContext(context); } } } private void loadLayers(LayerManager sourceLayerManager, LayerManager newLayerManager, CoordinateSystemRegistry registry, TaskMonitor monitor) throws Exception { JUMPWorkbench workbench = workbenchContext.getWorkbench(); WorkbenchFrame workbenchFrame = workbench.getFrame(); FindFile findFile = new FindFile(workbenchFrame); boolean displayDialog = true; try { List<Category> categories = sourceLayerManager.getCategories(); for (Category sourceLayerCategory : categories) { newLayerManager.addCategory(sourceLayerCategory.getName()); // LayerManager#addLayerable adds layerables to the top. So reverse // the order. ArrayList<Layerable> layerables = new ArrayList<Layerable>( sourceLayerCategory.getLayerables()); Collections.reverse(layerables); for (Layerable layerable : layerables) { if (monitor != null) { monitor.report(I18N.get("ui.plugin.OpenProjectPlugIn.loading") + " " + layerable.getName()); } layerable.setLayerManager(newLayerManager); if (layerable instanceof Layer) { Layer layer = (Layer)layerable; try { load(layer, registry, monitor); } catch (FileNotFoundException ex) { if (displayDialog) { displayDialog = false; int response = JOptionPane.showConfirmDialog( workbenchFrame, I18N.get("ui.plugin.OpenProjectPlugIn.At-least-one-file-in-the-task-could-not-be-found") + "\n" + I18N.get("ui.plugin.OpenProjectPlugIn.Do-you-want-to-locate-it-and-continue-loading-the-task"), "JUMP", JOptionPane.YES_NO_OPTION); if (response != JOptionPane.YES_OPTION) { break; } } DataSourceQuery dataSourceQuery = layer.getDataSourceQuery(); DataSource dataSource = dataSourceQuery.getDataSource(); Map properties = dataSource.getProperties(); String fname = properties.get("File").toString(); String filename = findFile.getFileName(fname); if (filename.length() > 0) { // set the new source for this layer properties.put(DataSource.FILE_KEY, filename); dataSource.setProperties(properties); load(layer, registry, monitor); } else { break; } } } newLayerManager.addLayerable(sourceLayerCategory.getName(), layerable); } } // fire TaskListener's Object[] listeners = workbenchFrame.getTaskListeners().toArray(); for (int i = 0; i < listeners.length; i++) { TaskListener l = (TaskListener) listeners[i]; l.taskLoaded(new TaskEvent(this, newLayerManager.getTask())); } } finally { SwingUtilities.invokeLater(new Runnable() { public void run() { try { if (savedTaskEnvelope == null) workbenchContext.getLayerViewPanel().getViewport().zoomToFullExtent(); else workbenchContext.getLayerViewPanel().getViewport().zoom(savedTaskEnvelope); } catch (Exception ex) { ex.printStackTrace(); } } }); } } public static void load(Layer layer, CoordinateSystemRegistry registry, TaskMonitor monitor) throws Exception { DataSourceQuery dataSourceQuery = layer.getDataSourceQuery(); String query = dataSourceQuery.getQuery(); DataSource dataSource = dataSourceQuery.getDataSource(); FeatureCollection features = executeQuery(query, dataSource, registry, monitor); layer.setFeatureCollection(features); layer.setFeatureCollectionModified(false); } private static FeatureCollection executeQuery(String query, DataSource dataSource, CoordinateSystemRegistry registry, TaskMonitor monitor) throws Exception { Connection connection = dataSource.getConnection(); try { FeatureCollection features = connection.executeQuery(query, monitor); return dataSource.installCoordinateSystem(features, registry); } finally { connection.close(); } } }