You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2009/06/28 20:21:49 UTC

svn commit: r789136 [2/8] - in /hadoop/hbase/trunk/src/contrib: ./ stargate/ stargate/lib/ stargate/src/ stargate/src/java/ stargate/src/java/org/ stargate/src/java/org/apache/ stargate/src/java/org/apache/hadoop/ stargate/src/java/org/apache/hadoop/hb...

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/SchemaResource.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/SchemaResource.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/SchemaResource.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/SchemaResource.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.CacheControl;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.UriInfo;
+import javax.xml.namespace.QName;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.TableExistsException;
+import org.apache.hadoop.hbase.TableNotFoundException;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
+import org.apache.hadoop.hbase.client.HTable;
+import org.apache.hadoop.hbase.client.HTablePool;
+import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
+import org.apache.hadoop.hbase.stargate.model.ColumnSchemaModel;
+import org.apache.hadoop.hbase.stargate.model.TableSchemaModel;
+import org.apache.hadoop.hbase.util.Bytes;
+
+public class SchemaResource implements Constants {
+  private static final Log LOG = LogFactory.getLog(SchemaResource.class);
+
+  private String table;
+  private CacheControl cacheControl;
+
+  public SchemaResource(String table) {
+    this.table = table;
+    cacheControl = new CacheControl();
+    cacheControl.setNoCache(true);
+    cacheControl.setNoTransform(false);
+  }
+
+  private HTableDescriptor getTableSchema() throws IOException,
+      TableNotFoundException {
+    HTablePool pool = RESTServlet.getInstance().getTablePool(this.table);
+    HTable table = pool.get();
+    try {
+      return table.getTableDescriptor();
+    } finally {
+      pool.put(table);
+    }
+  }
+
+  @GET
+  @Produces({MIMETYPE_TEXT, MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_JAVASCRIPT,
+    MIMETYPE_PROTOBUF})
+  public Response get(@Context UriInfo uriInfo) {
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("GET " + uriInfo.getAbsolutePath());
+    }
+    try {
+      HTableDescriptor htd = getTableSchema();
+      TableSchemaModel model = new TableSchemaModel();
+      model.setName(htd.getNameAsString());
+      for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
+          htd.getValues().entrySet()) {
+        model.addAttribute(Bytes.toString(e.getKey().get()), 
+            Bytes.toString(e.getValue().get()));
+      }
+      for (HColumnDescriptor hcd: htd.getFamilies()) {
+        ColumnSchemaModel columnModel = new ColumnSchemaModel();
+        columnModel.setName(hcd.getNameAsString());
+        for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
+          hcd.getValues().entrySet()) {
+        columnModel.addAttribute(Bytes.toString(e.getKey().get()), 
+          Bytes.toString(e.getValue().get()));
+      }
+        model.addColumnFamily(columnModel);
+      }
+      ResponseBuilder response = Response.ok(model);
+      response.cacheControl(cacheControl);
+      return response.build();
+    } catch (TableNotFoundException e) {
+      throw new WebApplicationException(Response.Status.NOT_FOUND);
+    } catch (IOException e) {
+      throw new WebApplicationException(e,
+                  Response.Status.SERVICE_UNAVAILABLE);
+    }
+  }
+
+  private Response update(TableSchemaModel model, boolean replace,
+      UriInfo uriInfo) {
+    // NOTE: 'replace' is currently ignored... we always replace the schema
+    try {
+      HTableDescriptor htd = new HTableDescriptor(table);
+      for (Map.Entry<QName,Object> e: model.getAny().entrySet()) {
+        htd.setValue(e.getKey().getLocalPart(), e.getValue().toString());
+      }
+      for (ColumnSchemaModel family: model.getColumns()) {
+        HColumnDescriptor hcd = new HColumnDescriptor(family.getName());
+        for (Map.Entry<QName,Object> e: family.getAny().entrySet()) {
+          hcd.setValue(e.getKey().getLocalPart(), e.getValue().toString());
+        }
+        htd.addFamily(hcd);
+      }
+      RESTServlet server = RESTServlet.getInstance();
+      HBaseAdmin admin = new HBaseAdmin(server.getConfiguration());
+      if (admin.tableExists(table)) {
+        admin.disableTable(table);
+        admin.modifyTable(Bytes.toBytes(table), htd);
+        server.invalidateMaxAge(table);
+        admin.enableTable(table);
+        return Response.ok().build();
+      } else {
+        admin.createTable(htd);
+        return Response.created(uriInfo.getAbsolutePath()).build();
+      }
+    } catch (TableExistsException e) {
+      // race, someone else created a table with the same name
+      throw new WebApplicationException(e, Response.Status.NOT_MODIFIED);
+    } catch (IOException e) {
+      throw new WebApplicationException(e, 
+            Response.Status.SERVICE_UNAVAILABLE);
+    }
+  }
+
+  @PUT
+  @Consumes({MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_JAVASCRIPT,
+    MIMETYPE_PROTOBUF})
+  public Response put(TableSchemaModel model, @Context UriInfo uriInfo) {
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("PUT " + uriInfo.getAbsolutePath());
+    }
+    return update(model, true, uriInfo);
+  }
+
+  @POST
+  @Consumes({MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_JAVASCRIPT,
+    MIMETYPE_PROTOBUF})
+  public Response post(TableSchemaModel model, @Context UriInfo uriInfo) {
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("PUT " + uriInfo.getAbsolutePath());
+    }
+    return update(model, false, uriInfo);
+  }
+
+  @DELETE
+  public Response delete(@Context UriInfo uriInfo) {     
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("DELETE " + uriInfo.getAbsolutePath());
+    }
+    try {
+      HBaseAdmin admin =
+        new HBaseAdmin(RESTServlet.getInstance().getConfiguration());
+      admin.disableTable(table);
+      admin.deleteTable(table);
+      return Response.ok().build();
+    } catch (TableNotFoundException e) {
+      throw new WebApplicationException(Response.Status.NOT_FOUND);
+    } catch (IOException e) {
+      throw new WebApplicationException(e, 
+            Response.Status.SERVICE_UNAVAILABLE);
+    }
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/StorageClusterStatusResource.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/StorageClusterStatusResource.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/StorageClusterStatusResource.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/StorageClusterStatusResource.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate;
+
+import java.io.IOException;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.CacheControl;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.UriInfo;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.hadoop.hbase.ClusterStatus;
+import org.apache.hadoop.hbase.HServerInfo;
+import org.apache.hadoop.hbase.HServerLoad;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
+import org.apache.hadoop.hbase.stargate.model.StorageClusterStatusModel;
+
+@Path(Constants.PATH_STATUS_CLUSTER)
+public class StorageClusterStatusResource implements Constants {
+  private static final Log LOG =
+    LogFactory.getLog(StorageClusterStatusResource.class);
+
+  private CacheControl cacheControl;
+
+  public StorageClusterStatusResource() {
+    cacheControl = new CacheControl();
+    cacheControl.setNoCache(true);
+    cacheControl.setNoTransform(false);
+  }
+
+  @GET
+  @Produces({MIMETYPE_TEXT, MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_JAVASCRIPT,
+    MIMETYPE_PROTOBUF})
+  public Response get(@Context UriInfo uriInfo) {
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("GET " + uriInfo.getAbsolutePath());
+    }
+    try {
+      RESTServlet server = RESTServlet.getInstance();
+      HBaseAdmin admin = new HBaseAdmin(server.getConfiguration());
+      ClusterStatus status = admin.getClusterStatus();
+      StorageClusterStatusModel model = new StorageClusterStatusModel();
+      model.setRegions(status.getRegionsCount());
+      model.setRequests(status.getRequestsCount());
+      model.setAverageLoad(status.getAverageLoad());
+      for (HServerInfo info: status.getServerInfo()) {
+        StorageClusterStatusModel.Node node = 
+          model.addLiveNode(
+            info.getServerAddress().getHostname() + ":" + 
+            Integer.toString(info.getServerAddress().getPort()),
+            info.getStartCode());
+        HServerLoad load = info.getLoad();
+        node.setRequests(load.getNumberOfRequests());
+        for (HServerLoad.RegionLoad region: load.getRegionsLoad()) {
+          node.addRegion(region.getName());
+        }
+      }
+      for (String name: status.getDeadServerNames()) {
+        model.addDeadNode(name);
+      }
+      ResponseBuilder response = Response.ok(model);
+      response.cacheControl(cacheControl);
+      return response.build();
+    } catch (IOException e) {
+      throw new WebApplicationException(e, 
+                  Response.Status.SERVICE_UNAVAILABLE);
+    }
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/StorageClusterVersionResource.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/StorageClusterVersionResource.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/StorageClusterVersionResource.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/StorageClusterVersionResource.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate;
+
+import java.io.IOException;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.CacheControl;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.core.Response.ResponseBuilder;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
+import org.apache.hadoop.hbase.stargate.model.StorageClusterVersionModel;
+
+@Path(Constants.PATH_VERSION_CLUSTER)
+public class StorageClusterVersionResource implements Constants {
+  private static final Log LOG =
+    LogFactory.getLog(StorageClusterVersionResource.class);
+
+  private CacheControl cacheControl;
+
+  public StorageClusterVersionResource() {
+    cacheControl = new CacheControl();
+    cacheControl.setNoCache(true);
+    cacheControl.setNoTransform(false);
+  }
+
+  @GET
+  @Produces({MIMETYPE_TEXT, MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_JAVASCRIPT,
+    MIMETYPE_PROTOBUF})
+  public Response get(@Context UriInfo uriInfo) {
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("GET " + uriInfo.getAbsolutePath());
+    }
+    try {
+      RESTServlet server = RESTServlet.getInstance();
+      HBaseAdmin admin = new HBaseAdmin(server.getConfiguration());
+      StorageClusterVersionModel model = new StorageClusterVersionModel();
+      model.setVersion(admin.getClusterStatus().getHBaseVersion());
+      ResponseBuilder response = Response.ok(model);
+      response.cacheControl(cacheControl);
+      return response.build();
+    } catch (IOException e) {
+      throw new WebApplicationException(e, 
+                  Response.Status.SERVICE_UNAVAILABLE);
+    }
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/TableResource.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/TableResource.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/TableResource.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/TableResource.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate;
+
+import java.io.IOException;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.CacheControl;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.core.Response.ResponseBuilder;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
+import org.apache.hadoop.hbase.stargate.model.TableListModel;
+import org.apache.hadoop.hbase.stargate.model.TableModel;
+
+@Path("/")
+public class TableResource implements Constants {
+  private static final Log LOG = LogFactory.getLog(TableResource.class);
+
+  private CacheControl cacheControl;
+
+  public TableResource() {
+    cacheControl = new CacheControl();
+    cacheControl.setNoCache(true);
+    cacheControl.setNoTransform(false);
+  }
+
+  private HTableDescriptor[] getTableList() throws IOException {
+    HBaseAdmin admin =
+      new HBaseAdmin(RESTServlet.getInstance().getConfiguration());
+    HTableDescriptor[] list = admin.listTables();
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("getTableList:");
+      for (HTableDescriptor htd: list) {
+        LOG.debug(htd.toString());
+      }
+    }
+    return list;
+  }
+
+  @GET
+  @Produces({MIMETYPE_TEXT, MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_JAVASCRIPT,
+    MIMETYPE_PROTOBUF})
+  public Response get(@Context UriInfo uriInfo) {
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("GET " + uriInfo.getAbsolutePath());
+    }
+    try {
+      TableListModel tableList = new TableListModel();
+      for (HTableDescriptor htd: getTableList()) {
+        if (htd.isMetaRegion()) {
+          continue;
+        }
+        tableList.add(new TableModel(htd.getNameAsString()));
+      }
+      ResponseBuilder response = Response.ok(tableList);
+      response.cacheControl(cacheControl);
+      return response.build();
+    } catch (IOException e) {
+      throw new WebApplicationException(e, 
+                  Response.Status.SERVICE_UNAVAILABLE);
+    }
+  }
+
+  @Path("{table}/regions")
+  public RegionsResource getRegionsResource(
+      @PathParam("table") String table) {
+    return new RegionsResource(table);    
+  }
+
+  @Path("{table}/scanner")
+  public ScannerResource getScannerResource(
+      @PathParam("table") String table) {
+    return new ScannerResource(table);    
+  }
+
+  @Path("{table}/schema")
+  public SchemaResource getSchemaResource(
+      @PathParam("table") String table) {
+    return new SchemaResource(table);    
+  }
+
+  @Path("{table}/{rowspec: .+}")
+  public RowResource getRowResource(
+      @PathParam("table") String table,
+      @PathParam("rowspec") String rowspec,
+      @QueryParam("v") String versions) {
+    try {
+      return new RowResource(table, rowspec, versions);
+    } catch (IOException e) {
+      throw new WebApplicationException(e, 
+                  Response.Status.INTERNAL_SERVER_ERROR);
+    }
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/VersionResource.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/VersionResource.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/VersionResource.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/VersionResource.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate;
+
+import javax.servlet.ServletContext;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.CacheControl;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.core.Response.ResponseBuilder;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hbase.stargate.model.VersionModel;
+
+@Path(Constants.PATH_VERSION)
+public class VersionResource implements Constants {
+  private static final Log LOG = LogFactory.getLog(VersionResource.class);
+
+  private CacheControl cacheControl;
+
+  public VersionResource() {
+    cacheControl = new CacheControl();
+    cacheControl.setNoCache(true);
+    cacheControl.setNoTransform(false);
+  }
+
+  @GET
+  @Produces({MIMETYPE_TEXT, MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_JAVASCRIPT,
+    MIMETYPE_PROTOBUF})
+  public Response get(@Context ServletContext context, @Context UriInfo uriInfo) {
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("GET " + uriInfo.getAbsolutePath());
+    }
+    ResponseBuilder response = Response.ok(new VersionModel(context));
+    response.cacheControl(cacheControl);
+    return response.build();
+  }
+  
+  // "/version/stargate" is an alias for "/version"
+  @Path("stargate")
+  public VersionResource getVersionResource() {
+    return this;
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Client.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Client.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Client.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Client.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,242 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.client;
+
+import java.io.IOException;
+
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpVersion;
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.apache.commons.httpclient.URI;
+import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
+import org.apache.commons.httpclient.methods.DeleteMethod;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.HeadMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.PutMethod;
+import org.apache.commons.httpclient.params.HttpClientParams;
+import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class Client {
+  public static final Header[] EMPTY_HEADER_ARRAY = new Header[0];
+
+  private static final Log LOG = LogFactory.getLog(Client.class);
+
+  private HttpClient httpClient;
+  private Cluster cluster;
+
+  public Client() {
+    this(null);
+  }
+
+  public Client(Cluster cluster) {
+    this.cluster = cluster;
+    httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());
+    HttpConnectionManagerParams managerParams =
+      httpClient.getHttpConnectionManager().getParams();
+    managerParams.setConnectionTimeout(2000); // 2 s
+    HttpClientParams clientParams = httpClient.getParams();
+    clientParams.setVersion(HttpVersion.HTTP_1_1);
+  }
+
+  public void shutdown() {
+    MultiThreadedHttpConnectionManager manager = 
+      (MultiThreadedHttpConnectionManager) httpClient.getHttpConnectionManager();
+    manager.shutdown();
+  }
+
+  @SuppressWarnings("deprecation")
+  public int executePathOnly(Cluster c, HttpMethod method, Header[] headers,
+      String path) throws IOException {
+    IOException lastException;
+    if (c.nodes.size() < 1) {
+      throw new IOException("Cluster is empty");
+    }
+    int start = (int)Math.round((c.nodes.size() - 1) * Math.random());
+    int i = start;
+    do {
+      c.lastHost = c.nodes.get(i);
+      try {
+        StringBuffer sb = new StringBuffer();
+        sb.append("http://");
+        sb.append(c.lastHost);
+        sb.append(path);
+        URI uri = new URI(sb.toString());
+        return executeURI(method, headers, uri.toString());
+      } catch (IOException e) {
+        lastException = e;
+      }
+    } while (++i != start && i < c.nodes.size());
+    throw lastException;
+  }
+
+  @SuppressWarnings("deprecation")
+  public int executeURI(HttpMethod method, Header[] headers, String uri)
+      throws IOException {
+    method.setURI(new URI(uri));
+    if (headers != null) {
+      for (Header header: headers) {
+        method.addRequestHeader(header);
+      }
+    }
+    long startTime = System.currentTimeMillis();
+    int code = httpClient.executeMethod(method);
+    long endTime = System.currentTimeMillis();
+    if (LOG.isDebugEnabled()) {
+      LOG.debug(method.getName() + " " + uri + ": " + code + " " +
+        method.getStatusText() + " in " + (endTime - startTime) + " ms");
+    }
+    return code;
+  }
+
+  public int execute(Cluster c, HttpMethod method, Header[] headers,
+      String path) throws IOException {
+    if (path.startsWith("/")) {
+      return executePathOnly(c, method, headers, path);
+    }
+    return executeURI(method, headers, path);
+  }
+
+  public Cluster getCluster() {
+    return cluster;
+  }
+
+  public void setCluster(Cluster cluster) {
+    this.cluster = cluster;
+  }
+
+  public Response head(String path) throws IOException {
+    return head(cluster, path);
+  }
+
+  public Response head(Cluster c, String path) throws IOException {
+    HeadMethod method = new HeadMethod();
+    int code = execute(c, method, null, path);
+    Header[] headers = method.getResponseHeaders();
+    method.releaseConnection();
+    return new Response(code, headers, null);
+  }
+
+  public Response get(String path) throws IOException {
+    return get(cluster, path);
+  }
+
+  public Response get(Cluster c, String path) throws IOException {
+    return get(c, path, EMPTY_HEADER_ARRAY);
+  }
+
+  public Response get(String path, String accept) throws IOException {
+    return get(cluster, path, accept);
+  }
+
+  public Response get(Cluster c, String path, String accept)
+      throws IOException {
+    Header[] headers = new Header[1];
+    headers[0] = new Header("Accept", accept);
+    return get(c, path, headers);
+  }
+
+  public Response get(String path, Header[] headers) throws IOException {
+    return get(cluster, path, headers);
+  }
+
+  public Response get(Cluster c, String path, Header[] headers) 
+      throws IOException {
+    GetMethod method = new GetMethod();
+    int code = execute(c, method, headers, path);
+    headers = method.getResponseHeaders();
+    byte[] body = method.getResponseBody();
+    method.releaseConnection();
+    return new Response(code, headers, body);
+  }
+
+  public Response put(String path, String contentType, byte[] content)
+      throws IOException {
+    return put(cluster, path, contentType, content);
+  }
+
+  public Response put(Cluster c, String path, String contentType, 
+      byte[] content) throws IOException {
+    Header[] headers = new Header[1];
+    headers[0] = new Header("Content-Type", contentType);
+    return put(c, path, headers, content);
+  }
+
+  public Response put(String path, Header[] headers, byte[] body) 
+      throws IOException {
+    return put(cluster, path, headers, body);
+  }
+
+  public Response put(Cluster c, String path, Header[] headers, 
+      byte[] body) throws IOException {
+    PutMethod method = new PutMethod();
+    method.setRequestEntity(new ByteArrayRequestEntity(body));
+    int code = execute(c, method, headers, path);
+    headers = method.getResponseHeaders();
+    body = method.getResponseBody();
+    method.releaseConnection();
+    return new Response(code, headers, body);
+  }
+
+  public Response post(String path, String contentType, byte[] content)
+      throws IOException {
+    return post(cluster, path, contentType, content);
+  }
+
+  public Response post(Cluster c, String path, String contentType, 
+      byte[] content) throws IOException {
+    Header[] headers = new Header[1];
+    headers[0] = new Header("Content-Type", contentType);
+    return post(c, path, headers, content);
+  }
+
+  public Response post(String path, Header[] headers, byte[] content) 
+      throws IOException {
+    return post(cluster, path, headers, content);
+  }
+
+  public Response post(Cluster c, String path, Header[] headers, 
+      byte[] content) throws IOException {
+    PostMethod method = new PostMethod();
+    method.setRequestEntity(new ByteArrayRequestEntity(content));
+    int code = execute(c, method, headers, path);
+    headers = method.getResponseHeaders();
+    content = method.getResponseBody();
+    method.releaseConnection();
+    return new Response(code, headers, content);
+  }
+
+  public Response delete(String path) throws IOException {
+    return delete(cluster, path);
+  }
+
+  public Response delete(Cluster c, String path) throws IOException {
+    DeleteMethod method = new DeleteMethod();
+    int code = execute(c, method, null, path);
+    Header[] headers = method.getResponseHeaders();
+    method.releaseConnection();
+    return new Response(code, headers);
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Cluster.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Cluster.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Cluster.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Cluster.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.client;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class Cluster {
+  protected List<String> nodes = 
+    Collections.synchronizedList(new ArrayList<String>());
+  protected String lastHost;
+
+  /**
+   * Constructor
+   */
+  public Cluster() {}
+
+  /**
+   * Constructor
+   * @param nodes a list of service locations, in 'host:port' format
+   */
+  public Cluster(List<String> nodes) {
+    nodes.addAll(nodes);
+  }
+
+  /**
+   * Add a node to the cluster
+   * @param name the service location in 'host:port' format
+   */
+  public Cluster add(String node) {
+    nodes.add(node);
+    return this;
+  }
+
+  /**
+   * Add a node to the cluster
+   * @param name host name
+   * @param port service port
+   */
+  public Cluster add(String name, int port) {
+    StringBuilder sb = new StringBuilder();
+    sb.append(name);
+    sb.append(':');
+    sb.append(port);
+    return add(sb.toString());
+  }
+
+  /**
+   * Remove a node from the cluster
+   * @param name the service location in 'host:port' format
+   */
+  public Cluster remove(String node) {
+    nodes.remove(node);
+    return this;
+  }
+
+  /**
+   * Remove a node from the cluster
+   * @param name host name
+   * @param port service port
+   */
+  public Cluster remove(String name, int port) {
+    StringBuilder sb = new StringBuilder();
+    sb.append(name);
+    sb.append(':');
+    sb.append(port);
+    return remove(sb.toString());
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Response.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Response.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Response.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Response.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.client;
+
+import org.apache.commons.httpclient.Header;
+
+public class Response {
+  private int code;
+  private Header[] headers;
+  private byte[] body;
+
+  /**
+   * Constructor
+   * @param code the HTTP response code
+   */
+  public Response(int code) {
+    this(code, null, null);
+  }
+
+  /**
+   * Constructor
+   * @param code the HTTP response code
+   * @param headers the HTTP response headers
+   */
+  public Response(int code, Header[] headers) {
+    this(code, headers, null);
+  }
+
+  /**
+   * Constructor
+   * @param code the HTTP response code
+   * @param headers the HTTP response headers
+   * @param body the response body, can be null
+   */
+  public Response(int code, Header[] headers, byte[] body) {
+    this.code = code;
+    this.headers = headers;
+    this.body = body;
+  }
+
+  /**
+   * @return the HTTP response code
+   */
+  public int getCode() {
+    return code;
+  }
+
+  /**
+   * @return the HTTP response headers
+   */
+  public Header[] getHeaders() {
+    return headers;
+  }
+
+  /**
+   * @return the value of the Location header
+   */
+  public String getLocation() {
+    for (Header header: headers) {
+      if (header.getName().equals("Location")) {
+        return header.getValue();
+      }
+    }
+    return null;
+  }
+
+  /**
+   * @return true if a response body was sent
+   */
+  public boolean hasBody() {
+    return body != null;
+  }
+
+  /**
+   * @return the HTTP response body
+   */
+  public byte[] getBody() {
+    return body;
+  }
+
+  /**
+   * @param code the HTTP response code
+   */
+  public void setCode(int code) {
+    this.code = code;
+  }
+
+  /**
+   * @param headers the HTTP response headers
+   */
+  public void setHeaders(Header[] headers) {
+    this.headers = headers;
+  }
+
+  /**
+   * @param body the response body
+   */
+  public void setBody(byte[] body) {
+    this.body = body;
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/CellModel.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/CellModel.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/CellModel.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/CellModel.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.model;
+
+import java.io.IOException;
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlValue;
+
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.stargate.protobuf.generated.CellMessage.Cell;
+
+import com.google.protobuf.ByteString;
+
+@XmlRootElement(name="Cell")
+@XmlType(propOrder={"column","timestamp"})
+public class CellModel implements IProtobufWrapper, Serializable {
+  private static final long serialVersionUID = 1L;
+  
+  private long   timestamp = HConstants.LATEST_TIMESTAMP;
+  private byte[] column;
+  private byte[] value;
+
+  public CellModel() {}
+
+  /**
+   * @param column
+   * @param value
+   */
+  public CellModel(byte[] column, byte[] value) {
+    super();
+    this.column = column;
+    this.value = value;
+  }
+
+  /**
+   * @param column
+   * @param timestamp
+   * @param value
+   */
+  public CellModel(byte[] column, long timestamp, byte[] value) {
+    super();
+    this.column = column;
+    this.timestamp = timestamp;
+    this.value = value;
+  }
+  
+  /**
+   * @return the column
+   */
+  @XmlAttribute
+  public byte[] getColumn() {
+    return column;
+  }
+
+  /**
+   * @param column the column to set
+   */
+  public void setColumn(byte[] column) {
+    this.column = column;
+  }
+
+  /**
+   * @return true if the timestamp property has been specified by the
+   * user
+   */
+  public boolean hasUserTimestamp() {
+    return timestamp != HConstants.LATEST_TIMESTAMP;
+  }
+
+  /**
+   * @return the timestamp
+   */
+  @XmlAttribute
+  public long getTimestamp() {
+    return timestamp;
+  }
+
+  /**
+   * @param timestamp the timestamp to set
+   */
+  public void setTimestamp(long timestamp) {
+    this.timestamp = timestamp;
+  }
+
+  /**
+   * @return the value
+   */
+  @XmlValue
+  public byte[] getValue() {
+    return value;
+  }
+
+  /**
+   * @param value the value to set
+   */
+  public void setValue(byte[] value) {
+    this.value = value;
+  }
+
+  @Override
+  public byte[] createProtobufOutput() {
+    Cell.Builder builder = Cell.newBuilder();
+    builder.setColumn(ByteString.copyFrom(getColumn()));
+    builder.setData(ByteString.copyFrom(getValue()));
+    if (hasUserTimestamp()) {
+      builder.setTimestamp(getTimestamp());
+    }
+    return builder.build().toByteArray();
+  }
+
+  @Override
+  public IProtobufWrapper getObjectFromMessage(byte[] message)
+      throws IOException {
+    Cell.Builder builder = Cell.newBuilder();
+    builder.mergeFrom(message);
+    setColumn(builder.getColumn().toByteArray());
+    setValue(builder.getData().toByteArray());
+    if (builder.hasTimestamp()) {
+      setTimestamp(builder.getTimestamp());
+    }
+    return this;
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/CellSetModel.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/CellSetModel.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/CellSetModel.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/CellSetModel.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.model;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlElement;
+
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.stargate.protobuf.generated.CellMessage.Cell;
+import org.apache.hadoop.hbase.stargate.protobuf.generated.CellSetMessage.CellSet;
+
+import com.google.protobuf.ByteString;
+
+@XmlRootElement(name="CellSet")
+public class CellSetModel implements Serializable, IProtobufWrapper {
+
+  private static final long serialVersionUID = 1L;
+  
+  private List<RowModel> rows;
+  
+  
+  public CellSetModel() {
+    this.rows = new ArrayList<RowModel>();
+  }
+  
+  /**
+   * @param rows
+   */
+  
+  public CellSetModel(List<RowModel> rows) {
+    super();
+    this.rows = rows;
+  }
+  
+  /**
+   * Add a row to this cell set
+   * 
+   * @param row
+   */
+  public void addRow(RowModel row) {
+    rows.add(row);
+  }
+
+  /**
+   * @return the rows
+   */
+  @XmlElement(name="Row")
+  public List<RowModel> getRows() {
+    return rows;
+  }
+
+  @Override
+  public byte[] createProtobufOutput() {
+    CellSet.Builder builder = CellSet.newBuilder();
+    for (RowModel row: getRows()) {
+      CellSet.Row.Builder rowBuilder = CellSet.Row.newBuilder();
+      rowBuilder.setKey(ByteString.copyFrom(row.getKey()));
+      for (CellModel cell: row.getCells()) {
+        Cell.Builder cellBuilder = Cell.newBuilder();
+        cellBuilder.setColumn(ByteString.copyFrom(cell.getColumn()));
+        cellBuilder.setData(ByteString.copyFrom(cell.getValue()));
+        if (cell.hasUserTimestamp()) {
+          cellBuilder.setTimestamp(cell.getTimestamp());
+        }
+        rowBuilder.addValues(cellBuilder);
+      }
+      builder.addRows(rowBuilder);
+    }
+    return builder.build().toByteArray();
+  }
+
+  @Override
+  public IProtobufWrapper getObjectFromMessage(byte[] message)
+      throws IOException {
+    CellSet.Builder builder = CellSet.newBuilder();
+    builder.mergeFrom(message);
+    for (CellSet.Row row: builder.getRowsList()) {
+      RowModel rowModel = new RowModel(row.getKey().toByteArray());
+      for (Cell cell: row.getValuesList()) {
+        long timestamp = HConstants.LATEST_TIMESTAMP;
+        if (cell.hasTimestamp()) {
+          timestamp = cell.getTimestamp();
+        }
+        rowModel.addCell(
+            new CellModel(cell.getColumn().toByteArray(), timestamp,
+                  cell.getData().toByteArray()));
+      }
+      addRow(rowModel);
+    }
+    return this;
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/ColumnSchemaModel.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/ColumnSchemaModel.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/ColumnSchemaModel.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/ColumnSchemaModel.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.model;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HConstants;
+
+@XmlRootElement(name="ColumnSchema")
+@XmlType(propOrder = {"name"})
+public class ColumnSchemaModel implements Serializable {
+  private static final long serialVersionUID = 1L;
+  private static QName BLOCKCACHE = new QName(HColumnDescriptor.BLOCKCACHE);
+  private static QName BLOCKSIZE = new QName(HColumnDescriptor.BLOCKSIZE);
+  private static QName BLOOMFILTER = new QName(HColumnDescriptor.BLOOMFILTER);
+  private static QName COMPRESSION = new QName(HColumnDescriptor.COMPRESSION);
+  private static QName IN_MEMORY = new QName(HConstants.IN_MEMORY);
+  private static QName TTL = new QName(HColumnDescriptor.TTL);
+  private static QName VERSIONS = new QName(HConstants.VERSIONS);
+
+  private String name;
+  private Map<QName,Object> attrs = new HashMap<QName,Object>();
+
+  public ColumnSchemaModel() {}
+
+  public void addAttribute(String name, Object value) {
+    attrs.put(new QName(name), value);
+  }
+
+  public String getAttribute(String name) {
+    return attrs.get(new QName(name)).toString();
+  }
+
+  /**
+   * @return the column name
+   */
+  @XmlAttribute
+  public String getName() {
+    return name;
+  }
+
+  /**
+   * @return the map for holding unspecified (user) attributes
+   */
+  @XmlAnyAttribute
+  public Map<QName,Object> getAny() {
+    return attrs;
+  }
+
+  /**
+   * @param the table name
+   */
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  /* (non-Javadoc)
+   * @see java.lang.Object#toString()
+   */
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("{ NAME => '");
+    sb.append(name);
+    sb.append('\'');
+    for (Map.Entry<QName,Object> e: attrs.entrySet()) {
+      sb.append(", ");
+      sb.append(e.getKey().getLocalPart());
+      sb.append(" => '");
+      sb.append(e.getValue().toString());
+      sb.append('\'');
+    }
+    sb.append(" }");
+    return sb.toString();
+  }
+
+  // getters and setters for common schema attributes
+
+  // cannot be standard bean type getters and setters, otherwise this would
+  // confuse JAXB
+
+  public boolean __getBlockcache() {
+    Object o = attrs.get(BLOCKCACHE);
+    return o != null ? 
+      Boolean.valueOf(o.toString()) : HColumnDescriptor.DEFAULT_BLOCKCACHE;
+  }
+
+  public int __getBlocksize() {
+    Object o = attrs.get(BLOCKSIZE);
+    return o != null ? 
+      Integer.valueOf(o.toString()) : HColumnDescriptor.DEFAULT_BLOCKSIZE;
+  }
+
+  public boolean __getBloomfilter() {
+    Object o = attrs.get(BLOOMFILTER);
+    return o != null ? 
+      Boolean.valueOf(o.toString()) : HColumnDescriptor.DEFAULT_BLOOMFILTER;
+  }
+
+  public String __getCompression() {
+    Object o = attrs.get(COMPRESSION);
+    return o != null ? o.toString() : HColumnDescriptor.DEFAULT_COMPRESSION;
+  }
+
+  public boolean __getInMemory() {
+    Object o = attrs.get(IN_MEMORY);
+    return o != null ? 
+      Boolean.valueOf(o.toString()) : HColumnDescriptor.DEFAULT_IN_MEMORY;
+  }
+
+  public int __getTTL() {
+    Object o = attrs.get(TTL);
+    return o != null ? 
+      Integer.valueOf(o.toString()) : HColumnDescriptor.DEFAULT_TTL;
+  }
+
+  public int __getVersions() {
+    Object o = attrs.get(VERSIONS);
+    return o != null ? 
+      Integer.valueOf(o.toString()) : HColumnDescriptor.DEFAULT_VERSIONS;
+  }
+
+  public void __setBlocksize(int value) {
+    attrs.put(BLOCKSIZE, Integer.toString(value));
+  }
+
+  public void __setBlockcache(boolean value) {
+    attrs.put(BLOCKCACHE, Boolean.toString(value));
+  }
+
+  public void __setBloomfilter(boolean value) {
+    attrs.put(BLOOMFILTER, Boolean.toString(value));
+  }
+
+  public void __setCompression(String value) {
+    attrs.put(COMPRESSION, value); 
+  }
+
+  public void __setInMemory(boolean value) {
+    attrs.put(IN_MEMORY, Boolean.toString(value));
+  }
+
+  public void __setTTL(int value) {
+    attrs.put(TTL, Integer.toString(value));
+  }
+
+  public void __setVersions(int value) {
+    attrs.put(VERSIONS, Integer.toString(value));
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/IProtobufWrapper.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/IProtobufWrapper.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/IProtobufWrapper.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/IProtobufWrapper.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.model;
+
+import java.io.IOException;
+
+public abstract interface IProtobufWrapper {
+  public byte[] createProtobufOutput();
+  public IProtobufWrapper getObjectFromMessage(byte[] message)
+    throws IOException;
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/RowModel.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/RowModel.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/RowModel.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/RowModel.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.model;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="Row")
+public class RowModel implements IProtobufWrapper, Serializable {
+  private static final long serialVersionUID = 1L;
+
+  private byte[]            key;
+  private List<CellModel>   cells = new ArrayList<CellModel>();
+
+  public RowModel() { }
+
+  /**
+   * @param key
+   */
+  public RowModel(final String key) {
+    this(key.getBytes());
+  }
+  
+  /**
+   * @param key
+   */
+  public RowModel(final byte[] key) {
+    super();
+    this.key = key;
+    cells = new ArrayList<CellModel>();
+  }
+
+  /**
+   * @param key
+   * @param cells
+   */
+  public RowModel(final String key, final List<CellModel> cells) {
+    this(key.getBytes(), cells);
+  }
+  
+  /**
+   * @param key
+   * @param cells
+   */
+  public RowModel(final byte[] key, final List<CellModel> cells) {
+    super();
+    this.key = key;
+    this.cells = cells;
+  }
+  
+  /**
+   * Adds a cell to the list of cells for this row
+   * 
+   * @param cell
+   */
+  public void addCell(CellModel cell) {
+    cells.add(cell);
+  }
+
+  /**
+   * @return the key
+   */
+  @XmlAttribute
+  public byte[] getKey() {
+    return key;
+  }
+
+  /**
+   * @param key the key to set
+   */
+  public void setKey(byte[] key) {
+    this.key = key;
+  }
+
+  /**
+   * @return the cells
+   */
+  @XmlElement(name="Cell")
+  public List<CellModel> getCells() {
+    return cells;
+  }
+
+  @Override
+  public byte[] createProtobufOutput() {
+    // there is no standalone row protobuf message
+    throw new UnsupportedOperationException(
+        "no protobuf equivalent to RowModel");
+  }
+
+  @Override
+  public IProtobufWrapper getObjectFromMessage(byte[] message)
+      throws IOException {
+    // there is no standalone row protobuf message
+    throw new UnsupportedOperationException(
+        "no protobuf equivalent to RowModel");
+  }
+
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/ScannerModel.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/ScannerModel.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/ScannerModel.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/ScannerModel.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,220 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.model;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.stargate.protobuf.generated.ScannerMessage.Scanner;
+import org.apache.hadoop.hbase.util.Bytes;
+
+import com.google.protobuf.ByteString;
+
+@XmlRootElement(name="Scanner")
+public class ScannerModel implements IProtobufWrapper, Serializable {
+  private static final long serialVersionUID = 1L;
+
+  private byte[] startRow = HConstants.EMPTY_START_ROW;
+  private byte[] endRow = HConstants.EMPTY_END_ROW;;
+  private List<byte[]> columns = new ArrayList<byte[]>();
+  private int batch = 1;
+  private long startTime = 0;
+  private long endTime = Long.MAX_VALUE;
+
+  public ScannerModel() {}
+
+  public ScannerModel(byte[] startRow, byte[] endRow, List<byte[]> columns,
+      int batch, long endTime) {
+    super();
+    this.startRow = startRow;
+    this.endRow = endRow;
+    this.columns = columns;
+    this.batch = batch;
+    this.endTime = endTime;
+  }
+
+  public ScannerModel(byte[] startRow, byte[] endRow, List<byte[]> columns,
+      int batch, long startTime, long endTime) {
+    super();
+    this.startRow = startRow;
+    this.endRow = endRow;
+    this.columns = columns;
+    this.batch = batch;
+    this.startTime = startTime;
+    this.endTime = endTime;
+  }
+
+  public void addColumn(byte[] column) {
+    columns.add(column);
+  }
+
+  /**
+   * @return true if a start row was specified
+   */
+  public boolean hasStartRow() {
+    return !Bytes.equals(startRow, HConstants.EMPTY_START_ROW);
+  }
+
+  /**
+   * @return start row
+   */
+  @XmlAttribute
+  public byte[] getStartRow() {
+    return startRow;
+  }
+
+  /**
+   * @return true if an end row was specified
+   */
+  public boolean hasEndRow() {
+    return !Bytes.equals(endRow, HConstants.EMPTY_END_ROW);
+  }
+
+  /**
+   * @return end row
+   */
+  @XmlAttribute
+  public byte[] getEndRow() {
+    return endRow;
+  }
+
+  /**
+   * @return list of columns of interest, or empty for all
+   */
+  @XmlAttribute(name="column")
+  public List<byte[]> getColumns() {
+    return columns;
+  }
+  
+  /**
+   * @return the number of cells to return in batch
+   */
+  @XmlAttribute
+  public int getBatch() {
+    return batch;
+  }
+
+  /**
+   * @return the lower bound on timestamps of items of interest
+   */
+  @XmlAttribute
+  public long getStartTime() {
+    return startTime;
+  }
+
+  /**
+   * @return the upper bound on timestamps of items of interest
+   */
+  @XmlAttribute
+  public long getEndTime() {
+    return endTime;
+  }
+
+  /**
+   * @param startRow start row
+   */
+  public void setStartRow(byte[] startRow) {
+    this.startRow = startRow;
+  }
+
+  /**
+   * @param endRow end row
+   */
+  public void setEndRow(byte[] endRow) {
+    this.endRow = endRow;
+  }
+
+  /**
+   * @param batch the number of cells to return in batch
+   */
+  public void setBatch(int batch) {
+    this.batch = batch;
+  }
+
+  /**
+   * @param startTime the lower bound on timestamps of items of interest
+   */
+  public void setStartTime(long startTime) {
+    this.startTime = startTime;
+  }
+
+  /**
+   * @param endTime the upper bound on timestamps of items of interest
+   */
+  public void setEndTime(long endTime) {
+    this.endTime = endTime;
+  }
+
+  @Override
+  public byte[] createProtobufOutput() {
+    Scanner.Builder builder = Scanner.newBuilder();
+    if (!Bytes.equals(startRow, HConstants.EMPTY_START_ROW)) {
+      builder.setStartRow(ByteString.copyFrom(startRow));
+    }
+    if (!Bytes.equals(endRow, HConstants.EMPTY_START_ROW)) {
+      builder.setEndRow(ByteString.copyFrom(endRow));
+    }
+    for (byte[] column: columns) {
+      builder.addColumns(ByteString.copyFrom(column));
+    }
+    builder.setBatch(batch);
+    if (startTime != 0) {
+      builder.setStartTime(startTime);
+    }
+    if (endTime != 0) {
+      builder.setEndTime(endTime);
+    }
+    builder.setBatch(getBatch());
+    return builder.build().toByteArray();
+  }
+
+  @Override
+  public IProtobufWrapper getObjectFromMessage(byte[] message)
+      throws IOException {
+    Scanner.Builder builder = Scanner.newBuilder();
+    builder.mergeFrom(message);
+    if (builder.hasStartRow()) {
+      startRow = builder.getStartRow().toByteArray();
+    }
+    if (builder.hasEndRow()) {
+      endRow = builder.getEndRow().toByteArray();
+    }
+    for (ByteString column: builder.getColumnsList()) {
+      addColumn(column.toByteArray());
+    }
+    if (builder.hasBatch()) {
+      batch = builder.getBatch();
+    }
+    if (builder.hasStartTime()) {
+      startTime = builder.getStartTime();
+    }
+    if (builder.hasEndTime()) {
+      endTime = builder.getEndTime();
+    }
+    return this;
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/StorageClusterStatusModel.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/StorageClusterStatusModel.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/StorageClusterStatusModel.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/StorageClusterStatusModel.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,289 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.model;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.hadoop.hbase.stargate.protobuf.generated.StorageClusterStatusMessage.StorageClusterStatus;
+import org.apache.hadoop.hbase.util.Bytes;
+
+import com.google.protobuf.ByteString;
+
+@XmlRootElement(name="ClusterStatus")
+public class StorageClusterStatusModel 
+    implements Serializable, IProtobufWrapper {
+	private static final long serialVersionUID = 1L;
+
+	public static class Node {
+	  
+	  public static class Region {
+	    private byte[] name;
+
+	    public Region() {}
+
+	    public Region(byte[] name) {
+	      this.name = name;
+	    }
+
+	    @XmlAttribute
+	    public byte[] getName() {
+	      return name;
+	    }
+
+	    public void setName(byte[] name) {
+	      this.name = name;
+	    }
+	  }
+
+	  private String name;
+    private long startCode;
+    private int requests;
+    private List<Region> regions = new ArrayList<Region>();
+
+    public void addRegion(byte[] name) {
+      regions.add(new Region(name));
+    }
+
+    public Region getRegion(int i) {
+      return regions.get(i);
+    }
+
+    public Node() {}
+
+    public Node(String name, long startCode) {
+      this.name = name;
+      this.startCode = startCode;
+    }
+
+    @XmlAttribute
+    public String getName() {
+      return name;
+    }
+
+    @XmlAttribute
+    public long getStartCode() {
+      return startCode;
+    }
+
+    @XmlElement(name="Region")
+    public List<Region> getRegions() {
+      return regions;
+    }
+
+    @XmlAttribute
+    public int getRequests() {
+      return requests;
+    }
+
+    public void setName(String name) {
+      this.name = name;
+    }
+
+    public void setStartCode(long startCode) {
+      this.startCode = startCode;
+    }
+
+    public void setRegions(List<Region> regions) {
+      this.regions = regions;
+    }
+
+    public void setRequests(int requests) {
+      this.requests = requests;
+    }
+	}
+
+	private List<Node> liveNodes = new ArrayList<Node>();
+	private List<String> deadNodes = new ArrayList<String>();
+	private int regions;
+	private int requests;
+	private double averageLoad;
+
+	public Node addLiveNode(String name, long startCode) {
+	  Node node = new Node(name, startCode);
+	  liveNodes.add(node);
+	  return node;
+	}
+
+	public Node getLiveNode(int i) {
+	  return liveNodes.get(i);
+	}
+
+	public void addDeadNode(String node) {
+	  deadNodes.add(node);
+	}
+	
+	public String getDeadNode(int i) {
+	  return deadNodes.get(i);
+	}
+
+	public StorageClusterStatusModel() {}
+
+	@XmlElement(name="Node")
+	@XmlElementWrapper(name="LiveNodes")
+	public List<Node> getLiveNodes() {
+	  return liveNodes;
+	}
+
+  @XmlElement(name="Node")
+  @XmlElementWrapper(name="DeadNodes")
+  public List<String> getDeadNodes() {
+    return deadNodes;
+  }
+
+  @XmlAttribute
+  public int getRegions() {
+    return regions;
+  }
+  
+  @XmlAttribute
+  public int getRequests() {
+    return requests;
+  }
+
+  @XmlAttribute
+  public double getAverageLoad() {
+    return averageLoad;
+  }
+
+  public void setLiveNodes(List<Node> nodes) {
+    this.liveNodes = nodes;
+  }
+
+  public void setDeadNodes(List<String> nodes) {
+    this.deadNodes = nodes;
+  }
+
+  public void setRegions(int regions) {
+    this.regions = regions;
+  }
+  
+  public void setRequests(int requests) {
+    this.requests = requests;
+  }
+
+  public void setAverageLoad(double averageLoad) {
+    this.averageLoad = averageLoad;
+  }
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+	  StringBuilder sb = new StringBuilder();
+	  sb.append(String.format("%d live servers, %d dead servers, " + 
+      "%.4f average load\n\n", liveNodes.size(), deadNodes.size(),
+      averageLoad));
+    if (!liveNodes.isEmpty()) {
+      sb.append(liveNodes.size());
+      sb.append(" live servers\n");
+      for (Node node: liveNodes) {
+        sb.append("    ");
+        sb.append(node.name);
+        sb.append(' ');
+        sb.append(node.startCode);
+        sb.append("\n        requests=");
+        sb.append(node.requests);
+        sb.append(", regions=");
+        sb.append(node.regions.size());
+        sb.append("\n\n");
+        for (Node.Region region: node.regions) {
+          sb.append("        ");
+          sb.append(Bytes.toString(region.name));
+          sb.append('\n');
+        }
+        sb.append('\n');
+      }
+    }
+    if (!deadNodes.isEmpty()) {
+      sb.append('\n');
+      sb.append(deadNodes.size());
+      sb.append(" dead servers\n");
+      for (String node: deadNodes) {
+        sb.append("    ");
+        sb.append(node);
+        sb.append('\n');
+      }
+    }
+	  return sb.toString();
+	}
+
+  @Override
+  public byte[] createProtobufOutput() {
+    StorageClusterStatus.Builder builder = StorageClusterStatus.newBuilder();
+    builder.setRegions(regions);
+    builder.setRequests(requests);
+    builder.setAverageLoad(averageLoad);
+    for (Node node: liveNodes) {
+      StorageClusterStatus.Node.Builder nodeBuilder = 
+        StorageClusterStatus.Node.newBuilder();
+      nodeBuilder.setName(node.name);
+      nodeBuilder.setStartCode(node.startCode);
+      nodeBuilder.setRequests(node.requests);
+      for (Node.Region region: node.regions) {
+        nodeBuilder.addRegions(ByteString.copyFrom(region.name));
+      }
+      builder.addLiveNodes(nodeBuilder);
+    }
+    for (String node: deadNodes) {
+      builder.addDeadNodes(node);
+    }
+    return builder.build().toByteArray();
+  }
+
+  @Override
+  public IProtobufWrapper getObjectFromMessage(byte[] message)
+      throws IOException {
+    StorageClusterStatus.Builder builder = StorageClusterStatus.newBuilder();
+    builder.mergeFrom(message);
+    if (builder.hasRegions()) {
+      regions = builder.getRegions();
+    }
+    if (builder.hasRequests()) {
+      requests = builder.getRequests();
+    }
+    if (builder.hasAverageLoad()) {
+      averageLoad = builder.getAverageLoad();
+    }
+    for (StorageClusterStatus.Node node: builder.getLiveNodesList()) {
+      long startCode = node.hasStartCode() ? node.getStartCode() : -1;
+      StorageClusterStatusModel.Node nodeModel = 
+        addLiveNode(node.getName(), startCode);
+      int requests = node.hasRequests() ? node.getRequests() : 0;
+      nodeModel.setRequests(requests);
+      for (ByteString region: node.getRegionsList()) {
+        nodeModel.addRegion(region.toByteArray());
+      }
+    }
+    for (String node: builder.getDeadNodesList()) {
+      addDeadNode(node);
+    }
+    return this;
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/StorageClusterVersionModel.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/StorageClusterVersionModel.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/StorageClusterVersionModel.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/StorageClusterVersionModel.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.model;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlValue;
+
+@XmlRootElement(name="ClusterVersion")
+public class StorageClusterVersionModel implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	private String version;
+
+	@XmlValue
+	public String getVersion() {
+	  return version;
+	}
+	
+	public void setVersion(String version) {
+	  this.version = version;
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+	  return version;
+	}
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableInfoModel.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableInfoModel.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableInfoModel.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableInfoModel.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.model;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.hadoop.hbase.stargate.protobuf.generated.TableInfoMessage.TableInfo;
+
+import com.google.protobuf.ByteString;
+
+@XmlRootElement(name="TableInfo")
+@XmlType(propOrder = {"name","regions"})
+public class TableInfoModel implements Serializable, IProtobufWrapper {
+  private static final long serialVersionUID = 1L;
+
+  private String name;
+  private List<TableRegionModel> regions = new ArrayList<TableRegionModel>();
+
+  public TableInfoModel() {}
+
+  public TableInfoModel(String name) {
+    this.name = name;
+  }
+
+  public void add(TableRegionModel object) {
+    regions.add(object);
+  }
+  
+  public TableRegionModel get(int index) {
+    return regions.get(index);
+  }
+
+  /**
+   * @return the table name
+   */
+  @XmlAttribute
+  public String getName() {
+    return name;
+  }
+
+  /**
+   * @return the regions
+   */
+  @XmlElement(name="Region")
+  public List<TableRegionModel> getRegions() {
+    return regions;
+  }
+
+  /**
+   * @param the table name
+   */
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  /**
+   * @param regions the regions to set
+   */
+  public void setRegions(List<TableRegionModel> regions) {
+    this.regions = regions;
+  }
+
+  /* (non-Javadoc)
+   * @see java.lang.Object#toString()
+   */
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    for(TableRegionModel aRegion : regions) {
+      sb.append(aRegion.toString());
+      sb.append('\n');
+    }
+    return sb.toString();
+  }
+
+  @Override
+  public byte[] createProtobufOutput() {
+    TableInfo.Builder builder = TableInfo.newBuilder();
+    builder.setName(name);
+    for (TableRegionModel aRegion: regions) {
+      TableInfo.Region.Builder regionBuilder = TableInfo.Region.newBuilder();
+      regionBuilder.setName(aRegion.getName());
+      regionBuilder.setId(aRegion.getId());
+      regionBuilder.setStartKey(ByteString.copyFrom(aRegion.getStartKey()));
+      regionBuilder.setEndKey(ByteString.copyFrom(aRegion.getEndKey()));
+      regionBuilder.setLocation(aRegion.getLocation());
+      builder.addRegions(regionBuilder);
+    }
+    return builder.build().toByteArray();
+  }
+
+  @Override
+  public IProtobufWrapper getObjectFromMessage(byte[] message) 
+      throws IOException {
+    TableInfo.Builder builder = TableInfo.newBuilder();
+    builder.mergeFrom(message);
+    setName(builder.getName());
+    for (TableInfo.Region region: builder.getRegionsList()) {
+      add(new TableRegionModel(builder.getName(), region.getId(), 
+          region.getStartKey().toByteArray(),
+          region.getEndKey().toByteArray(),
+          region.getLocation()));
+    }
+    return this;
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableListModel.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableListModel.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableListModel.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableListModel.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.model;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.hadoop.hbase.stargate.protobuf.generated.TableListMessage.TableList;
+
+@XmlRootElement(name="TableList")
+public class TableListModel implements Serializable, IProtobufWrapper {
+
+	private static final long serialVersionUID = 1L;
+
+	private List<TableModel> tables = new ArrayList<TableModel>();
+
+	public TableListModel() {}
+	
+	public void add(TableModel object) {
+		tables.add(object);
+	}
+	
+	public TableModel get(int index) {
+		return tables.get(index);
+	}
+
+	/**
+	 * @return the tables
+	 */
+	@XmlElementRef(name="table")
+	public List<TableModel> getTables() {
+		return tables;
+	}
+
+	/**
+	 * @param tables the tables to set
+	 */
+	public void setTables(List<TableModel> tables) {
+		this.tables = tables;
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		for(TableModel aTable : tables) {
+			sb.append(aTable.toString());
+			sb.append('\n');
+		}
+		return sb.toString();
+	}
+
+	@Override
+	public byte[] createProtobufOutput() {
+		TableList.Builder builder = TableList.newBuilder();
+		for (TableModel aTable : tables) {
+			builder.addName(aTable.getName());
+		}
+		return builder.build().toByteArray();
+	}
+
+  @Override
+  public IProtobufWrapper getObjectFromMessage(byte[] message)
+      throws IOException {
+    TableList.Builder builder = TableList.newBuilder();
+    builder.mergeFrom(message);
+    for (String table: builder.getNameList()) {
+      this.add(new TableModel(table));
+    }
+    return this;
+  }
+}

Added: hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableModel.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableModel.java?rev=789136&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableModel.java (added)
+++ hadoop/hbase/trunk/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableModel.java Sun Jun 28 18:21:45 2009
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2009 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.model;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="table")
+public class TableModel implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+	private String name;
+	
+	public TableModel() {}
+
+	/**
+	 * @param name
+	 */
+	public TableModel(String name) {
+		super();
+		this.name = name;
+	}
+
+	/**
+	 * @return the name
+	 */
+	@XmlAttribute
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * @param name the name to set
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+		return this.name;
+	}
+}