| /******************************************************************************* |
| * Copyright (c) 2012, 2018 Wind River and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Wind River - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.equinox.p2.testserver.servlets; |
| |
| import java.io.BufferedReader; |
| import java.io.IOException; |
| import java.io.PrintWriter; |
| import java.io.StringReader; |
| import java.text.DateFormat; |
| import java.text.SimpleDateFormat; |
| import java.util.Date; |
| import java.util.HashMap; |
| import java.util.Locale; |
| import java.util.Map; |
| import java.util.TimeZone; |
| import javax.servlet.http.HttpServlet; |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletResponse; |
| import org.eclipse.equinox.p2.testserver.HttpConstants; |
| |
| public class Stats extends HttpServlet { |
| |
| private static final long serialVersionUID = -3209768955270841029L; |
| private static final String UnkownPackage = "unkown"; //$NON-NLS-1$ |
| private static final String PACKAGE = "package"; //$NON-NLS-1$ |
| private final Map<String, Integer> downloadStats = new HashMap<>(); |
| |
| public Stats() { |
| downloadStats.put(UnkownPackage, Integer.valueOf(0)); |
| } |
| |
| @Override |
| protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { |
| responseHeaderAndStatus(response); |
| |
| final String result = getStatsResult(); |
| response.setContentLength(result.length()); |
| response.setContentType("text/plain"); //$NON-NLS-1$ |
| |
| BufferedReader reader = new BufferedReader(new StringReader(result)); |
| PrintWriter writer = response.getWriter(); |
| try { |
| writer.flush(); /* write the headers and unbuffer the output */ |
| char buffer[] = new char[4096]; |
| int read; |
| while ((read = reader.read(buffer, 0, buffer.length)) != -1) { |
| writer.write(buffer, 0, read); |
| } |
| } finally { |
| reader.close(); |
| writer.close(); |
| } |
| } |
| |
| private void responseHeaderAndStatus(HttpServletResponse response) { |
| // set when the resource was modified |
| DateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); //$NON-NLS-1$ |
| // must always be GMT |
| df.setTimeZone(TimeZone.getTimeZone("GMT")); //$NON-NLS-1$ |
| response.setHeader(HttpConstants.LAST_MODIFIED, df.format(new Date())); |
| response.setStatus(HttpServletResponse.SC_OK); |
| } |
| |
| private String getStatsResult() { |
| StringBuffer sb = new StringBuffer(); |
| sb.append( |
| "It's a page to count the downloading times when heading this page with query 'package=<package name>'.\n"); //$NON-NLS-1$ |
| for (String string : downloadStats.keySet()) { |
| String packageName = string; |
| sb.append(packageName).append(" download number: ").append(downloadStats.get(packageName)).append("\n"); //$NON-NLS-1$//$NON-NLS-2$ |
| } |
| return sb.toString(); |
| } |
| |
| @Override |
| protected void doHead(HttpServletRequest request, HttpServletResponse response) { |
| String queryString = request.getQueryString(); |
| |
| responseHeaderAndStatus(response); |
| |
| boolean found = false; |
| if (queryString != null) { |
| String[] parameters = queryString.split("&"); //$NON-NLS-1$ |
| for (String parameter : parameters) { |
| String[] paraPair = parameter.split("=", 2); //$NON-NLS-1$ |
| if (paraPair.length == 2 && PACKAGE.equals(paraPair[0])) { |
| found = true; |
| Integer count = downloadStats.get(paraPair[1]); |
| if (count == null) { |
| count = Integer.valueOf(1); |
| } else |
| count = Integer.valueOf(1 + count.intValue()); |
| downloadStats.put(paraPair[1], count); |
| break; |
| } |
| } |
| } |
| if (!found) { |
| Integer count = downloadStats.get(UnkownPackage); |
| downloadStats.put(UnkownPackage, Integer.valueOf(1 + count.intValue())); |
| } |
| } |
| } |