You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ph...@apache.org on 2010/03/09 02:06:17 UTC
svn commit: r920604 [3/3] - in /hadoop/zookeeper/trunk: ./
src/contrib/zooinspector/ src/contrib/zooinspector/config/
src/contrib/zooinspector/icons/ src/contrib/zooinspector/lib/
src/contrib/zooinspector/licences/ src/contrib/zooinspector/src/ src/con...
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/NodeViewerMetaData.java Tue Mar 9 01:06:15 2010
@@ -0,0 +1,186 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.zookeeper.inspector.gui.nodeviewer;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+import javax.swing.SwingWorker;
+
+import org.apache.zookeeper.data.Stat;
+import org.apache.zookeeper.inspector.logger.LoggerFactory;
+import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager;
+
+/**
+ * A node viewer for displaying the meta data for the currently selected node.
+ * The meta data is essentially the information from the {@link Stat} for the
+ * node
+ */
+public class NodeViewerMetaData extends ZooInspectorNodeViewer {
+ private ZooInspectorNodeManager zooInspectorManager;
+ private final JPanel metaDataPanel;
+ private String selectedNode;
+
+ /**
+ *
+ */
+ public NodeViewerMetaData() {
+ this.setLayout(new BorderLayout());
+ this.metaDataPanel = new JPanel();
+ this.metaDataPanel.setBackground(Color.WHITE);
+ JScrollPane scroller = new JScrollPane(this.metaDataPanel);
+ this.add(scroller, BorderLayout.CENTER);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer#
+ * getTitle()
+ */
+ @Override
+ public String getTitle() {
+ return "Node Metadata";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer#
+ * nodeSelectionChanged(java.util.Set)
+ */
+ @Override
+ public void nodeSelectionChanged(List<String> selectedNodes) {
+ this.metaDataPanel.removeAll();
+ if (selectedNodes.size() > 0) {
+ this.selectedNode = selectedNodes.get(0);
+ SwingWorker<Map<String, String>, Void> worker = new SwingWorker<Map<String, String>, Void>() {
+
+ @Override
+ protected Map<String, String> doInBackground() throws Exception {
+ return NodeViewerMetaData.this.zooInspectorManager
+ .getNodeMeta(NodeViewerMetaData.this.selectedNode);
+ }
+
+ @Override
+ protected void done() {
+ Map<String, String> data = null;
+ try {
+ data = get();
+ } catch (InterruptedException e) {
+ data = new HashMap<String, String>();
+ LoggerFactory.getLogger().error(
+ "Error retrieving meta data for node: "
+ + NodeViewerMetaData.this.selectedNode,
+ e);
+ } catch (ExecutionException e) {
+ data = new HashMap<String, String>();
+ LoggerFactory.getLogger().error(
+ "Error retrieving meta data for node: "
+ + NodeViewerMetaData.this.selectedNode,
+ e);
+ }
+ NodeViewerMetaData.this.metaDataPanel
+ .setLayout(new GridBagLayout());
+ JPanel infoPanel = new JPanel();
+ infoPanel.setBackground(Color.WHITE);
+ infoPanel.setLayout(new GridBagLayout());
+ int i = 0;
+ int rowPos = 0;
+ for (Map.Entry<String, String> entry : data.entrySet()) {
+ rowPos = 2 * i + 1;
+ JLabel label = new JLabel(entry.getKey());
+ JTextField text = new JTextField(entry.getValue());
+ text.setEditable(false);
+ GridBagConstraints c1 = new GridBagConstraints();
+ c1.gridx = 0;
+ c1.gridy = rowPos;
+ c1.gridwidth = 1;
+ c1.gridheight = 1;
+ c1.weightx = 0;
+ c1.weighty = 0;
+ c1.anchor = GridBagConstraints.WEST;
+ c1.fill = GridBagConstraints.HORIZONTAL;
+ c1.insets = new Insets(5, 5, 5, 5);
+ c1.ipadx = 0;
+ c1.ipady = 0;
+ infoPanel.add(label, c1);
+ GridBagConstraints c2 = new GridBagConstraints();
+ c2.gridx = 2;
+ c2.gridy = rowPos;
+ c2.gridwidth = 1;
+ c2.gridheight = 1;
+ c2.weightx = 0;
+ c2.weighty = 0;
+ c2.anchor = GridBagConstraints.WEST;
+ c2.fill = GridBagConstraints.HORIZONTAL;
+ c2.insets = new Insets(5, 5, 5, 5);
+ c2.ipadx = 0;
+ c2.ipady = 0;
+ infoPanel.add(text, c2);
+ i++;
+ }
+ GridBagConstraints c = new GridBagConstraints();
+ c.gridx = 1;
+ c.gridy = rowPos;
+ c.gridwidth = 1;
+ c.gridheight = 1;
+ c.weightx = 1;
+ c.weighty = 1;
+ c.anchor = GridBagConstraints.NORTHWEST;
+ c.fill = GridBagConstraints.NONE;
+ c.insets = new Insets(5, 5, 5, 5);
+ c.ipadx = 0;
+ c.ipady = 0;
+ NodeViewerMetaData.this.metaDataPanel.add(infoPanel, c);
+ NodeViewerMetaData.this.metaDataPanel.revalidate();
+ NodeViewerMetaData.this.metaDataPanel.repaint();
+ }
+ };
+ worker.execute();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.zookeeper.inspector.gui.nodeviewer.ZooInspectorNodeViewer#
+ * setZooInspectorManager
+ * (org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager)
+ */
+ @Override
+ public void setZooInspectorManager(
+ ZooInspectorNodeManager zooInspectorManager) {
+ this.zooInspectorManager = zooInspectorManager;
+ }
+
+}
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/gui/nodeviewer/ZooInspectorNodeViewer.java Tue Mar 9 01:06:15 2010
@@ -0,0 +1,138 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.zookeeper.inspector.gui.nodeviewer;
+
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.IOException;
+import java.util.List;
+
+import javax.swing.JPanel;
+
+import org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager;
+
+/**
+ * A {@link JPanel} for displaying information about the currently selected
+ * node(s)
+ */
+public abstract class ZooInspectorNodeViewer extends JPanel implements
+ Transferable {
+ /**
+ * The {@link DataFlavor} used for DnD in the node viewer configuration
+ * dialog
+ */
+ public static final DataFlavor nodeViewerDataFlavor = new DataFlavor(
+ ZooInspectorNodeViewer.class, "nodeviewer");
+
+ /**
+ * @param zooInspectorManager
+ */
+ public abstract void setZooInspectorManager(
+ ZooInspectorNodeManager zooInspectorManager);
+
+ /**
+ * Called whenever the selected nodes in the tree view changes.
+ *
+ * @param selectedNodes
+ * - the nodes currently selected in the tree view
+ *
+ */
+ public abstract void nodeSelectionChanged(List<String> selectedNodes);
+
+ /**
+ * @return the title of the node viewer. this will be shown on the tab for
+ * this node viewer.
+ */
+ public abstract String getTitle();
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * java.awt.datatransfer.Transferable#getTransferData(java.awt.datatransfer
+ * .DataFlavor)
+ */
+ public Object getTransferData(DataFlavor flavor)
+ throws UnsupportedFlavorException, IOException {
+ if (flavor.equals(nodeViewerDataFlavor)) {
+ return this.getClass().getCanonicalName();
+ } else {
+ return null;
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.awt.datatransfer.Transferable#getTransferDataFlavors()
+ */
+ public DataFlavor[] getTransferDataFlavors() {
+ return new DataFlavor[] { nodeViewerDataFlavor };
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seejava.awt.datatransfer.Transferable#isDataFlavorSupported(java.awt.
+ * datatransfer.DataFlavor)
+ */
+ public boolean isDataFlavorSupported(DataFlavor flavor) {
+ return flavor.equals(nodeViewerDataFlavor);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result
+ + ((getTitle() == null) ? 0 : getTitle().hashCode());
+ return result;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ZooInspectorNodeViewer other = (ZooInspectorNodeViewer) obj;
+ if (getClass().getCanonicalName() != other.getClass()
+ .getCanonicalName()) {
+ return false;
+ }
+ if (getTitle() == null) {
+ if (other.getTitle() != null)
+ return false;
+ } else if (!getTitle().equals(other.getTitle()))
+ return false;
+ return true;
+ }
+}
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/logger/LoggerFactory.java Tue Mar 9 01:06:15 2010
@@ -0,0 +1,38 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.zookeeper.inspector.logger;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Provides a {@link Logger} for use across the entire application
+ *
+ */
+public class LoggerFactory
+{
+ private static final Logger logger = Logger.getLogger("org.apache.zookeeper.inspector"); //$NON-NLS-1$
+
+ /**
+ * @return {@link Logger} for ZooInspector
+ */
+ public static Logger getLogger()
+ {
+ return logger;
+ }
+
+}
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/NodeListener.java Tue Mar 9 01:06:15 2010
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.zookeeper.inspector.manager;
+
+import java.util.Map;
+
+/**
+ * A Listener for Events on zookeeper nodes
+ */
+public interface NodeListener {
+ /**
+ * @param nodePath
+ * - the path of the node
+ * @param eventType
+ * - the event type
+ * @param eventInfo
+ * - a {@link Map} containing any other information about this
+ * event
+ */
+ public void processEvent(String nodePath, String eventType,
+ Map<String, String> eventInfo);
+}
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/Pair.java Tue Mar 9 01:06:15 2010
@@ -0,0 +1,120 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.zookeeper.inspector.manager;
+
+/**
+ * A utility class for storing a pair of objects
+ *
+ * @param <K>
+ * @param <V>
+ */
+public class Pair<K, V> {
+ private K key;
+ private V value;
+
+ /**
+ * @param key
+ * @param value
+ */
+ public Pair(K key, V value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ /**
+ *
+ */
+ public Pair() {
+ // Do Nothing
+ }
+
+ /**
+ * @return key
+ */
+ public K getKey() {
+ return key;
+ }
+
+ /**
+ * @param key
+ */
+ public void setKey(K key) {
+ this.key = key;
+ }
+
+ /**
+ * @return value
+ */
+ public V getValue() {
+ return value;
+ }
+
+ /**
+ * @param value
+ */
+ public void setValue(V value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return "Pair [" + key + ", " + value + "]";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((key == null) ? 0 : key.hashCode());
+ result = prime * result + ((value == null) ? 0 : value.hashCode());
+ return result;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Pair<?, ?> other = (Pair<?, ?>) obj;
+ if (key == null) {
+ if (other.key != null)
+ return false;
+ } else if (!key.equals(other.key))
+ return false;
+ if (value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!value.equals(other.value))
+ return false;
+ return true;
+ }
+
+}
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManager.java Tue Mar 9 01:06:15 2010
@@ -0,0 +1,139 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.zookeeper.inspector.manager;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.swing.JComboBox;
+import javax.swing.JTextField;
+
+/**
+ * A Manager for all interactions between the application and the Zookeeper
+ * instance
+ */
+public interface ZooInspectorManager extends ZooInspectorNodeManager,
+ ZooInspectorNodeTreeManager {
+
+ /**
+ * @param connectionProps
+ * @return true if successfully connected
+ */
+ public boolean connect(Properties connectionProps);
+
+ /**
+ * @return true if successfully disconnected
+ */
+ public boolean disconnect();
+
+ /**
+ * @return a {@link Pair} containing the following:
+ * <ul>
+ * <li>a {@link Map} of property keys to list of possible values. If
+ * the list size is 1 the value is taken to be the default value for
+ * a {@link JTextField}. If the list size is greater than 1, the
+ * values are taken to be the possible options to show in a
+ * {@link JComboBox} with the first selected as default.</li>
+ * <li>a {@link Map} of property keys to the label to show on the UI
+ * </li>
+ * <ul>
+ *
+ */
+ public Pair<Map<String, List<String>>, Map<String, String>> getConnectionPropertiesTemplate();
+
+ /**
+ * @param selectedNodes
+ * - the nodes to add the watcher to
+ * @param nodeListener
+ * - the node listener for this watcher
+ */
+ public void addWatchers(Collection<String> selectedNodes,
+ NodeListener nodeListener);
+
+ /**
+ * @param selectedNodes
+ * - the nodes to remove the watchers from
+ */
+ public void removeWatchers(Collection<String> selectedNodes);
+
+ /**
+ * @param selectedFile
+ * - the file to load which contains the node viewers
+ * configuration
+ * @return nodeViewers - the class names of the node viewers from the
+ * configuration
+ * @throws IOException
+ * - if the configuration file cannot be loaded
+ */
+ public List<String> loadNodeViewersFile(File selectedFile)
+ throws IOException;
+
+ /**
+ * @param selectedFile
+ * - the file to save the configuration to
+ * @param nodeViewersClassNames
+ * - the class names of the node viewers
+ * @throws IOException
+ * - if the configuration file cannot be saved
+ */
+ public void saveNodeViewersFile(File selectedFile,
+ List<String> nodeViewersClassNames) throws IOException;
+
+ /**
+ * @param nodeViewersClassNames
+ * - the class names of the node viewers
+ * @throws IOException
+ * - if the default configuration file cannot be loaded
+ */
+ public void setDefaultNodeViewerConfiguration(
+ List<String> nodeViewersClassNames) throws IOException;
+
+ /**
+ * @return nodeViewers - the class names of the node viewers from the
+ * configuration
+ * @throws IOException
+ * - if the default configuration file cannot be loaded
+ */
+ List<String> getDefaultNodeViewerConfiguration() throws IOException;
+
+ /**
+ * @param connectionProps
+ * - the connection properties last used to connect to the
+ * zookeeeper instance
+ */
+ public void setLastConnectionProps(Properties connectionProps);
+
+ /**
+ * @return last connection Properties - the connection properties last used
+ * to connect to the zookeeeper instance
+ */
+ public Properties getLastConnectionProps();
+
+ /**
+ * @param props
+ * - the properties to use as the default connection settings
+ * @throws IOException
+ * - if the default configuration file cannot be saved
+ */
+ public void saveDefaultConnectionFile(Properties props) throws IOException;
+
+}
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManagerImpl.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManagerImpl.java?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManagerImpl.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManagerImpl.java Tue Mar 9 01:06:15 2010
@@ -0,0 +1,852 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.zookeeper.inspector.manager;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.WatchedEvent;
+import org.apache.zookeeper.Watcher;
+import org.apache.zookeeper.ZooKeeper;
+import org.apache.zookeeper.Watcher.Event.EventType;
+import org.apache.zookeeper.Watcher.Event.KeeperState;
+import org.apache.zookeeper.ZooDefs.Ids;
+import org.apache.zookeeper.ZooDefs.Perms;
+import org.apache.zookeeper.data.ACL;
+import org.apache.zookeeper.data.Stat;
+import org.apache.zookeeper.inspector.encryption.BasicDataEncryptionManager;
+import org.apache.zookeeper.inspector.encryption.DataEncryptionManager;
+import org.apache.zookeeper.inspector.logger.LoggerFactory;
+import org.apache.zookeeper.retry.ZooKeeperRetry;
+
+/**
+ * A default implementation of {@link ZooInspectorManager} for connecting to
+ * zookeeper instances
+ */
+public class ZooInspectorManagerImpl implements ZooInspectorManager {
+ private static final String A_VERSION = "ACL Version";
+ private static final String C_TIME = "Creation Time";
+ private static final String C_VERSION = "Children Version";
+ private static final String CZXID = "Creation ID";
+ private static final String DATA_LENGTH = "Data Length";
+ private static final String EPHEMERAL_OWNER = "Ephemeral Owner";
+ private static final String M_TIME = "Last Modified Time";
+ private static final String MZXID = "Modified ID";
+ private static final String NUM_CHILDREN = "Number of Children";
+ private static final String PZXID = "Node ID";
+ private static final String VERSION = "Data Version";
+ private static final String ACL_PERMS = "Permissions";
+ private static final String ACL_SCHEME = "Scheme";
+ private static final String ACL_ID = "Id";
+ private static final String SESSION_STATE = "Session State";
+ private static final String SESSION_ID = "Session ID";
+ /**
+ * The key used for the connect string in the connection properties file
+ */
+ public static final String CONNECT_STRING = "hosts";
+ /**
+ * The key used for the session timeout in the connection properties file
+ */
+ public static final String SESSION_TIMEOUT = "timeout";
+ /**
+ * The key used for the data encryption manager in the connection properties
+ * file
+ */
+ public static final String DATA_ENCRYPTION_MANAGER = "encryptionManager";
+
+ private static final File defaultNodeViewersFile = new File(
+ "./config/defaultNodeVeiwers.cfg");
+ private static final File defaultConnectionFile = new File(
+ "./config/defaultConnectionSettings.cfg");
+
+ private DataEncryptionManager encryptionManager;
+ private String connectString;
+ private int sessionTimeout;
+ private ZooKeeper zooKeeper;
+ private final Map<String, NodeWatcher> watchers = new HashMap<String, NodeWatcher>();
+ protected boolean connected = true;
+ private Properties lastConnectionProps;
+ private String defaultEncryptionManager;
+ private String defaultTimeout;
+ private String defaultHosts;
+
+ /**
+ * @throws IOException
+ * - thrown if the default connection settings cannot be loaded
+ *
+ */
+ public ZooInspectorManagerImpl() throws IOException {
+ loadDefaultConnectionFile();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.zookeeper.inspector.manager.ZooInspectorManager#connect(java
+ * .util.Properties)
+ */
+ public boolean connect(Properties connectionProps) {
+ try {
+ if (this.zooKeeper == null) {
+ String connectString = connectionProps
+ .getProperty(CONNECT_STRING);
+ String sessionTimeout = connectionProps
+ .getProperty(SESSION_TIMEOUT);
+ String encryptionManager = connectionProps
+ .getProperty(DATA_ENCRYPTION_MANAGER);
+ if (connectString == null || sessionTimeout == null) {
+ throw new IllegalArgumentException(
+ "Both connect string and session timeout are required.");
+ }
+ if (encryptionManager == null) {
+ this.encryptionManager = new BasicDataEncryptionManager();
+ } else {
+ Class<?> clazz = Class.forName(encryptionManager);
+
+ if (Arrays.asList(clazz.getInterfaces()).contains(
+ DataEncryptionManager.class)) {
+ this.encryptionManager = (DataEncryptionManager) Class
+ .forName(encryptionManager).newInstance();
+ } else {
+ throw new IllegalArgumentException(
+ "Data encryption manager must implement DataEncryptionManager interface");
+ }
+ }
+ this.connectString = connectString;
+ this.sessionTimeout = Integer.valueOf(sessionTimeout);
+ this.zooKeeper = new ZooKeeperRetry(connectString, Integer
+ .valueOf(sessionTimeout), new Watcher() {
+
+ public void process(WatchedEvent event) {
+ if (event.getState() == KeeperState.Expired) {
+ connected = false;
+ }
+ }
+ });
+ ((ZooKeeperRetry) this.zooKeeper).setRetryLimit(10);
+ connected = ((ZooKeeperRetry) this.zooKeeper).testConnection();
+ return connected;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ connected = false;
+ return connected;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.zookeeper.inspector.manager.ZooInspectorManager#disconnect()
+ */
+ public boolean disconnect() {
+ try {
+ if (this.zooKeeper != null) {
+ this.zooKeeper.close();
+ this.zooKeeper = null;
+ connected = false;
+ removeWatchers(this.watchers.keySet());
+ return true;
+ }
+ } catch (Exception e) {
+ LoggerFactory.getLogger().error(
+ "Error occurred while disconnecting from ZooKeeper server",
+ e);
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorReadOnlyManager#
+ * getChildren(java.lang.String)
+ */
+ public List<String> getChildren(String nodePath) {
+ if (connected) {
+ try {
+
+ return zooKeeper.getChildren(nodePath, false);
+ } catch (Exception e) {
+ LoggerFactory.getLogger().error(
+ "Error occurred retrieving children of node: "
+ + nodePath, e);
+ }
+ }
+ return null;
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.zookeeper.inspector.manager.ZooInspectorReadOnlyManager#getData
+ * (java.lang.String)
+ */
+ public String getData(String nodePath) {
+ if (connected) {
+ try {
+ if (nodePath.length() == 0) {
+ nodePath = "/";
+ }
+ Stat s = zooKeeper.exists(nodePath, false);
+ if (s != null) {
+ return this.encryptionManager.decryptData(zooKeeper
+ .getData(nodePath, false, s));
+ }
+ } catch (Exception e) {
+ LoggerFactory.getLogger().error(
+ "Error occurred getting data for node: " + nodePath, e);
+ }
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorReadOnlyManager#
+ * getNodeChild(java.lang.String, int)
+ */
+ public String getNodeChild(String nodePath, int childIndex) {
+ if (connected) {
+ try {
+ Stat s = zooKeeper.exists(nodePath, false);
+ if (s != null) {
+ return this.zooKeeper.getChildren(nodePath, false).get(
+ childIndex);
+ }
+ } catch (Exception e) {
+ LoggerFactory.getLogger().error(
+ "Error occurred retrieving child " + childIndex
+ + " of node: " + nodePath, e);
+ }
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorReadOnlyManager#
+ * getNodeIndex(java.lang.String)
+ */
+ public int getNodeIndex(String nodePath) {
+ if (connected) {
+ int index = nodePath.lastIndexOf("/");
+ if (index == -1
+ || (!nodePath.equals("/") && nodePath.charAt(nodePath
+ .length() - 1) == '/')) {
+ throw new IllegalArgumentException("Invalid node path: "
+ + nodePath);
+ }
+ String parentPath = nodePath.substring(0, index);
+ String child = nodePath.substring(index + 1);
+ if (parentPath != null && parentPath.length() > 0) {
+ List<String> children = this.getChildren(parentPath);
+ if (children != null) {
+ return children.indexOf(child);
+ }
+ }
+ }
+ return -1;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.zookeeper.inspector.manager.ZooInspectorReadOnlyManager#getACLs
+ * (java.lang.String)
+ */
+ public List<Map<String, String>> getACLs(String nodePath) {
+ List<Map<String, String>> returnACLs = new ArrayList<Map<String, String>>();
+ if (connected) {
+ try {
+ if (nodePath.length() == 0) {
+ nodePath = "/";
+ }
+ Stat s = zooKeeper.exists(nodePath, false);
+ if (s != null) {
+ List<ACL> acls = zooKeeper.getACL(nodePath, s);
+ for (ACL acl : acls) {
+ Map<String, String> aclMap = new LinkedHashMap<String, String>();
+ aclMap.put(ACL_SCHEME, acl.getId().getScheme());
+ aclMap.put(ACL_ID, acl.getId().getId());
+ StringBuilder sb = new StringBuilder();
+ int perms = acl.getPerms();
+ boolean addedPerm = false;
+ if ((perms & Perms.READ) == Perms.READ) {
+ sb.append("Read");
+ addedPerm = true;
+ }
+ if (addedPerm) {
+ sb.append(", ");
+ }
+ if ((perms & Perms.WRITE) == Perms.WRITE) {
+ sb.append("Write");
+ addedPerm = true;
+ }
+ if (addedPerm) {
+ sb.append(", ");
+ }
+ if ((perms & Perms.CREATE) == Perms.CREATE) {
+ sb.append("Create");
+ addedPerm = true;
+ }
+ if (addedPerm) {
+ sb.append(", ");
+ }
+ if ((perms & Perms.DELETE) == Perms.DELETE) {
+ sb.append("Delete");
+ addedPerm = true;
+ }
+ if (addedPerm) {
+ sb.append(", ");
+ }
+ if ((perms & Perms.ADMIN) == Perms.ADMIN) {
+ sb.append("Admin");
+ addedPerm = true;
+ }
+ aclMap.put(ACL_PERMS, sb.toString());
+ returnACLs.add(aclMap);
+ }
+ }
+ } catch (InterruptedException e) {
+ LoggerFactory.getLogger().error(
+ "Error occurred retrieving ACLs of node: " + nodePath,
+ e);
+ } catch (KeeperException e) {
+ LoggerFactory.getLogger().error(
+ "Error occurred retrieving ACLs of node: " + nodePath,
+ e);
+ }
+ }
+ return returnACLs;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorReadOnlyManager#
+ * getNodeMeta(java.lang.String)
+ */
+ public Map<String, String> getNodeMeta(String nodePath) {
+ Map<String, String> nodeMeta = new LinkedHashMap<String, String>();
+ if (connected) {
+ try {
+ if (nodePath.length() == 0) {
+ nodePath = "/";
+ }
+ Stat s = zooKeeper.exists(nodePath, false);
+ if (s != null) {
+ nodeMeta.put(A_VERSION, String.valueOf(s.getAversion()));
+ nodeMeta.put(C_TIME, String.valueOf(s.getCtime()));
+ nodeMeta.put(C_VERSION, String.valueOf(s.getCversion()));
+ nodeMeta.put(CZXID, String.valueOf(s.getCzxid()));
+ nodeMeta
+ .put(DATA_LENGTH, String.valueOf(s.getDataLength()));
+ nodeMeta.put(EPHEMERAL_OWNER, String.valueOf(s
+ .getEphemeralOwner()));
+ nodeMeta.put(M_TIME, String.valueOf(s.getMtime()));
+ nodeMeta.put(MZXID, String.valueOf(s.getMzxid()));
+ nodeMeta.put(NUM_CHILDREN, String.valueOf(s
+ .getNumChildren()));
+ nodeMeta.put(PZXID, String.valueOf(s.getPzxid()));
+ nodeMeta.put(VERSION, String.valueOf(s.getVersion()));
+ }
+ } catch (Exception e) {
+ LoggerFactory.getLogger().error(
+ "Error occurred retrieving meta data for node: "
+ + nodePath, e);
+ }
+ }
+ return nodeMeta;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorReadOnlyManager#
+ * getNumChildren(java.lang.String)
+ */
+ public int getNumChildren(String nodePath) {
+ if (connected) {
+ try {
+ Stat s = zooKeeper.exists(nodePath, false);
+ if (s != null) {
+ return s.getNumChildren();
+ }
+ } catch (Exception e) {
+ LoggerFactory.getLogger().error(
+ "Error occurred getting the number of children of node: "
+ + nodePath, e);
+ }
+ }
+ return -1;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorReadOnlyManager#
+ * hasChildren(java.lang.String)
+ */
+ public boolean hasChildren(String nodePath) {
+ return getNumChildren(nodePath) > 0;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorReadOnlyManager#
+ * isAllowsChildren(java.lang.String)
+ */
+ public boolean isAllowsChildren(String nodePath) {
+ if (connected) {
+ try {
+ Stat s = zooKeeper.exists(nodePath, false);
+ if (s != null) {
+ return s.getEphemeralOwner() == 0;
+ }
+ } catch (Exception e) {
+ LoggerFactory.getLogger().error(
+ "Error occurred determining whether node is allowed children: "
+ + nodePath, e);
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorReadOnlyManager#
+ * getSessionMeta()
+ */
+ public Map<String, String> getSessionMeta() {
+ Map<String, String> sessionMeta = new LinkedHashMap<String, String>();
+ try {
+ if (zooKeeper != null) {
+
+ sessionMeta.put(SESSION_ID, String.valueOf(zooKeeper
+ .getSessionId()));
+ sessionMeta.put(SESSION_STATE, String.valueOf(zooKeeper
+ .getState().toString()));
+ sessionMeta.put(CONNECT_STRING, this.connectString);
+ sessionMeta.put(SESSION_TIMEOUT, String
+ .valueOf(this.sessionTimeout));
+ }
+ } catch (Exception e) {
+ LoggerFactory.getLogger().error(
+ "Error occurred retrieving session meta data.", e);
+ }
+ return sessionMeta;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.zookeeper.inspector.manager.ZooInspectorNodeTreeManager#createNode
+ * (java.lang.String, java.lang.String)
+ */
+ public boolean createNode(String parent, String nodeName) {
+ if (connected) {
+ try {
+ String[] nodeElements = nodeName.split("/");
+ for (String nodeElement : nodeElements) {
+ String node = parent + "/" + nodeElement;
+ Stat s = zooKeeper.exists(node, false);
+ if (s == null) {
+ zooKeeper.create(node, this.encryptionManager
+ .encryptData(null), Ids.OPEN_ACL_UNSAFE,
+ CreateMode.PERSISTENT);
+ parent = node;
+ }
+ }
+ return true;
+ } catch (Exception e) {
+ LoggerFactory.getLogger().error(
+ "Error occurred creating node: " + parent + "/"
+ + nodeName, e);
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.zookeeper.inspector.manager.ZooInspectorNodeTreeManager#deleteNode
+ * (java.lang.String)
+ */
+ public boolean deleteNode(String nodePath) {
+ if (connected) {
+ try {
+ Stat s = zooKeeper.exists(nodePath, false);
+ if (s != null) {
+ List<String> children = zooKeeper.getChildren(nodePath,
+ false);
+ for (String child : children) {
+ String node = nodePath + "/" + child;
+ deleteNode(node);
+ }
+ zooKeeper.delete(nodePath, -1);
+ }
+ return true;
+ } catch (Exception e) {
+ LoggerFactory.getLogger().error(
+ "Error occurred deleting node: " + nodePath, e);
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.zookeeper.inspector.manager.ZooInspectorNodeManager#setData
+ * (java.lang.String, java.lang.String)
+ */
+ public boolean setData(String nodePath, String data) {
+ if (connected) {
+ try {
+ zooKeeper.setData(nodePath, this.encryptionManager
+ .encryptData(data), -1);
+ return true;
+ } catch (Exception e) {
+ LoggerFactory.getLogger().error(
+ "Error occurred setting data for node: " + nodePath, e);
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorManager#
+ * getConnectionPropertiesTemplate()
+ */
+ public Pair<Map<String, List<String>>, Map<String, String>> getConnectionPropertiesTemplate() {
+ Map<String, List<String>> template = new LinkedHashMap<String, List<String>>();
+ template.put(CONNECT_STRING, Arrays
+ .asList(new String[] { defaultHosts }));
+ template.put(SESSION_TIMEOUT, Arrays
+ .asList(new String[] { defaultTimeout }));
+ template.put(DATA_ENCRYPTION_MANAGER, Arrays
+ .asList(new String[] { defaultEncryptionManager }));
+ Map<String, String> labels = new LinkedHashMap<String, String>();
+ labels.put(CONNECT_STRING, "Connect String");
+ labels.put(SESSION_TIMEOUT, "Session Timeout");
+ labels.put(DATA_ENCRYPTION_MANAGER, "Data Encryption Manager");
+ return new Pair<Map<String, List<String>>, Map<String, String>>(
+ template, labels);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.zookeeper.inspector.manager.ZooInspectorManager#addWatchers
+ * (java.util.Collection,
+ * org.apache.zookeeper.inspector.manager.NodeListener)
+ */
+ public void addWatchers(Collection<String> selectedNodes,
+ NodeListener nodeListener) {
+ // add watcher for each node and add node to collection of
+ // watched nodes
+ if (connected) {
+ for (String node : selectedNodes) {
+ if (!watchers.containsKey(node)) {
+ try {
+ watchers.put(node, new NodeWatcher(node, nodeListener,
+ zooKeeper));
+ } catch (Exception e) {
+ LoggerFactory.getLogger().error(
+ "Error occured adding node watcher for node: "
+ + node, e);
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.zookeeper.inspector.manager.ZooInspectorManager#removeWatchers
+ * (java.util.Collection)
+ */
+ public void removeWatchers(Collection<String> selectedNodes) {
+ // remove watcher for each node and remove node from
+ // collection of watched nodes
+ if (connected) {
+ for (String node : selectedNodes) {
+ if (watchers.containsKey(node)) {
+ NodeWatcher watcher = watchers.remove(node);
+ if (watcher != null) {
+ watcher.stop();
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * A Watcher which will re-add itself every time an event is fired
+ *
+ */
+ public class NodeWatcher implements Watcher {
+
+ private final String nodePath;
+ private final NodeListener nodeListener;
+ private final ZooKeeper zookeeper;
+ private boolean closed = false;
+
+ /**
+ * @param nodePath
+ * - the path to the node to watch
+ * @param nodeListener
+ * the {@link NodeListener} for this node
+ * @param zookeeper
+ * - a {@link ZooKeeper} to use to access zookeeper
+ * @throws InterruptedException
+ * @throws KeeperException
+ */
+ public NodeWatcher(String nodePath, NodeListener nodeListener,
+ ZooKeeper zookeeper) throws KeeperException,
+ InterruptedException {
+ this.nodePath = nodePath;
+ this.nodeListener = nodeListener;
+ this.zookeeper = zookeeper;
+ Stat s = zooKeeper.exists(nodePath, this);
+ if (s != null) {
+ zookeeper.getChildren(nodePath, this);
+ }
+ }
+
+ public void process(WatchedEvent event) {
+ if (!closed) {
+ try {
+ if (event.getType() != EventType.NodeDeleted) {
+
+ Stat s = zooKeeper.exists(nodePath, this);
+ if (s != null) {
+ zookeeper.getChildren(nodePath, this);
+ }
+ }
+ } catch (Exception e) {
+ LoggerFactory.getLogger().error(
+ "Error occured re-adding node watcherfor node "
+ + nodePath, e);
+ }
+ nodeListener.processEvent(event.getPath(), event.getType()
+ .name(), null);
+ }
+ }
+
+ /**
+ *
+ */
+ public void stop() {
+ this.closed = true;
+ }
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorManager#
+ * loadNodeViewersFile(java.io.File)
+ */
+ public List<String> loadNodeViewersFile(File selectedFile)
+ throws IOException {
+ List<String> result = new ArrayList<String>();
+ if (defaultNodeViewersFile.exists()) {
+ FileReader reader = new FileReader(selectedFile);
+ try {
+ BufferedReader buff = new BufferedReader(reader);
+ try {
+ while (buff.ready()) {
+ String line = buff.readLine();
+ if (line != null && line.length() > 0) {
+ result.add(line);
+ }
+ }
+ } finally {
+ buff.close();
+ }
+ } finally {
+ reader.close();
+ }
+ }
+ return result;
+ }
+
+ private void loadDefaultConnectionFile() throws IOException {
+ if (defaultConnectionFile.exists()) {
+ Properties props = new Properties();
+
+ FileReader reader = new FileReader(defaultConnectionFile);
+ try {
+ props.load(reader);
+ } finally {
+ reader.close();
+ }
+ defaultEncryptionManager = props
+ .getProperty(DATA_ENCRYPTION_MANAGER) == null ? "org.apache.zookeeper.inspector.encryption.BasicDataEncryptionManager"
+ : props.getProperty(DATA_ENCRYPTION_MANAGER);
+ defaultTimeout = props.getProperty(SESSION_TIMEOUT) == null ? "5000"
+ : props.getProperty(SESSION_TIMEOUT);
+ defaultHosts = props.getProperty(CONNECT_STRING) == null ? "localhost:2181"
+ : props.getProperty(CONNECT_STRING);
+ } else {
+ defaultEncryptionManager = "org.apache.zookeeper.inspector.encryption.BasicDataEncryptionManager";
+ defaultTimeout = "5000";
+ defaultHosts = "localhost:2181";
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorManager#
+ * saveDefaultConnectionFile(java.util.Properties)
+ */
+ public void saveDefaultConnectionFile(Properties props) throws IOException {
+ File defaultDir = defaultConnectionFile.getParentFile();
+ if (!defaultDir.exists()) {
+ if (!defaultDir.mkdirs()) {
+ throw new IOException(
+ "Failed to create configuration directory: "
+ + defaultDir.getAbsolutePath());
+ }
+ }
+ if (!defaultConnectionFile.exists()) {
+ if (!defaultConnectionFile.createNewFile()) {
+ throw new IOException(
+ "Failed to create default connection file: "
+ + defaultConnectionFile.getAbsolutePath());
+ }
+ }
+ FileWriter writer = new FileWriter(defaultConnectionFile);
+ try {
+ props.store(writer, "Default connection for ZooInspector");
+ } finally {
+ writer.close();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorManager#
+ * saveNodeViewersFile(java.io.File, java.util.List)
+ */
+ public void saveNodeViewersFile(File selectedFile,
+ List<String> nodeViewersClassNames) throws IOException {
+ if (!selectedFile.exists()) {
+ if (!selectedFile.createNewFile()) {
+ throw new IOException(
+ "Failed to create node viewers configuration file: "
+ + selectedFile.getAbsolutePath());
+ }
+ }
+ FileWriter writer = new FileWriter(selectedFile);
+ try {
+ BufferedWriter buff = new BufferedWriter(writer);
+ try {
+ for (String nodeViewersClassName : nodeViewersClassNames) {
+ buff.append(nodeViewersClassName);
+ buff.append("\n");
+ }
+ } finally {
+ buff.flush();
+ buff.close();
+ }
+ } finally {
+ writer.close();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorManager#
+ * setDefaultNodeViewerConfiguration(java.io.File, java.util.List)
+ */
+ public void setDefaultNodeViewerConfiguration(
+ List<String> nodeViewersClassNames) throws IOException {
+ File defaultDir = defaultNodeViewersFile.getParentFile();
+ if (!defaultDir.exists()) {
+ if (!defaultDir.mkdirs()) {
+ throw new IOException(
+ "Failed to create configuration directory: "
+ + defaultDir.getAbsolutePath());
+ }
+ }
+ saveNodeViewersFile(defaultNodeViewersFile, nodeViewersClassNames);
+ }
+
+ public List<String> getDefaultNodeViewerConfiguration() throws IOException {
+ return loadNodeViewersFile(defaultNodeViewersFile);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorManager#
+ * getLastConnectionProps()
+ */
+ public Properties getLastConnectionProps() {
+ return this.lastConnectionProps;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.apache.zookeeper.inspector.manager.ZooInspectorManager#
+ * setLastConnectionProps(java.util.Properties)
+ */
+ public void setLastConnectionProps(Properties connectionProps) {
+ this.lastConnectionProps = connectionProps;
+ }
+}
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeManager.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeManager.java?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeManager.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeManager.java Tue Mar 9 01:06:15 2010
@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.zookeeper.inspector.manager;
+
+/**
+ * A Manager for all interactions between the application and the nodes in a
+ * Zookeeper instance
+ * */
+public interface ZooInspectorNodeManager extends ZooInspectorReadOnlyManager {
+ /**
+ * @param nodePath
+ * - the path to the node on which to set the data
+ * @param data
+ * - the data to set on the this node
+ * @return true if the data for the node was successfully updated
+ */
+ public boolean setData(String nodePath, String data);
+}
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeTreeManager.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeTreeManager.java?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeTreeManager.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeTreeManager.java Tue Mar 9 01:06:15 2010
@@ -0,0 +1,43 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.zookeeper.inspector.manager;
+
+/**
+ * A Manager for all interactions between the application and the node tree in a
+ * Zookeeper instance
+ */
+public interface ZooInspectorNodeTreeManager extends
+ ZooInspectorReadOnlyManager {
+
+ /**
+ * @param parent
+ * - the parent node path for the node to add
+ * @param nodeName
+ * - the name of the new node
+ * @return true if the node was successfully created
+ */
+ public abstract boolean createNode(String parent, String nodeName);
+
+ /**
+ * @param nodePath
+ * - the path to the node to delete
+ * @return true if the node was successfully deleted
+ */
+ public abstract boolean deleteNode(String nodePath);
+
+}
\ No newline at end of file
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorReadOnlyManager.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorReadOnlyManager.java?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorReadOnlyManager.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorReadOnlyManager.java Tue Mar 9 01:06:15 2010
@@ -0,0 +1,99 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.zookeeper.inspector.manager;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A Manager for all read only interactions between the application and a node
+ * in a Zookeeper instance
+ */
+public interface ZooInspectorReadOnlyManager {
+
+ /**
+ * @param nodePath
+ * - the path to the node to delete
+ * @return the data for the node
+ */
+ public abstract String getData(String nodePath);
+
+ /**
+ * @param nodePath
+ * - the path to the node to delete
+ * @return the metaData for the node
+ */
+ public abstract Map<String, String> getNodeMeta(String nodePath);
+
+ /**
+ * @param nodePath
+ * - the path to the node to delete
+ * @return the ACLs set on the node
+ */
+ public abstract List<Map<String, String>> getACLs(String nodePath);
+
+ /**
+ * @return the metaData for the current session
+ */
+ public abstract Map<String, String> getSessionMeta();
+
+ /**
+ * @param nodePath
+ * - the path to the node to delete
+ * @return true if the node has children
+ */
+ public abstract boolean hasChildren(String nodePath);
+
+ /**
+ * @param nodePath
+ * - the path to the node to delete
+ * @return the index of the node within its siblings
+ */
+ public abstract int getNodeIndex(String nodePath);
+
+ /**
+ * @param nodePath
+ * - the path to the node to delete
+ * @return the number of children of the node
+ */
+ public abstract int getNumChildren(String nodePath);
+
+ /**
+ * @param nodePath
+ * - the path to the node to delete
+ * @param childIndex
+ * - the index to the node in the list of node children
+ * @return the path to the node for the child of the nodePath at childIndex
+ */
+ public abstract String getNodeChild(String nodePath, int childIndex);
+
+ /**
+ * @param nodePath
+ * - the path to the node to delete
+ * @return true if the node allows children nodes
+ */
+ public abstract boolean isAllowsChildren(String nodePath);
+
+ /**
+ * @param nodePath
+ * - the path to the node to delete
+ * @return a {@link List} of the children of the node
+ */
+ public abstract List<String> getChildren(String nodePath);
+
+}
\ No newline at end of file
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/retry/ZooKeeperRetry.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/retry/ZooKeeperRetry.java?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/retry/ZooKeeperRetry.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/retry/ZooKeeperRetry.java Tue Mar 9 01:06:15 2010
@@ -0,0 +1,288 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.zookeeper.retry;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.Watcher;
+import org.apache.zookeeper.ZooKeeper;
+import org.apache.zookeeper.data.ACL;
+import org.apache.zookeeper.data.Stat;
+import org.apache.zookeeper.inspector.logger.LoggerFactory;
+
+/**
+ * A Class which extends {@link ZooKeeper} and will automatically retry calls to
+ * zookeeper if a {@link KeeperException.ConnectionLossException} occurs
+ */
+public class ZooKeeperRetry extends ZooKeeper {
+
+ private boolean closed = false;
+ private final Watcher watcher;
+ private int limit = -1;
+
+ /**
+ * @param connectString
+ * @param sessionTimeout
+ * @param watcher
+ * @throws IOException
+ */
+ public ZooKeeperRetry(String connectString, int sessionTimeout,
+ Watcher watcher) throws IOException {
+ super(connectString, sessionTimeout, watcher);
+ this.watcher = watcher;
+ }
+
+ /**
+ * @param connectString
+ * @param sessionTimeout
+ * @param watcher
+ * @param sessionId
+ * @param sessionPasswd
+ * @throws IOException
+ */
+ public ZooKeeperRetry(String connectString, int sessionTimeout,
+ Watcher watcher, long sessionId, byte[] sessionPasswd)
+ throws IOException {
+ super(connectString, sessionTimeout, watcher, sessionId, sessionPasswd);
+ this.watcher = watcher;
+ }
+
+ @Override
+ public synchronized void close() throws InterruptedException {
+ this.closed = true;
+ super.close();
+ }
+
+ @Override
+ public String create(String path, byte[] data, List<ACL> acl,
+ CreateMode createMode) throws KeeperException, InterruptedException {
+ int count = 0;
+ do {
+ try {
+ return super.create(path, data, acl, createMode);
+ } catch (KeeperException.ConnectionLossException e) {
+ LoggerFactory.getLogger().warn(
+ "ZooKeeper connection lost. Trying to reconnect.");
+ if (exists(path, false) != null) {
+ return path;
+ }
+ } catch (KeeperException.NodeExistsException e) {
+ return path;
+ }
+ } while (!closed && (limit == -1 || count++ < limit));
+ return null;
+ }
+
+ @Override
+ public void delete(String path, int version) throws InterruptedException,
+ KeeperException {
+ int count = 0;
+ do {
+ try {
+ super.delete(path, version);
+ } catch (KeeperException.ConnectionLossException e) {
+ LoggerFactory.getLogger().warn(
+ "ZooKeeper connection lost. Trying to reconnect.");
+ if (exists(path, false) == null) {
+ return;
+ }
+ } catch (KeeperException.NoNodeException e) {
+ break;
+ }
+ } while (!closed && (limit == -1 || count++ < limit));
+ }
+
+ @Override
+ public Stat exists(String path, boolean watch) throws KeeperException,
+ InterruptedException {
+ int count = 0;
+ do {
+ try {
+ return super.exists(path, watch ? watcher : null);
+ } catch (KeeperException.ConnectionLossException e) {
+ LoggerFactory.getLogger().warn(
+ "ZooKeeper connection lost. Trying to reconnect.");
+ }
+ } while (!closed && (limit == -1 || count++ < limit));
+ return null;
+ }
+
+ @Override
+ public Stat exists(String path, Watcher watcher) throws KeeperException,
+ InterruptedException {
+ int count = 0;
+ do {
+ try {
+ return super.exists(path, watcher);
+ } catch (KeeperException.ConnectionLossException e) {
+ LoggerFactory.getLogger().warn(
+ "ZooKeeper connection lost. Trying to reconnect.");
+ }
+ } while (!closed && (limit == -1 || count++ < limit));
+ return null;
+ }
+
+ @Override
+ public List<ACL> getACL(String path, Stat stat) throws KeeperException,
+ InterruptedException {
+ int count = 0;
+ do {
+ try {
+ return super.getACL(path, stat);
+ } catch (KeeperException.ConnectionLossException e) {
+ LoggerFactory.getLogger().warn(
+ "ZooKeeper connection lost. Trying to reconnect.");
+ }
+ } while (!closed && (limit == -1 || count++ < limit));
+ return null;
+ }
+
+ @Override
+ public List<String> getChildren(String path, boolean watch)
+ throws KeeperException, InterruptedException {
+ int count = 0;
+ do {
+ try {
+ return super.getChildren(path, watch ? watcher : null);
+ } catch (KeeperException.ConnectionLossException e) {
+ LoggerFactory.getLogger().warn(
+ "ZooKeeper connection lost. Trying to reconnect.");
+ }
+ } while (!closed && (limit == -1 || count++ < limit));
+ return new ArrayList<String>();
+ }
+
+ @Override
+ public List<String> getChildren(String path, Watcher watcher)
+ throws KeeperException, InterruptedException {
+ int count = 0;
+ do {
+ try {
+ return super.getChildren(path, watcher);
+ } catch (KeeperException.ConnectionLossException e) {
+ LoggerFactory.getLogger().warn(
+ "ZooKeeper connection lost. Trying to reconnect.");
+ }
+ } while (!closed && (limit == -1 || count++ < limit));
+ return new ArrayList<String>();
+ }
+
+ @Override
+ public byte[] getData(String path, boolean watch, Stat stat)
+ throws KeeperException, InterruptedException {
+ int count = 0;
+ do {
+ try {
+ return super.getData(path, watch ? watcher : null, stat);
+ } catch (KeeperException.ConnectionLossException e) {
+ LoggerFactory.getLogger().warn(
+ "ZooKeeper connection lost. Trying to reconnect.");
+ }
+ } while (!closed && (limit == -1 || count++ < limit));
+ return null;
+ }
+
+ @Override
+ public byte[] getData(String path, Watcher watcher, Stat stat)
+ throws KeeperException, InterruptedException {
+ int count = 0;
+ do {
+ try {
+ return super.getData(path, watcher, stat);
+ } catch (KeeperException.ConnectionLossException e) {
+ LoggerFactory.getLogger().warn(
+ "ZooKeeper connection lost. Trying to reconnect.");
+ }
+ } while (!closed && (limit == -1 || count++ < limit));
+ return null;
+ }
+
+ @Override
+ public Stat setACL(String path, List<ACL> acl, int version)
+ throws KeeperException, InterruptedException {
+ int count = 0;
+ do {
+ try {
+ return super.setACL(path, acl, version);
+ } catch (KeeperException.ConnectionLossException e) {
+ LoggerFactory.getLogger().warn(
+ "ZooKeeper connection lost. Trying to reconnect.");
+ Stat s = exists(path, false);
+ if (s != null) {
+ if (getACL(path, s).equals(acl)) {
+ return s;
+ }
+ } else {
+ return null;
+ }
+ }
+ } while (!closed && (limit == -1 || count++ < limit));
+ return null;
+ }
+
+ @Override
+ public Stat setData(String path, byte[] data, int version)
+ throws KeeperException, InterruptedException {
+ int count = 0;
+ do {
+ try {
+ return super.setData(path, data, version);
+ } catch (KeeperException.ConnectionLossException e) {
+ LoggerFactory.getLogger().warn(
+ "ZooKeeper connection lost. Trying to reconnect.");
+ Stat s = exists(path, false);
+ if (s != null) {
+ if (getData(path, false, s) == data) {
+ return s;
+ }
+ } else {
+ return null;
+ }
+ }
+ } while (!closed && (limit == -1 || count++ < limit));
+ return null;
+ }
+
+ /**
+ * @param limit
+ */
+ public void setRetryLimit(int limit) {
+ this.limit = limit;
+ }
+
+ /**
+ * @return true if successfully connected to zookeeper
+ */
+ public boolean testConnection() {
+ int count = 0;
+ do {
+ try {
+ return super.exists("/", null) != null;
+ } catch (Exception e) {
+ LoggerFactory.getLogger().warn(
+ "ZooKeeper connection lost. Trying to reconnect.");
+ }
+ } while (count++ < 5);
+ return false;
+ }
+
+}
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector-dev.sh
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector-dev.sh?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector-dev.sh (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector-dev.sh Tue Mar 9 01:06:15 2010
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+java -cp ../../../build/contrib/ZooInspector/zookeeper-dev-ZooInspector.jar:../../../build/lib/log4j-1.2.15.jar:lib/zookeeper-3.3.0.jar:lib/jtoaster-1.0.4.jar:lib org.apache.zookeeper.inspector.ZooInspector
\ No newline at end of file
Propchange: hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector-dev.sh
------------------------------------------------------------------------------
svn:executable = *
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector.cmd
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector.cmd?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector.cmd (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector.cmd Tue Mar 9 01:06:15 2010
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+java -cp zookeeper-dev-ZooInspector.jar;lib/log4j-1.2.15.jar;lib/zookeeper-3.3.0.jar;lib/jToaster-1.0.4.jar;lib org.apache.zookeeper.inspector.ZooInspector
\ No newline at end of file
Added: hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector.sh
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector.sh?rev=920604&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector.sh (added)
+++ hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector.sh Tue Mar 9 01:06:15 2010
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+java -cp lib/New.jar:zookeeper-dev-ZooInspector.jar:lib/log4j-1.2.15.jar:;lib/zookeeper-3.3.0.jar:lib/jToaster-1.0.4.jar:lib org.apache.zookeeper.inspector.ZooInspector
Propchange: hadoop/zookeeper/trunk/src/contrib/zooinspector/zooInspector.sh
------------------------------------------------------------------------------
svn:executable = *