/* Copyright (c) 2009 Google Inc.
*
* Licensed 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 com.google.appengine.demos.shardedcounter.v3;
import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Renders an HTML page showing current count of the sharded counter.
*
* Through the form, the user can increment the counter or add new shards.
*
* @author j.s@google.com (Jeff Scudder)
*/
public class CounterPage extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
displayPageStart(resp);
ShardedCounter counter = getOrCreateCounter(resp);
displayCounts(counter, resp);
displayInputFormAndClose(resp);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
displayPageStart(resp);
ShardedCounter counter = getOrCreateCounter(resp);
String query = req.getQueryString();
if (query != null && query.equals("addShard=true")) {
displayCount(counter, resp);
displayNumberOfShards(counter.addShard(), resp);
} else {
counter.increment();
displayCount(counter, resp);
displayNumberOfShards(counter.getNumShards(), resp);
}
displayInputFormAndClose(resp);
}
private void displayPageStart(HttpServletResponse resp) throws IOException {
resp.getWriter().println("<html>");
resp.getWriter().println(" <body>");
}
/**
* Creates the sharded counter if it does not yet exist.
*/
private ShardedCounter getOrCreateCounter(HttpServletResponse resp)
throws IOException {
CounterFactory factory = new CounterFactory();
ShardedCounter counter = factory.getCounter("test'\"counter");
if (counter == null) {
// Create a counter with 0 shards.
counter = factory.createCounter("test'\"counter");
// Add a first shard to the counter.
counter.addShard();
resp.getWriter().println(
"<p>No counter named 'test'\"counter', so we created one.</p>");
}
return counter;
}
private void displayCount(ShardedCounter counter, HttpServletResponse resp)
throws IOException {
resp.getWriter().println(" <p>Current count: " + counter.getCount()
+ "</p>");
}
private void displayCounts(ShardedCounter counter, HttpServletResponse resp)
throws IOException {
// Displays the overall count for the counter and the number of shards.
displayCount(counter, resp);
displayNumberOfShards(counter.getNumShards(), resp);
}
private void displayNumberOfShards(int shards, HttpServletResponse resp)
throws IOException {
resp.getWriter().print("<p>Counter has " + shards);
if (shards == 1) {
resp.getWriter().println(" shard</p>");
} else {
resp.getWriter().println(" shards</p>");
}
}
private void displayInputFormAndClose(HttpServletResponse resp)
throws IOException {
resp.getWriter().println("<form action=\"/v3\" method=\"post\">");
resp.getWriter().println(
" <div><input type=\"submit\" value=\"+1\" /></div>");
resp.getWriter().println("</form>");
resp.getWriter().println(
"<form action=\"/v3?addShard=true\" method=\"post\">");
resp.getWriter().println(
" <div><input type=\"submit\" value=\"Add Shard\" /></div>");
resp.getWriter().println("</form>");
resp.getWriter().println(" </body>");
resp.getWriter().println("</html>");
}
}