Return-Path: X-Original-To: apmail-zookeeper-commits-archive@www.apache.org Delivered-To: apmail-zookeeper-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 3AF3511C3F for ; Fri, 4 Apr 2014 01:25:30 +0000 (UTC) Received: (qmail 86265 invoked by uid 500); 4 Apr 2014 01:25:28 -0000 Delivered-To: apmail-zookeeper-commits-archive@zookeeper.apache.org Received: (qmail 86217 invoked by uid 500); 4 Apr 2014 01:25:28 -0000 Mailing-List: contact commits-help@zookeeper.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ Delivered-To: mailing list commits@zookeeper.apache.org Received: (qmail 86205 invoked by uid 99); 4 Apr 2014 01:25:27 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 04 Apr 2014 01:25:27 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 04 Apr 2014 01:25:23 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id E020D2388ABC; Fri, 4 Apr 2014 01:24:40 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1584497 [7/9] - in /zookeeper/trunk: bin/ src/c/ src/contrib/loggraph/web/org/apache/zookeeper/graph/resources/ src/contrib/zooinspector/ src/contrib/zooinspector/lib/ src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/ src/c... Date: Fri, 04 Apr 2014 01:24:38 -0000 To: commits@zookeeper.apache.org From: michim@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20140404012440.E020D2388ABC@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Modified: zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManagerImpl.java URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManagerImpl.java?rev=1584497&r1=1584496&r2=1584497&view=diff ============================================================================== --- zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManagerImpl.java (original) +++ zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManagerImpl.java Fri Apr 4 01:24:37 2014 @@ -1,885 +1,885 @@ -/** - * 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"; - /** - * The key used for the authentication scheme in the connection properties file - */ - public static final String AUTH_SCHEME_KEY = "authScheme"; - /** - * The key used for the authentication data in the connection properties file - */ - public static final String AUTH_DATA_KEY = "authData"; - - - private static final File defaultNodeViewersFile = new File( - "./config/defaultNodeViewers.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 watchers = new HashMap(); - protected boolean connected = true; - private Properties lastConnectionProps; - private String defaultEncryptionManager; - private String defaultTimeout; - private String defaultHosts; - private String defaultAuthScheme; - private String defaultAuthValue; - - /** - * @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); - String authScheme = connectionProps - .getProperty(AUTH_SCHEME_KEY); - String authData = connectionProps - .getProperty(AUTH_DATA_KEY); - - 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; - } - } - }); - if (authData != null && authData.length() > 0){ - this.zooKeeper.addAuthInfo(authScheme, authData.getBytes()); - } - ((ZooKeeperRetry) this.zooKeeper).setRetryLimit(10); - connected = ((ZooKeeperRetry) this.zooKeeper).testConnection(); - } - } catch (Exception e) { - connected = false; - e.printStackTrace(); - } - if (!connected){ - disconnect(); - } - 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 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 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> getACLs(String nodePath) { - List> returnACLs = new ArrayList>(); - if (connected) { - try { - if (nodePath.length() == 0) { - nodePath = "/"; - } - Stat s = zooKeeper.exists(nodePath, false); - if (s != null) { - List acls = zooKeeper.getACL(nodePath, s); - for (ACL acl : acls) { - Map aclMap = new LinkedHashMap(); - 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 getNodeMeta(String nodePath) { - Map nodeMeta = new LinkedHashMap(); - 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 getSessionMeta() { - Map sessionMeta = new LinkedHashMap(); - 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 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> getConnectionPropertiesTemplate() { - Map> template = new LinkedHashMap>(); - 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 })); - template.put(AUTH_SCHEME_KEY, Arrays - .asList(new String[] { defaultAuthScheme })); - template.put(AUTH_DATA_KEY, Arrays - .asList(new String[] { defaultAuthValue })); - Map labels = new LinkedHashMap(); - labels.put(CONNECT_STRING, "Connect String"); - labels.put(SESSION_TIMEOUT, "Session Timeout"); - labels.put(DATA_ENCRYPTION_MANAGER, "Data Encryption Manager"); - labels.put(AUTH_SCHEME_KEY, "Authentication Scheme"); - labels.put(AUTH_DATA_KEY, "Authentication Data"); - return new Pair>, Map>( - 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 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 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 loadNodeViewersFile(File selectedFile) - throws IOException { - List result = new ArrayList(); - 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 && !line.startsWith("#")) { - 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); - defaultAuthScheme = props.getProperty(AUTH_SCHEME_KEY) == null ? "" - : props.getProperty(AUTH_SCHEME_KEY); - defaultAuthValue = props.getProperty(AUTH_DATA_KEY) == null ? "" - : props.getProperty(AUTH_DATA_KEY); - } else { - defaultEncryptionManager = "org.apache.zookeeper.inspector.encryption.BasicDataEncryptionManager"; - defaultTimeout = "5000"; - defaultHosts = "localhost:2181"; - defaultAuthScheme = ""; - defaultAuthValue = ""; - } - } - - /* - * (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 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 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 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; - } -} +/** + * 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"; + /** + * The key used for the authentication scheme in the connection properties file + */ + public static final String AUTH_SCHEME_KEY = "authScheme"; + /** + * The key used for the authentication data in the connection properties file + */ + public static final String AUTH_DATA_KEY = "authData"; + + + private static final File defaultNodeViewersFile = new File( + "./config/defaultNodeViewers.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 watchers = new HashMap(); + protected boolean connected = true; + private Properties lastConnectionProps; + private String defaultEncryptionManager; + private String defaultTimeout; + private String defaultHosts; + private String defaultAuthScheme; + private String defaultAuthValue; + + /** + * @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); + String authScheme = connectionProps + .getProperty(AUTH_SCHEME_KEY); + String authData = connectionProps + .getProperty(AUTH_DATA_KEY); + + 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; + } + } + }); + if (authData != null && authData.length() > 0){ + this.zooKeeper.addAuthInfo(authScheme, authData.getBytes()); + } + ((ZooKeeperRetry) this.zooKeeper).setRetryLimit(10); + connected = ((ZooKeeperRetry) this.zooKeeper).testConnection(); + } + } catch (Exception e) { + connected = false; + e.printStackTrace(); + } + if (!connected){ + disconnect(); + } + 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 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 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> getACLs(String nodePath) { + List> returnACLs = new ArrayList>(); + if (connected) { + try { + if (nodePath.length() == 0) { + nodePath = "/"; + } + Stat s = zooKeeper.exists(nodePath, false); + if (s != null) { + List acls = zooKeeper.getACL(nodePath, s); + for (ACL acl : acls) { + Map aclMap = new LinkedHashMap(); + 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 getNodeMeta(String nodePath) { + Map nodeMeta = new LinkedHashMap(); + 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 getSessionMeta() { + Map sessionMeta = new LinkedHashMap(); + 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 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> getConnectionPropertiesTemplate() { + Map> template = new LinkedHashMap>(); + 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 })); + template.put(AUTH_SCHEME_KEY, Arrays + .asList(new String[] { defaultAuthScheme })); + template.put(AUTH_DATA_KEY, Arrays + .asList(new String[] { defaultAuthValue })); + Map labels = new LinkedHashMap(); + labels.put(CONNECT_STRING, "Connect String"); + labels.put(SESSION_TIMEOUT, "Session Timeout"); + labels.put(DATA_ENCRYPTION_MANAGER, "Data Encryption Manager"); + labels.put(AUTH_SCHEME_KEY, "Authentication Scheme"); + labels.put(AUTH_DATA_KEY, "Authentication Data"); + return new Pair>, Map>( + 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 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 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 loadNodeViewersFile(File selectedFile) + throws IOException { + List result = new ArrayList(); + 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 && !line.startsWith("#")) { + 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); + defaultAuthScheme = props.getProperty(AUTH_SCHEME_KEY) == null ? "" + : props.getProperty(AUTH_SCHEME_KEY); + defaultAuthValue = props.getProperty(AUTH_DATA_KEY) == null ? "" + : props.getProperty(AUTH_DATA_KEY); + } else { + defaultEncryptionManager = "org.apache.zookeeper.inspector.encryption.BasicDataEncryptionManager"; + defaultTimeout = "5000"; + defaultHosts = "localhost:2181"; + defaultAuthScheme = ""; + defaultAuthValue = ""; + } + } + + /* + * (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 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 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 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; + } +} Propchange: zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorManagerImpl.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeManager.java URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeManager.java?rev=1584497&r1=1584496&r2=1584497&view=diff ============================================================================== --- zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeManager.java (original) +++ zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeManager.java Fri Apr 4 01:24:37 2014 @@ -1,33 +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); -} +/** + * 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); +} Propchange: zookeeper/trunk/src/contrib/zooinspector/src/java/org/apache/zookeeper/inspector/manager/ZooInspectorNodeManager.java ------------------------------------------------------------------------------ svn:eol-style = native