/*
* Licensed Materials - Property of Rogue Wave Software, Inc.
* © Copyright Rogue Wave Software, Inc. 2014, 2017
* © Copyright IBM Corp. 2009, 2014
* © Copyright ILOG 1996, 2009
* All Rights Reserved.
*
* Note to U.S. Government Users Restricted Rights:
* The Software and Documentation were developed at private expense and
* are "Commercial Items" as that term is defined at 48 CFR 2.101,
* consisting of "Commercial Computer Software" and
* "Commercial Computer Software Documentation", as such terms are
* used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
* as applicable.
*/
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.net.MalformedURLException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.border.EtchedBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.text.Position;
import ilog.views.IlvManager;
import ilog.views.IlvManagerLayer;
import ilog.views.IlvManagerView;
import ilog.views.IlvRect;
import ilog.views.IlvTransformer;
import ilog.views.accelerator.IlvDeleteSelectionAccelerator;
import ilog.views.accelerator.IlvFitToSizeAccelerator;
import ilog.views.accelerator.IlvIdentityAccelerator;
import ilog.views.accelerator.IlvZoomInAccelerator;
import ilog.views.accelerator.IlvZoomOutAccelerator;
import ilog.views.interactor.IlvManagerMagViewInteractor;
import ilog.views.interactor.IlvPanInteractor;
import ilog.views.maps.ExceptionHandler;
import ilog.views.maps.IlvAttributeInfoProperty;
import ilog.views.maps.IlvCoordinate;
import ilog.views.maps.IlvCoordinateSystemProperty;
import ilog.views.maps.IlvMapFeature;
import ilog.views.maps.IlvMapFeatureIterator;
import ilog.views.maps.IlvMapLayerTreeProperty;
import ilog.views.maps.IlvMapScaleLimiter;
import ilog.views.maps.IlvMapUtil;
import ilog.views.maps.beans.IlvJMapsManagerViewControlBar;
import ilog.views.maps.beans.IlvLayerTreePanel;
import ilog.views.maps.beans.IlvMapLayer;
import ilog.views.maps.beans.IlvMapLayerTreeModel;
import ilog.views.maps.datasource.IlvMapDataSourceModel;
import ilog.views.maps.datasource.IlvMapDataSourceProperty;
import ilog.views.maps.datasource.IlvSDODataSource;
import ilog.views.maps.datasource.IlvShapeDataSource;
import ilog.views.maps.export.IlvMapExportManager;
import ilog.views.maps.export.IlvSDOExporter;
import ilog.views.maps.format.IlvMapLoader;
import ilog.views.maps.format.oracle.IlvSDOConnection;
import ilog.views.maps.format.oracle.IlvSDOUtil;
import ilog.views.maps.format.oracle.objectmodel.IlvObjectSDOUtil;
import ilog.views.maps.format.oracle.objectmodel.IlvObjectSDOWriter;
import ilog.views.maps.srs.coordsys.IlvCoordinateSystem;
import ilog.views.maps.srs.coordsys.IlvGeographicCoordinateSystem;
import ilog.views.maps.srs.coordtrans.IlvCoordinateTransformation;
import ilog.views.swing.IlvJScrollManagerView;
import ilog.views.swing.IlvThreadedActivityMonitor;
import ilog.views.swing.IlvThreadedActivityMonitorPanel;
import ilog.views.swing.IlvThreadedActivityMonitorProperty;
import ilog.views.tiling.IlvTiledLayer;
import ilog.views.util.IlvProductUtil;
import ilog.views.util.data.IlvJDBCQueryUtil;
/**
* This is the class that uses the <code>IlvObjectSDOFeatureIterator</code>,
* <code>IlvObjectSDOWriter</code> and all the other classes allow to read a map
* file, to save it into Oracle Spatial, to read and restore a (SDO) Layer, and
* to load a Layer on demand.
*/
SuppressWarnings("serial")
public class SdoSample extends JFrame implements ExceptionHandler {
// Bars
IlvJMapsManagerViewControlBar controlBar;
JToolBar demoToolBar;
IlvThreadedActivityMonitorPanel monitorPanel;
IlvThreadedActivityMonitor monitor;
// Dialogs
JFileChooser loadDialog;
JFileChooser saveDialog;
// Text handlers.
JTextArea textBuffer = new JTextArea("Outputs: \n"); //$NON-NLS-1$
Position end;
JScrollPane scroll;
// The connection to the database.
IlvSDOConnection connection = null;
// The Oracle SDO stuff.
IlvMapFeatureIterator reader = null;
int columnCount = 1;
int rowCount = 1;
// String keyColumnName = null;
String geometryColumnName = null;
// boolean lodEnabled = false;
// boolean writeEnabled = false;
IlvAttributeInfoProperty info = null;
boolean saveAttributes = false;
Long srID = null;
// The name of the ordinates in the (USER_)SDO_GEOM_METADATA table.
String xColName = "X"; //$NON-NLS-1$
String yColName = "Y"; //$NON-NLS-1$
// The layer name.
String layerName;
// The current file which is loaded or will be saved in Oracle.
String currentFilename = ""; //$NON-NLS-1$
// The number of objects loaded from a file.
int fileObjectsCount = 0;
// The debug view and the frame containing it.
IlvManagerView debugView;
// JFrame debugFrame;
// JViews objects.
IlvManager manager;
IlvManagerView view;
IlvMapLoader mapLoader;
// The boundaries of the SDO layer.
IlvCoordinate layerUpperLeftCorner = new IlvCoordinate(-360d, 90d);
IlvCoordinate layerLowerRightCorner = new IlvCoordinate(360d, -90d);
IlvLayerTreePanel layerTreePanel;
JPanel accessoryPanel;
JCheckBox lodCheckBox;
JCheckBoxMenuItem debugViewCheckbox;
private JTextField columnCountField;
private JTextField rowCountField;
private JLabel rowCountLabel;
private JLabel columnCountLabel;
IlvShapeDataSource shapeDataSource;
/**
* Constructs the sample and it's GUI.
*/
SuppressWarnings("nls")
public SdoSample() {
setTitle("Oracle Spatial Sample");
setIconImage(new ImageIcon(SdoSample.class.getResource("database.gif")).getImage());
loadDialog = new JFileChooser(".");
loadDialog.setAcceptAllFileFilterUsed(false);
loadDialog.addChoosableFileFilter(new FileFilter() {
Override
public boolean accept(File f) {
return f.isDirectory() || f.getName().toLowerCase(IlvMapLoader.getFileLocale()).endsWith(".shp");
}
Override
public String getDescription() {
return ("ESRI Shape (*.shp) File"); //$NON-NLS-1$
}
});
saveDialog = new JFileChooser(".");
setSize(900, 600);
manager = new IlvManager();
manager.setNamedProperty(new IlvCoordinateSystemProperty(IlvGeographicCoordinateSystem.WGS84));
view = new IlvManagerView(manager);
view.setKeepingAspectRatio(true);
// limit the zoom to correct scales.
IlvMapScaleLimiter limiter = new IlvMapScaleLimiter(1, (float) (1 / 1E9));
limiter.setView(view);
mapLoader = new IlvMapLoader(manager);
lodCheckBox = new JCheckBox("Use tiling");
lodCheckBox.setToolTipText("Enable load on demand (tiling) on the required layer");
columnCountField = new JTextField(3);
rowCountField = new JTextField(3);
columnCountLabel = new JLabel("columns");
rowCountLabel = new JLabel("rows");
rowCountLabel.setToolTipText("Specify the number of columns of the load on demand grid");
columnCountLabel.setToolTipText("Specify the number of rows of the load on demand grid");
columnCountField.setEnabled(false);
rowCountField.setEnabled(false);
columnCountLabel.setEnabled(false);
rowCountLabel.setEnabled(false);
lodCheckBox.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
if (lodCheckBox.isSelected()) {
columnCountField.setEnabled(true);
rowCountField.setEnabled(true);
columnCountLabel.setEnabled(true);
rowCountLabel.setEnabled(true);
} else {
columnCountField.setEnabled(false);
rowCountField.setEnabled(false);
columnCountLabel.setEnabled(false);
rowCountLabel.setEnabled(false);
}
}
});
initButtons();
createMenuBar();
initAccelerators();
getContentPane().add(new IlvJScrollManagerView(view), BorderLayout.CENTER);
textBuffer.setRows(6);
textBuffer.setEditable(false);
end = textBuffer.getDocument().getEndPosition();
scroll = new JScrollPane(textBuffer);
layerTreePanel = new IlvLayerTreePanel();
layerTreePanel.setPreferredSize(new Dimension(220, 300));
layerTreePanel.setView(view);
accessoryPanel = new JPanel(new BorderLayout());
accessoryPanel.add(layerTreePanel, BorderLayout.CENTER);
getContentPane().add(accessoryPanel, BorderLayout.LINE_START);
getContentPane().add(scroll, BorderLayout.PAGE_END);
}
/**
* Builds the buttons and the bars.
*/
SuppressWarnings("nls")
public void initButtons() {
getContentPane().setLayout(new BorderLayout());
JPanel p = new JPanel();
p.setLayout(new FlowLayout(FlowLayout.LEFT));
JButton loadButton = new JButton(new ImageIcon(SdoSample.class.getResource("load_shape.gif"))); //$NON-NLS-1$
JButton saveDbButton = new JButton(new ImageIcon(SdoSample.class.getResource("save_db.gif"))); //$NON-NLS-1$
JButton loadDbButton = new JButton(new ImageIcon(SdoSample.class.getResource("load_db.gif"))); //$NON-NLS-1$
monitor = IlvThreadedActivityMonitorProperty.GetThreadedActivityMonitor(manager);
monitorPanel = new IlvThreadedActivityMonitorPanel(monitor);
monitorPanel.setOpaque(false);
controlBar = new IlvJMapsManagerViewControlBar();
controlBar.setFloatable(false);
controlBar.setBorderPainted(false);
controlBar.setOpaque(false);
demoToolBar = new JToolBar();
demoToolBar.setFloatable(false);
demoToolBar.setBorderPainted(false);
demoToolBar.setOpaque(false);
p.add(demoToolBar);
p.add(controlBar);
controlBar.setView(view);
loadButton.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
loadShape();
}
});
saveDbButton.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
saveToDb();
}
});
loadDbButton.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
loadFromDB();
}
});
p.add(controlBar);
loadButton.setToolTipText("Open shape file");
saveDbButton.setToolTipText("Save layer to dataBase");
loadDbButton.setToolTipText("Load layer from database");
demoToolBar.add(loadButton);
demoToolBar.addSeparator();
demoToolBar.add(loadDbButton);
demoToolBar.add(saveDbButton);
controlBar.addSeparator();
p.add(monitorPanel);
loadButton.setPreferredSize(new Dimension(26, 26));
saveDbButton.setPreferredSize(new Dimension(26, 26));
loadDbButton.setPreferredSize(new Dimension(26, 26));
((IlvPanInteractor) controlBar.getPanInteractor()).setOpaqueMove(true);
getContentPane().add(p, BorderLayout.PAGE_START);
}
/**
* Creates the menu bar.
*/
SuppressWarnings("nls")
public void createMenuBar() {
JMenuItem voidItem;
JMenu demoMenu = new JMenu("Demo");
// JMenu dataBase = new JMenu("Data Base");
// Reset all.
demoMenu.add(voidItem = new JMenuItem("New map"));
voidItem.setIcon(new ImageIcon(SdoSample.class.getResource("new.gif"))); //$NON-NLS-1$
voidItem.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
reset();
}
});
demoMenu.addSeparator();
// Load shape file.
demoMenu.add(voidItem = new JMenuItem("Open shape file"));
voidItem.setIcon(new ImageIcon(SdoSample.class.getResource("load_shape.gif")));
voidItem.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
loadShape();
}
});
// Load DB.
demoMenu.add(voidItem = new JMenuItem("Load layer from dataBase"));
voidItem.setIcon(new ImageIcon(SdoSample.class.getResource("load_db.gif")));
voidItem.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
loadFromDB();
}
});
// Save DB.
demoMenu.add(voidItem = new JMenuItem("Save layer to dataBase"));
voidItem.setIcon(new ImageIcon(SdoSample.class.getResource("save_db.gif")));
voidItem.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
saveToDb();
}
});
demoMenu.addSeparator();
demoMenu.add(voidItem = new JMenuItem("Disconnect"));
voidItem.setIcon(new ImageIcon(SdoSample.class.getResource("disconnect.gif")));
voidItem.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
closeConnection();
}
});
demoMenu.addSeparator();
debugViewCheckbox = new JCheckBoxMenuItem("Show debug view", true);
demoMenu.add(debugViewCheckbox);
debugViewCheckbox.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
if (debugView != null) {
if (debugViewCheckbox.isSelected()) {
addDebugView();
} else {
removeDebugView();
}
}
}
});
demoMenu.addSeparator();
// Quit.
demoMenu.add(voidItem = new JMenuItem("Quit"));
voidItem.setIcon(new ImageIcon(SdoSample.class.getResource("exit.gif")));
voidItem.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
exitSample();
}
});
JMenuBar menubar = new JMenuBar();
menubar.add(demoMenu);
// menubar.add(dataBase);
setJMenuBar(menubar);
}
/**
* Sets the accelerators for the manager.
*/
public void initAccelerators() {
manager.addAccelerator(new IlvZoomInAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_Z, InputEvent.CTRL_MASK));
manager.addAccelerator(new IlvZoomOutAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_U, InputEvent.CTRL_MASK));
manager.addAccelerator(new IlvIdentityAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_I, InputEvent.CTRL_MASK));
manager.addAccelerator(new IlvFitToSizeAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_F, InputEvent.CTRL_MASK));
manager.addAccelerator(new IlvDeleteSelectionAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_DELETE, 0));
}
/**
* This method handles messaging in the <code>TextArea</code> object.
*
* @param mes
*/
public void appendMessage(String mes) {
textBuffer.setCaretPosition(end.getOffset() - 1);
textBuffer.append(mes + "\n"); //$NON-NLS-1$
Rectangle tmp = getBounds();
scroll.paintImmediately(0, 0, tmp.width, tmp.height);
}
/**
* This method handles errors in the <code>TextArea</code> object.
*
* @param error
*/
public void reportError(String error) {
appendMessage("** " + error);//$NON-NLS-1$
}
/**
* This method handles exceptions in the <code>TextArea</code> object.
*
* @param e
*/
public void reportError(Throwable e) {
if (e.getMessage() != null)
appendMessage("** " + e);//$NON-NLS-1$
else
appendMessage("No message for this exception.");//$NON-NLS-1$
// e.printStackTrace();
}
private void removeDebugView() {
if (debugView != null) {
debugView.popInteractor();
accessoryPanel.remove(debugView);
accessoryPanel.invalidate();
getContentPane().validate();
}
}
/**
* Resets the debug view of the SDO layer and the manager for load on demand.
*/
public void reset() {
removeDebugView();
debugView = null;
IlvMapDataSourceModel dataSourceModel = IlvMapDataSourceProperty.GetMapDataSourceModel(manager);
dataSourceModel.clear();
IlvMapLayerTreeModel ltm = IlvMapLayerTreeProperty.GetMapLayerTreeModel(view.getManager());
ltm.clear();
int nb = manager.getLayersCount();
for (int i = 1; i < nb; i++)
manager.removeLayer(1, false);
manager.deleteAll(true);
view.repaint();
}
/**
* Exists the sample. It closes the connection before.
*/
public void exitSample() {
closeConnection();
System.exit(0);
}
/**
*
*
*/
private void closeConnection() {
try {
if (connection != null && connection.getConnection() != null)
connection.getConnection().close();
connection = null;
appendMessage("Connection closed"); //$NON-NLS-1$
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* Loads a shape file.
*/
SuppressWarnings("nls")
public void loadShape() {
try {
loadDialog.setDialogType(JFileChooser.OPEN_DIALOG);
loadDialog.setDialogTitle("Load a shape file");
loadDialog.setSelectedFile(null);
loadDialog.showOpenDialog(this);
final File fi = loadDialog.getSelectedFile();
if (fi != null && fi.getName() != null) {
reset();
currentFilename = fi.getPath();
appendMessage("Loading " + currentFilename);
shapeDataSource = new IlvShapeDataSource(currentFilename);
shapeDataSource.setCoordinateSystem(IlvGeographicCoordinateSystem.WGS84);
final IlvMapDataSourceModel dataSourceModel = IlvMapDataSourceProperty.GetMapDataSourceModel(manager);
dataSourceModel.insert(shapeDataSource);
// dataSourceModel.start();
Thread loader = new Thread() {
Override
public void run() {
dataSourceModel.start();
IlvMapLayerTreeModel ltm = IlvMapLayerTreeProperty.GetMapLayerTreeModel(view.getManager());
IlvMapLayer shapeLayer = shapeDataSource.getInsertionLayer();
ltm.addChild(null, shapeLayer);
shapeLayer.setName("ESRI layer (" + fi.getName() + ")");
view.fitTransformerToContent();
view.repaint();
}
};
loader.start();
}
} catch (Exception e) {
reportError(e);
} finally {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
Toolkit.getDefaultToolkit().sync();
}
view.fitTransformerToContent();
manager.reDraw();
}
////////////////////////
// Data Base Callbacks
////////////////////////
/**
* Executes the query passed as argument and returns the result set.
*
* @param query
* SQL query string.
* @return the result set
* @throws SQLException
*/
private ResultSet executeQuery(String query) throws SQLException {
// no risk of SQL injection - only used in getAvailableGid
if (connection == null || connection.getConnection() == null) {
reportError("No Connection available!"); //$NON-NLS-1$
return null;
}
Statement st = connection.getConnection().createStatement();
ResultSet res = st.executeQuery(query);
return res;
}
/**
* Creates and connects the reader and the writer to the DB.
*/
SuppressWarnings("nls")
public void connect() {
try {
// The connection panel implementing the
// <code>IlvSDOConnectionFactory</code>.
ConnectionPanel conpan = new ConnectionPanel(this);
Rectangle bbox = getBounds();
Rectangle bbox2 = conpan.getBounds();
conpan.setLocation((int) ((bbox.x + bbox.width) / 2f - (bbox2.x + bbox2.width) / 2f),
(int) ((bbox.y + bbox.height) / 2f - (bbox2.y + bbox2.height) / 2f));
// Changing the default connection factory:
IlvSDOConnection.SetConnectionFactory(conpan);
// Creating a new IlvSDOConnection.
connection = new IlvSDOConnection(null, null, null);
// Connecting it.
IlvSDOConnection.GetConnectionFactory().makeConnection(connection);
if (connection.getConnection() == null) {
appendMessage("Not connected.");
return;
}
appendMessage("Connected.");
// Testing the existence of SDO package.
if (IlvSDOUtil.CheckSdoExistence(connection.getConnection()))
appendMessage("Found Oracle SDO Package ...");
else {
reportError("** No Oracle SDO Package found.**");
reportError("** Please contact your DB Administrator. **");
reportError(" Disconnecting ... ");
closeConnection();
return;
}
} catch (Exception e) {
reportError(e);
}
}
/**
* Checks if the user is connected to the DB.
*
* @return true if connection succeeded.
*/
public boolean checkConnection() {
if (connection == null || connection.getConnection() == null)
connect();
if (connection.getConnection() == null)
return false;
return true;
}
/**
* Returns an available SDO_GID which has to be a unique value.
*
* @param sdoLayerName
* @return gid number.
*/
public int getAvailableGid(String sdoLayerName) {
try {
// check against SQL injection.
IlvJDBCQueryUtil.validateTableName(sdoLayerName);
// Extract the greater SDO_GID from the DB.
ResultSet result = executeQuery("select SDO_GID from " + sdoLayerName + "_SDOGEOM ORDER BY 1 DESC\n"); //$NON-NLS-1$ //$NON-NLS-2$
result.next();
int gid = result.getInt(1);
result.getStatement().close();
result.close();
if (!result.wasNull())
return gid + 1;
} catch (SQLException e) {
return 0;
}
return 0;
}
/**
* Pops a dialog proposing the available SDO layers. If
* <code>multipleChoice</code> is set to <code>true</codE>, then the user can
* choose more than one layer (by using the shift key + mouse click).
*
* @param writingToDB
* @return whether the user has chosen something or nothing.
*/
SuppressWarnings("nls")
public boolean selectLayers(boolean writingToDB) {
if (!checkConnection())
return false;
layerName = null;
try {
String[] layersList = null;
layersList = IlvObjectSDOUtil.GetAllLayers(connection.getConnection(), connection.getUser(), true);
final JList<String> dataList = new JList<String>(layersList);
// custom renderer to display icons
DefaultListCellRenderer customRenderer = new DefaultListCellRenderer() {
private Icon vectorIcon = new ImageIcon(SdoSample.class.getResource("vector.gif")); //$NON-NLS-1$
private Icon rasterIcon = new ImageIcon(SdoSample.class.getResource("raster.gif")); //$NON-NLS-1$
Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected,
boolean hasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, hasFocus);
if (value instanceof String && ((String) value).contains("GEORASTER")) { //$NON-NLS-1$
label.setIcon(rasterIcon);
} else {
label.setIcon(vectorIcon);
}
return label;
}
};
dataList.setCellRenderer(customRenderer);
dataList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
dataList.addListSelectionListener(new ListSelectionListener() {
boolean lodValue = lodCheckBox.isSelected();
String rrowCount = rowCountField.getText();
String colCount = columnCountField.getText();
boolean needToRestore = false;
Override
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
if (dataList.getSelectedValue() != null) {
String s = dataList.getSelectedValue().toString();
if (s.contains("GEORASTER")) { //$NON-NLS-1$
if (!needToRestore) {
lodValue = lodCheckBox.isSelected();
rrowCount = rowCountField.getText();
colCount = columnCountField.getText();
}
lodCheckBox.setEnabled(false);
lodCheckBox.setSelected(false);
rowCountField.setEnabled(false);
rowCountLabel.setEnabled(false);
columnCountField.setEnabled(false);
columnCountLabel.setEnabled(false);
needToRestore = true;
} else {
lodCheckBox.setEnabled(true);
rowCountField.setEnabled(lodCheckBox.isSelected());
rowCountLabel.setEnabled(lodCheckBox.isSelected());
columnCountLabel.setEnabled(lodCheckBox.isSelected());
columnCountField.setEnabled(lodCheckBox.isSelected());
if (needToRestore) {
needToRestore = false;
lodCheckBox.setSelected(lodValue);
rowCountField.setText(rrowCount);
columnCountField.setText(colCount);
}
}
}
}
});
final JScrollPane scrollPane = new JScrollPane(dataList);
String title = "Choose the SDO layer";
final JDialog layerDialog = new JDialog(this, title, true);
final JPanel pan1 = new JPanel();
final JPanel pan2 = new JPanel();
final JPanel pan4 = new JPanel(new BorderLayout());
final JButton ok = new JButton("OK");
final JButton cancel = new JButton("Cancel");
final JTextField sridField = new JTextField(6);
final JLabel sridLabel = new JLabel("SRID");
sridLabel.setToolTipText("Specify the coordinate system of the layer to save to Oracle DB");
final JPanel pan3 = new JPanel();
pan3.setLayout(new FlowLayout());
pan3.setBorder(new EtchedBorder());
if (writingToDB) {
pan3.add(sridLabel);
pan3.add(sridField);
} else {
pan3.add(lodCheckBox);
pan3.add(rowCountLabel);
pan3.add(rowCountField);
pan3.add(columnCountLabel);
pan3.add(columnCountField);
}
pan1.setLayout(new BorderLayout());
pan1.add(scrollPane, "Center"); //$NON-NLS-1$
pan2.add(ok);
pan2.add(cancel);
ok.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
Object value = dataList.getSelectedValue();
if (value == null) {
reportError("Please select a layer !");
return;
}
layerName = value.toString();
geometryColumnName = GetAfterDotString(value.toString());
try {
srID = Long.valueOf(sridField.getText().trim());
} catch (Exception ee) {
if (sridField.isEnabled() && sridField.getText().trim().length() > 0) {
reportError("Please give a correct SRID !");
return;
}
}
try {
rowCount = Integer.valueOf(rowCountField.getText().trim()).intValue();
columnCount = Integer.valueOf(columnCountField.getText().trim()).intValue();
layerDialog.setVisible(false);
} catch (Exception ee) {
rowCount = 1;
columnCount = 1;
if (columnCountField.isEnabled()) {
reportError("Please fill in tiling parameters"); //$NON-NLS-1$
return;
}
layerDialog.setVisible(false);
}
}
});
cancel.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
layerDialog.setVisible(false);
}
});
layerDialog.getContentPane().setLayout(new BorderLayout());
pan4.add(pan3, BorderLayout.CENTER);
pan4.add(pan2, BorderLayout.PAGE_END);
layerDialog.getContentPane().add(pan1, BorderLayout.CENTER);
layerDialog.getContentPane().add(pan4, BorderLayout.PAGE_END);
Rectangle bbox = getBounds();
layerDialog.pack();
layerDialog.setLocation((int) bbox.getCenterX() - layerDialog.getWidth() / 2,
(int) bbox.getCenterY() - layerDialog.getHeight() / 2);
layerDialog.setVisible(true);
} catch (SQLException e) {
reportError(e);
}
if (layerName != null) {
return true;
}
return false;
}
/**
* Writes the feature iterator passed as argument into the database. Moreover,
* it updates the progress bar.
*
* @param rreader
* @param theWriter
* @return the feature index.
*/
SuppressWarnings("nls")
public int writeFeatureIterator(IlvMapFeatureIterator rreader, Object theWriter) {
int i = 0;
if (rreader == null)
return 0;
try {
IlvMapFeature feature = rreader.getNextFeature();
if (feature != null && feature.getAttributeInfo() != null) {
int res = JOptionPane.showConfirmDialog(this, "Do you want to save the attributes of the map features?",
"Save attributes ?", JOptionPane.YES_NO_OPTION);
if (res == JOptionPane.YES_OPTION)
saveAttributes = true;
else
saveAttributes = false;
}
// Loop over the features.
while (feature != null) {
try {
((IlvObjectSDOWriter) theWriter).writeFeature(feature, saveAttributes, srID);
i++;
} catch (Exception e) {
reportError(e);
}
int progress = (int) (100 * i / (double) fileObjectsCount);
monitor.updateActivityProgress(SdoSample.this, progress, "Saving to DB...");
if (SwingUtilities.isEventDispatchThread()) {
Rectangle bounds = monitorPanel.getBounds();
monitorPanel.paintImmediately(0, 0, (int) bounds.getWidth(), (int) bounds.getHeight());
}
}
} catch (Exception e) {
reportError(e);
}
monitor.unregisterThreadedActivity(SdoSample.this);
// Don't forget to commit the inserte rows.
try {
connection.getConnection().commit();
((IlvObjectSDOWriter) theWriter).close(0.00001, srID);
} catch (SQLException e) {
reportError(e);
}
return i;
}
/**
* Saves the current reader into Spatial.
*/
SuppressWarnings("nls")
public void saveToDb() {
if (!checkConnection())
return;
if (shapeDataSource == null) {
// No Map file has been loaded so that no current reader is available.
JOptionPane.showMessageDialog(this, "No current filename to save!", "Can't save in Data Base",
JOptionPane.ERROR_MESSAGE);
return;
}
int res = JOptionPane.showConfirmDialog(this,
"Saving '" + shapeDataSource.getInsertionLayer().getName() + "' layer in the Data Base ?", "Confirm saving",
JOptionPane.YES_NO_OPTION);
if (res == JOptionPane.NO_OPTION)
return;
IlvMapExportManager exportManager = new IlvMapExportManager();
IlvSDOExporter sdoExporter = new IlvSDOExporter();
sdoExporter.setConnection(connection);
// sdoExporter.
exportManager.setVectorialExporter(sdoExporter);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Toolkit.getDefaultToolkit().sync();
exportManager.exportMapLayers(new IlvMapLayer[] { shapeDataSource.getInsertionLayer() });
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
Toolkit.getDefaultToolkit().sync();
}
/**
* Loads a Spatial layer on demand.
*/
public void loadFromDB() {
// lodEnabled = true;
if (!checkConnection())
return;
selectLayers(false);
if (layerName == null)
return;
// reset();
createDataSources(lodCheckBox.isSelected());
// show debug view (if tiled)
if (lodCheckBox.isSelected()) {
debugView = new IlvManagerView(manager);
debugView.setKeepingAspectRatio(true);
debugView.setPreferredSize(new Dimension(230, 170));
addDebugView();
int layerCount = manager.getLayersCount();
for (int i = 0; i < layerCount; i++) {
IlvManagerLayer currentLayer = manager.getManagerLayer(i);
if (currentLayer instanceof IlvTiledLayer) {
((IlvTiledLayer) currentLayer).setDebugView(debugView);
}
}
IlvManagerMagViewInteractor mag = new IlvManagerMagViewInteractor(view, false);
debugView.pushInteractor(mag);
mag.setAutoZooming(true);
mag.setAutoTranslating(true);
}
}
private void addDebugView() {
if (debugView != null) {
accessoryPanel.add(debugView, BorderLayout.PAGE_START);
accessoryPanel.invalidate();
getContentPane().validate();
}
}
/**
*
* @param isTiled
* @param rows
* @param columns
*/
private void createDataSources(final boolean isTiled) {
final IlvMapDataSourceModel dataSourceModel = IlvMapDataSourceProperty.GetMapDataSourceModel(view.getManager());
IlvMapLayerTreeModel ltm = IlvMapLayerTreeProperty.GetMapLayerTreeModel(view.getManager());
IlvSDODataSource ds = null;
IlvRect tempArea = null;
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
try {
ds = new IlvSDODataSource(connection, true, layerName);
IlvRect extent = null;
if (isTiled && !layerName.contains("GEORASTER")) {//$NON-NLS-1$
try {
extent = IlvObjectSDOUtil.GetLayerExtent(connection.getConnection(), GetBeforeDotString(layerName),
geometryColumnName, xColName, yColName, true);
} catch (SQLException e) {/* ignore */
}
tempArea = extent;
ds.setTilingParameters(true, rowCount, columnCount);
ds.setMultiThreaded(true);
}
dataSourceModel.insert(ds);
IlvMapLayer mapLayer = ds.getInsertionLayer();
mapLayer.setName("Oracle Layer");//$NON-NLS-1$
ltm.addChild(null, mapLayer);
} catch (MalformedURLException e) {
e.printStackTrace();
}
final IlvRect areaToFit = tempArea;
final IlvSDODataSource fds = ds;
final IlvCoordinateSystem cs = IlvCoordinateSystemProperty.GetCoordinateSystem(manager);
// start datasource model in a separate thread
Thread loadThread = new Thread() {
Override
public void run() {
try {
fds.start();
} catch (Throwable e) {
reportError(e);
tcleanup();
return;
}
if (!isTiled || layerName.contains("GEORASTER")) { //$NON-NLS-1$
if (dataSourceModel.getDataSources().length == 1) {
// fit only on first layer loaded
view.fitTransformerToContent();
}
} else {
// fit area on center tile
double width = areaToFit.getWidth() / columnCount;
double height = areaToFit.getHeight() / rowCount;
double x = areaToFit.getX() + width * (columnCount / 2);
double y = areaToFit.getY() + height * (rowCount / 2);
double margin = 0.2d;
IlvCoordinateSystem SDOSystem = fds.getCoordinateSystem();
IlvCoordinateTransformation tr = IlvCoordinateTransformation.CreateTransformation(SDOSystem, cs);
IlvRect projectedRect = IlvMapUtil.computeTransformedBounds(tr.getTransform(), x, y, x + width, y + height,
true, 10);
// adjust ratio
double ratio = view.getWidth() / (double) view.getHeight();
double newWidth = projectedRect.getWidth();
double newHeight = projectedRect.getHeight();
if ((newWidth / newHeight) < ratio) {
newHeight = newWidth / ratio;
} else {
newWidth = newHeight * ratio;
}
/*
* IlvRect adjustedArea = new IlvRect(projectedRect.x +
* projectedRect.width*margin , -(projectedRect.y +
* projectedRect.height) + projectedRect.height * margin,
* projectedRect.width * (1-2*margin), projectedRect.height*
* (1-2*margin));
*/
IlvRect adjustedArea2 = new IlvRect();
adjustedArea2.setFrameFromCenter(projectedRect.getCenterX(), -projectedRect.getCenterY(),
projectedRect.getCenterX() + newWidth * (1 - margin) / 2,
-projectedRect.getCenterY() + newHeight * (1 - margin) / 2);
IlvTransformer t = IlvTransformer.computeTransformer(adjustedArea2,
new IlvRect(view.getX(), view.getY(), view.getWidth(), view.getHeight()), null);
view.setTransformer(t);
}
tcleanup();
}
private void tcleanup() {
view.repaint();
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
Toolkit.getDefaultToolkit().sync();
}
};
if (!isTiled) {
loadThread.start();
} else {
loadThread.run();
}
}
private static final String GetBeforeDotString(String str) {
int dotPosition = str.indexOf('.');
if (dotPosition < 1)
return str;
return str.substring(0, dotPosition);
}
private static final String GetAfterDotString(String str) {
int dotPosition = str.indexOf('.');
if (dotPosition < 0)
return null;
return str.substring(dotPosition + 1);
}
/**
* Instantiates the sample.
*
* @param args
*/
public static void main(String args[]) {
// This sample uses JViews Maps features. When deploying an
// application that includes this code, you need to be in possession
// of a Rogue Wave JViews Maps Deployment license.
IlvProductUtil.DeploymentLicenseRequired(IlvProductUtil.JViews_Maps_Deployment);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
Override
public void run() {
final SdoSample demo = new SdoSample();
demo.addWindowListener(new WindowAdapter() {
Override
public void windowClosing(WindowEvent e) {
demo.exitSample();
}
});
demo.setVisible(true);
}
});
}
Override
public void handle(Exception e) throws Exception {
reportError(e);
}
}