You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by el...@apache.org on 2006/10/06 23:20:27 UTC

svn commit: r453774 [1/4] - in /incubator/roller/trunk: metadata/database/ metadata/database/hibernate/ src/org/apache/roller/business/hibernate/ src/org/apache/roller/model/ src/org/apache/roller/pojos/ src/org/apache/roller/ui/rendering/model/ src/or...

Author: eliast
Date: Fri Oct  6 14:20:26 2006
New Revision: 453774

URL: http://svn.apache.org/viewvc?view=rev&rev=453774
Log:
More on tagging...

- Renamed weblogtagagg back to weblogentrytagagg
- Added lastused column to weblogentrytagagg
- Updated 300-to-310 migration scripts
- Renamed WeblogTagAggregateData to WeblogEntryTagAggregateData
- Changed FeedModel to support tags in the request params
- Refactored getTags() and getPopularTags() in SiteModel,PageModel and WeblogEntryData
- Added scriptaculous for tag type-ahead in WeblogEdit.jsp
- Improved TagStatsServlet
- Removed Tags tab in frontpage theme, moved it to the sidebar only
- Renamed getTagSet() to getTags() and getTags() to getTagsAsString()
- Updated Velocity macros to the changes and simplified #showTagCloud macro
- Solved world hunger (mostly in Latin America, Africa is next) [jk]

Added:
    incubator/roller/trunk/src/org/apache/roller/pojos/WeblogEntryTagAggregateData.java
      - copied, changed from r453438, incubator/roller/trunk/src/org/apache/roller/pojos/WeblogTagAggregateData.java
    incubator/roller/trunk/web/roller-ui/scripts/roller-autocomplete.js   (with props)
    incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/
    incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/builder.js   (with props)
    incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/controls.js   (with props)
    incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/dragdrop.js   (with props)
    incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/effects.js   (with props)
    incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/prototype.js   (with props)
    incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/scriptaculous.js   (with props)
    incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/slider.js   (with props)
Removed:
    incubator/roller/trunk/src/org/apache/roller/pojos/WeblogTagAggregateData.java
    incubator/roller/trunk/web/themes/frontpage/tags.vm
Modified:
    incubator/roller/trunk/metadata/database/300-to-310-migration.vm
    incubator/roller/trunk/metadata/database/createdb.vm
    incubator/roller/trunk/metadata/database/hibernate/hibernate.cfg.xml
    incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateWeblogManagerImpl.java
    incubator/roller/trunk/src/org/apache/roller/model/WeblogManager.java
    incubator/roller/trunk/src/org/apache/roller/pojos/TagStat.java
    incubator/roller/trunk/src/org/apache/roller/pojos/WeblogEntryData.java
    incubator/roller/trunk/src/org/apache/roller/pojos/WebsiteData.java
    incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/FeedModel.java
    incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/PageModel.java
    incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/SiteModel.java
    incubator/roller/trunk/src/org/apache/roller/ui/rendering/util/WeblogFeedRequest.java
    incubator/roller/trunk/src/org/apache/roller/ui/rendering/util/WeblogPageRequest.java
    incubator/roller/trunk/src/org/apache/roller/webservices/json/TagStatsServlet.java
    incubator/roller/trunk/testdata/WEB-INF/classes/hibernate.cfg.xml
    incubator/roller/trunk/tests/org/apache/roller/business/WeblogEntryTest.java
    incubator/roller/trunk/web/WEB-INF/jsps/authoring/WeblogEdit.jsp
    incubator/roller/trunk/web/WEB-INF/velocity/weblog.vm
    incubator/roller/trunk/web/roller-ui/scripts/calendar.js
    incubator/roller/trunk/web/roller-ui/styles/roller.css
    incubator/roller/trunk/web/themes/frontpage/Weblog.vm
    incubator/roller/trunk/web/themes/frontpage/_css.vm
    incubator/roller/trunk/web/themes/frontpage/_entry.vm
    incubator/roller/trunk/web/themes/frontpage/directory.vm

Modified: incubator/roller/trunk/metadata/database/300-to-310-migration.vm
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/metadata/database/300-to-310-migration.vm?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/metadata/database/300-to-310-migration.vm (original)
+++ incubator/roller/trunk/metadata/database/300-to-310-migration.vm Fri Oct  6 14:20:26 2006
@@ -12,18 +12,22 @@
     websiteid       varchar(48)   not null,    
     userid		    varchar(48)  not null,
     name            varchar(255)  not null,
-    time         $TIMESTAMP_SQL_TYPE	not null
+    time            $TIMESTAMP_SQL_TYPE 	not null
 );
+
 create index wet_entryid_idx on weblogentrytag( entryid );
 create index wet_websiteid_idx on weblogentrytag( websiteid );
 create index wet_userid_idx on weblogentrytag( userid );
 create index wet_name_idx on weblogentrytag( name );
 
-create table weblogtagagg (
+create table weblogentrytagagg (
     id              varchar(48)   not null primary key,
     websiteid       varchar(48) ,    
     name            varchar(255)  not null,
-    count           integer		  not null
+    count           integer		  not null,
+    lastused        $TIMESTAMP_SQL_TYPE 	not null
 );
-create index weta_websiteid_idx on weblogtagagg( websiteid );
-create index weta_name_idx on weblogtagagg( name );
\ No newline at end of file
+
+create index weta_websiteid_idx on weblogentrytagagg( websiteid );
+create index weta_name_idx on weblogentrytagagg( name );
+create index weta_lastused_idx on weblogentrytagagg( lastused );
\ No newline at end of file

Modified: incubator/roller/trunk/metadata/database/createdb.vm
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/metadata/database/createdb.vm?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/metadata/database/createdb.vm (original)
+++ incubator/roller/trunk/metadata/database/createdb.vm Fri Oct  6 14:20:26 2006
@@ -212,9 +212,9 @@
     id              varchar(48)   not null primary key,
     entryid         varchar(48)   not null,
     websiteid       varchar(48)   not null,    
-    userid		    varchar(48)  not null,
+    userid		    varchar(48)   not null,
     name            varchar(255)  not null,
-    time         $TIMESTAMP_SQL_TYPE	not null
+    time            $TIMESTAMP_SQL_TYPE 	not null
 );
 
 create index wet_entryid_idx on weblogentrytag( entryid );
@@ -222,15 +222,17 @@
 create index wet_userid_idx on weblogentrytag( userid );
 create index wet_name_idx on weblogentrytag( name );
 
-create table weblogtagagg (
+create table weblogentrytagagg (
     id              varchar(48)   not null primary key,
     websiteid       varchar(48) ,    
     name            varchar(255)  not null,
-    count           integer		  not null
+    count           integer		  not null,
+    lastused        $TIMESTAMP_SQL_TYPE 	not null
 );
 
-create index weta_websiteid_idx on weblogtagagg( websiteid );
-create index weta_name_idx on weblogtagagg( name );
+create index weta_websiteid_idx on weblogentrytagagg( websiteid );
+create index weta_name_idx on weblogentrytagagg( name );
+create index weta_lastused_idx on weblogentrytagagg( lastused );
 
 create table newsfeed (
     id              varchar(48) not null primary key,

Modified: incubator/roller/trunk/metadata/database/hibernate/hibernate.cfg.xml
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/metadata/database/hibernate/hibernate.cfg.xml?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/metadata/database/hibernate/hibernate.cfg.xml (original)
+++ incubator/roller/trunk/metadata/database/hibernate/hibernate.cfg.xml Fri Oct  6 14:20:26 2006
@@ -95,7 +95,7 @@
 
         <mapping resource="org/apache/roller/pojos/WeblogEntryData.hbm.xml" />
         <mapping resource="org/apache/roller/pojos/WeblogEntryTagData.hbm.xml" />        
-        <mapping resource="org/apache/roller/pojos/WeblogTagAggregateData.hbm.xml" />                       
+        <mapping resource="org/apache/roller/pojos/WeblogEntryTagAggregateData.hbm.xml" />                       
         <mapping resource="org/apache/roller/pojos/EntryAttributeData.hbm.xml" />
         <mapping resource="org/apache/roller/pojos/WeblogCategoryData.hbm.xml" />
         <mapping resource="org/apache/roller/pojos/WeblogCategoryAssoc.hbm.xml" />

Modified: incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateWeblogManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateWeblogManagerImpl.java?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateWeblogManagerImpl.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateWeblogManagerImpl.java Fri Oct  6 14:20:26 2006
@@ -18,6 +18,7 @@
 
 package org.apache.roller.business.hibernate;
 
+import java.sql.Timestamp;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -47,7 +48,7 @@
 import org.apache.roller.pojos.WeblogCategoryData;
 import org.apache.roller.pojos.WeblogEntryData;
 import org.apache.roller.pojos.WeblogEntryTagData;
-import org.apache.roller.pojos.WeblogTagAggregateData;
+import org.apache.roller.pojos.WeblogEntryTagAggregateData;
 import org.apache.roller.pojos.WebsiteData;
 import org.apache.roller.util.DateUtil;
 import org.apache.roller.util.Utilities;
@@ -245,8 +246,8 @@
         }
         
         // remove tags aggregates
-        if(entry.getTagSet() != null) {
-            for(Iterator it = entry.getTagSet().iterator(); it.hasNext(); ) {
+        if(entry.getTags() != null) {
+            for(Iterator it = entry.getTags().iterator(); it.hasNext(); ) {
                 WeblogEntryTagData tag = (WeblogEntryTagData) it.next();
                 updateTagCount(tag.getName(), entry.getWebsite(), -1);
             }
@@ -427,7 +428,7 @@
             
             if (tags != null && tags.size() > 0) {
               for(int i = 0; i < tags.size(); i++) {
-                queryString.append(" and tagSet.name = ?");
+                queryString.append(" and tags.name = ?");
                 params.add(tags.get(i));
               }
             }
@@ -1176,30 +1177,104 @@
         }
     }   
     
-    public List getTags(WebsiteData website, String sortBy, String startsWith, int limit)
+    /* (non-Javadoc)
+     * @see org.apache.roller.model.WeblogManager#getPopularTags(org.apache.roller.pojos.WebsiteData, java.util.Date, int)
+     */
+    public List getPopularTags(WebsiteData website, Date startDate, int limit)
             throws RollerException {
         try {
             List results = new ArrayList();
 
             Session session = ((HibernatePersistenceStrategy) strategy)
                     .getSession();
+
+            ArrayList params = new ArrayList();
+            StringBuffer queryString = new StringBuffer();
+            queryString.append("select a.name, a.count ");
+            queryString.append("from WeblogEntryTagAggregateData a where ");
+            if (website != null) {
+                queryString.append("a.website.id = ? ");
+                params.add(website.getId());
+            } else {
+                queryString.append("a.website = NULL ");
+            }
+            if (startDate != null) {
+                queryString.append("and a.lastUsed >= ? ");
+                params.add(startDate);
+            }
+
+            queryString.append("order by a.count desc");
+
+            Query query = session.createQuery(queryString.toString());
+            if (limit > 0)
+                query.setMaxResults(limit);
+
+            // set params
+            for (int i = 0; i < params.size(); i++) {
+                query.setParameter(i, params.get(i));
+            }
+
+            double min = Integer.MAX_VALUE;
+            double max = Integer.MIN_VALUE;
+
+            for (Iterator iter = query.list().iterator(); iter.hasNext();) {
+                Object[] row = (Object[]) iter.next();
+                TagStat t = new TagStat();
+                t.setName((String) row[0]);
+                t.setCount(((Integer) row[1]).intValue());
+                
+                min = Math.min(min, t.getCount());
+                max = Math.max(max, t.getCount());                
+                results.add(t);
+            }
             
+            min = Math.log(1+min);
+            max = Math.log(1+max);
+
+            double range = Math.max(.01, max - min) * 1.0001;
+
+            for (Iterator iter = results.iterator(); iter.hasNext(); )
+            {
+                TagStat t = (TagStat) iter.next();
+                t.setIntensity((int) (1 + Math.floor(5 * (Math.log(1+t.getCount()) - min) / range)));
+            }            
+
+            return results;
+
+        } catch (HibernateException e) {
+            throw new RollerException(e);
+        }
+    }
+    
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.roller.model.WeblogManager#getTags(org.apache.roller.pojos.WebsiteData,
+     *      java.lang.String, java.lang.String, int)
+     */
+    public List getTags(WebsiteData website, String sortBy, String startsWith, int limit) throws RollerException {    
+        try {
+            List results = new ArrayList();
+
+            Session session = ((HibernatePersistenceStrategy) strategy)
+                    .getSession();
+
             if (sortBy != null && sortBy.equals("count")) {
-                sortBy = "a.count desc"; 
+                sortBy = "a.count desc";
             } else {
                 sortBy = "a.name";
             }
-            
+
             StringBuffer queryString = new StringBuffer();
             queryString.append("select a.name, a.count ");
-            queryString.append("from WeblogTagAggregateData a where ");
+            queryString.append("from WeblogEntryTagAggregateData a where ");
             if (website != null)
                 queryString.append("a.website.id = '" + website.getId() + "' ");
             else
                 queryString.append("a.website = NULL ");
             if (startsWith != null && startsWith.length() > 0)
                 queryString.append("and a.name like '" + startsWith + "%' ");
-            
+
             queryString.append("order by " + sortBy);
 
             Query query = session.createQuery(queryString.toString());
@@ -1222,6 +1297,7 @@
 
     }
     
+    
 
     public void updateTagCount(String name, WebsiteData website, int amount) throws RollerException {
         
@@ -1240,49 +1316,48 @@
         conjunction.add(Expression.eq("name", name));
         conjunction.add(Expression.eq("website", website));
 
-        Criteria criteria = session.createCriteria(WeblogTagAggregateData.class)
+        Criteria criteria = session.createCriteria(WeblogEntryTagAggregateData.class)
             .add(conjunction);
         
-        WeblogTagAggregateData weblogTagData = (WeblogTagAggregateData) criteria.uniqueResult();
+        WeblogEntryTagAggregateData weblogTagData = (WeblogEntryTagAggregateData) criteria.uniqueResult();
 
         conjunction = Expression.conjunction();
         conjunction.add(Restrictions.eq("name", name));
         conjunction.add(Restrictions.isNull("website"));
         
-        criteria = session.createCriteria(WeblogTagAggregateData.class)
+        criteria = session.createCriteria(WeblogEntryTagAggregateData.class)
             .add(conjunction);
     
-        WeblogTagAggregateData siteTagData = (WeblogTagAggregateData) criteria.uniqueResult();
+        WeblogEntryTagAggregateData siteTagData = (WeblogEntryTagAggregateData) criteria.uniqueResult();
+        
+        Timestamp lastUsed = new Timestamp((new Date()).getTime());
         
         // create it only if we are going to need it.
         if(weblogTagData == null && amount > 0) {
-            weblogTagData = new WeblogTagAggregateData(null, website, name, 0);
+            weblogTagData = new WeblogEntryTagAggregateData(null, website, name, amount);
+            weblogTagData.setLastUsed(lastUsed);
+            session.save(weblogTagData);
+        } else {
+            session.createQuery("update WeblogEntryTagAggregateData a set a.count = a.count + ?, a.lastUsed = current_time() where a.name = ? and a.website = ?")
+            .setInteger(0, amount)
+            .setString(1, weblogTagData.getName())
+            .setParameter(2, website)
+            .executeUpdate();
         }
         
         // create it only if we are going to need it.        
         if(siteTagData == null && amount > 0) {
-            siteTagData = new WeblogTagAggregateData(null, null, name, 0);
-        }
-        
-        // 
-        if(weblogTagData != null) {
-            if ((amount + weblogTagData.getCount()) <= 0) {
-                if(weblogTagData.getId() != null)
-                    session.delete(weblogTagData);
-            } else {
-                weblogTagData.setCount(weblogTagData.getCount() + amount);
-                session.save(weblogTagData);
-            }
-        }        
+            siteTagData = new WeblogEntryTagAggregateData(null, null, name, amount);
+            siteTagData.setLastUsed(lastUsed);
+            session.save(siteTagData);
+        } else {
+            session.createQuery("update WeblogEntryTagAggregateData a set a.count = a.count + ?, a.lastUsed = current_time() where a.name = ? and a.website is null")
+            .setInteger(0, amount)
+            .setString(1, weblogTagData.getName())
+            .executeUpdate();            
+        }       
         
-        if(siteTagData != null) {
-            if ((amount + siteTagData.getCount()) <= 0) {
-                if(siteTagData.getId() != null)
-                    session.delete(siteTagData);
-            } else {
-                siteTagData.setCount(siteTagData.getCount() + amount);
-                session.save(siteTagData);
-            }
-        }   
+        // delete all bad counts
+        session.createQuery("delete from WeblogEntryTagAggregateData a where a.count <= 0").executeUpdate();
     }
 }

Modified: incubator/roller/trunk/src/org/apache/roller/model/WeblogManager.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/model/WeblogManager.java?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/model/WeblogManager.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/model/WeblogManager.java Fri Oct  6 14:20:26 2006
@@ -385,15 +385,25 @@
     /**
      * Get list of TagStat. There's no offset/length params just a limit.
      * @param website       Weblog or null to get for all weblogs.
-     * @param sortBy        Sort by either 'name' or 'count' (null for name)
-     * @param startsWith    Prefix for tags to be returned (null or a string of length > 0)
+     * @param startDate     Date or null of the most recent time a tag was used.
      * @param limit         Max TagStats to return (or -1 for no limit)
      * @return
      * @throws RollerException
      */
-    public List getTags(WebsiteData website, String sortBy, 
-            String startsWith, int limit)
+    public List getPopularTags(WebsiteData website, Date startDate, int limit)
             throws RollerException;
+    
+    /**
+     * Get list of TagStat. There's no offset/length params just a limit.
+     * @param website       Weblog or null to get for all weblogs.
+     * @param sortBy        Sort by either 'name' or 'count' (null for name) 
+     * @param startsWith    Prefix for tags to be returned (null or a string of length > 0)
+     * @param limit         Max TagStats to return (or -1 for no limit)
+     * @return
+     * @throws RollerException
+     */
+    public List getTags(WebsiteData website, String sortBy, String startsWith, int limit)
+            throws RollerException;    
     
     /**
      * This method maintains the tag aggregate table up-to-date with total counts. More

Modified: incubator/roller/trunk/src/org/apache/roller/pojos/TagStat.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/pojos/TagStat.java?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/pojos/TagStat.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/pojos/TagStat.java Fri Oct  6 14:20:26 2006
@@ -29,38 +29,47 @@
  */
 public class TagStat implements java.io.Serializable {
 
-  private static final long serialVersionUID = 1142064841813545198L;
+    private static final long serialVersionUID = 1142064841813545198L;
 
-  private java.lang.String name = null;
+    private java.lang.String name;
 
-  private int count = 0;
+    private int count;
+    
+    private int intensity;
 
-  public TagStat() {
-  }
+    public TagStat() {
+    }
 
-  public String getName() {
-    return this.name;
-  }
+    public String getName() {
+        return this.name;
+    }
 
-  public void setName(String name) {
-    this.name = name;
-  }
+    public void setName(String name) {
+        this.name = name;
+    }
 
-  public int getCount() {
-    return this.count;
-  }
+    public int getCount() {
+        return this.count;
+    }
 
-  public void setCount(int count) {
-    this.count = count;
-  }
+    public void setCount(int count) {
+        this.count = count;
+    }
 
-  public String toString() {
-    StringBuffer str = new StringBuffer("{");
+    public String toString() {
+        StringBuffer str = new StringBuffer("{");
 
-    str.append("name=" + name + " " + "count=" + count);
-    str.append('}');
+        str.append("name=" + name + " " + "count=" + count);
+        str.append('}');
 
-    return (str.toString());
-  }
+        return (str.toString());
+    }
 
+    public int getIntensity() {
+        return intensity;
+    }
+
+    public void setIntensity(int intensity) {
+        this.intensity = intensity;
+    }
 }

Modified: incubator/roller/trunk/src/org/apache/roller/pojos/WeblogEntryData.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/pojos/WeblogEntryData.java?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/pojos/WeblogEntryData.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/pojos/WeblogEntryData.java Fri Oct  6 14:20:26 2006
@@ -43,6 +43,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.RollerException;
 import org.apache.roller.config.RollerRuntimeConfig;
+import org.apache.roller.model.Roller;
 import org.apache.roller.model.RollerFactory;
 import org.apache.roller.model.UserManager;
 import org.apache.roller.model.WeblogEntryPlugin;
@@ -611,12 +612,12 @@
      * @hibernate.collection-key column="entryid" 
      * @hibernate.collection-one-to-many class="org.apache.roller.pojos.WeblogEntryTagData"
      */
-     public Set getTagSet()
+     public Set getTags()
      {
          return tagSet;
      }
      
-     private void setTagSet(Set tagSet) throws RollerException
+     private void setTags(Set tagSet) throws RollerException
      {
          this.tagSet = tagSet;
          this.removedTags = new HashSet();
@@ -713,9 +714,9 @@
     /**
      * @roller.wrapPojoMethod type="simple"
      */
-    public String getTags() {
+    public String getTagsAsString() {
         StringBuffer sb = new StringBuffer();
-        for (Iterator it = getTagSet().iterator(); it.hasNext();) {
+        for (Iterator it = getTags().iterator(); it.hasNext();) {
             sb.append(((WeblogEntryTagData) it.next()).getName()).append(" ");
         }
         if (sb.length() > 0) {
@@ -725,7 +726,7 @@
         return sb.toString();
     }
 
-    public void setTags(String tags) throws RollerException {
+    public void setTagsAsString(String tags) throws RollerException {
         if (tags == null) {
             tagSet.clear();
             return;
@@ -739,7 +740,7 @@
         }
 
         updateTags(Arrays.asList(tagsarr));
-    }
+    }  
 
     // ------------------------------------------------------------------------
     

Copied: incubator/roller/trunk/src/org/apache/roller/pojos/WeblogEntryTagAggregateData.java (from r453438, incubator/roller/trunk/src/org/apache/roller/pojos/WeblogTagAggregateData.java)
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/pojos/WeblogEntryTagAggregateData.java?view=diff&rev=453774&p1=incubator/roller/trunk/src/org/apache/roller/pojos/WeblogTagAggregateData.java&r1=453438&p2=incubator/roller/trunk/src/org/apache/roller/pojos/WeblogEntryTagAggregateData.java&r2=453774
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/pojos/WeblogTagAggregateData.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/pojos/WeblogEntryTagAggregateData.java Fri Oct  6 14:20:26 2006
@@ -20,31 +20,34 @@
  */
 package org.apache.roller.pojos;
 
+import java.sql.Timestamp;
+
 import org.apache.roller.util.PojoUtil;
 
 
 /**
  * @author Elias Torres
  *
- * @ejb:bean name="WeblogTagAggregateData"
+ * @ejb:bean name="WeblogEntryTagAggregateData"
  * @struts.form include-all="true"
- * @hibernate.class lazy="false" table="weblogtagagg"
+ * @hibernate.class lazy="false" table="weblogentrytagagg"
  * @hibernate.cache usage="read-write"
  */
-public class WeblogTagAggregateData extends PersistentObject
+public class WeblogEntryTagAggregateData extends PersistentObject
     implements java.io.Serializable
 {
     private static final long serialVersionUID = -4343500268898106982L;
     private java.lang.String id = null;
     private java.lang.String name = null;    
     private WebsiteData website = null;
+    private Timestamp lastUsed = null;
     private int count = 0;
 
-    public WeblogTagAggregateData()
+    public WeblogEntryTagAggregateData()
     {
     }
 
-    public WeblogTagAggregateData(java.lang.String id,
+    public WeblogEntryTagAggregateData(java.lang.String id,
                        WebsiteData website,
                        java.lang.String name, int count)
     {
@@ -54,7 +57,7 @@
         this.count = count;
     }
 
-    public WeblogTagAggregateData(WeblogTagAggregateData otherData)
+    public WeblogEntryTagAggregateData(WeblogEntryTagAggregateData otherData)
     {
         setData(otherData);
     }
@@ -115,6 +118,21 @@
    {
        return this.count;
    }
+   
+   /**
+   *
+   * @roller.wrapPojoMethod type="simple"
+   * @ejb:persistent-field
+   * @hibernate.property column="lastused" non-null="true" unique="false"
+   */   
+   public Timestamp getLastUsed() {
+       return this.lastUsed;
+   }
+   
+   /** @ejb:persistent-field */
+   public void setLastUsed(Timestamp lastUsed) {
+       this.lastUsed = lastUsed;
+   }   
 
    /** @ejb:persistent-field */
    public void setCount(int count)
@@ -128,15 +146,16 @@
      str.append("id=" + id + " " +
              "website=" + website +
              "name=" + name + " " +
-             "count=" + count);
+             "count=" + count + " " +
+             "lastUsed=" + lastUsed);
      str.append('}');
      
      return (str.toString());
  }
  
    public boolean equals(Object pOther) {
-       if (pOther instanceof WeblogTagAggregateData) {
-           WeblogTagAggregateData lTest = (WeblogTagAggregateData) pOther;
+       if (pOther instanceof WeblogEntryTagAggregateData) {
+           WeblogEntryTagAggregateData lTest = (WeblogEntryTagAggregateData) pOther;
            boolean lEquals = true;
            
            lEquals = PojoUtil.equals(lEquals, this.id, lTest.getId());
@@ -164,11 +183,12 @@
      */
     public void setData(org.apache.roller.pojos.PersistentObject otherData)
     {
-        WeblogTagAggregateData data = (WeblogTagAggregateData) otherData;
+        WeblogEntryTagAggregateData data = (WeblogEntryTagAggregateData) otherData;
         this.id = data.getId();
         this.website = data.getWebsite();
         this.name = data.getName();
         this.count = data.getCount();
+        this.lastUsed = data.getLastUsed();
     }
 
 }

Modified: incubator/roller/trunk/src/org/apache/roller/pojos/WebsiteData.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/pojos/WebsiteData.java?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/pojos/WebsiteData.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/pojos/WebsiteData.java Fri Oct  6 14:20:26 2006
@@ -20,6 +20,7 @@
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collections;
 import java.util.Date;
 import java.util.Iterator;
@@ -1307,6 +1308,34 @@
         }
         return 0;
     }
+    
+    
+    
+    /**
+     * Get a list of TagStats objects for the most popular tags
+     * 
+     * @param sinceDays
+     * @param length
+     * @return
+     */
+    public List getPopularTags(int sinceDays, int length) {
+        List results = new ArrayList();
+        Date startDate = null;
+        if(sinceDays > 0) {
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(new Date());
+            cal.add(Calendar.DATE, -1 * sinceDays);        
+            startDate = cal.getTime();     
+        }        
+        try {            
+            Roller roller = RollerFactory.getRoller();
+            WeblogManager wmgr = roller.getWeblogManager();
+            results = wmgr.getPopularTags(this, startDate, length);
+        } catch (Exception e) {
+            log.error("ERROR: fetching weblog tags list", e);
+        }
+        return results;
+    }      
     
     /** No-op method to please XDoclet */
     public void setTodaysHits(int ignored) {}

Modified: incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/FeedModel.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/FeedModel.java?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/FeedModel.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/FeedModel.java Fri Oct  6 14:20:26 2006
@@ -131,7 +131,7 @@
                     null, 
                     new Date(), 
                     feedRequest.getWeblogCategoryName(), 
-                    null, 
+                    feedRequest.getTags(), 
                     WeblogEntryData.PUBLISHED, 
                     "pubTime", 
                     feedRequest.getLocale(), 

Modified: incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/PageModel.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/PageModel.java?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/PageModel.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/PageModel.java Fri Oct  6 14:20:26 2006
@@ -273,34 +273,10 @@
     }
     
     /**
-     * @param sinceDay
+     * Returns the list of tags specified in the request /tags/foo+bar or /?tags=foo+bar
      * @return
      */
     public List getTags() {
-        List results = new ArrayList();
-        try {            
-            Roller roller = RollerFactory.getRoller();
-            WeblogManager wmgr = roller.getWeblogManager();
-            results = wmgr.getTags(weblog, null, null, -1);
-        } catch (Exception e) {
-            log.error("ERROR: fetching site tags list", e);
-        }
-        return results;
-    }
-    
-    /**
-     * @param sinceDay
-     * @return
-     */
-    public List getHotTags(int length) {
-        List results = new ArrayList();
-        try {            
-            Roller roller = RollerFactory.getRoller();
-            WeblogManager wmgr = roller.getWeblogManager();
-            results = wmgr.getTags(weblog, "count", null, length);
-        } catch (Exception e) {
-            log.error("ERROR: fetching site tags list", e);
-        }
-        return results;
-    }      
+        return pageRequest.getTags();
+    }    
 }

Modified: incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/SiteModel.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/SiteModel.java?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/SiteModel.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/SiteModel.java Fri Oct  6 14:20:26 2006
@@ -478,31 +478,33 @@
     }
     
     /**
-     * @param sinceDay
+     * Returns the list of tags specified in the request /tags/foo+bar or /?tags=foo+bar
      * @return
      */
     public List getTags() {
-        List results = new ArrayList();
-        try {            
-            Roller roller = RollerFactory.getRoller();
-            WeblogManager wmgr = roller.getWeblogManager();
-            results = wmgr.getTags(null, null, null, -1);
-        } catch (Exception e) {
-            log.error("ERROR: fetching site tags list", e);
-        }
-        return results;
+        return tags;
     }
     
     /**
-     * @param sinceDay
+     * 
+     * @param sinceDays
+     * @param length
      * @return
      */
-    public List getHotTags(int length) {
+    public List getPopularTags(int sinceDays, int length) {
         List results = new ArrayList();
+        Date startDate = null;
+        if(sinceDays > 0) {
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(new Date());
+            cal.add(Calendar.DATE, -1 * sinceDays);        
+            startDate = cal.getTime();     
+        }
+        
         try {            
             Roller roller = RollerFactory.getRoller();
             WeblogManager wmgr = roller.getWeblogManager();
-            results = wmgr.getTags(null, "count", null, length);
+            results = wmgr.getPopularTags(null, startDate, length);
         } catch (Exception e) {
             log.error("ERROR: fetching site tags list", e);
         }

Modified: incubator/roller/trunk/src/org/apache/roller/ui/rendering/util/WeblogFeedRequest.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/ui/rendering/util/WeblogFeedRequest.java?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/ui/rendering/util/WeblogFeedRequest.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/ui/rendering/util/WeblogFeedRequest.java Fri Oct  6 14:20:26 2006
@@ -31,6 +31,7 @@
 import org.apache.roller.model.WeblogManager;
 import org.apache.roller.pojos.WeblogCategoryData;
 import org.apache.roller.util.URLUtilities;
+import org.apache.roller.util.Utilities;
 
 
 /**
@@ -130,16 +131,23 @@
         
         if(request.getParameter("tags") != null) {
           this.tags = Arrays.asList(StringUtils.split(URLUtilities.decode(request.getParameter("tags")),"+"));
+          if(this.tags.size() > 3)
+              throw new InvalidRequestException("max number of tags allowed is 3, " + request.getRequestURL());          
         }        
         
         if(request.getParameter("excerpts") != null) {
             this.excerpts = Boolean.valueOf(request.getParameter("excerpts")).booleanValue();
         }
         
+        if(this.tags.size() > 0 && this.weblogCategoryName != null) {
+            throw new InvalidRequestException("please specify either category or tags but not both, " + request.getRequestURL());            
+        }
+        
         if(log.isDebugEnabled()) {
             log.debug("type = "+this.type);
             log.debug("format = "+this.format);
             log.debug("weblogCategory = "+this.weblogCategoryName);
+            log.debug("tags = "+ Utilities.stringArrayToString((String[])this.tags.toArray(), ","));            
             log.debug("excerpts = "+this.excerpts);
         }
     }

Modified: incubator/roller/trunk/src/org/apache/roller/ui/rendering/util/WeblogPageRequest.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/ui/rendering/util/WeblogPageRequest.java?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/ui/rendering/util/WeblogPageRequest.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/ui/rendering/util/WeblogPageRequest.java Fri Oct  6 14:20:26 2006
@@ -145,6 +145,8 @@
 
                 } else if("tags".equals(this.context)) {
                   this.tags = Arrays.asList(StringUtils.split(pathElements[1],"+"));
+                  if(this.tags.size() > 3)
+                      throw new InvalidRequestException("max number of tags allowed is 3, " + request.getRequestURL());
                                       
                 } else {
                     throw new InvalidRequestException("context "+this.context+
@@ -210,10 +212,6 @@
                         this.weblogCategoryName = "/"+this.weblogCategoryName;
                     }
                 }
-                
-                if(request.getParameter("tags") != null) {
-                  this.tags = Arrays.asList(StringUtils.split(URLUtilities.decode(request.getParameter("tags")),"+"));
-                }
             }
         }
         
@@ -236,6 +234,10 @@
         customParams.remove("cat");
         customParams.remove("page");
         customParams.remove("tags");
+        
+        if(this.tags.size() > 0 && this.weblogCategoryName != null) {
+            throw new InvalidRequestException("please specify either category or tags but not both, " + request.getRequestURL());            
+        }        
             
         if(log.isDebugEnabled()) {
             log.debug("context = "+this.context);

Modified: incubator/roller/trunk/src/org/apache/roller/webservices/json/TagStatsServlet.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/webservices/json/TagStatsServlet.java?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/webservices/json/TagStatsServlet.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/webservices/json/TagStatsServlet.java Fri Oct  6 14:20:26 2006
@@ -48,6 +48,10 @@
     
     private final int MAX_LENGTH = 100;
     
+    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        doGet(request, response);
+    }
+    
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {    
         
@@ -62,46 +66,48 @@
         if(!StringUtils.isEmpty(pathInfo)) {
             path = StringUtils.split(pathInfo, '/');
         }
-        
-        if(path == null || path.length == 0 || path.length > 2) {
-            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing either weblog handle or tag prefix.");
-            return;
-        }      
-                                
+                                        
         Roller roller = RollerFactory.getRoller();
         try {
             response.setContentType("text/html; charset=utf-8");
             
             WeblogManager wmgr = roller.getWeblogManager();
             WebsiteData website = null;
-            String startsWith = null;
-            if(path.length == 2) {
-                startsWith = path[1];
+            String startsWith = null;            
+            
+            // website handle is always the first path segment,
+            // only throw an exception when not found if we have a tag prefix 
+            if(path.length > 0) {
                 try {
                     UserManager umgr = RollerFactory.getRoller().getUserManager();
                     website = umgr.getWebsiteByHandle(path[0], Boolean.TRUE);
-                    if (website == null)
-                        throw new RollerException();
-                    
+                    if (website == null && path.length > 1)
+                        throw new RollerException();                
                 } catch (RollerException ex) {
                     response.sendError(HttpServletResponse.SC_NOT_FOUND, "Weblog handle not found.");
                     return;
-                }
-            } else {
-                startsWith = path[0];
+                }    
             }
             
-            if(startsWith == null || startsWith.trim().length() < 1) {
-                response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing tag prefix.");
-                return;
+            if(path.length == 2) {
+                startsWith = path[1].trim();
+            } else if(path.length == 1 && website == null) {
+                startsWith = path[0].trim();
             }
+                                    
+            List tags = wmgr.getTags(website, null, startsWith, limit);
             
-            List tags = wmgr.getTags(website, null, startsWith.trim(), limit);
-            
-            response.getWriter().println("[");
+            response.getWriter().println("{");
+            response.getWriter().print("  prefix : \"");
+            response.getWriter().print(startsWith);
+            response.getWriter().println("\",");
+            response.getWriter().print("  weblog : \"");
+            response.getWriter().print(website != null ? website.getHandle() : "");
+            response.getWriter().println("\",");            
+            response.getWriter().println("  tagcounts : [");
             for(Iterator it = tags.iterator(); it.hasNext();) {
                 TagStat stat = (TagStat) it.next();
-                response.getWriter().print("\t{ name : \"");
+                response.getWriter().print("    { tag : \"");
                 response.getWriter().print(stat.getName());
                 response.getWriter().print("\", ");
                 response.getWriter().print("count : ");
@@ -110,7 +116,7 @@
                 if(it.hasNext())
                    response.getWriter().println(", ");
             }
-            response.getWriter().println("\n]");
+            response.getWriter().println("\n  ]\n}");
             
             response.flushBuffer();
         } catch (RollerException e) {

Modified: incubator/roller/trunk/testdata/WEB-INF/classes/hibernate.cfg.xml
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/testdata/WEB-INF/classes/hibernate.cfg.xml?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/testdata/WEB-INF/classes/hibernate.cfg.xml (original)
+++ incubator/roller/trunk/testdata/WEB-INF/classes/hibernate.cfg.xml Fri Oct  6 14:20:26 2006
@@ -66,7 +66,7 @@
 
         <mapping resource="org/apache/roller/pojos/WeblogEntryData.hbm.xml" />
         <mapping resource="org/apache/roller/pojos/WeblogEntryTagData.hbm.xml" />  
-        <mapping resource="org/apache/roller/pojos/WeblogTagAggregateData.hbm.xml" />    
+        <mapping resource="org/apache/roller/pojos/WeblogEntryTagAggregateData.hbm.xml" />    
         <mapping resource="org/apache/roller/pojos/EntryAttributeData.hbm.xml" />
         <mapping resource="org/apache/roller/pojos/WeblogCategoryData.hbm.xml" />
         <mapping resource="org/apache/roller/pojos/WeblogCategoryAssoc.hbm.xml" />

Modified: incubator/roller/trunk/tests/org/apache/roller/business/WeblogEntryTest.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/tests/org/apache/roller/business/WeblogEntryTest.java?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/tests/org/apache/roller/business/WeblogEntryTest.java (original)
+++ incubator/roller/trunk/tests/org/apache/roller/business/WeblogEntryTest.java Fri Oct  6 14:20:26 2006
@@ -347,7 +347,7 @@
         tag.setUser(testUser);
         tag.setTime(new java.sql.Timestamp(new java.util.Date().getTime()));
         
-        testEntry.getTagSet().add(tag);
+        testEntry.getTags().add(tag);
         
         // create a weblog entry
         mgr.saveWeblogEntry(testEntry);
@@ -358,9 +358,9 @@
         entry = mgr.getWeblogEntry(id);
         assertNotNull(entry);
         assertEquals(testEntry, entry);
-        assertNotNull(entry.getTagSet());
-        assertEquals(1, entry.getTagSet().size());
-        assertEquals("testTag",((WeblogEntryTagData) entry.getTagSet().iterator().next()).getName());
+        assertNotNull(entry.getTags());
+        assertEquals(1, entry.getTags().size());
+        assertEquals("testTag",((WeblogEntryTagData) entry.getTags().iterator().next()).getName());
         
         // teardown our test entries
         TestUtils.teardownWeblogEntry(id);
@@ -395,9 +395,9 @@
         entry = mgr.getWeblogEntry(id);
         assertNotNull(entry);
         assertEquals(testEntry, entry);
-        assertNotNull(entry.getTagSet());
-        assertEquals(1, entry.getTagSet().size());
-        assertEquals("testTag",((WeblogEntryTagData) entry.getTagSet().iterator().next()).getName());
+        assertNotNull(entry.getTags());
+        assertEquals(1, entry.getTags().size());
+        assertEquals("testTag",((WeblogEntryTagData) entry.getTags().iterator().next()).getName());
         
         // teardown our test entry
         TestUtils.teardownWeblogEntry(id);
@@ -416,19 +416,19 @@
 
         entry = mgr.getWeblogEntry(id);
         assertNotNull(entry);
-        assertNotNull(entry.getTagSet());
-        assertEquals(1, entry.getTagSet().size());
-        assertEquals("testTag",((WeblogEntryTagData) entry.getTagSet().iterator().next()).getName());
+        assertNotNull(entry.getTags());
+        assertEquals(1, entry.getTags().size());
+        assertEquals("testTag",((WeblogEntryTagData) entry.getTags().iterator().next()).getName());
 
         // update a weblog entry tag
-        WeblogEntryTagData tag = ((WeblogEntryTagData) entry.getTagSet().iterator().next());
+        WeblogEntryTagData tag = ((WeblogEntryTagData) entry.getTags().iterator().next());
         tag.setName("updatedTestTag");
         TestUtils.endSession(true);
 
         entry = mgr.getWeblogEntry(id);
         assertNotNull(entry);
-        assertEquals(1, entry.getTagSet().size());
-        assertEquals("updatedTestTag",((WeblogEntryTagData) entry.getTagSet().iterator().next()).getName());
+        assertEquals(1, entry.getTags().size());
+        assertEquals("updatedTestTag",((WeblogEntryTagData) entry.getTags().iterator().next()).getName());
       
         // teardown our test entry
         TestUtils.teardownWeblogEntry(id);
@@ -452,7 +452,7 @@
         TestUtils.endSession(true);
         
         entry = mgr.getWeblogEntry(id);
-        assertEquals(3, entry.getTagSet().size());
+        assertEquals(3, entry.getTags().size());
         
         // teardown our test entry
         TestUtils.teardownWeblogEntry(id);
@@ -474,7 +474,7 @@
       TestUtils.endSession(true);
       
       entry = mgr.getWeblogEntry(id);
-      assertEquals(1, entry.getTagSet().size());
+      assertEquals(1, entry.getTags().size());
       
       // teardown our test entry
       TestUtils.teardownWeblogEntry(id);
@@ -497,15 +497,15 @@
       TestUtils.endSession(true);
       
       entry = mgr.getWeblogEntry(id);
-      assertEquals(2, entry.getTagSet().size());
+      assertEquals(2, entry.getTags().size());
       TestUtils.endSession(true);
       
       entry = mgr.getWeblogEntry(id);
-      entry.getTagSet().clear();
+      entry.getTags().clear();
       TestUtils.endSession(true);
 
       entry = mgr.getWeblogEntry(id);
-      assertEquals(0, entry.getTagSet().size());
+      assertEquals(0, entry.getTags().size());
       TestUtils.endSession(true);
       
       // teardown our test entry
@@ -525,7 +525,7 @@
       TestUtils.endSession(true);
       
       entry = mgr.getWeblogEntry(id);
-      assertEquals(2, entry.getTagSet().size());
+      assertEquals(2, entry.getTags().size());
       TestUtils.endSession(true);
       
       entry = mgr.getWeblogEntry(id);
@@ -534,7 +534,7 @@
       TestUtils.endSession(true);
 
       entry = mgr.getWeblogEntry(id);
-      assertEquals(0, entry.getTagSet().size());
+      assertEquals(0, entry.getTags().size());
       TestUtils.endSession(true);
       
       // teardown our test entry
@@ -601,7 +601,7 @@
       TestUtils.endSession(true);
      
       entry = mgr.getWeblogEntry(id);
-      assertEquals(2, entry.getTagSet().size());
+      assertEquals(2, entry.getTags().size());
       
       List updateTags = new ArrayList();
       updateTags.add("testWillStayTag");
@@ -612,12 +612,12 @@
       
       entry = mgr.getWeblogEntry(id);
       HashSet tagNames = new HashSet();
-      for(Iterator it = entry.getTagSet().iterator(); it.hasNext();) {
+      for(Iterator it = entry.getTags().iterator(); it.hasNext();) {
         WeblogEntryTagData tagData = (WeblogEntryTagData) it.next();
         tagNames.add(tagData.getName());
       }
       
-      assertEquals(3, entry.getTagSet().size());      
+      assertEquals(3, entry.getTags().size());      
       assertEquals(3, tagNames.size());
       assertEquals(true, tagNames.contains("testWillStayTag"));
       assertEquals(true, tagNames.contains("testNewTag"));
@@ -647,11 +647,11 @@
         TestUtils.endSession(true);
 
         entry = mgr.getWeblogEntry(id);
-        assertEquals(2, entry.getTagSet().size());
+        assertEquals(2, entry.getTags().size());
 
         Timestamp original = null;
 
-        for (Iterator it = entry.getTagSet().iterator(); it.hasNext();) {
+        for (Iterator it = entry.getTags().iterator(); it.hasNext();) {
             WeblogEntryTagData tagData = (WeblogEntryTagData) it.next();
             if (tagData.getName().equals("testWillStayTag"))
                 original = tagData.getTime();
@@ -666,14 +666,14 @@
 
         entry = mgr.getWeblogEntry(id);
         HashSet tagNames = new HashSet();
-        for (Iterator it = entry.getTagSet().iterator(); it.hasNext();) {
+        for (Iterator it = entry.getTags().iterator(); it.hasNext();) {
             WeblogEntryTagData tagData = (WeblogEntryTagData) it.next();
             tagNames.add(tagData.getName());
             if (tagData.getName().equals("testWillStayTag"))
                 assertEquals(original, tagData.getTime());
         }
 
-        assertEquals(3, entry.getTagSet().size());
+        assertEquals(3, entry.getTags().size());
         assertEquals(3, tagNames.size());
         assertEquals(true, tagNames.contains("testWillStayTag"));
         assertEquals(true, tagNames.contains("testNewTag"));

Modified: incubator/roller/trunk/web/WEB-INF/jsps/authoring/WeblogEdit.jsp
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/WEB-INF/jsps/authoring/WeblogEdit.jsp?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/web/WEB-INF/jsps/authoring/WeblogEdit.jsp (original)
+++ incubator/roller/trunk/web/WEB-INF/jsps/authoring/WeblogEdit.jsp Fri Oct  6 14:20:26 2006
@@ -22,7 +22,10 @@
 <%
 WeblogEntryPageModel model = (WeblogEntryPageModel)request.getAttribute("model");
 try {
-%>
+%>
+<script type="text/javascript" src="<%= request.getContextPath() %>/roller-ui/scripts/scriptaculous/prototype.js" ></script>
+<script type="text/javascript" src="<%= request.getContextPath() %>/roller-ui/scripts/scriptaculous/scriptaculous.js" ></script>
+<script type="text/javascript" src="<%= request.getContextPath() %>/roller-ui/scripts/roller-autocomplete.js" ></script>
 <script type="text/javascript">
 <!--
 function postWeblogEntry() {
@@ -153,9 +156,14 @@
     <tr><td class="entryEditFormLabel">
       <label style="width:10%; float:left;" for="title"><fmt:message key="weblogEdit.tags" /></label>
     </td><td>
-        <html:text property="tags" size="70" maxlength="255" tabindex="2" /><br/>
-    </td></tr>    
-    
+        <html:text styleId="entryEditTags" property="tagsAsString" size="70" maxlength="255" tabindex="2" />
+        <div id="entryEditTagsChoices" style="display:none" class="autocomplete"></div>
+		<br/>
+        <script type="text/javascript">
+        <!--
+		new RollerTagsAutoCompleter("entryEditTags", "entryEditTagsChoices", "<%= request.getContextPath() %>/roller-services/json/tags/<%= model.getWeblogEntry().getWebsite().getHandle() %>", { tokens : [' ',','], minChars: 2 });
+        // --></script>
+    </td></tr>       
     <c:choose>
         <c:when test="${model.weblog.enableMultiLang}">
             <tr><td class="entryEditFormLabel">

Modified: incubator/roller/trunk/web/WEB-INF/velocity/weblog.vm
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/WEB-INF/velocity/weblog.vm?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/web/WEB-INF/velocity/weblog.vm (original)
+++ incubator/roller/trunk/web/WEB-INF/velocity/weblog.vm Fri Oct  6 14:20:26 2006
@@ -794,39 +794,19 @@
 *#
 #macro(showTagCloud $tags)
 
-  <center>
-					  #set ( $minSize = 12 )
-					  #set ( $maxSize = 28 )
-					
-					  #set ( $max = 0 )
-					  #foreach ( $tag in $tags )
-					    #if ( $tag.count > $max )
-					      #set ( $max = $tag.count )
-					    #end
-					  #end
-					
-					  #set ( $step = $max / ($maxSize - $minSize) )
-					  
-					  #set ( $step = $max / ($maxSize - $minSize) )
-  #if ( $step < 1 )
-  	  #set ( $step = 1 )
+  #foreach ($tag in $tags)
+	<a class="tag s${tag.intensity}" href="$url.tag($tag.name)" title="$tag.count">$tag.name</a> 
   #end
-					  #foreach ($tag in $tags)
-					    #set( $size = $minSize + ($tag.count / $step)  )
-					    <span class="tag" style="font-size:${size}px"><a href="$url.tag($tag.name)" title="$tag.count">$tag.name</a></span>
-					  #end
-				  </center>
-
+			
 #end
 
 #macro(showEntryTags $entry)
   
-  #set ( $tags = $entry.tagSet )
-  Tags:&nbsp;
+  #set ( $tags = $entry.tags )
   #foreach($tag in $tags)
 	    <a href="$url.tag($tag.name)" title="$tag.count" rel="tag">$tag.name</a>&nbsp;
   #end
-
+  
 #end
 
 

Modified: incubator/roller/trunk/web/roller-ui/scripts/calendar.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/scripts/calendar.js?view=diff&rev=453774&r1=453773&r2=453774
==============================================================================
--- incubator/roller/trunk/web/roller-ui/scripts/calendar.js (original)
+++ incubator/roller/trunk/web/roller-ui/scripts/calendar.js Fri Oct  6 14:20:26 2006
@@ -688,7 +688,7 @@
 			return false;
 			}
 		else if (this.use_gebi && e) {
-			var t = e.originalTarget;
+			var t = e.target;
 			while (t.parentNode != null) {
 				if (t.id==this.divName) {
 					return true;

Added: incubator/roller/trunk/web/roller-ui/scripts/roller-autocomplete.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/scripts/roller-autocomplete.js?view=auto&rev=453774
==============================================================================
--- incubator/roller/trunk/web/roller-ui/scripts/roller-autocomplete.js (added)
+++ incubator/roller/trunk/web/roller-ui/scripts/roller-autocomplete.js Fri Oct  6 14:20:26 2006
@@ -0,0 +1,46 @@
+RollerTagsAutoCompleter = Class.create();
+Object.extend(Object.extend(RollerTagsAutoCompleter.prototype, Ajax.Autocompleter.prototype), {
+
+	initialize: function(element, update, url, options) {
+		this.baseInitialize(element, update, options);
+	    this.options.asynchronous  = true;
+	    this.options.onComplete    = this.onComplete.bind(this)
+	    this.options.method   = 'get';
+	    this.options.defaultParams = this.options.parameters || null;
+	    this.url    = url;
+	    this.cache = {};
+	    this.options.mine = options.mine || [];
+	  },
+	
+  getUpdatedChoices: function() {
+  	
+  	var t = this.getToken();
+  	if (this.cache[t])
+  	{
+  		this.updateChoices(this.cache[t]);
+  		return;
+  	}
+  	
+	this.options.parameters = this.options.callback ?
+	  this.options.callback(this.element, entry) : "";
+
+	if(this.options.defaultParams) 
+	  this.options.parameters += '&' + this.options.defaultParams;
+
+	new Ajax.Request(this.url + "/" + encodeURIComponent(t), this.options);
+  },
+
+	onComplete: function(request) {
+		eval("var results = " + request.responseText + ";");
+		var buf = "<ul>\n";
+		for (var i = 0; i < results.tagcounts.length; i++)
+		{
+			var tc = results.tagcounts[i];						
+			buf += "<li>" + tc.tag + "</li>\n";
+		}
+		buf += "</ul>";
+		this.cache[results.prefix] = buf;
+		this.updateChoices(buf);
+	}
+
+});
\ No newline at end of file

Propchange: incubator/roller/trunk/web/roller-ui/scripts/roller-autocomplete.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/roller/trunk/web/roller-ui/scripts/roller-autocomplete.js
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/roller/trunk/web/roller-ui/scripts/roller-autocomplete.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/builder.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/builder.js?view=auto&rev=453774
==============================================================================
--- incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/builder.js (added)
+++ incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/builder.js Fri Oct  6 14:20:26 2006
@@ -0,0 +1,119 @@
+// script.aculo.us builder.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
+
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// See scriptaculous.js for full license.
+
+var Builder = {
+  NODEMAP: {
+    AREA: 'map',
+    CAPTION: 'table',
+    COL: 'table',
+    COLGROUP: 'table',
+    LEGEND: 'fieldset',
+    OPTGROUP: 'select',
+    OPTION: 'select',
+    PARAM: 'object',
+    TBODY: 'table',
+    TD: 'table',
+    TFOOT: 'table',
+    TH: 'table',
+    THEAD: 'table',
+    TR: 'table'
+  },
+  // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
+  //       due to a Firefox bug
+  node: function(elementName) {
+    elementName = elementName.toUpperCase();
+    
+    // try innerHTML approach
+    var parentTag = this.NODEMAP[elementName] || 'div';
+    var parentElement = document.createElement(parentTag);
+    try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+      parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
+    } catch(e) {}
+    var element = parentElement.firstChild || null;
+      
+    // see if browser added wrapping tags
+    if(element && (element.tagName != elementName))
+      element = element.getElementsByTagName(elementName)[0];
+    
+    // fallback to createElement approach
+    if(!element) element = document.createElement(elementName);
+    
+    // abort if nothing could be created
+    if(!element) return;
+
+    // attributes (or text)
+    if(arguments[1])
+      if(this._isStringOrNumber(arguments[1]) ||
+        (arguments[1] instanceof Array)) {
+          this._children(element, arguments[1]);
+        } else {
+          var attrs = this._attributes(arguments[1]);
+          if(attrs.length) {
+            try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+              parentElement.innerHTML = "<" +elementName + " " +
+                attrs + "></" + elementName + ">";
+            } catch(e) {}
+            element = parentElement.firstChild || null;
+            // workaround firefox 1.0.X bug
+            if(!element) {
+              element = document.createElement(elementName);
+              for(attr in arguments[1]) 
+                element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
+            }
+            if(element.tagName != elementName)
+              element = parentElement.getElementsByTagName(elementName)[0];
+            }
+        } 
+
+    // text, or array of children
+    if(arguments[2])
+      this._children(element, arguments[2]);
+
+     return element;
+  },
+  _text: function(text) {
+     return document.createTextNode(text);
+  },
+  _attributes: function(attributes) {
+    var attrs = [];
+    for(attribute in attributes)
+      attrs.push((attribute=='className' ? 'class' : attribute) +
+          '="' + attributes[attribute].toString().escapeHTML() + '"');
+    return attrs.join(" ");
+  },
+  _children: function(element, children) {
+    if(typeof children=='object') { // array can hold nodes and text
+      children.flatten().each( function(e) {
+        if(typeof e=='object')
+          element.appendChild(e)
+        else
+          if(Builder._isStringOrNumber(e))
+            element.appendChild(Builder._text(e));
+      });
+    } else
+      if(Builder._isStringOrNumber(children)) 
+         element.appendChild(Builder._text(children));
+  },
+  _isStringOrNumber: function(param) {
+    return(typeof param=='string' || typeof param=='number');
+  },
+  dump: function(scope) { 
+    if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope 
+  
+    var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
+      "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
+      "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
+      "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
+      "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
+      "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
+  
+    tags.each( function(tag){ 
+      scope[tag] = function() { 
+        return Builder.node.apply(Builder, [tag].concat($A(arguments)));  
+      } 
+    });
+  }
+}
\ No newline at end of file

Propchange: incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/builder.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/builder.js
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/roller/trunk/web/roller-ui/scripts/scriptaculous/builder.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain