You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ds...@apache.org on 2015/07/06 23:47:38 UTC

[13/18] incubator-geode git commit: GEODE-80: Imported databrowser from geode-1.0.0-SNAPSHOT-2.src.tar

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/IQueryExecutedEvent.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/IQueryExecutedEvent.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/IQueryExecutedEvent.java
new file mode 100644
index 0000000..b42e480
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/IQueryExecutedEvent.java
@@ -0,0 +1,30 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.controller;
+
+import com.gemstone.gemfire.mgmt.DataBrowser.model.member.GemFireMember;
+import com.gemstone.gemfire.mgmt.DataBrowser.query.QueryResult;
+
+/**
+ * Event for query execution to be sent to all listeners
+ * {@link IQueryExecutionListener}
+ * 
+ * @author mjha
+ * 
+ */
+public interface IQueryExecutedEvent {
+
+	/**
+	 * @return the original query string for which query was performed
+	 */
+	public String getQueryString();
+
+	/**
+	 * @return the result of query performed, null in case of error occurred
+	 *         while querying
+	 */
+	public QueryResult getQueryResult();
+
+	/**
+	 * @return the member on which query was fired
+	 */
+	public GemFireMember getMember();
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/IQueryExecutionListener.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/IQueryExecutionListener.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/IQueryExecutionListener.java
new file mode 100644
index 0000000..569172b
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/IQueryExecutionListener.java
@@ -0,0 +1,28 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.controller;
+
+/**
+ * This interface provides call back functionality for listening query execution
+ * completed result
+ * 
+ * @author mjha
+ **/
+public interface IQueryExecutionListener {
+
+  /**
+   * to be called when query is successfully executed
+   * 
+   * @param queryEvent
+   *          instance of {@link IQueryExecutedEvent }
+   */
+  public void queryExecuted(IQueryExecutedEvent queryEvent);
+
+  /**
+   * to be called when error occurred while executing query
+   * 
+   * @param queryEvent
+   *          instance of {@link IQueryExecutedEvent }
+   * @param ex
+   *          exception occurred while executing query
+   */
+  public void queryFailed(IQueryExecutedEvent queryEvent, Throwable ex);
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/InvalidConfigurationException.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/InvalidConfigurationException.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/InvalidConfigurationException.java
new file mode 100644
index 0000000..40fd2b5
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/InvalidConfigurationException.java
@@ -0,0 +1,34 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.controller;
+
+/**
+ * @author mjha
+ *
+ */
+public class InvalidConfigurationException extends Exception {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 1L;
+
+  public InvalidConfigurationException() {
+    super();
+    // TODO Auto-generated constructor stub
+  }
+
+  public InvalidConfigurationException(String arg0, Throwable arg1) {
+    super(arg0, arg1);
+    // TODO Auto-generated constructor stub
+  }
+
+  public InvalidConfigurationException(String arg0) {
+    super(arg0);
+    // TODO Auto-generated constructor stub
+  }
+
+  public InvalidConfigurationException(Throwable arg0) {
+    super(arg0);
+    // TODO Auto-generated constructor stub
+  }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/InvalidSecurityPluginException.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/InvalidSecurityPluginException.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/InvalidSecurityPluginException.java
new file mode 100644
index 0000000..6a64c39
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/InvalidSecurityPluginException.java
@@ -0,0 +1,34 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.controller;
+
+/**
+ * @author mjha
+ *
+ */
+public class InvalidSecurityPluginException extends Exception {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 1L;
+
+  public InvalidSecurityPluginException() {
+    super();
+    // TODO Auto-generated constructor stub
+  }
+
+  public InvalidSecurityPluginException(String arg0, Throwable arg1) {
+    super(arg0, arg1);
+    // TODO Auto-generated constructor stub
+  }
+
+  public InvalidSecurityPluginException(String arg0) {
+    super(arg0);
+    // TODO Auto-generated constructor stub
+  }
+
+  public InvalidSecurityPluginException(Throwable arg0) {
+    super(arg0);
+    // TODO Auto-generated constructor stub
+  }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/MissingSecuritiesPropException.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/MissingSecuritiesPropException.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/MissingSecuritiesPropException.java
new file mode 100644
index 0000000..e99633f
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/MissingSecuritiesPropException.java
@@ -0,0 +1,34 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.controller;
+
+/**
+ * 
+ * @author mjha
+ *
+ */
+public class MissingSecuritiesPropException extends Exception {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 1L;
+
+  public MissingSecuritiesPropException() {
+    super();
+    // TODO Auto-generated constructor stub
+  }
+
+  public MissingSecuritiesPropException(String arg0, Throwable arg1) {
+    super(arg0, arg1);
+    // TODO Auto-generated constructor stub
+  }
+
+  public MissingSecuritiesPropException(Throwable arg0) {
+    super(arg0);
+    // TODO Auto-generated constructor stub
+  }
+  
+  public MissingSecuritiesPropException(String arg0) {
+    super(arg0);
+    // TODO Auto-generated constructor stub
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/QueryConfigurationPrms.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/QueryConfigurationPrms.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/QueryConfigurationPrms.java
new file mode 100644
index 0000000..78c026f
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/QueryConfigurationPrms.java
@@ -0,0 +1,79 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.controller;
+
+import com.gemstone.gemfire.mgmt.DataBrowser.model.member.GemFireMember;
+
+/**
+ * Encapsulating informations required to executed query
+ * 
+ * @author mjha
+ * 
+ */
+public class QueryConfigurationPrms {
+
+  /**
+   * the query string for which query to be performed
+   */
+  private String                  queryString;
+
+  /**
+   * Member to which query has to be sent
+   */
+  private GemFireMember           member;
+
+  /**
+   * Call back object({@link IQueryExecutionListener}) , to which result has to
+   * be pass after query
+   */
+  private IQueryExecutionListener queryExecutionListener;
+
+  public QueryConfigurationPrms() {
+
+  }
+
+  /**
+   * 
+   * @param strQuery
+   *          the query string for which query to be performed
+   * @param gfeMbr
+   *          to which query has to be sent
+   * @param listener
+   *          Call back object({@link IQueryExecutionListener}) , to which
+   *          result has to be pass after query
+   */
+  public QueryConfigurationPrms(String strQuery, GemFireMember gfeMbr,
+      IQueryExecutionListener listener) {
+    this.queryString = strQuery;
+    this.member = gfeMbr;
+    this.queryExecutionListener = listener;
+  }
+
+  public String getQueryString() {
+    return queryString;
+  }
+
+  public void setQueryString(String strQuery) {
+    this.queryString = strQuery;
+  }
+
+  public GemFireMember getMember() {
+    return member;
+  }
+
+  public void setMember(GemFireMember gfeMbr) {
+    this.member = gfeMbr;
+  }
+
+  public IQueryExecutionListener getQueryExecutionListener() {
+    return queryExecutionListener;
+  }
+
+  public void setQueryExecutionListener(IQueryExecutionListener listener) {
+    this.queryExecutionListener = listener;
+  }
+  
+  // TODO MGH - this works for us. But this is not really good design! :)
+  public boolean isCQ(){
+    return false;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/DataBrowserCustomClassLoader.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/DataBrowserCustomClassLoader.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/DataBrowserCustomClassLoader.java
new file mode 100644
index 0000000..1802a02
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/DataBrowserCustomClassLoader.java
@@ -0,0 +1,156 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.controller.internal;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Enumeration;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import com.gemstone.gemfire.DataSerializable;
+import com.gemstone.gemfire.mgmt.DataBrowser.utils.LogUtil;
+
+/**
+ * 
+ * @author mjha
+ *
+ */
+public class DataBrowserCustomClassLoader extends URLClassLoader {
+
+  public DataBrowserCustomClassLoader(URL[] urls, ClassLoader parent) {
+    super(urls, parent);
+  }
+  
+  public void addURL(URL url) {
+    super.addURL(url);
+  }
+  
+  public static String getAuthProp(String jar, Class<?> authInitialize) throws ClassNotFoundException, IOException {
+    String authInitializeProperty = null;
+    Class<?> authInitializeImplementation = null;
+    File file = new File(jar);
+    //TODO need to fix this before release
+    try {
+      URLClassLoader classloader =getUrlClassLoader(file);
+      JarFile jarFile = new JarFile(file);
+      Enumeration<JarEntry> entries = jarFile.entries();
+      while (entries.hasMoreElements()) {
+        JarEntry nextElement = entries.nextElement();
+        if (!nextElement.isDirectory()) {
+          if (nextElement.getName().contains(".class")) {
+            Class<?> loadClass = classloader.loadClass(nextElement.getName()
+                .replace("/", ".").replace(".class", ""));
+            if (authInitializeImplementation== null) {
+              Class<?>[] interfaces = loadClass.getInterfaces();
+              for (int i = 0; i < interfaces.length; i++) {
+                if (interfaces[i].equals(authInitialize)) {
+                  authInitializeImplementation = loadClass;
+                  break;
+                }
+              }
+            }
+          }
+        }
+        if(authInitializeImplementation != null)
+          break;
+      }
+    }
+    catch (IOException e) {
+      throw e;
+    }
+    catch (ClassNotFoundException e) {
+      throw e;
+    }
+    
+    if(authInitializeImplementation != null){
+      Method[] methods = authInitializeImplementation.getMethods();
+      for (int i = 0; i < methods.length; i++) {
+        boolean staticMethod = isStaticMethod(methods[i]);
+        if(staticMethod){
+          if(methods[i].getReturnType().isAssignableFrom(authInitialize)){
+            authInitializeProperty = authInitializeImplementation.getName()+ "." + methods[i].getName();
+
+            break;
+          }
+        }
+      }
+    }else{
+      throw new ClassNotFoundException("Class Implementing 'AuthInitialize' not found in specified security jar");
+    }
+    return authInitializeProperty;
+  }
+  
+  public static boolean isStaticMethod(Method method){
+    return Modifier.isStatic(method.getModifiers());
+  }
+  
+  
+  /**
+   * 
+   * This API is provided to load application class once, so that is application
+   * class is registering themselves with Instantiators, will register
+   * themselves to instantiator here. This is suppose to be call before query
+   * execution, if appluation class is changed
+   * 
+   * @param jars
+   * @throws ClassNotFoundException
+   * @throws IOException
+   */
+  public static void loadApplicationClass( DataBrowserCustomClassLoader classloader, String[] jars)
+      throws ClassNotFoundException, IOException {
+    for (int i = 0; i < jars.length; i++) {
+      String jar = jars[i];
+      File file = new File(jar);
+
+      try {
+        JarFile jarFile = new JarFile(file);
+        Enumeration<JarEntry> entries = jarFile.entries();
+        while (entries.hasMoreElements()) {
+          JarEntry nextElement = entries.nextElement();
+          if (!nextElement.isDirectory()) {
+            if (nextElement.getName().contains(".class")) {
+              String className = nextElement.getName().replace("/", ".")
+              .replace(".class", "");
+              try {
+                Class<?> forName = Class.forName(className, true, classloader);
+                boolean canBeAssignedToDataSerializer = canBeAssignedToDataSerializable(forName);
+                if(canBeAssignedToDataSerializer){
+                  LogUtil.fine("class " + className + " is loaded");
+                }
+              }
+              catch (ClassNotFoundException e) {
+                LogUtil.fine("Error while loading the classes :", e);
+              }
+              catch (Throwable e) {
+                LogUtil.fine("Error while loading the classes :", e);
+              }
+            }
+          }
+        }
+      }
+      catch (IOException e) {
+        LogUtil.warning("Error while loading application class " +e);
+      }
+      catch (Throwable e) {
+       LogUtil.warning("Error while loading application class " +e);
+      }
+    }
+  }
+  
+  private static URLClassLoader getUrlClassLoader(File file) throws IOException{
+    //TODO need to fix this before release
+    URLClassLoader classloader = new URLClassLoader(new URL[] { file
+        .toURI().toURL() }, ClassLoader.getSystemClassLoader());
+    
+    return classloader;
+  }
+  
+  
+  private static boolean canBeAssignedToDataSerializable(Class<?> cls){
+    return DataSerializable.class.isAssignableFrom(cls);
+  }
+  
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/QueryExecutedEvent.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/QueryExecutedEvent.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/QueryExecutedEvent.java
new file mode 100644
index 0000000..967de3c
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/QueryExecutedEvent.java
@@ -0,0 +1,56 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.controller.internal;
+
+import com.gemstone.gemfire.mgmt.DataBrowser.controller.IQueryExecutedEvent;
+import com.gemstone.gemfire.mgmt.DataBrowser.model.member.GemFireMember;
+import com.gemstone.gemfire.mgmt.DataBrowser.query.QueryResult;
+
+/**
+ * Implementation of {@link IQueryExecutedEvent}
+ * 
+ * @author mjha
+ */
+public class QueryExecutedEvent implements IQueryExecutedEvent {
+
+  private String        queryString;
+  private QueryResult   queryResult;
+  private GemFireMember member;
+
+  public QueryExecutedEvent(String strQuery, QueryResult resQuery,
+      GemFireMember gfeMbr) {
+    this.queryString = strQuery;
+    this.queryResult = resQuery;
+    this.member = gfeMbr;
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see
+   * com.gemstone.gemfire.mgmt.DataBrowser.model.IQueryExecutedEvent#getQueryResult
+   * ()
+   */
+  public QueryResult getQueryResult() {
+    return queryResult;
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see
+   * com.gemstone.gemfire.mgmt.DataBrowser.model.IQueryExecutedEvent#getQueryString
+   * ()
+   */
+  public String getQueryString() {
+    return queryString;
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see
+   * com.gemstone.gemfire.mgmt.DataBrowser.model.IQueryExecutedEvent#getMember()
+   */
+  public GemFireMember getMember() {
+    return member;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/QueryExecutionHelper.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/QueryExecutionHelper.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/QueryExecutionHelper.java
new file mode 100644
index 0000000..2291a75
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/QueryExecutionHelper.java
@@ -0,0 +1,292 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.controller.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.gemstone.gemfire.mgmt.DataBrowser.connection.GemFireConnection;
+import com.gemstone.gemfire.mgmt.DataBrowser.controller.CQConfiguarationPrms;
+import com.gemstone.gemfire.mgmt.DataBrowser.controller.IQueryExecutedEvent;
+import com.gemstone.gemfire.mgmt.DataBrowser.controller.IQueryExecutionListener;
+import com.gemstone.gemfire.mgmt.DataBrowser.controller.QueryConfigurationPrms;
+import com.gemstone.gemfire.mgmt.DataBrowser.model.member.GemFireMember;
+import com.gemstone.gemfire.mgmt.DataBrowser.query.QueryResult;
+import com.gemstone.gemfire.mgmt.DataBrowser.query.cq.CQQuery;
+import com.gemstone.gemfire.mgmt.DataBrowser.utils.LogUtil;
+
+/**
+ * 
+ * Singleton Helper class to perform query fired by view also process post query
+ * data
+ * 
+ * initialize() method has to be called after each connection to
+ * initialize/reset the state of field.
+ * 
+ * 
+ * 
+ * @author mjha
+ * 
+ */
+public class QueryExecutionHelper {
+  private static QueryExecutionHelper instance;
+
+  private GemFireConnection connection;
+
+  private List<QueryConfigurationPrms> queriesToBeExecutedQueue;
+
+  private List<PostQueryData> postQueryDataQueue;
+
+  private QueryResult lastQueryResult = null;
+  
+  private Thread queryExecuter;
+
+  private Thread queryResultProcessor;
+
+  private boolean isShutDownStarted;
+
+  private QueryExecutionHelper() {
+
+  }
+
+  public static QueryExecutionHelper getInstance() {
+    if (instance == null)
+      instance = new QueryExecutionHelper();
+
+    return instance;
+  }
+
+  /**
+   * Initialize the fields , also starts the thread to execute query and process
+   * query result
+   */
+  public void start(GemFireConnection conn) {
+    queriesToBeExecutedQueue = new ArrayList<QueryConfigurationPrms>();
+    postQueryDataQueue = new ArrayList<PostQueryData>();
+    connection = conn;
+    isShutDownStarted = false;
+  }
+
+  public void shutDown() {
+    this.isShutDownStarted = true;
+    if (isShutDownStarted) {
+      connection = null;
+
+      if (queryExecuter != null){
+        synchronized (queriesToBeExecutedQueue) {
+          queriesToBeExecutedQueue.clear();
+          queriesToBeExecutedQueue.notify();
+        }
+      }
+
+      if (queryResultProcessor != null){
+        synchronized (postQueryDataQueue) {
+          postQueryDataQueue.clear();
+          postQueryDataQueue.notify();
+        }
+      }
+
+      queryResultProcessor = null;
+      queryExecuter = null;
+      setLastQueryResults(null);
+    }
+  }
+
+  /**
+   * Append query to the queue. This will return with adding query if connection
+   * is no more or data browser shut down
+   * 
+   * @param queryPrms
+   *          encapsulating parameters to perform query and process post query
+   *          result
+   */
+  public void submitQuery(QueryConfigurationPrms queryPrms) {
+    if (connection == null || isShutDownStarted)
+      return;
+    synchronized (queriesToBeExecutedQueue) {
+      queriesToBeExecutedQueue.add(queryPrms);
+      if (queryExecuter == null) {
+        queryExecuter = new Thread(new QueryExecutor());
+        queryExecuter.setName("Query Executer");
+        queryExecuter.setDaemon(true);
+        queryExecuter.start();
+      }
+
+      queriesToBeExecutedQueue.notify();
+    }
+  }
+  
+
+  private void processResult(PostQueryData queryData) {
+    if (connection == null || isShutDownStarted)
+      return;
+    synchronized (postQueryDataQueue) {
+      postQueryDataQueue.add(queryData);
+      if (queryResultProcessor == null) {
+        queryResultProcessor = new Thread(new QueryResultProcessor());
+        queryResultProcessor.setName("Query Result Processor");
+        queryResultProcessor.setDaemon(true);
+        queryResultProcessor.start();
+      }
+
+      postQueryDataQueue.notify();
+    }
+  }
+
+  /**
+   * Runnable to execute query on DS
+   * 
+   * The runnable keeps on running as long as connection is establish with DS or
+   * Data Browser is running
+   * 
+   * @author mjha
+   */
+  private class QueryExecutor implements Runnable {
+    public void run() {
+      while (true) {
+        QueryConfigurationPrms prms = null;
+        synchronized (queriesToBeExecutedQueue) {
+          while (queriesToBeExecutedQueue.isEmpty()) {
+            if(connection != null && !isShutDownStarted){
+              try {
+                queriesToBeExecutedQueue.wait();
+              }
+              catch (InterruptedException e) {
+                 continue;
+              }
+            }else{
+              return;
+            }
+          }
+          prms = queriesToBeExecutedQueue.remove(0);
+        }
+        String queryString = prms.getQueryString();
+        GemFireMember member = prms.getMember();
+        boolean isCQ = prms.isCQ();
+        Object result = null;
+        CQQuery cQuery = null;
+        if (connection != null && !isShutDownStarted) {
+          try {
+            if(!isCQ){
+              QueryResult executeQuery = connection.executeQuery(queryString,
+                  member);
+
+              result = executeQuery;
+            }else{
+              CQConfiguarationPrms cqPrms= (CQConfiguarationPrms)prms;
+              cQuery = cqPrms.getCQuery();
+              cQuery.execute();
+            }
+          }
+          catch (Throwable e) {
+            result = e;
+            LogUtil.error("Error occured while executing the query: " + prms, e);
+          }
+          finally {
+            PostQueryData queryData = new PostQueryData(prms, result);
+            processResult(queryData);
+          }
+        }
+        else {
+          return;
+        }
+      }
+    }
+  }
+
+ public synchronized QueryResult getLastQueryResults(){
+   return lastQueryResult;
+ }
+ 
+ public synchronized void setLastQueryResults(QueryResult result) {
+   LogUtil.fine("QueryHelper.setLastQueryResults =>"+result);
+   lastQueryResult = result;
+ }
+  
+  /**
+   * Runnable to process post query results, if query successful else it will
+   * process error occurred while querying
+   * 
+   * The runnable keeps on running as long as connection is establish with DS or
+   * Data Browser is running
+   * 
+   * @author mjha
+   */
+  private class QueryResultProcessor implements Runnable {
+    public void run() {
+      while (true) {
+        PostQueryData data = null;
+        synchronized (postQueryDataQueue) {
+          while (postQueryDataQueue.isEmpty()) {
+            if(connection != null && !isShutDownStarted){
+              try {
+                postQueryDataQueue.wait();
+              }
+              catch (InterruptedException e) {
+                 continue;
+              }
+            }else{
+              return;
+            }
+          }
+          data = postQueryDataQueue.remove(0);
+        }
+        QueryConfigurationPrms prms = data.getQueryPrms();
+        boolean isCQ = prms.isCQ();
+        IQueryExecutionListener listener = prms.getQueryExecutionListener();
+        String queryString = prms.getQueryString();
+        GemFireMember member = prms.getMember();
+        Object object = data.getQueryResult();
+        if (connection != null && !isShutDownStarted) {
+          if (object instanceof Throwable) {
+            IQueryExecutedEvent event = new QueryExecutedEvent(queryString,
+                null, member);
+            listener.queryFailed(event, (Throwable)object);
+          }
+          else {
+            if(!isCQ){
+              if (object instanceof QueryResult) {
+                IQueryExecutedEvent event = new QueryExecutedEvent(queryString,
+                    (QueryResult)object, member);
+                setLastQueryResults((QueryResult)object);
+                listener.queryExecuted(event);
+              }
+            }else{
+              IQueryExecutedEvent event = new QueryExecutedEvent(queryString, null, member);
+              listener.queryExecuted(event);
+            }
+          }
+        }
+        else {
+          return;
+        }
+      }
+    }
+  }
+
+  /**
+   * represents post query data along with query information
+   * 
+   * Post query data can be ResultSet or error occurred
+   * 
+   * @author mjha
+   */
+  private static class PostQueryData {
+    private QueryConfigurationPrms queryPrms;
+
+    private Object queryResult;
+
+    PostQueryData(QueryConfigurationPrms prms, Object resQuery) {
+      this.queryPrms = prms;
+      this.queryResult = resQuery;
+    }
+
+    public QueryConfigurationPrms getQueryPrms() {
+      return queryPrms;
+    }
+
+    public Object getQueryResult() {
+      return queryResult;
+    }
+
+  }
+ 
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/SWTAppAdapter_Controller.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/SWTAppAdapter_Controller.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/SWTAppAdapter_Controller.java
new file mode 100644
index 0000000..369771a
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/controller/internal/SWTAppAdapter_Controller.java
@@ -0,0 +1,130 @@
+/**
+ *
+ */
+package com.gemstone.gemfire.mgmt.DataBrowser.controller.internal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.MessageBox;
+
+import com.gemstone.gemfire.mgmt.DataBrowser.app.DataBrowserApp;
+import com.gemstone.gemfire.mgmt.DataBrowser.app.State;
+import com.gemstone.gemfire.mgmt.DataBrowser.connection.ConnectionTerminatedEvent;
+import com.gemstone.gemfire.mgmt.DataBrowser.connection.IConnectionEvent;
+import com.gemstone.gemfire.mgmt.DataBrowser.controller.DSSnapShot;
+import com.gemstone.gemfire.mgmt.DataBrowser.controller.DataBrowserController;
+import com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent;
+import com.gemstone.gemfire.mgmt.DataBrowser.model.member.GemFireMember;
+import com.gemstone.gemfire.mgmt.DataBrowser.ui.CustomUIMessages;
+import com.gemstone.gemfire.mgmt.DataBrowser.ui.MainAppWindow;
+
+/**
+ * @author mghosh
+ *
+ */
+public class SWTAppAdapter_Controller extends DataBrowserController {
+  private MemberEventProcessor memberEventProcessor= new MemberEventProcessor();
+
+  /**
+   *
+   */
+  public SWTAppAdapter_Controller() {
+    // TODO Auto-generated constructor stub
+  }
+
+  /* (non-Javadoc)
+   * @see com.gemstone.gemfire.mgmt.DataBrowser.controller.DataBrowserController#memberEventReceived(com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent)
+   */
+  @Override
+  public void memberEventReceived(final IMemberEvent memEvent) {
+    final MainAppWindow wnd = DataBrowserApp.getInstance().getMainWindow();
+    memberEventProcessor.addEvent(memEvent);
+    if(memberEventProcessor.isProcessed()){
+      memberEventProcessor.setProcessed(false);
+      Display display = wnd.getShell().getDisplay();
+      display.asyncExec(memberEventProcessor);
+    }
+  }
+
+  public void connectionEventReceived(IConnectionEvent event) {
+    if(event instanceof ConnectionTerminatedEvent) {
+      if(this.hasConnection()) {
+        try {
+          this.disconnect();
+        }
+        catch (Exception e) {
+          // mjha- do we need to log the error ?
+        }
+
+        final MainAppWindow wnd = DataBrowserApp.getInstance().getMainWindow();
+        if (null != wnd) {
+          Runnable runnable = new Runnable() {
+            public void run() {
+              State st = DataBrowserApp.getInstance().getState();
+              DSSnapShot dsss = st.getCurrDS();
+
+              ArrayList<Object> prms = new ArrayList<Object>();
+              prms.add(dsss);
+              ArrayList<Object> res = new ArrayList<Object>();
+              wnd.sendCustomMessage(CustomUIMessages.DS_DISCONNECTED, prms, res);
+
+              // TODO MGH - see if this can be done by sending a message to main window.
+              MessageBox mb = new MessageBox(wnd.getShell(), SWT.OK);
+              //TODO: Handle this message for localization.
+              mb.setText("Connection Closed unexpectedly");
+              mb.setMessage("Connection Closed unexpectedly");
+              mb.open();
+
+            }
+          };
+          Display display = wnd.getShell().getDisplay();
+          display.asyncExec(runnable);
+        }
+      }
+    }
+
+  }
+
+  private static class MemberEventProcessor implements Runnable{
+    private boolean processed = true;
+    private Map<String, IMemberEvent> memberEventMap = new HashMap<String, IMemberEvent>();
+
+    public void run() {
+      processed = false;
+      ArrayList<Object> res = new ArrayList<Object>();
+      ArrayList<Object> prms= new ArrayList<Object>() ;
+      synchronized (memberEventMap) {
+        Collection<IMemberEvent> values = memberEventMap.values();
+        prms.addAll(values);
+        memberEventMap.clear();
+        setProcessed(true);
+      }
+      MainAppWindow wnd = DataBrowserApp.getInstance().getMainWindow();
+      if(wnd != null)
+        wnd.sendCustomMessage(CustomUIMessages.UPDATE_MEMBER_EVENT, prms, res);
+    }
+
+    public boolean isProcessed(){
+      return processed;
+    }
+
+    public void setProcessed(boolean processed) {
+      this.processed = processed;
+    }
+
+    public void addEvent(IMemberEvent memEvent){
+      GemFireMember member = memEvent.getMember();
+      if(member != null){
+        synchronized (memberEventMap) {
+          memberEventMap.put(member.getId(), memEvent);
+        }
+      }
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/DistributedSystem.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/DistributedSystem.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/DistributedSystem.java
new file mode 100644
index 0000000..4451d4e
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/DistributedSystem.java
@@ -0,0 +1,96 @@
+/*=========================================================================
+ * (c)Copyright 2002-2009, GemStone Systems, Inc. All Rights Reserved.
+ * 1260 NW Waterhouse Ave., Suite 200, Beaverton, OR 97006
+ * All Rights Reserved.
+ * =======================================================================*/
+package com.gemstone.gemfire.mgmt.DataBrowser.model;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.gemstone.gemfire.mgmt.DataBrowser.model.member.GemFireMember;
+
+/**
+ * This class represents the DistributedSystem model component.
+ *
+ * @author mghosh
+ **/
+public class DistributedSystem {
+  public static final String DATA_BROWSER_NAME = "Data-Browser";
+
+  private String       name_        = null;
+  private boolean      isConnected_ = false;
+  private Map<String, GemFireMember> members;
+
+  public DistributedSystem(String name) {
+    this.name_ = name;
+    this.members = Collections.synchronizedMap(new HashMap<String, GemFireMember>());
+  }
+
+  public void disconnect() {
+//    System.out.println("Disconnecting from DS " + this.toString());
+  }
+
+  /**
+   * @return the name_
+   */
+  public final String getName() {
+    return this.name_;
+  }
+
+  /**
+   * @return the members_
+   */
+  public final Collection<GemFireMember> getMembers() {
+    synchronized (members) {
+      return Collections.unmodifiableCollection(this.members.values());
+    }
+  }
+
+  /**
+   * @param mbrs
+   *          the members_ to set
+   */
+  public final void setMembers(Collection<GemFireMember> mbrs) {
+    //this.members_ = members;
+  }
+
+  /**
+   * @return the fIsConnected_
+   */
+  public final boolean isConnected() {
+    return this.isConnected_;
+  }
+
+  /**
+   * @param isConnected_
+   *          the fIsConnected_ to set
+   */
+  public final void setConnected(boolean isConnected) {
+    this.isConnected_ = isConnected;
+  }
+
+  public GemFireMember getMember(String id) {
+    return this.members.get(id);
+  }
+
+  public final GemFireMember removeMember(String id) {
+    GemFireMember member = null;
+    member = this.members.remove(id);
+    return member;
+  }
+
+  public final boolean containsMember(String id) {
+    return this.members.containsKey(id);
+  }
+
+  public final boolean addMember(GemFireMember member) {
+   if(!DATA_BROWSER_NAME.equalsIgnoreCase(member.getName())) {
+    this.members.put(member.getId(), member);
+    return true;
+   }
+   return false;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/IDistributedSystemEvent.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/IDistributedSystemEvent.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/IDistributedSystemEvent.java
new file mode 100644
index 0000000..640aa63
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/IDistributedSystemEvent.java
@@ -0,0 +1,12 @@
+/**
+ * 
+ */
+package com.gemstone.gemfire.mgmt.DataBrowser.model;
+
+/**
+ * @author mghosh
+ *
+ */
+public interface IDistributedSystemEvent {
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/IMemberEvent.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/IMemberEvent.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/IMemberEvent.java
new file mode 100644
index 0000000..d8e78ea
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/IMemberEvent.java
@@ -0,0 +1,23 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.model;
+
+import com.gemstone.gemfire.mgmt.DataBrowser.model.member.GemFireMember;
+
+/**
+ * Event representing change of member status(Left, Crashed, Joined etc)
+ * 
+ * @author mghosh
+ * 
+ */
+public interface IMemberEvent extends IDistributedSystemEvent {
+	/**
+	 * 
+	 * @return the member for which the event is raised
+	 */
+	public GemFireMember getMember();
+	
+	/**
+	 * 
+	 * @return the list of members for which the event is raised
+	 */
+	public GemFireMember[] getMembers();
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/IQueryEvent.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/IQueryEvent.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/IQueryEvent.java
new file mode 100644
index 0000000..a70ef37
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/IQueryEvent.java
@@ -0,0 +1,12 @@
+/**
+ * 
+ */
+package com.gemstone.gemfire.mgmt.DataBrowser.model;
+
+/**
+ * @author mghosh
+ *
+ */
+public interface IQueryEvent extends IDistributedSystemEvent  {
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/ServerGroup.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/ServerGroup.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/ServerGroup.java
new file mode 100644
index 0000000..dfceefc
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/ServerGroup.java
@@ -0,0 +1,59 @@
+/**
+ * 
+ */
+package com.gemstone.gemfire.mgmt.DataBrowser.model;
+
+import java.util.Collection;
+
+import com.gemstone.gemfire.mgmt.DataBrowser.model.member.GemFireMember;
+
+/**
+ * @author mghosh
+ *
+ */
+public class ServerGroup {
+
+  private String        name_ = null;
+  
+  private Collection< GemFireMember >     dsMembers_ = null; 
+  
+  public static class Attributes {
+  }
+
+  /**
+   * 
+   */
+  public ServerGroup() {
+    // TODO Auto-generated constructor stub
+  }
+
+  /**
+   * @param nm_ the name_ to set
+   */
+  public final void setName(String nm_) {
+    this.name_ = nm_;
+  }
+
+  /**
+   * @return the name_
+   */
+  public final String getName() {
+    return this.name_;
+  }
+
+  /**
+   * @return the dsMembers_
+   */
+  public final Collection<GemFireMember> getDsMembers_() {
+    return this.dsMembers_;
+  }
+
+  /**
+   * @param dsMmbrs_ the dsMembers_ to set
+   */
+  public final void setDsMembers(Collection<GemFireMember> dsMmbrs_) {
+    this.dsMembers_ = dsMmbrs_;
+  }
+
+  
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/CacheServerInfo.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/CacheServerInfo.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/CacheServerInfo.java
new file mode 100644
index 0000000..33dabbf
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/CacheServerInfo.java
@@ -0,0 +1,88 @@
+/*========================================================================= 
+ * (c)Copyright 2002-2009, GemStone Systems, Inc. All Rights Reserved.
+ * 1260 NW Waterhouse Ave., Suite 200, Beaverton, OR 97006 
+ * All Rights Reserved.
+ * =======================================================================*/
+package com.gemstone.gemfire.mgmt.DataBrowser.model.member;
+
+/**
+ * This class provides the information related to a GemFire Cache server.
+ * 
+ * @author Hrishi
+ **/
+public class CacheServerInfo {
+
+  private String bindAddress;
+  private int    port;
+  private boolean notifyBySubscription;
+
+  public CacheServerInfo() {
+    this.bindAddress = null;
+    this.port = -1;
+    this.notifyBySubscription = false;
+  }
+
+  public CacheServerInfo(String bindAddr, int p, boolean ntfyBySubscr) {
+    super();
+    bindAddress = bindAddr;
+    notifyBySubscription = ntfyBySubscr;
+    port = p;
+  }
+
+  /**
+   * Getter of the property <tt>bindAddress</tt>
+   * 
+   * @return Returns the bindAddress.
+   * 
+   */
+  public String getBindAddress() {
+    return bindAddress;
+  }
+
+  /**
+   * Setter of the property <tt>bindAddress</tt>
+   * 
+   * @param bindAddr
+   *          The bindAddress to set.
+   **/
+  public void setBindAddress(String bindAddr) {
+    this.bindAddress = bindAddr;
+  }
+
+  /**
+   * Getter of the property <tt>port</tt>
+   * 
+   * @return Returns the port.
+   **/
+  public int getPort() {
+    return port;
+  }
+
+  /**
+   * Setter of the property <tt>port</tt>
+   * 
+   * @param p
+   *          The port to set.
+   **/
+  public void setPort(int p) {
+    port = p;
+  }
+  
+  public boolean isNotifyBySubscription() {
+    return notifyBySubscription;
+  }
+  
+  public void setNotifyBySubscription(boolean ntfyBySubscrp) {
+    notifyBySubscription = ntfyBySubscrp;
+  }
+  
+  @Override
+  public String toString() {
+    StringBuffer buff = new StringBuffer();
+    buff.append("CacheServerInfo ["); 
+    buff.append("Host: " + this.bindAddress); 
+    buff.append(", Port: " + this.port);
+    buff.append("]");
+    return buff.toString();
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/GemFireMember.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/GemFireMember.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/GemFireMember.java
new file mode 100644
index 0000000..8101499
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/GemFireMember.java
@@ -0,0 +1,199 @@
+/*========================================================================= 
+ * (c)Copyright 2002-2009, GemStone Systems, Inc. All Rights Reserved.
+ * 1260 NW Waterhouse Ave., Suite 200, Beaverton, OR 97006 
+ * All Rights Reserved.
+ * =======================================================================*/
+package com.gemstone.gemfire.mgmt.DataBrowser.model.member;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.gemstone.gemfire.mgmt.DataBrowser.model.region.GemFireRegion;
+
+/**
+ * This class represents a GemFire system member.
+ * 
+ * @author Hrishi
+ **/
+public final class GemFireMember {
+  private static final GemFireRegion[] EMPTY_REGION_LIST = new GemFireRegion[0];
+  public static final short     GEMFIRE_CACHELESS_MEMBER   = 0;
+  public static final short     GEMFIRE_PEER               = 1;
+  public static final short     GEMFIRE_CACHE_SERVER       = 3;
+  public static final short     GEMFIRE_SERVER_LOCATOR     = 4;
+
+  private String                id;
+  private String                name;
+  private String                host;
+  private short                 type;
+  private List<CacheServerInfo> cacheServers;
+  private List<MemberConfigurationPrms> config;
+  private GemFireRegion         root;
+
+  // Make sure that the access for creating new objects is restricted to this
+  // package.
+  GemFireMember() {
+    this.id = null;
+    this.name = null;
+    this.host = null;
+    this.type = -1;
+    this.cacheServers = new ArrayList<CacheServerInfo>();
+    this.config = new ArrayList<MemberConfigurationPrms>();
+    this.root = null;
+  }
+
+  void setHost(String hst) {
+    this.host = hst;
+  }
+
+  void setId(String ident) {
+    this.id = ident;
+  }
+
+  void setName(String nm) {
+    this.name = nm;
+  }
+
+  void setType(short tp) {
+    this.type = tp;
+  }
+
+  void addCacheServer(CacheServerInfo server) {
+    this.cacheServers.add(server);
+  }
+
+  void resetCacheServerInfo() {
+    this.cacheServers.clear();
+  }
+  
+  public MemberConfigurationPrms[] getConfig() {
+    return config.toArray(new MemberConfigurationPrms[0]);
+  }
+  
+  public void setConfig(List<MemberConfigurationPrms> cfg) {
+    if(cfg != null) {
+     config.clear();
+     config.addAll(cfg);
+    }
+  }
+
+  void setRootRegion(GemFireRegion region) {
+    root = region;
+  }
+
+  /**
+   * This method returns member-id of this GemFire member.
+   * 
+   * @return member-id
+   */
+  public String getId() {
+    return id;
+  }
+
+  /**
+   * This method returns name of this GemFire member.
+   * 
+   * @return member-name
+   */
+  public String getName() {
+    return name;
+  }
+  
+  /**
+   * This method returns representation name of this GemFire member for view.
+   * 
+   * @return member-name
+   */
+  public String getRepresentationName() {
+    String repName =name + "(" + getId() +")";
+    
+    return repName;
+  }
+
+  /**
+   * This method returns hostname of this GemFire member.
+   * 
+   * @return hostname
+   */
+  public String getHost() {
+    return host;
+  }
+
+  /**
+   * This method returns type of this GemFire member.
+   * 
+   * @return type
+   */
+  public short getType() {
+    return type;
+  }
+
+  /**
+   * This method returns a list of root regions defined on this GemFire member.
+   * 
+   * @return list of root regions.
+   */
+  public GemFireRegion[] getRootRegions() {
+    //We get a /Root element, which is meaningless for user. 
+    //Hence we filter the same.
+    GemFireRegion[] retVal = EMPTY_REGION_LIST;
+    if(root != null) {
+      retVal = root.getSubRegions();  
+    }    
+    
+    return retVal;
+  }
+  
+  /**
+   * This method returns a list of all the regions defined on this GemFire member.
+   * 
+   * @return list of root regions.
+   */
+  public GemFireRegion[] getAllRegions() {
+    //We get a /Root element, which is meaningless for user. 
+    //Hence we filter the same.
+    if(this.root != null) {
+      List<GemFireRegion> subRegions = root.getSubRegions(true);
+      return subRegions.toArray(new GemFireRegion[0]);  
+    }    
+    return EMPTY_REGION_LIST;
+  }
+
+  /**
+   * This method returns information regarding the Cache servers started on this
+   * member.
+   * 
+   * @return list of cache servers started.
+   */
+  public CacheServerInfo[] getCacheServers() {
+    return this.cacheServers.toArray(new CacheServerInfo[0]);
+  }
+  
+  @Override
+  public boolean equals(Object obj) {
+    if(obj == null)
+      return false;
+    
+    if (!(obj instanceof GemFireMember))
+      return false;
+
+    GemFireMember mem = (GemFireMember)obj;
+
+    return getId() != null ? getId().equalsIgnoreCase(mem.getId())
+        : super.equals(obj);
+  }
+  
+  @Override
+  public int hashCode() {
+    return getId() != null ? getId().hashCode() : super.hashCode();
+  }
+  
+  public boolean isNotifyBySubscriptionEnabled() {
+    for(CacheServerInfo info : this.cacheServers) {
+      if(info.isNotifyBySubscription())
+       return true; 
+    }
+    return false;
+  }
+ 
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberConfigurationPrms.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberConfigurationPrms.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberConfigurationPrms.java
new file mode 100644
index 0000000..67e3be3
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberConfigurationPrms.java
@@ -0,0 +1,52 @@
+/*========================================================================= 
+ * (c)Copyright 2002-2009, GemStone Systems, Inc. All Rights Reserved.
+ * 1260 NW Waterhouse Ave., Suite 200, Beaverton, OR 97006 
+ * All Rights Reserved.
+ * =======================================================================*/
+package com.gemstone.gemfire.mgmt.DataBrowser.model.member;
+
+/**
+ * @author hgadre
+ *
+ */
+public class MemberConfigurationPrms {
+  private String name;
+  private Object value;
+  
+  public MemberConfigurationPrms() {
+   name = null;
+   value = null;
+  }
+
+  public MemberConfigurationPrms(String nm, Object val) {
+    super();
+    name = nm;
+    value = val;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String nm) {
+    name = nm;
+  }
+
+  public Object getValue() {
+    return value;
+  }
+
+  public void setValue(Object val) {
+    value = val;
+  }
+  
+  @Override
+  public String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.append("MemberConfigurationPrms[");
+    buffer.append("  name :"+name);
+    buffer.append(", value :"+value);
+    buffer.append("]");
+    return buffer.toString();
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberCrashedEvent.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberCrashedEvent.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberCrashedEvent.java
new file mode 100644
index 0000000..23a7a11
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberCrashedEvent.java
@@ -0,0 +1,60 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.model.member;
+
+import com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent;
+
+/**
+ * Implementation of {@link IMemberEvent}, representing event for member crashed
+ * 
+ * @author mghosh
+ */
+public class MemberCrashedEvent implements IMemberEvent {
+
+  private final GemFireMember[] members_;
+
+  /**
+   * 
+   */
+  public MemberCrashedEvent(GemFireMember[] mbrs) {
+    if((mbrs != null)) {
+      members_ = new GemFireMember[mbrs.length];
+      System.arraycopy(mbrs, 0, members_, 0, members_.length);
+     } else {
+       members_ = new GemFireMember[0]; 
+     }
+  }
+
+  public MemberCrashedEvent(GemFireMember mbr) {
+    members_ = new GemFireMember[] { mbr };
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent#getMember()
+   */
+  public final GemFireMember getMember() {
+    return members_[0];
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent#getMembers()
+   */
+  public GemFireMember[] getMembers() {
+    GemFireMember[] temp = new GemFireMember[members_.length];
+    System.arraycopy(members_, 0, temp, 0, members_.length);
+    return temp;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder builder = new StringBuilder();
+    builder.append("member crashed event for: ");
+    for (int i = 0; i < members_.length; i++) {
+      builder.append("\n" + members_[i].getName());
+    }
+    return builder.toString();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberFactory.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberFactory.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberFactory.java
new file mode 100644
index 0000000..f64dfaf
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberFactory.java
@@ -0,0 +1,176 @@
+/*=========================================================================
+ * (c)Copyright 2002-2009, GemStone Systems, Inc. All Rights Reserved.
+ * 1260 NW Waterhouse Ave., Suite 200, Beaverton, OR 97006
+ * All Rights Reserved.
+ * =======================================================================*/
+package com.gemstone.gemfire.mgmt.DataBrowser.model.member;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import com.gemstone.gemfire.admin.AdminException;
+import com.gemstone.gemfire.admin.GemFireMemberStatus;
+import com.gemstone.gemfire.admin.RegionSubRegionSnapshot;
+import com.gemstone.gemfire.admin.SystemMember;
+import com.gemstone.gemfire.admin.SystemMemberCache;
+import com.gemstone.gemfire.admin.SystemMemberCacheServer;
+import com.gemstone.gemfire.admin.SystemMemberRegion;
+import com.gemstone.gemfire.mgmt.DataBrowser.connection.ClientConfiguration;
+import com.gemstone.gemfire.mgmt.DataBrowser.model.region.GemFireRegion;
+import com.gemstone.gemfire.mgmt.DataBrowser.model.region.RegionFactory;
+import com.gemstone.gemfire.mgmt.DataBrowser.utils.LogUtil;
+import com.gemstone.gemfire.mgmt.DataBrowser.connection.EndPoint;
+
+/**
+ * This class provides factory methods to create member model beans from
+ * corresponding GemFire member representation.
+ *
+ * @author Hrishi
+ **/
+public class MemberFactory {
+
+  /**
+   * Factory method to create member model beans from corresponding GemFire
+   * member representation.
+   *
+   * @param member
+   *          GemFire member representation.
+   * @return Member model bean.
+   */
+  public static GemFireMember createGemFireMember(SystemMember member)
+      throws AdminException {
+    GemFireMember result = new GemFireMember();
+    updateGemFireMember(result, member);
+    return result;
+  }
+
+  public static void updateGemFireMember(GemFireMember member,
+      SystemMember update) throws AdminException {
+    member.resetCacheServerInfo();
+// /   member.resetRegionInfo();
+
+    member.setId(update.getId());
+    member.setName(update.getName());
+    member.setHost(update.getHost());
+
+    if (update.hasCache()) {
+      SystemMemberCache cache = update.getCache();
+      SystemMemberCacheServer[] cacheServers = cache.getCacheServers();
+
+      short type = (cacheServers.length > 0) ? GemFireMember.GEMFIRE_CACHE_SERVER
+          : GemFireMember.GEMFIRE_PEER;
+      member.setType(type);
+
+      for (int i = 0; i < cacheServers.length; i++) {
+        CacheServerInfo info = new CacheServerInfo();
+        info.setBindAddress(cacheServers[i].getHostnameForClients());
+        info.setPort(cacheServers[i].getPort());
+        member.addCacheServer(info);
+        LogUtil.info("Adding CacheServer :" + info);
+      }
+
+      Set regions = cache.getRootRegionNames();
+      Iterator iterator = regions.iterator();
+      while (iterator.hasNext()) {
+        String regionName = (String) iterator.next();
+        SystemMemberRegion region = cache.getRegion(regionName);
+        // TODO MGH - what is this for?
+        GemFireRegion reg = RegionFactory.getRegion(member.getId(), cache, region);
+  //      member.addRegion(reg);
+      }
+    } else {
+      member.setType(GemFireMember.GEMFIRE_CACHELESS_MEMBER);
+    }
+  }
+  
+  public static GemFireMember createGemFireMember(ClientConfiguration conf) {
+    if(conf.getCacheServers().size() > 0) {
+      GemFireMember member = new GemFireMember();
+      member.setType(GemFireMember.GEMFIRE_CACHE_SERVER);
+      member.setName("GemFire Cache Server");
+      member.setId("default-id");
+      member.setHost("host");
+      
+      for(EndPoint endpt : conf.getCacheServers()) {
+        CacheServerInfo info = new CacheServerInfo();
+        info.setBindAddress(endpt.getHostName());
+        info.setPort(endpt.getPort()); 
+        member.addCacheServer(info);      
+      }
+      
+      return member;      
+    } 
+    
+    GemFireMember member = new GemFireMember();
+    member.setType(GemFireMember.GEMFIRE_SERVER_LOCATOR);
+    member.setName("GemFire Server Locator");
+    member.setId("default-id");
+    member.setHost("host");
+    
+    for(EndPoint endpt : conf.getLocators()) {
+      CacheServerInfo info = new CacheServerInfo();
+      info.setBindAddress(endpt.getHostName());
+      info.setPort(endpt.getPort());       
+      member.addCacheServer(info);
+    }
+    
+    return member;
+  }  
+  
+  public static GemFireMember createGemFireMember(String memberId, List<MemberConfigurationPrms> config, List<CacheServerInfo> cs_info, GemFireMemberStatus status, RegionSubRegionSnapshot snapshot) {
+    GemFireMember member = new GemFireMember();
+    member.setType(GemFireMember.GEMFIRE_CACHE_SERVER);
+    member.setHost(status.getHostAddress().getCanonicalHostName());
+    member.setName(status.getMemberName());
+    member.setId(memberId);
+    member.setConfig(config);
+    
+    if((cs_info != null) && (!cs_info.isEmpty())) {
+     for(CacheServerInfo info : cs_info)
+      member.addCacheServer(info);      
+    
+    } else {
+      CacheServerInfo info = new CacheServerInfo();
+      info.setBindAddress(status.getBindAddress());
+      info.setPort(status.getServerPort()); 
+      info.setNotifyBySubscription(false); //TODO : There is no way to fetch this information from GemFireMemberStatus.
+      member.addCacheServer(info); 
+    }
+    
+    if(snapshot != null) {
+      GemFireRegion root = RegionFactory.getRegion(memberId, snapshot);
+      member.setRootRegion(root);
+    }    
+    
+    return member;
+  }
+  
+  public static GemFireMember createGemFireMemberMbean(String memberId, List<MemberConfigurationPrms> config, List<CacheServerInfo> cs_info, MemberStatus status, GemFireRegion root) {
+    GemFireMember member = new GemFireMember();
+    member.setType(GemFireMember.GEMFIRE_CACHE_SERVER);
+    member.setHost(status.getHostAddress().getCanonicalHostName());
+    member.setName(status.getMemberName());
+    member.setId(memberId);
+    member.setConfig(config);
+    
+    if((cs_info != null) && (!cs_info.isEmpty())) {
+       for(CacheServerInfo info : cs_info) {
+         LogUtil.fine("Adding cache server info: " + info);
+         member.addCacheServer(info);
+       }
+    } else {
+      CacheServerInfo info = new CacheServerInfo();
+      info.setBindAddress(status.getBindAddress());
+      info.setPort(status.getServerPort()); 
+      info.setNotifyBySubscription(true); 
+      member.addCacheServer(info); 
+    }
+  
+    member.setRootRegion(root);
+    
+    return member;
+  }
+  
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberJoinedEvent.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberJoinedEvent.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberJoinedEvent.java
new file mode 100644
index 0000000..e85b175
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberJoinedEvent.java
@@ -0,0 +1,60 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.model.member;
+
+import com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent;
+
+/**
+ * Implementation of {@link IMemberEvent}, representing event for member joined
+ * 
+ * @author mghosh
+ */
+public class MemberJoinedEvent implements IMemberEvent {
+
+  private final GemFireMember[] members_;
+
+  /**
+   * 
+   */
+  public MemberJoinedEvent(GemFireMember[] mbrs) {
+    if((mbrs != null)) {
+      members_ = new GemFireMember[mbrs.length];
+      System.arraycopy(mbrs, 0, members_, 0, members_.length);
+     } else {
+       members_ = new GemFireMember[0]; 
+     }
+  }
+
+  public MemberJoinedEvent(GemFireMember mbr) {
+    members_ = new GemFireMember[] { mbr };
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent#getMember()
+   */
+  public final GemFireMember getMember() {
+    return members_[0];
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent#getMembers()
+   */
+  public GemFireMember[] getMembers() {
+    GemFireMember[] temp = new GemFireMember[members_.length];
+    System.arraycopy(members_, 0, temp, 0, members_.length);
+    return temp;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder builder = new StringBuilder();
+    builder.append("member joined event for: ");
+    for (int i = 0; i < members_.length; i++) {
+      builder.append("\n" + members_[i].getName());
+    }
+    return builder.toString();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberLeftEvent.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberLeftEvent.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberLeftEvent.java
new file mode 100644
index 0000000..0a3d656
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberLeftEvent.java
@@ -0,0 +1,62 @@
+/**
+ * 
+ */
+package com.gemstone.gemfire.mgmt.DataBrowser.model.member;
+
+import com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent;
+
+/**
+ * Implementation of {@link IMemberEvent}, representing event for member left
+ * 
+ * @author mghosh
+ */
+public class MemberLeftEvent implements IMemberEvent {
+
+  private final GemFireMember[] members_;
+
+  /**
+   * 
+   */
+  public MemberLeftEvent(GemFireMember[] mbrs) {
+    if((mbrs != null)) {
+      members_ = new GemFireMember[mbrs.length];
+      System.arraycopy(mbrs, 0, members_, 0, members_.length);
+     } else {
+       members_ = new GemFireMember[0]; 
+     }
+  }
+
+  public MemberLeftEvent(GemFireMember mbr) {
+    members_ = new GemFireMember[] { mbr };
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent#getMember()
+   */
+  public final GemFireMember getMember() {
+    return members_[0];
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent#getMembers()
+   */
+  public GemFireMember[] getMembers() {
+    GemFireMember[] temp = new GemFireMember[members_.length];
+    System.arraycopy(members_, 0, temp, 0, members_.length);
+    return temp;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder builder = new StringBuilder();
+    builder.append("member left event for: ");
+    for (int i = 0; i < members_.length; i++) {
+      builder.append("\n" + members_[i].getName());
+    }
+    return builder.toString();
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberStatus.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberStatus.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberStatus.java
new file mode 100644
index 0000000..a811d16
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberStatus.java
@@ -0,0 +1,37 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.model.member;
+
+import java.net.InetAddress;
+
+public class MemberStatus {
+
+  private String memberName;
+  private String bindAddress;
+  private InetAddress hostAddress;
+  private int serverPort;
+  public String getMemberName() {
+    return memberName;
+  }
+  public void setMemberName(String memberName) {
+    this.memberName = memberName;
+  }
+  public String getBindAddress() {
+    return bindAddress;
+  }
+  public void setBindAddress(String bindAddress) {
+    this.bindAddress = bindAddress;
+  }
+  public InetAddress getHostAddress() {
+    return hostAddress;
+  }
+  public void setHostAddress(InetAddress hostAddress) {
+    this.hostAddress = hostAddress;
+  }
+  public int getServerPort() {
+    return serverPort;
+  }
+  public void setServerPort(int serverPort) {
+    this.serverPort = serverPort;
+  }
+  
+  
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberUpdatedEvent.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberUpdatedEvent.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberUpdatedEvent.java
new file mode 100644
index 0000000..4beca9c
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/MemberUpdatedEvent.java
@@ -0,0 +1,62 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.model.member;
+
+import com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent;
+
+/**
+ * 
+ * Implementation of {@link IMemberEvent}, representing event for member
+ * updation
+ * 
+ * @author mghosh
+ * 
+ */
+public class MemberUpdatedEvent implements IMemberEvent {
+
+  private final GemFireMember[] members_;
+
+  /**
+   * 
+   */
+  public MemberUpdatedEvent(GemFireMember[] mbrs) {
+   if((mbrs != null)) {
+    members_ = new GemFireMember[mbrs.length];
+    System.arraycopy(mbrs, 0, members_, 0, members_.length);
+   } else {
+     members_ = new GemFireMember[0]; 
+   }
+  }
+
+  public MemberUpdatedEvent(GemFireMember mbr) {
+    members_ = new GemFireMember[] { mbr };
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent#getMember()
+   */
+  public final GemFireMember getMember() {
+    return members_[0];
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see com.gemstone.gemfire.mgmt.DataBrowser.model.IMemberEvent#getMembers()
+   */
+  public GemFireMember[] getMembers() {
+    GemFireMember[] temp = new GemFireMember[members_.length];
+    System.arraycopy(members_, 0, temp, 0, members_.length);
+    return temp;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder builder = new StringBuilder();
+    builder.append("member updated event for: ");
+    for (int i = 0; i < members_.length; i++) {
+      builder.append("\n" + members_[i].getName());
+    }
+    return builder.toString();
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/Messages.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/Messages.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/Messages.java
new file mode 100644
index 0000000..f137999
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/Messages.java
@@ -0,0 +1,22 @@
+package com.gemstone.gemfire.mgmt.DataBrowser.model.member;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+  private static final String         BUNDLE_NAME     = "com.gemstone.gemfire.mgmt.DataBrowser.model.member.messages";
+
+  private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+                                                          .getBundle(BUNDLE_NAME);
+
+  private Messages() {
+  }
+
+  public static String getString(String key) {
+    try {
+      return RESOURCE_BUNDLE.getString(key);
+    } catch (MissingResourceException e) {
+      return '!' + key + '!';
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/messages.properties
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/messages.properties b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/member/messages.properties
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/region/GemFireRegion.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/region/GemFireRegion.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/region/GemFireRegion.java
new file mode 100644
index 0000000..32eb96b
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/region/GemFireRegion.java
@@ -0,0 +1,138 @@
+/*=========================================================================
+ * (c)Copyright 2002-2009, GemStone Systems, Inc. All Rights Reserved.
+ * 1260 NW Waterhouse Ave., Suite 200, Beaverton, OR 97006
+ * All Rights Reserved.
+ * =======================================================================*/
+package com.gemstone.gemfire.mgmt.DataBrowser.model.region;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This class represents a GemFire region.
+ *
+ * @author Hrishi
+ **/
+public final class GemFireRegion {
+
+  private static final String ROOT_ELEM = "/Root";
+  private String              name;
+  private String              fullPath;
+  private String              dataPolicy;
+  private String              scope;
+  private List<GemFireRegion> subRegions = new ArrayList<GemFireRegion>();
+  private String              memberId;
+
+  GemFireRegion() {
+    // Do nothing.
+  }
+
+  void addSubRegion(GemFireRegion reg) {
+    this.subRegions.add(reg);
+  }
+
+  void resetSubRegionInfo() {
+
+    for (GemFireRegion reg : this.subRegions) {
+      reg.resetSubRegionInfo();
+    }
+    this.subRegions.clear();
+  }
+
+  void setName(String nm) {
+    this.name = nm;
+  }
+
+  void setFullPath(String FQN) {
+    this.fullPath = FQN;
+  }
+
+  void setDataPolicy(String dataPol) {
+    this.dataPolicy = dataPol;
+  }
+
+  void setScope(String s) {
+    this.scope = s;
+  }
+
+  void setMemberId(String mbrID) {
+    this.memberId = mbrID;
+  }
+
+  /**
+   * This method returns name of this region.
+   */
+  public String getName() {
+    return this.name;
+  }
+
+  /**
+   * This method returns path of this region.
+   */
+  public String getFullPath() {
+    if(this.fullPath != null) {
+      String result = this.fullPath;
+      int length = result.length();
+      if(this.fullPath.startsWith(ROOT_ELEM)) {
+       return result.substring(ROOT_ELEM.length(), length-1 );
+      }
+    }
+
+    return this.fullPath;
+  }
+
+  /**
+   * This method returns data-policy for this region.
+   **/
+  public String getDataPolicy() {
+    return this.dataPolicy;
+  }
+
+  /**
+   * This method returns scope for this region.
+   **/
+  public String getScope() {
+    return this.scope;
+  }
+
+  /**
+   * This method returns a list of subregions.
+   * */
+  public GemFireRegion[] getSubRegions() {
+    return this.subRegions.toArray(new GemFireRegion[0]);
+  }
+
+  /**
+   * This method returns a list of subregions.
+   * */
+  public List<GemFireRegion> getSubRegions(boolean recursive) {
+    List<GemFireRegion> allRegions = subRegions;
+    if(recursive){
+      for (int i = 0; i < subRegions.size(); i++) {
+        allRegions.addAll(subRegions.get(i).getSubRegions(true));
+      }
+    }
+
+    return allRegions;
+  }
+
+  public String getMemberId() {
+    return memberId;
+  }
+
+  @Override
+  public String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.append("GemFireRegion [");
+    buffer.append("\n name :" + this.name);
+    buffer.append("\n full-path :" + this.getFullPath());
+    buffer.append("\n scope :" + this.scope);
+    buffer.append("\n data-policy :" + this.dataPolicy);
+    for (GemFireRegion reg : this.subRegions) {
+      buffer.append("\n sub-regions :" + reg);
+    }
+    buffer.append("\n]");
+    return buffer.toString();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e2ccf3da/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/region/RegionFactory.java
----------------------------------------------------------------------
diff --git a/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/region/RegionFactory.java b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/region/RegionFactory.java
new file mode 100644
index 0000000..03065f5
--- /dev/null
+++ b/databrowser/src/com/gemstone/gemfire/mgmt/DataBrowser/model/region/RegionFactory.java
@@ -0,0 +1,113 @@
+/*========================================================================= 
+ * (c)Copyright 2002-2009, GemStone Systems, Inc. All Rights Reserved.
+ * 1260 NW Waterhouse Ave., Suite 200, Beaverton, OR 97006 
+ * All Rights Reserved.
+ * =======================================================================*/
+package com.gemstone.gemfire.mgmt.DataBrowser.model.region;
+
+import java.util.Iterator;
+import java.util.Set;
+
+import javax.management.JMX;
+import javax.management.MBeanServerConnection;
+import javax.management.ObjectName;
+
+import com.gemstone.gemfire.admin.AdminException;
+import com.gemstone.gemfire.admin.RegionSubRegionSnapshot;
+import com.gemstone.gemfire.admin.SystemMemberCache;
+import com.gemstone.gemfire.admin.SystemMemberRegion;
+import com.gemstone.gemfire.management.DistributedSystemMXBean;
+import com.gemstone.gemfire.management.RegionAttributesData;
+import com.gemstone.gemfire.management.RegionMXBean;
+import com.gemstone.gemfire.mgmt.DataBrowser.utils.LogUtil;
+
+/**
+ * This class provides factory methods to create region model beans from
+ * corresponding GemFire region representation.
+ * 
+ * @author Hrishi
+ **/
+
+public class RegionFactory {
+
+  /**
+   * Factory method to create region model beans from
+   * corresponding GemFire region representation.
+   * 
+   * @param region GemFire region representation.
+   * @return Region model bean.
+   */
+  public static GemFireRegion getRegion(String memberId,
+      SystemMemberCache cache, SystemMemberRegion region) throws AdminException {
+    GemFireRegion result = new GemFireRegion();
+    
+    result.setMemberId(memberId);    
+    result.setName(region.getName());
+    result.setFullPath(region.getFullPath());
+    result.setDataPolicy(region.getDataPolicy().toString());
+    result.setScope(region.getScope().toString());
+
+    Set subRegions = region.getSubregionFullPaths();
+    Iterator iter = subRegions.iterator();
+
+    while (iter.hasNext()) {
+      String path = (String)iter.next();
+      SystemMemberRegion temp = cache.getRegion(path);
+      GemFireRegion subRegion = getRegion(memberId, cache, temp);
+      result.addSubRegion(subRegion);
+    }
+
+    return result;
+  }
+  
+  public static GemFireRegion getRegion(String memberId, RegionSubRegionSnapshot snapshot) {
+    
+    LogUtil.fine("Region Update : "+snapshot);
+    
+    GemFireRegion result = new GemFireRegion();
+    
+    result.setMemberId(memberId);    
+    result.setName(snapshot.getName());
+    result.setFullPath(snapshot.getFullPath());
+    //Need to make these available through JMX...
+    //result.setDataPolicy(region.getDataPolicy().toString());
+    //result.setScope(region.getScope().toString());
+
+    Set subRegions = snapshot.getSubRegionSnapshots();
+    Iterator iter = subRegions.iterator();
+
+    while (iter.hasNext()) {
+      RegionSubRegionSnapshot reg = (RegionSubRegionSnapshot)iter.next();
+      GemFireRegion subRegion = getRegion(memberId, reg);
+      result.addSubRegion(subRegion);
+    }
+
+    return result;
+  }
+
+  public static GemFireRegion getRootRegion(String memberId, DistributedSystemMXBean distributedSystemMXBeanProxy, MBeanServerConnection connServer, String[] regionNames) throws Exception{
+    GemFireRegion gfRegion = new GemFireRegion();
+    gfRegion.setName("Root");
+    gfRegion.setMemberId(memberId);
+    for (String region : regionNames) {
+      gfRegion.addSubRegion(createGemFireRegion(distributedSystemMXBeanProxy, connServer,memberId, region));
+    }
+    return gfRegion;
+  }
+  
+  public static GemFireRegion createGemFireRegion(DistributedSystemMXBean distributedSystemMXBeanProxy, MBeanServerConnection connServer, String memberId, String regionName) throws Exception{
+      ObjectName regionObjectName = distributedSystemMXBeanProxy.fetchRegionObjectName(memberId, regionName);
+      RegionMXBean rbean = JMX.newMXBeanProxy(connServer, regionObjectName, RegionMXBean.class);
+      RegionAttributesData ra = rbean.listRegionAttributes();
+      GemFireRegion region = new GemFireRegion();
+      region.setDataPolicy( ra.getDataPolicy());
+      region.setFullPath(rbean.getFullPath());
+      region.setName(rbean.getName());
+      
+      for(String subRegionName : rbean.listSubRegionPaths(true)){
+        GemFireRegion subRegion = createGemFireRegion(distributedSystemMXBeanProxy, connServer, memberId,  subRegionName);
+        region.addSubRegion(subRegion);
+      }
+      return region;
+  }
+}