File Source: JPARefererManagerImpl.java
/*
P/P * Method: org.apache.roller.weblogger.business.jpa.JPARefererManagerImpl$LinkbackExtractorRunnable__static_init
*/
1
2 /*
3 * Licensed to the Apache Software Foundation (ASF) under one or more
4 * contributor license agreements. The ASF licenses this file to You
5 * under the Apache License, Version 2.0 (the "License"); you may not
6 * use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License. For additional information regarding
16 * copyright in this work, please see the NOTICE file in the top level
17 * directory of this distribution.
18 */
19 package org.apache.roller.weblogger.business.jpa;
20
21 import java.sql.Timestamp;
22 import java.util.Iterator;
23 import java.util.List;
24 import java.util.ArrayList;
25 import java.util.Calendar;
26 import java.util.Date;
27 import java.util.Collections;
28 import java.util.Comparator;
29 import javax.persistence.Query;
30
31 import org.apache.commons.logging.Log;
32 import org.apache.commons.logging.LogFactory;
33 import org.apache.commons.lang.StringUtils;
34 import org.apache.roller.weblogger.business.jpa.JPAPersistenceStrategy;
35
36 import org.apache.roller.weblogger.WebloggerException;
37 import org.apache.roller.weblogger.business.Weblogger;
38 import org.apache.roller.weblogger.business.UserManager;
39 import org.apache.roller.weblogger.business.WeblogManager;
40 import org.apache.roller.weblogger.business.referrers.RefererManager;
41 import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
42 import org.apache.roller.weblogger.pojos.WeblogReferrer;
43 import org.apache.roller.weblogger.pojos.StatCount;
44 import org.apache.roller.weblogger.pojos.WeblogEntry;
45 import org.apache.roller.weblogger.pojos.Weblog;
46 import org.apache.roller.weblogger.pojos.StatCountCountComparator;
47 import org.apache.roller.weblogger.util.LinkbackExtractor;
48 import org.apache.roller.weblogger.util.Utilities;
49
50 /*
51 * JPARefererManagerImpl.java
52 */
/*
P/P * Method: org.apache.roller.weblogger.business.jpa.JPARefererManagerImpl__static_init
*
* Postconditions:
* init'ed(log)
* init'ed(statCountCountReverseComparator)
*/
53 @com.google.inject.Singleton
/*
P/P * Method: JPAPersistenceStrategy access$100(JPARefererManagerImpl)
*
* Preconditions:
* x0 != null
*
* Postconditions:
* return_value == x0.strategy
* init'ed(return_value)
*/
54 public class JPARefererManagerImpl implements RefererManager {
55
56 private static Log log = LogFactory.getLog(
57 JPARefererManagerImpl.class);
58
59 protected static final String DAYHITS = "dayHits";
60 protected static final String TOTALHITS = "totalHits";
61
62 private static final Comparator statCountCountReverseComparator =
63 Collections.reverseOrder(StatCountCountComparator.getInstance());
64
65 /** The strategy for this manager. */
66 private final Weblogger roller;
67 private final JPAPersistenceStrategy strategy;
68
69
70 /**
71 * Creates a new instance of JPARefererManagerImpl
72 */
73 @com.google.inject.Inject
/*
P/P * Method: void org.apache.roller.weblogger.business.jpa.JPARefererManagerImpl(Weblogger, JPAPersistenceStrategy)
*
* Preconditions:
* log != null
*
* Postconditions:
* this.roller == roller
* init'ed(this.roller)
* this.strategy == strategy
* init'ed(this.strategy)
*/
74 protected JPARefererManagerImpl(Weblogger roller, JPAPersistenceStrategy strategy) {
75 log.debug("Instantiating JPA Referer Manager");
76 this.roller = roller;
77 this.strategy = strategy;
78 }
79
80
81 public void saveReferer(WeblogReferrer referer) throws WebloggerException {
/*
P/P * Method: void saveReferer(WeblogReferrer)
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*/
82 strategy.store(referer);
83 }
84
85 public void removeReferer(WeblogReferrer referer) throws WebloggerException {
/*
P/P * Method: void removeReferer(WeblogReferrer)
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*/
86 strategy.remove(referer);
87 }
88
89 /**
90 * Clear referrer dayhits and remove referrers without excerpts.
91 */
92 public void clearReferrers() throws WebloggerException {
/*
P/P * Method: void clearReferrers()
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*
* Presumptions:
* javax.persistence.EntityManager:createNamedQuery(...)@301 != null
*/
93 clearDayHits();
94 Query q = strategy.getNamedUpdate("WeblogReferrer.removeByNullOrEmptyExcerpt");
95 q.executeUpdate();
96 }
97
98 /**
99 * Clear referrer dayhits and remove referrers without excerpts.
100 */
101 public void clearReferrers(Weblog website) throws WebloggerException {
/*
P/P * Method: void clearReferrers(Weblog)
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*
* Presumptions:
* javax.persistence.EntityManager:createNamedQuery(...)@301 != null
*/
102 clearDayHitsByWebsite(website);
103 Query q = strategy.getNamedUpdate("WeblogReferrer.removeByNullOrEmptyExcerpt&Website");
104 q.setParameter(1, website);
105 q.executeUpdate();
106 }
107
108 /**
109 * Apply ignoreWord/spam filters to all referers in system.
110 */
111 public void applyRefererFilters() throws WebloggerException {
/*
P/P * Method: void applyRefererFilters()
*
* Preconditions:
* org/apache/roller/weblogger/config/WebloggerRuntimeConfig.log != null
* (soft) org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider != null
* (soft) org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance != null
* (soft) this.strategy != null
* (soft) this.strategy.emf != null
* (soft) this.strategy.threadLocalEntityManager != null
*
* Presumptions:
* blacklist.length@113 <= 232-1
* javax.persistence.Query:getResultList(...)@651 != null
* org.apache.commons.lang.StringUtils:split(...)@113 != null
*
* Test Vectors:
* blacklist.length@113: {1..232-1}, {0}
* java.util.Iterator:hasNext(...)@117: {0}, {1}
*/
112 String spamwords = WebloggerRuntimeConfig.getProperty("spam.blacklist");
113 String[] blacklist = StringUtils.split(
114 StringUtils.deleteWhitespace(spamwords),",");
115 if (blacklist.length == 0) return;
116 List referers = getBlackListedReferer(blacklist);
117 for (Iterator iterator = referers.iterator(); iterator.hasNext();) {
118 WeblogReferrer referer= (WeblogReferrer) iterator.next();
119 this.strategy.remove(referer);
120 }
121 }
122
123 /**
124 * Apply ignoreWord/spam filters to all referers in website.
125 */
126 public void applyRefererFilters(Weblog website)
127 throws WebloggerException {
/*
P/P * Method: void applyRefererFilters(Weblog)
*
* Preconditions:
* website != null
* (soft) this.strategy != null
* (soft) this.strategy.emf != null
* (soft) this.strategy.threadLocalEntityManager != null
*
* Presumptions:
* blacklist.length@131 <= 232-1
* javax.persistence.Query:getResultList(...)@660 != null
* org.apache.commons.lang.StringUtils:split(...)@131 != null
*
* Test Vectors:
* blacklist.length@131: {1..232-1}, {0}
* java.util.Iterator:hasNext(...)@135: {0}, {1}
* org.apache.roller.weblogger.pojos.Weblog:getBlacklist(...)@129: Inverse{null}, Addr_Set{null}
*/
128 if (null == website) throw new WebloggerException("website is null");
129 if (null == website.getBlacklist()) return;
130
131 String[] blacklist = StringUtils.split(
132 StringUtils.deleteWhitespace(website.getBlacklist()),",");
133 if (blacklist.length == 0) return;
134 List referers = getBlackListedReferer(website, blacklist);
135 for (Iterator iterator = referers.iterator(); iterator.hasNext();) {
136 WeblogReferrer referer= (WeblogReferrer) iterator.next();
137 this.strategy.remove(referer);
138 }
139 }
140
141 protected List getExistingReferers(Weblog website, String dateString,
142 String permalink) throws WebloggerException {
143
/*
P/P * Method: List getExistingReferers(Weblog, String, String)
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*
* Postconditions:
* init'ed(return_value)
*/
144 Query q = strategy.getNamedQuery(
145 "WeblogReferrer.getByWebsite&DateString&RefererPermalink");
146 q.setParameter(1, website);
147 q.setParameter(2, dateString);
148 q.setParameter(3, permalink);
149 return q.getResultList();
150 }
151
152 protected List getMatchingReferers(Weblog website, String requestUrl,
153 String refererUrl) throws WebloggerException {
154
/*
P/P * Method: List getMatchingReferers(Weblog, String, String)
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*
* Postconditions:
* init'ed(return_value)
*/
155 Query q = strategy.getNamedQuery(
156 "WeblogReferrer.getByWebsite&RequestUrl&RefererUrl");
157 q.setParameter(1, website);
158 q.setParameter(2, requestUrl);
159 q.setParameter(3, refererUrl);
160 return q.getResultList();
161 }
162
163 /**
164 * Returns hot weblogs as StatCount objects, in descending order by today's
165 * hits.
166 * @param sinceDays Restrict to last X days (or -1 for all)
167 * @param offset Offset into results (for paging)
168 * @param length Maximum number of results to return (for paging)
169 * @return List of StatCount objects.
170 */
171 public List getHotWeblogs(int sinceDays, int offset, int length)
172 throws WebloggerException {
173
/*
P/P * Method: List getHotWeblogs(int, int, int)
*
* Preconditions:
* sinceDays <= 231
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*
* Presumptions:
* init'ed(java.lang.Boolean.TRUE)
* java.util.Calendar:getInstance(...)@176 != null
* java.util.Calendar:getTime(...)@179 != null
* java.util.Iterator:next(...)@198 != null
* javax.persistence.Query:getResultList(...)@196 != null
* ...
*
* Postconditions:
* return_value == &new ArrayList(getHotWeblogs#1)
* new ArrayList(getHotWeblogs#1) num objects == 1
*
* Test Vectors:
* length: {-231..-2, 0..232-1}, {-1}
* java.util.Iterator:hasNext(...)@197: {0}, {1}
*/
+ 174 String msg = "Getting hot weblogs";
175 List results = new ArrayList();
176 Calendar cal = Calendar.getInstance();
177 cal.setTime(new Date());
178 cal.add(Calendar.DATE, -1 * sinceDays);
179 Date startDate = cal.getTime();
180
181 if (length == -1) {
182 length = Integer.MAX_VALUE - offset;
183 }
184
185 Query q = strategy.getNamedQuery(
186 "WeblogReferrer.getHotWeblogsByWebsite.enabled&Website.active&Website.lastModifiedGreater");
187
188 if (offset != 0 || length != -1) {
189 q.setFirstResult(offset);
190 q.setMaxResults(length);
191 }
192 Timestamp start = new Timestamp(startDate.getTime());
193 q.setParameter(1, Boolean.TRUE);
194 q.setParameter(2, Boolean.TRUE);
195 q.setParameter(3, start);
196 List queryResults = (List)q.getResultList();
197 for (Iterator it = queryResults.iterator(); it.hasNext(); ) {
198 Object[] row = (Object[])it.next();
+ 199 long hits = ((Number)row[0]).longValue();
200 String websiteId = (String)row[1];
201 String websiteName = (String)row[2];
202 String websiteHandle = (String)row[3];
203 results.add(new StatCount(
204 websiteId,
205 websiteHandle,
206 websiteName,
207 "statCount.weblogDayHits",
208 hits));
209 }
210 // Original query ordered by desc hits.
211 // JPA QL doesn't allow queries to be ordered by agregates; do it in memory
212 Collections.sort(results, statCountCountReverseComparator);
213
214 return results;
215 }
216
217 protected int getHits(Weblog website, String type)
218 throws WebloggerException {
/*
P/P * Method: int getHits(Weblog, String)
*
* Preconditions:
* log != null
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* website != null
* (soft) this.strategy.emf != null
* (soft) type != null
*
* Presumptions:
* init'ed(java.lang.Boolean.TRUE)
* java.util.List:get(...)@232 != null
* javax.persistence.Query:getResultList(...)@230 != null
*
* Postconditions:
* return_value in -1..0
*
* Test Vectors:
* java.lang.String:equals(...)@234: {0}, {1}
* org.apache.commons.logging.Log:isDebugEnabled(...)@220: {0}, {1}
* resultsArray.length@232: {0}, {1..+Inf}
*/
219 int hits = -1;
220 if (log.isDebugEnabled()) {
221 log.debug("getHits: " + website.getName());
222 }
223 //TODO: JPAPort. This query retrieves both SUM(r.dayHits), SUM(r.totalHits)
224 //The method only comsumes one of them. We can optimize the logic to retrieve only the
225 //requied SUM
226 Query query = strategy.getNamedQuery(
227 "WeblogReferrer.getHitsByWebsite.enabled&Website.id");
228 query.setParameter(1, Boolean.TRUE);
229 query.setParameter(2, website.getId());
230 List results = query.getResultList();
231
232 Object[] resultsArray = (Object[]) results.get(0);
233
234 if (resultsArray.length > 0 && type.equals(DAYHITS)) {
+ 235 if ( resultsArray[0] != null ) {
+ 236 hits = ((Long) resultsArray[0]).intValue();
237 }
238 } else if ( resultsArray.length > 0 ) {
+ 239 if ( resultsArray[0] != null ) {
+ 240 hits = ((Long) resultsArray[1]).intValue();
241 }
242 } else {
243 hits = 0;
244 }
245
246 return hits;
247 }
248
249 /**
250 * Get all referers for specified weblog.
251 * @param weblog
252 * @return List of type WeblogReferrer
253 */
254 public List getReferers(Weblog weblog) throws WebloggerException {
/*
P/P * Method: List getReferers(Weblog)
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*
* Postconditions:
* init'ed(return_value)
*/
255 Query q = strategy.getNamedQuery(
256 "WeblogReferrer.getByWebsiteOrderByTotalHitsDesc");
257 q.setParameter(1, weblog);
258 return q.getResultList();
259 }
260
261 /**
262 * Get all referers for specified user that were made today.
263 * @param website Web site.
264 * @return List of type WeblogReferrer
265 */
266 public List getTodaysReferers(Weblog website) throws WebloggerException {
/*
P/P * Method: List getTodaysReferers(Weblog)
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*
* Postconditions:
* init'ed(return_value)
*/
267 Query q = strategy.getNamedQuery(
268 "WeblogReferrer.getByWebsite&DayHitsGreaterZeroOrderByDayHitsDesc");
269 q.setParameter(1, website);
270 return q.getResultList();
271 }
272
273 /**
274 * Get referers for a specified date.
275 * @param website Web site.
276 * @param date YYYYMMDD format of day's date.
277 * @return List of type WeblogReferrer.
278 * @throws org.apache.roller.weblogger.WebloggerException
279 */
280 public List getReferersToDate(Weblog website, String date)
281 throws WebloggerException {
282
/*
P/P * Method: List getReferersToDate(Weblog, String)
*
* Preconditions:
* date != null
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* website != null
* (soft) this.strategy.emf != null
*
* Presumptions:
* init'ed(java.lang.Boolean.FALSE)
*
* Postconditions:
* init'ed(return_value)
*/
283 if (website==null )
284 throw new WebloggerException("website is null");
285
286 if (date==null )
287 throw new WebloggerException("Date is null");
288
289 Query q = strategy.getNamedQuery(
290 "WeblogReferrer.getByWebsite&DateString&DuplicateOrderByTotalHitsDesc");
291 q.setParameter(1, website);
292 q.setParameter(2, date);
293 q.setParameter(3, Boolean.FALSE);
294 return q.getResultList();
295 }
296
297 /**
298 * Get referers that refer to a specific weblog entry.
299 * @param entryid Weblog entry ID
300 * @return List of WeblogReferrer objects.
301 * @throws org.apache.roller.weblogger.WebloggerException
302 */
303 public List getReferersToEntry(String entryid) throws WebloggerException {
/*
P/P * Method: List getReferersToEntry(String)
*
* Preconditions:
* entryid != null
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*
* Postconditions:
* init'ed(return_value)
*/
304 if (null == entryid)
305 throw new WebloggerException("entryid is null");
306 //TODO: DataMapperPort: Change calling code to pass WeblogEntry instead of id
307 // we should change calling code to pass instance of WeblogEntry instead
308 // of extracting and passing id. Once that is done, change the code below to
309 // skip the load (Please note that the load below will always find the enty in cache)
310 Query q = strategy.getNamedQuery(
311 "WeblogReferrer.getByWeblogEntry&TitleNotNull&ExcerptNotNullOrderByTotalHitsDesc");
312 q.setParameter(1, strategy.load(WeblogEntry.class, entryid));
313 return q.getResultList();
314 }
315
316 /**
317 * Query for collection of referers.
318 */
319 protected List getReferersToWebsite(Weblog website, String refererUrl)
320 throws WebloggerException {
/*
P/P * Method: List getReferersToWebsite(Weblog, String)
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*
* Postconditions:
* init'ed(return_value)
*/
321 Query q = strategy.getNamedQuery(
322 "WeblogReferrer.getByWebsite&RefererUrl");
323 q.setParameter(1, website);
324 q.setParameter(2, refererUrl);
325 return q.getResultList();
326 }
327
328 /**
329 * Query for collection of referers.
330 */
331 protected List getReferersWithSameTitle(Weblog website,
332 String requestUrl,
333 String title,
334 String excerpt)
335 throws WebloggerException {
/*
P/P * Method: List getReferersWithSameTitle(Weblog, String, String, String)
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*
* Postconditions:
* init'ed(return_value)
*/
336 Query q = strategy.getNamedQuery(
337 "WeblogReferrer.getByWebsite&RequestURL&TitleOrExcerpt");
338 q.setParameter(1, website);
339 q.setParameter(2, requestUrl);
340 q.setParameter(3, title);
341 q.setParameter(4, excerpt);
342 return q.getResultList();
343 }
344
345 /**
346 * Get user's day hits
347 */
348 public int getDayHits(Weblog website) throws WebloggerException {
/*
P/P * Method: int getDayHits(Weblog)
*
* Preconditions:
* log != null
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* website != null
* (soft) this.strategy.emf != null
*
* Postconditions:
* return_value in -1..0
*/
349 return getHits(website, DAYHITS);
350 }
351
352 /**
353 * Get user's all-time total hits
354 */
355 public int getTotalHits(Weblog website) throws WebloggerException {
/*
P/P * Method: int getTotalHits(Weblog)
*
* Preconditions:
* log != null
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* website != null
* (soft) this.strategy.emf != null
*
* Postconditions:
* return_value in -1..0
*/
356 return getHits(website, TOTALHITS);
357 }
358
359 /**
360 * Retrieve referer by id.
361 */
362 public WeblogReferrer getReferer(String id) throws WebloggerException {
/*
P/P * Method: WeblogReferrer getReferer(String)
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*
* Postconditions:
* init'ed(return_value)
*/
363 return (WeblogReferrer)strategy.load(WeblogReferrer.class, id);
364 }
365
366 /**
367 * Process an incoming referer.
368 */
369 public void processReferrer(String requestUrl, String referrerUrl,
370 String weblogHandle, String entryAnchor, String dateString) {
/*
P/P * Method: void processReferrer(String, String, String, String, String)
*
* Preconditions:
* log != null
* (soft) org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider != null
* (soft) org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance != null
* (soft) org/apache/roller/weblogger/business/jpa/JPAUserManagerImpl.log != null
* (soft) org/apache/roller/weblogger/business/jpa/JPAWeblogManagerImpl.log != null
* (soft) org/apache/roller/weblogger/config/WebloggerRuntimeConfig.log != null
* (soft) this.roller != null
* (soft) this.roller.threadManager != null
* (soft) this.roller.threadManager.serviceScheduler != null
* (soft) this.roller.userManager != null
* ...
*
* Presumptions:
* init'ed(java.lang.Boolean.FALSE)
* java.lang.Integer:intValue(...)@435 <= 232-2
* java.lang.Integer:intValue(...)@436 <= 232-2
* java.util.List:get(...)@433 != null
* javax.persistence.Query:getResultList(...)@160 != null
* ...
*
* Test Vectors:
* entryAnchor: Addr_Set{null}, Inverse{null}
* referrerUrl: Addr_Set{null}, Inverse{null}
* weblogHandle: Inverse{null}, Addr_Set{null}
* java.lang.String:equals(...)@473: {1}, {0}
* java.lang.String:length(...)@403: {8..232-1}, {0..7}
* java.lang.String:startsWith(...)@417: {0}, {1}
* java.lang.String:startsWith(...)@473: {1}, {0}
* java.util.List:size(...)@415: {-231..-1, 1..232-1}, {0}
* java.util.List:size(...)@425: {-231..0, 2..232-1}, {1}
* java.util.List:size(...)@431: {-231..0, 2..232-1}, {1}
* ...
*/
371 log.debug("processing referrer ["+referrerUrl+
372 "] accessing ["+requestUrl+"]");
373
374 if (weblogHandle == null)
375 return;
376
+ 377 String selfSiteFragment = "/"+weblogHandle;
378 Weblog weblog = null;
379 WeblogEntry entry = null;
380
381 // lookup the weblog now
382 try {
383 UserManager userMgr = roller.getUserManager();
384 weblog = userMgr.getWebsiteByHandle(weblogHandle);
385 if (weblog == null) return;
386
387 // now lookup weblog entry if possible
388 if (entryAnchor != null) {
389 WeblogManager weblogMgr = roller.
390 getWeblogManager();
391 entry = weblogMgr.getWeblogEntryByAnchor(weblog, entryAnchor);
392 }
393 } catch (WebloggerException re) {
394 // problem looking up website, gotta bail
395 log.error("Error looking up website object", re);
396 return;
397 }
398
399 try {
400 List matchRef = null;
401
402 // try to find existing WeblogReferrer for referrerUrl
403 if (referrerUrl == null || referrerUrl.trim().length() < 8) {
404 referrerUrl = "direct";
405
406 // Get referer specified by referer URL of direct
407 matchRef = getReferersToWebsite(weblog, referrerUrl);
408 } else {
409 referrerUrl = Utilities.stripJsessionId(referrerUrl);
410
411 // Query for referer with same referer and request URLs
412 matchRef = getMatchingReferers(weblog, requestUrl, referrerUrl);
413
414 // If referer was not found, try adding or leaving off 'www'
415 if ( matchRef.size() == 0 ) {
416 String secondTryUrl = null;
417 if ( referrerUrl.startsWith("http://www") ) {
418 secondTryUrl = "http://"+referrerUrl.substring(11);
419 } else {
420 secondTryUrl = "http://www"+referrerUrl.substring(7);
421 }
422
423 matchRef = getMatchingReferers(weblog, requestUrl,
424 secondTryUrl);
425 if ( matchRef.size() == 1 ) {
426 referrerUrl = secondTryUrl;
427 }
428 }
429 }
430
431 if (matchRef.size() == 1) {
432 // Referer was found in database, so bump up hit count
433 WeblogReferrer ref = (WeblogReferrer)matchRef.get(0);
434
435 ref.setDayHits(new Integer(ref.getDayHits().intValue() + 1));
436 ref.setTotalHits(new Integer(ref.getTotalHits().intValue() + 1));
437
438 log.debug("Incrementing hit count on existing referer: " +
439 referrerUrl);
440
441 saveReferer(ref);
442
443 } else if (matchRef.size() == 0) {
444
445 // Referer was not found in database, so new Referer object
446 Integer one = new Integer(1);
447 WeblogReferrer ref =
448 new WeblogReferrer(
449 null,
450 weblog,
451 entry,
452 dateString,
453 referrerUrl,
454 null,
455 requestUrl,
456 null,
457 "", // Read comment above regarding Derby bug
458 Boolean.FALSE,
459 Boolean.FALSE,
460 one,
461 one);
462
463 if (log.isDebugEnabled()) {
464 log.debug("newReferer="+ref.getRefererUrl());
465 }
466
467 String refurl = ref.getRefererUrl();
468
469 // If not a direct or search engine then search for linkback
470 boolean doLinkbackExtraction =
471 WebloggerRuntimeConfig.getBooleanProperty(
472 "site.linkbacks.enabled");
473 if (doLinkbackExtraction
474 && entry != null
475 && !refurl.equals("direct")
476 && !refurl.startsWith("http://google")
477 && !refurl.startsWith("http://www.google")
478 && !refurl.startsWith("http://search.netscape")
479 && !refurl.startsWith("http://www.blinkpro")
480 && !refurl.startsWith("http://search.msn")
481 && !refurl.startsWith("http://search.yahoo")
482 && !refurl.startsWith("http://uk.search.yahoo")
483 && !refurl.startsWith("http://www.javablogs.com")
484 && !refurl.startsWith("http://www.teoma")
485 ) {
486 // Launch thread to extract referer linkback
487
488 try {
489 Weblogger mRoller = roller;
490 mRoller.getThreadManager().executeInBackground(
491 new LinkbackExtractorRunnable(ref));
492 } catch (InterruptedException e) {
493 log.warn("Interrupted during linkback extraction",e);
494 }
495 } else {
496 saveReferer(ref);
497 }
498 }
499 } catch (WebloggerException pe) {
500 log.error(pe);
501 } catch (NullPointerException npe) {
502 log.error(npe);
503 }
504 }
505
506 /**
507 * Use LinkbackExtractor to parse title and excerpt from referer
508 */
509 class LinkbackExtractorRunnable implements Runnable {
510
511 private WeblogReferrer mReferer = null;
512
/*
P/P * Method: void org.apache.roller.weblogger.business.jpa.JPARefererManagerImpl$LinkbackExtractorRunnable(JPARefererManagerImpl, WeblogReferrer)
*
* Postconditions:
* this.mReferer == referer
* init'ed(this.mReferer)
*/
513 public LinkbackExtractorRunnable( WeblogReferrer referer) {
514 mReferer = referer;
515 }
516
517 public void run() {
518
519 try {
/*
P/P * Method: void run()
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) org/apache/roller/weblogger/business/jpa/JPARefererManagerImpl.log != null
* (soft) this.mReferer != null
* (soft) this.strategy.emf != null
*
* Presumptions:
* init'ed(java.lang.Boolean.FALSE)
* init'ed(java.lang.Boolean.TRUE)
* java.lang.String:length(...)@580 <= 4_294_967_195
* java.util.Iterator:next(...)@578 != null
* java.util.Iterator:next(...)@601 != null
* ...
*
* Test Vectors:
* java.lang.Boolean:booleanValue(...)@590: {0}, {1}
* java.lang.String:indexOf(...)@581: {-1}, {-231..-2, 0..232-1}
* java.util.Iterator:hasNext(...)@577: {0}, {1}
* java.util.List:size(...)@541: {-231..-1, 1..232-1}, {0}
* org.apache.roller.weblogger.util.LinkbackExtractor:getExcerpt(...)@523: Addr_Set{null}, Inverse{null}
* org.apache.roller.weblogger.util.LinkbackExtractor:getPermalink(...)@527: Addr_Set{null}, Inverse{null}
* org.apache.roller.weblogger.util.LinkbackExtractor:getTitle(...)@523: Addr_Set{null}, Inverse{null}
*/
520 LinkbackExtractor lb = new LinkbackExtractor(
521 mReferer.getRefererUrl(),mReferer.getRequestUrl());
522
523 if ( lb.getTitle()!=null && lb.getExcerpt()!=null ) {
524 mReferer.setTitle(lb.getTitle());
525 mReferer.setExcerpt(lb.getExcerpt());
526
527 if ( lb.getPermalink() != null ) {
528 // The presence of a permalink indicates that this
529 // linkback was parsed out of an RSS feed and is
530 // presumed to be a good linkback.
531
532 mReferer.setRefererPermalink(lb.getPermalink());
533
534 // See if this request/permalink is in the DB
535 List matchRef = getExistingReferers(
536 mReferer.getWebsite(),
537 mReferer.getDateString(),
538 mReferer.getRefererPermalink());
539
540 // If it is the first, then set it to be visible
541 if ( matchRef.size() == 0 ) {
542 mReferer.setVisible(Boolean.TRUE);
543 } else {
544 // We can't throw away duplicates or we will
545 // end up reparsing them everytime a hit comes
546 // in from one of them, but we can mark them
547 // as duplicates.
548 mReferer.setDuplicate(Boolean.TRUE);
549 }
550
551 saveReferer(mReferer);
552
553 }
554
555 else {
556 // Store the new referer
557 saveReferer(mReferer);
558
559 // Hacky Referer URL weighting kludge:
560 //
561 // If there are multple referers to a request URL,
562 // then we want to pick the best one. The others
563 // are marked as duplicates. To do this we use a
564 // weight. The weight formula is:
565 //
566 // w = URL length + (100 if URL contains anchor)
567
568 // LOOP: find the referer with the highest weight
569 Boolean visible = Boolean.FALSE;
570 List refs= getReferersWithSameTitle(
571 mReferer.getWebsite(),
572 mReferer.getRequestUrl(),
573 lb.getTitle(),
574 lb.getExcerpt());
575 WeblogReferrer chosen = null;
576 int maxweight = 0;
577 for (Iterator rdItr = refs.iterator();rdItr.hasNext();) {
578 WeblogReferrer referer = (WeblogReferrer) rdItr.next();
579
580 int weight = referer.getRefererUrl().length();
581 if (referer.getRefererUrl().indexOf('#') != -1) {
582 weight += 100;
583 }
584
585 if ( weight > maxweight ) {
586 chosen = referer;
587 maxweight = weight;
588 }
589
590 if (referer.getVisible().booleanValue()) {
591 // If any are visible then chosen
592 // replacement must be visible as well.
593 visible = Boolean.TRUE;
594 }
595
596 }
597
598 // LOOP: to mark all of the lower weight ones
599 // as duplicates
600 for (Iterator rdItr = refs.iterator();rdItr.hasNext();) {
601 WeblogReferrer referer = (WeblogReferrer) rdItr.next();
602
603 if (referer != chosen) {
604 referer.setDuplicate(Boolean.TRUE);
605 } else {
606 referer.setDuplicate(Boolean.FALSE);
607 referer.setVisible(visible);
608 }
609 saveReferer(referer);
610 }
611
612
613 }
614 } else {
615 // It is not a linkback, but store it anyway
616 saveReferer(mReferer);
617
618 log.info("No excerpt found at refering URL "
619 + mReferer.getRefererUrl());
620 }
621 } catch (Exception e) {
622 log.error("Processing linkback",e);
623 } finally {
624 strategy.release();
625 }
626
627 }
628
629 }
630
631 /**
632 * Release all resources held by manager.
633 */
/*
P/P * Method: void release()
*/
634 public void release() {}
635
636 protected void clearDayHits() throws WebloggerException {
/*
P/P * Method: void clearDayHits()
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*
* Presumptions:
* javax.persistence.EntityManager:createNamedQuery(...)@301 != null
*/
637 Query query = strategy.getNamedUpdate("WeblogReferrer.clearDayHits");
638 query.executeUpdate();
639 }
640
641 protected void clearDayHitsByWebsite(Weblog website) throws WebloggerException {
/*
P/P * Method: void clearDayHitsByWebsite(Weblog)
*
* Preconditions:
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) this.strategy.emf != null
*
* Presumptions:
* javax.persistence.EntityManager:createNamedQuery(...)@301 != null
*/
642 Query query = strategy.getNamedUpdate("WeblogReferrer.clearDayHitsByWebsite");
643 query.setParameter(1, website);
644 query.executeUpdate();
645 }
646
647 protected List getBlackListedReferer(String[] blacklist) throws
648 WebloggerException {
/*
P/P * Method: List getBlackListedReferer(String[])
*
* Preconditions:
* blacklist != null
* blacklist.length in 1..232-1
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) blacklist[...] != null
* (soft) this.strategy.emf != null
*
* Postconditions:
* init'ed(return_value)
*/
649 StringBuffer queryString = getQueryStringForBlackList(blacklist);
650 Query query = strategy.getDynamicQuery(queryString.toString());
651 return (List) query.getResultList();
652 }
653
654 protected List getBlackListedReferer(Weblog website, String[] blacklist)
655 throws WebloggerException {
/*
P/P * Method: List getBlackListedReferer(Weblog, String[])
*
* Preconditions:
* blacklist != null
* blacklist.length in 1..232-1
* this.strategy != null
* this.strategy.threadLocalEntityManager != null
* (soft) blacklist[...] != null
* (soft) this.strategy.emf != null
*
* Postconditions:
* init'ed(return_value)
*/
656 StringBuffer queryString = getQueryStringForBlackList(blacklist);
657 queryString.append(" AND r.website = ?1 ");
658 Query query = strategy.getDynamicQuery(queryString.toString());
659 query.setParameter(1, website);
660 return query.getResultList();
661 }
662
663 /**
664 * Generates a JPQL query of form
665 * SELECT r FROM WeblogReferrer r WHERE
666 * ( refererUrl like %blacklist[1] ..... OR refererUrl like %blacklist[n])
667 * @param blacklist
668 * @return
669 */
670 private StringBuffer getQueryStringForBlackList(String[] blacklist) {
/*
P/P * Method: StringBuffer getQueryStringForBlackList(String[])
*
* Preconditions:
* blacklist != null
* blacklist.length in 1..232-1
* (soft) blacklist[...] != null
*
* Presumptions:
* java.lang.String:length(...)@683 - java.lang.StringBuffer:length(...)@683 in -232+1..231
*
* Postconditions:
* return_value == &new StringBuffer(getQueryStringForBlackList#1)
* new StringBuffer(getQueryStringForBlackList#1) num objects == 1
* return_value._tainted == 0
*/
671 assert blacklist.length > 0;
672 StringBuffer queryString = new StringBuffer("SELECT r FROM WeblogReferrer r WHERE (");
673 //Search for any matching entry from blacklist[]
+ 674 final String OR = " OR ";
675 for (int i = 0; i < blacklist.length; i++) {
676 String ignoreWord = blacklist[i];
677 //TODO: DataMapper port: original code use "like ignore case" as follows
678 // or.add(Expression.ilike("refererUrl","%"+ignoreWord+"%"));
679 // There is no equivalent for it in JPA
680 queryString.append("r.refererUrl like '%").append(ignoreWord.trim()).append("%'").append(OR);
681 }
682 // Get rid of last OR
683 queryString.delete(queryString.length() - OR.length(), queryString.length());
684 queryString.append(" ) ");
685 return queryString;
686 }
687 }
SofCheck Inspector Build Version : 2.18479
| JPARefererManagerImpl.java |
2009-Jan-02 14:24:54 |
| JPARefererManagerImpl.class |
2009-Sep-04 03:12:31 |
| JPARefererManagerImpl$LinkbackExtractorRunnable.class |
2009-Sep-04 03:12:31 |