| OracleDatastoreViewer |

    1   /*
    2    *  Copyright (c) 1998-2001, The University of Sheffield.
    3    *
    4    *  This file is part of GATE (see http://gate.ac.uk/), and is free
    5    *  software, licenced under the GNU Library General Public License,
    6    *  Version 2, June 1991 (in the distribution as file licence.html,
    7    *  and also available at http://gate.ac.uk/gate/licence.html).
    8    *
    9    *  Kalina Bontcheva (based on code from Valentin Tablan) 31/10/2001
    10   *
    11   *  $Id: OracleDatastoreViewer.java,v 1.5 2001/11/13 17:12:49 marin Exp $
    12   *
    13   */
    14  package gate.gui;
    15
    16  import gate.*;
    17  import gate.creole.*;
    18  import gate.util.*;
    19  import gate.persist.*;
    20
    21  import javax.swing.*;
    22  import java.awt.event.*;
    23  import javax.swing.tree.*;
    24
    25  import java.util.*;
    26  import java.text.NumberFormat;
    27
    28  import gate.event.*;
    29  import java.beans.*;
    30
    31  public class OracleDatastoreViewer extends JTree
    32                                     implements VisualResource,
    33                                                DatastoreListener {
    34
    35    public OracleDatastoreViewer() {
    36    }
    37
    38
    39    public void cleanup(){
    40    }
    41
    42    /** Accessor for features. */
    43    public FeatureMap getFeatures(){
    44      return features;
    45    }//getFeatures()
    46
    47    /** Mutator for features*/
    48    public void setFeatures(FeatureMap features){
    49      this.features = features;
    50    }// setFeatures()
    51
    52    //Parameters utility methods
    53    /**
    54     * Gets the value of a parameter of this resource.
    55     * @param paramaterName the name of the parameter
    56     * @return the current value of the parameter
    57     */
    58    public Object getParameterValue(String paramaterName)
    59                  throws ResourceInstantiationException{
    60      return AbstractResource.getParameterValue(this, paramaterName);
    61    }
    62
    63    /**
    64     * Sets the value for a specified parameter.
    65     *
    66     * @param paramaterName the name for the parameteer
    67     * @param parameterValue the value the parameter will receive
    68     */
    69    public void setParameterValue(String paramaterName, Object parameterValue)
    70                throws ResourceInstantiationException{
    71      // get the beaninfo for the resource bean, excluding data about Object
    72      BeanInfo resBeanInf = null;
    73      try {
    74        resBeanInf = Introspector.getBeanInfo(this.getClass(), Object.class);
    75      } catch(Exception e) {
    76        throw new ResourceInstantiationException(
    77          "Couldn't get bean info for resource " + this.getClass().getName()
    78          + Strings.getNl() + "Introspector exception was: " + e
    79        );
    80      }
    81      AbstractResource.setParameterValue(this, resBeanInf, paramaterName, parameterValue);
    82    }
    83
    84    /**
    85     * Sets the values for more parameters in one step.
    86     *
    87     * @param parameters a feature map that has paramete names as keys and
    88     * parameter values as values.
    89     */
    90    public void setParameterValues(FeatureMap parameters)
    91                throws ResourceInstantiationException{
    92      AbstractResource.setParameterValues(this, parameters);
    93    }
    94
    95    /** Initialise this resource, and return it. */
    96    public Resource init() throws ResourceInstantiationException {
    97      return this;
    98    }//init()
    99
    100   public void clear(){
    101   }
    102
    103   public void setTarget(Object target){
    104     if(target instanceof DataStore){
    105       datastore = (DataStore)target;
    106       initLocalData();
    107       initGuiComponents();
    108       initListeners();
    109     }else{
    110       throw new IllegalArgumentException(
    111         "SerialDatastoreViewers can only be used with GATE serial datastores!\n" +
    112         target.getClass().toString() + " is not a GATE serial datastore!");
    113     }
    114   }
    115
    116
    117   public void setHandle(Handle handle){
    118     if(handle instanceof NameBearerHandle){
    119       myHandle = (NameBearerHandle)handle;
    120     }
    121   }
    122
    123   protected void fireProgressChanged(int e) {
    124     myHandle.fireProgressChanged(e);
    125   }//protected void fireProgressChanged(int e)
    126
    127   protected void fireProcessFinished() {
    128     myHandle.fireProcessFinished();
    129   }//protected void fireProcessFinished()
    130
    131   protected void fireStatusChanged(String e) {
    132     myHandle.fireStatusChanged(e);
    133   }
    134
    135   protected void initLocalData(){
    136   }
    137
    138   protected void initGuiComponents(){
    139     treeRoot = new DefaultMutableTreeNode(
    140                  datastore.getName(), true);
    141     treeModel = new DefaultTreeModel(treeRoot, true);
    142     setModel(treeModel);
    143     setExpandsSelectedPaths(true);
    144     expandPath(new TreePath(treeRoot));
    145     try {
    146       Iterator lrTypesIter = datastore.getLrTypes().iterator();
    147       CreoleRegister cReg = Gate.getCreoleRegister();
    148       while(lrTypesIter.hasNext()){
    149         String type = (String)lrTypesIter.next();
    150         ResourceData rData = (ResourceData)cReg.get(type);
    151         DefaultMutableTreeNode node = new DefaultMutableTreeNode(
    152                                                               rData.getName());
    153         treeModel.insertNodeInto(node, treeRoot, treeRoot.getChildCount());
    154         expandPath(new TreePath(new Object[]{treeRoot, node}));
    155         Iterator lrIDsIter = datastore.getLrIds(type).iterator();
    156         while(lrIDsIter.hasNext()){
    157           Object id = (Object)lrIDsIter.next();
    158           DSEntry entry = new DSEntry(datastore.getLrName(id), id, type);
    159           DefaultMutableTreeNode lrNode =
    160             new DefaultMutableTreeNode(entry, false);
    161           treeModel.insertNodeInto(lrNode, node, node.getChildCount());
    162           node.add(lrNode);
    163         }
    164       }
    165     } catch(PersistenceException pe) {
    166       throw new GateRuntimeException(pe.toString());
    167     }
    168
    169   }//protected void initGuiComponents()
    170
    171   protected void initListeners(){
    172     datastore.addDatastoreListener(this);
    173     addMouseListener(new MouseAdapter() {
    174       public void mouseClicked(MouseEvent e) {
    175         //where inside the tree?
    176         TreePath path = getPathForLocation(e.getX(), e.getY());
    177         Object value = null;
    178         if(path != null) value = ((DefaultMutableTreeNode)
    179                                   path.getLastPathComponent()).getUserObject();
    180
    181         if(SwingUtilities.isRightMouseButton(e)){
    182           //right click
    183           if(value != null && value instanceof DSEntry){
    184             JPopupMenu popup = ((DSEntry)value).getPopup();
    185             popup.show(OracleDatastoreViewer.this, e.getX(), e.getY());
    186           }
    187         }else if(SwingUtilities.isLeftMouseButton(e) &&
    188                  e.getClickCount() == 2){
    189           //double click -> just load the resource
    190           if(value != null && value instanceof DSEntry){
    191             new LoadAction((DSEntry)value).actionPerformed(null);
    192           }
    193         }
    194       }//public void mouseClicked(MouseEvent e)
    195     });
    196   }//protected void initListeners()
    197
    198
    199   class LoadAction extends AbstractAction {
    200     LoadAction(DSEntry entry){
    201       super("Load");
    202       this.entry = entry;
    203     }
    204
    205     public void actionPerformed(ActionEvent e){
    206       Runnable runnable = new Runnable(){
    207         public void run(){
    208           try{
    209             long start = System.currentTimeMillis();
    210             fireStatusChanged("Loading " + entry.name);
    211             fireProgressChanged(0);
    212             FeatureMap params = Factory.newFeatureMap();
    213             params.put(DataStore.DATASTORE_FEATURE_NAME, datastore);
    214             params.put(DataStore.LR_ID_FEATURE_NAME, entry.id);
    215             FeatureMap features = Factory.newFeatureMap();
    216             Resource res = Factory.createResource(entry.type, params, features,
    217                                                   entry.name);
    218             //project.frame.resourcesTreeModel.treeChanged();
    219             fireProgressChanged(0);
    220             fireProcessFinished();
    221             long end = System.currentTimeMillis();
    222             fireStatusChanged(entry.name + " loaded in " +
    223                               NumberFormat.getInstance().format(
    224                               (double)(end - start) / 1000) + " seconds");
    225           } catch(ResourceInstantiationException rie){
    226             JOptionPane.showMessageDialog(OracleDatastoreViewer.this,
    227                                           "Error!\n" + rie.toString(),
    228                                           "Gate", JOptionPane.ERROR_MESSAGE);
    229             rie.printStackTrace(Err.getPrintWriter());
    230             fireProgressChanged(0);
    231             fireProcessFinished();
    232           }
    233         }
    234       };//runnable
    235       Thread thread = new Thread(Thread.currentThread().getThreadGroup(),
    236                                  runnable,
    237                                  "Loader from DS");
    238       thread.setPriority(Thread.MIN_PRIORITY);
    239       thread.start();
    240     }// public void actionPerformed(ActionEvent e)
    241     DSEntry entry;
    242   }//class LoadAction extends AbstractAction
    243
    244   class DeleteAction extends AbstractAction {
    245     DeleteAction(DSEntry entry){
    246       super("Delete");
    247       this.entry = entry;
    248     }
    249
    250     public void actionPerformed(ActionEvent e){
    251       try{
    252         datastore.delete(entry.type, entry.id);
    253         //project.frame.resourcesTreeModel.treeChanged();
    254       }catch(gate.persist.PersistenceException pe){
    255         JOptionPane.showMessageDialog(OracleDatastoreViewer.this,
    256                                       "Error!\n" + pe.toString(),
    257                                       "Gate", JOptionPane.ERROR_MESSAGE);
    258         pe.printStackTrace(Err.getPrintWriter());
    259       }catch(gate.security.SecurityException se){
    260         JOptionPane.showMessageDialog(OracleDatastoreViewer.this,
    261                                       "Error!\n" + se.toString(),
    262                                       "Gate", JOptionPane.ERROR_MESSAGE);
    263         se.printStackTrace(Err.getPrintWriter());
    264       }
    265     }// public void actionPerformed(ActionEvent e)
    266     DSEntry entry;
    267   }// class DeleteAction
    268
    269
    270   class DSEntry {
    271     DSEntry(String name, Object id, String type){
    272       this.name = name;
    273       this.type = type;
    274       this.id = id;
    275       popup = new JPopupMenu();
    276       popup.add(new LoadAction(this));
    277       popup.add(new DeleteAction(this));
    278     }// DSEntry
    279
    280     public String toString(){
    281       return name;
    282     }
    283
    284     public JPopupMenu getPopup(){
    285       return popup;
    286     }
    287
    288     String name;
    289     String type;
    290     Object id;
    291     JPopupMenu popup;
    292   }// class DSEntry
    293
    294   DefaultMutableTreeNode treeRoot;
    295   DefaultTreeModel treeModel;
    296   DataStore datastore;
    297   NameBearerHandle myHandle;
    298   protected FeatureMap features;
    299
    300   private transient Vector progressListeners;
    301   private transient Vector statusListeners;
    302   public void resourceAdopted(DatastoreEvent e) {
    303     //do nothing; SerialDataStore does actually nothing on adopt()
    304     //we'll have to listen for RESOURE_WROTE events
    305   }
    306
    307   public void resourceDeleted(DatastoreEvent e) {
    308     Object resID = e.getResourceID();
    309     DefaultMutableTreeNode node = null;
    310     Enumeration nodesEnum = treeRoot.depthFirstEnumeration();
    311     boolean found = false;
    312     while(nodesEnum.hasMoreElements() && !found){
    313       node = (DefaultMutableTreeNode)nodesEnum.nextElement();
    314       Object userObject = node.getUserObject();
    315       found = userObject instanceof DSEntry &&
    316               ((DSEntry)userObject).id.equals(resID);
    317     }
    318     if(found){
    319       DefaultMutableTreeNode parent = (DefaultMutableTreeNode)node.getParent();
    320       treeModel.removeNodeFromParent(node);
    321       if(parent.getChildCount() == 0) treeModel.removeNodeFromParent(parent);
    322     }
    323   }
    324
    325   public void resourceWritten(DatastoreEvent e) {
    326     Resource res = e.getResource();
    327     Object resID = e.getResourceID();
    328     String resType = ((ResourceData)Gate.getCreoleRegister().
    329                       get(res.getClass().getName())).getName();
    330     DefaultMutableTreeNode parent = treeRoot;
    331     DefaultMutableTreeNode node = null;
    332     //first look for the type node
    333     Enumeration childrenEnum = parent.children();
    334     boolean found = false;
    335     while(childrenEnum.hasMoreElements() && !found){
    336       node = (DefaultMutableTreeNode)childrenEnum.nextElement();
    337       found = node.getUserObject().equals(resType);
    338     }
    339     if(!found){
    340       //exhausted the children without finding the node -> new type
    341       node = new DefaultMutableTreeNode(resType);
    342       treeModel.insertNodeInto(node, parent, parent.getChildCount());
    343     }
    344     expandPath(new TreePath(new Object[]{parent, node}));
    345
    346     //now look for the resource node
    347     parent = node;
    348     childrenEnum = parent.children();
    349     found = false;
    350     while(childrenEnum.hasMoreElements() && !found){
    351       node = (DefaultMutableTreeNode)childrenEnum.nextElement();
    352       found = ((DSEntry)node.getUserObject()).id.equals(resID);
    353     }
    354     if(!found){
    355       //exhausted the children without finding the node -> new resource
    356       try{
    357         DSEntry entry = new DSEntry(datastore.getLrName(resID), resID,
    358                                     res.getClass().getName());
    359         node = new DefaultMutableTreeNode(entry, false);
    360         treeModel.insertNodeInto(node, parent, parent.getChildCount());
    361       }catch(PersistenceException pe){
    362         pe.printStackTrace(Err.getPrintWriter());
    363       }
    364     }
    365   }//public void resourceWritten(DatastoreEvent e)
    366
    367 }//public class DSHandle

| OracleDatastoreViewer |