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