/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2007-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.caching.grid.featurecache; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import org.geotools.caching.featurecache.FeatureCacheException; import org.geotools.caching.grid.spatialindex.store.MemoryStorage; import org.geotools.data.memory.MemoryDataStore; import org.geotools.feature.FeatureCollection; import com.vividsolutions.jts.geom.Envelope; public class DemoApp extends JFrame { MemoryDataStore ds; GridFeatureCache cache; volatile boolean task_wait = true; JPanel jContentPane = null; JPanel statsPanel = null; JPanel graphPanel = null; CacheDisplayPanel panel = null; JButton runQueryButton = null; JButton pauseButton = null; JLabel lblNumData = null; JLabel lblNumReads = null; JLabel lblNumWrites = null; JLabel lblNumEvictions = null; int threads = 0; DemoApp(long seed) { initDataStore(seed); initDataCache(); panel = new CacheDisplayPanel(cache); this.setContentPane(getJContentPane()); } void initDataStore(long seed) { ds = new MemoryDataStore(); FeatureCollection fc = DataUtilities.createUnitsquareDataSet(500, seed); ds.addFeatures(fc); } void initDataCache() { try { cache = new GridFeatureCache(ds.getFeatureSource(ds.getTypeNames()[0]), 100, 100, MemoryStorage.createInstance()); } catch (FeatureCacheException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); GridBagLayout bag = new GridBagLayout(); jContentPane.setLayout(bag); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; bag.setConstraints(getStatsPanel(), c); jContentPane.add(getStatsPanel()); c.weightx = 1.0; c.weighty = 1.0; c.gridwidth = GridBagConstraints.REMAINDER; bag.setConstraints(panel, c); jContentPane.add(panel, c); c.weightx = 0; c.weighty = 0; bag.setConstraints(getGraphPanel(), c); jContentPane.add(getGraphPanel(), c); } return jContentPane; } JPanel getStatsPanel() { if (statsPanel == null) { statsPanel = new JPanel(); statsPanel.setLayout(new GridLayout(5, 2, 1, 1)); statsPanel.setSize(100, 400); statsPanel.add(new JLabel("Stats")); statsPanel.add(new JLabel("Panel")); statsPanel.add(new JLabel("Data = ")); lblNumData = new JLabel("0"); statsPanel.add(lblNumData); statsPanel.add(new JLabel("Reads = ")); lblNumReads = new JLabel("0"); statsPanel.add(lblNumReads); statsPanel.add(new JLabel("Writes = ")); lblNumWrites = new JLabel("0"); statsPanel.add(lblNumWrites); lblNumEvictions = new JLabel("0"); statsPanel.add(new JLabel("Evictions = ")); statsPanel.add(lblNumEvictions); } return statsPanel; } JButton getRunQueryButton() { if (runQueryButton == null) { runQueryButton = new JButton("New thread"); runQueryButton.addMouseListener(new MouseListener() { public void mouseClicked(MouseEvent ev) { Runnable task = new Runnable() { public void run() { runQueries(); } }; new Thread(task, new Integer(++threads).toString()).start(); } public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } public void mousePressed(MouseEvent arg0) { // TODO Auto-generated method stub } public void mouseReleased(MouseEvent arg0) { // TODO Auto-generated method stub } }); } return runQueryButton; } JButton getPauseButton() { if (pauseButton == null) { pauseButton = new JButton("Start"); pauseButton.addMouseListener(new MouseListener() { public void mouseClicked(MouseEvent e) { if (task_wait) { pauseButton.setText("Pause"); } else { pauseButton.setText("Resume"); } task_wait = !task_wait; } public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } public void mousePressed(MouseEvent arg0) { // TODO Auto-generated method stub } public void mouseReleased(MouseEvent arg0) { // TODO Auto-generated method stub } }); } return pauseButton; } JPanel getGraphPanel() { if (graphPanel == null) { graphPanel = new JPanel(); graphPanel.setSize(300, 100); graphPanel.add(new JLabel("GraphPanel")); graphPanel.add(getRunQueryButton()); graphPanel.add(getPauseButton()); } return graphPanel; } void runQueries() { JFrame frame = new JFrame("Thread " + Thread.currentThread().getName()); QueryDisplayPanel display = new QueryDisplayPanel(); frame.setContentPane(display); frame.setSize(200, 200); frame.setVisible(true); // cache.clear(); for (int j = 0; j < 10; j++) { for (int i = 0; i < 10; i++) { try { while (task_wait) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } //System.out.print("i = " + i + ", j = " + j); Envelope query = new Envelope(i * .1, (i + 1) * .1, j * .1, (j + 1) * .1); display.setResult(cache.get(query)); lblNumData.setText(new Long(cache.tracker.getStatistics().getNumberOfData()) .toString()); lblNumReads.setText(new Long(cache.tracker.getStatistics().getReads()).toString()); lblNumWrites.setText(new Long(cache.tracker.getStatistics().getWrites()) .toString()); lblNumEvictions.setText(new Integer(cache.tracker.getEvictions()).toString()); panel.setCurrentQuery(Thread.currentThread().getName(), query); panel.repaint(); Object waiter = new Object(); synchronized (waiter) { try { waiter.wait(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } frame.setVisible(false); frame.dispose(); panel.removeWorker(Thread.currentThread().getName()); panel.repaint(); } public static void main(String[] args) { long seed = 1025; if (args.length < 1) { System.out.println("Usage: DemoApp seed"); System.out.println("Using default for seed value : " + seed); } else { try { seed = Long.parseLong(args[0]); } catch (Exception e) { throw new IllegalArgumentException( "Error : seed argument must be numeric ; input was : " + args[0]); } } DemoApp thisClass = new DemoApp(seed); thisClass.setSize(600, 400); thisClass.setTitle("Google SoC : Feature Cache Demo Application"); thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); thisClass.setVisible(true); thisClass.runQueries(); } }