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;
+ }
+}