File Source: viewcountriesaction.java
/*
P/P * Method: int compare(Object, Object)
*
* Postconditions:
* init'ed(return_value)
*/
1 /*
2 * Copyright (c) 2003-2006, Simon Brown
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * - Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in
13 * the documentation and/or other materials provided with the
14 * distribution.
15 *
16 * - Neither the name of Pebble nor the names of its contributors may
17 * be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32 package net.sourceforge.pebble.web.action;
33
/*
P/P * Method: void net.sourceforge.pebble.web.action.ViewCountriesAction()
*/
34 import com.maxmind.geoip.LookupService;
35 import net.sourceforge.pebble.logging.Log;
36 import net.sourceforge.pebble.logging.LogEntry;
37 import net.sourceforge.pebble.logging.Request;
38 import net.sourceforge.pebble.web.view.View;
39 import net.sourceforge.pebble.web.view.impl.CountriesView;
40 import net.sourceforge.pebble.domain.Blog;
41 import net.sourceforge.pebble.Constants;
42
43 import javax.servlet.ServletException;
44 import javax.servlet.http.HttpServletRequest;
45 import javax.servlet.http.HttpServletResponse;
46 import java.io.IOException;
47 import java.util.*;
48
49 /**
50 * Gets the visitor country information for the specified time period.
51 *
52 * @author Simon Brown
53 */
54 public class ViewCountriesAction extends AbstractLogAction {
55
56 /**
57 * Peforms the processing associated with this action.
58 *
59 * @param request the HttpServletRequest instance
60 * @param response the HttpServletResponse instance
61 * @return the name of the next view
62 */
63 public View process(HttpServletRequest request, HttpServletResponse response) throws ServletException {
/*
P/P * Method: View process(HttpServletRequest, HttpServletResponse)
*
* Preconditions:
* request != null
* this.model != null
* this.model.data != null
*
* Presumptions:
* com.maxmind.geoip.LookupService:getCountry(...)@84 != null
* java.lang.Class:getResource(...)@80 != null
* java.lang.Object:getClass(...)@80 != null
* java.net.URL:toExternalForm(...)@80 != null
* java.util.Collections:unmodifiableCollection(...)@72 != null
* ...
*
* Postconditions:
* return_value == &new CountriesView(process#10)
* new CountriesView(process#10) num objects == 1
*
* Test Vectors:
* java.util.Iterator:hasNext(...)@83: {1}, {0}
*/
64 Blog blog = (Blog)getModel().get(Constants.BLOG_KEY);
65 Log log = getLog(request, response);
66
67 Set<String> countries = new TreeSet<String>(new Comparator<String>() {
68 public int compare(String s1, String s2) {
/*
P/P * Method: int compare(String, String)
*
* Postconditions:
* init'ed(return_value)
*/
69 return s1 != null ? s1.compareToIgnoreCase(s2) : -1;
70 }
71 });
72 Map<String,Integer> consolidatedCountries = new HashMap<String,Integer>();
73 Map<String,Integer> countriesForNewsFeeds = new HashMap<String,Integer>();
74 Map<String,Integer> countriesForPageViews = new HashMap<String,Integer>();
75 Map<String,Integer> countriesForFileDownloads = new HashMap<String,Integer>();
76
77 LookupService lookupService = null;
78
79 try {
80 String filename = getClass().getResource("/geo-ip.dat").toExternalForm().substring(5);
81 lookupService = new LookupService(filename, LookupService.GEOIP_MEMORY_CACHE);
82
83 for (LogEntry logEntry : log.getLogEntries()) {
84 String country = lookupService.getCountry(logEntry.getHost()).getName();
85 countries.add(country);
86 register(country, countriesForNewsFeeds);
87 register(country, countriesForPageViews);
88 register(country, countriesForFileDownloads);
89 register(country, consolidatedCountries);
90
91 Request req = new Request(logEntry.getRequestUri(), blog);
92 if (req.isNewsFeed()) {
93 increment(country, countriesForNewsFeeds);
94 increment(country, consolidatedCountries);
95 } else if (req.isPageView()) {
96 increment(country, countriesForPageViews);
97 increment(country, consolidatedCountries);
98 } else if (req.isFileDownload()) {
99 increment(country, countriesForFileDownloads);
100 increment(country, consolidatedCountries);
101 }
102 }
103 } catch (IOException ioe) {
104 throw new ServletException(ioe);
105 } finally {
+ 106 if (lookupService != null) {
107 lookupService.close();
108 }
109 }
110
111 getModel().put("logAction", "viewCountries");
112 getModel().put("countries", countries);
113 getModel().put("consolidatedCountries", consolidatedCountries);
114 getModel().put("countriesForNewsFeeds", countriesForNewsFeeds);
115 getModel().put("countriesForPageViews", countriesForPageViews);
116 getModel().put("countriesForFileDownloads", countriesForFileDownloads);
117
118 return new CountriesView();
119 }
120
/*
P/P * Method: void register(String, Map)
*
* Preconditions:
* map != null
*
* Test Vectors:
* java.util.Map:get(...)@122: Inverse{null}, Addr_Set{null}
*/
121 private void register(String country, Map<String,Integer> map) {
122 Integer count = map.get(country);
123 if (count == null) {
124 count = 0;
125 }
126 map.put(country, count);
127 }
128
/*
P/P * Method: void increment(String, Map)
*
* Preconditions:
* map != null
*
* Presumptions:
* java.lang.Integer:intValue(...)@131 <= 232-2
* java.util.Map:get(...)@130 != null
*/
129 private void increment(String country, Map<String,Integer> map) {
130 Integer count = map.get(country);
131 count = count + 1;
132 map.put(country, count);
133 }
134
135 }
SofCheck Inspector Build Version : 2.22510
| viewcountriesaction.java |
2010-Jun-25 19:40:34 |
| viewcountriesaction.class |
2010-Jul-19 20:23:38 |
| viewcountriesaction$1.class |
2010-Jul-19 20:23:38 |