Author: unibrew Date: 2006-01-09 13:02:16 -0500 (Mon, 09 Jan 2006) New Revision: 2043 Added: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/Sorting.java Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/Counter.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCounterDescriptor.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersDescriptor.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersWatcher.java trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/portlet/DownloadCounterPortlet.java Log: [JBLAB-581] Adding new features. Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/Counter.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/Counter.java 2006-01-09 17:22:30 UTC (rev 2042) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/Counter.java 2006-01-09 18:02:16 UTC (rev 2043) @@ -49,6 +49,11 @@ private Boolean visible; /** + * It informs in what way the counter have to be sorted. + */ + private Sorting sorting; + + /** * Main constructor simply initiates values. * * @param value @@ -56,10 +61,11 @@ * @param projectId * Name of project for this counter. */ - Counter (long value,String projectId,Boolean visible) { + Counter (long value,String projectId,Boolean visible,Sorting sorting) { this.value=value; this.projectId=projectId; this.visible = visible; + this.sorting = sorting; } /** @@ -99,7 +105,7 @@ * Method sets visibility of the counter. * @param visible */ - public void setVisible(Boolean visible) { + void setVisible(Boolean visible) { this.visible = visible; } @@ -109,4 +115,21 @@ public String toString () { return Long.toString(value); } + + /** + * Method returns the enum information about how the counter have to be sorted. + * @return + * Sorting order information. + */ + public Sorting getSorting() { + return sorting; + } + + /** + * Sets new sorting. + * @param sorting + */ + public void setSorting(Sorting sorting) { + this.sorting = sorting; + } } Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCounterDescriptor.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCounterDescriptor.java 2006-01-09 17:22:30 UTC (rev 2042) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCounterDescriptor.java 2006-01-09 18:02:16 UTC (rev 2043) @@ -26,8 +26,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.Hashtable; -import java.util.LinkedList; -import java.util.List; import java.util.Map; import org.apache.xerces.parsers.DOMParser; @@ -54,6 +52,11 @@ private Map<String,Boolean> links; /** + * Describes the order in which counters are requested to be displayed. + */ + private Sorting sorting; + + /** * Name of tag in counter.xml containing counter link. */ public static final String LINK = "link"; @@ -69,6 +72,11 @@ public static final String VISIBILITY = "visible"; /** + * This variable contains name of the sorting attribute. + */ + public static final String SORTING = "sorting"; + + /** * This variable contains value for attributes which means TRUE. */ public static final String TRUE = "true"; @@ -104,6 +112,20 @@ // Parsing and gettting download links which are requested to be tracked by download counter. links = new Hashtable<String,Boolean>(); + + // Resolving way of sorting counters. + sorting = Sorting.RANDOM; + String sortingAtt = XmlTools.getAttributeValue(doc.getDocumentElement(),SORTING); + if (sortingAtt!=null && + (sortingAtt.compareToIgnoreCase(Sorting.ASCENDING.name())==0 + || sortingAtt.compareToIgnoreCase(Sorting.ASC.name())==0)) { + sorting = Sorting.ASCENDING; + } else if (sortingAtt!=null && + (sortingAtt.compareToIgnoreCase(Sorting.DESCENDING.name())==0 + || sortingAtt.compareToIgnoreCase(Sorting.DESC.name())==0)) { + sorting = Sorting.DESCENDING; + } + for (int i = 0; i < nodes.getLength(); i++) { n = nodes.item(i); if (n.getNodeType() == Node.ELEMENT_NODE) { @@ -131,6 +153,15 @@ } /** + * Returns sorting description for counters. + * @return + * Requested sorting order. + */ + public Sorting getSorting () { + return sorting; + } + + /** * Method simply returns links from the xml descriptor which are requested to be tracked. * @return * List<String> of download links. Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersDescriptor.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersDescriptor.java 2006-01-09 17:22:30 UTC (rev 2042) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersDescriptor.java 2006-01-09 18:02:16 UTC (rev 2043) @@ -25,15 +25,18 @@ import java.io.File; import java.io.InputStream; +import java.util.Comparator; import java.util.HashSet; import java.util.Hashtable; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeMap; import org.apache.xerces.parsers.DOMParser; import org.jboss.forge.common.XmlTools; +import org.jboss.logging.Logger; import org.jboss.shotoku.ContentManager; import org.jboss.shotoku.Directory; import org.jboss.shotoku.exceptions.ResourceDoesNotExist; @@ -50,7 +53,7 @@ * @author Ryszard Kozmik */ -public class DownloadCountersDescriptor extends AbstractDescriptor{ +public class DownloadCountersDescriptor extends AbstractDescriptor { /** * Name of tag in counters.xml containing counter value. @@ -78,6 +81,11 @@ public static final String VISIBILITY = "visible"; /** + * This variable contains name of the sorting attribute. + */ + public static final String SORTING = "sorting"; + + /** * This variable contains value for attributes which means TRUE. */ public static final String TRUE = "true"; @@ -98,6 +106,11 @@ private ContentManager contentManager; /** + * Logger is used for displaying messages. + */ + private Logger logger; + + /** * This boolean variable turns to true if one of the counters * has been incremented. If value is true the downloadCounters Map * will be synchronized with a main xml descriptor @@ -118,6 +131,9 @@ // Just initializing the changeStatus variable changeStatus=false; + // Initializing logger. + logger = Logger.getLogger(this.getClass()); + // Getting the path to main dowload counters descriptor. String pathToCountersXml = File.separator + DownloadCounterTools.getMainXmlPath(portalName); @@ -143,8 +159,7 @@ synchronizeCounters(descriptors); } catch (Exception e) { - System.out.println ("[DOWNLOADCOUNTERS] Failed to initialize downloadCounters."); - e.printStackTrace(); + logger.error ("Failed to initialize downloadCounters.",e); } } @@ -173,8 +188,7 @@ try { membersDir = contentManager.getDirectory(portalName+File.separator+ProjectsHelper.MEMBERS_DIR); } catch (ResourceDoesNotExist e) { - e.printStackTrace(); - System.out.println ("[DOWNLOADCOUNTERSDESCRIPTOR] Members directory not exists."); + logger.error ("Members directory not exists.",e); return null; } @@ -240,6 +254,7 @@ for (String link:xmlProjectLinks.keySet()) { if (links.keySet().contains(link)) { setCounterVisibility (link,links.get(link)); + setCounterSorting (link,counterDesc.getSorting()); links.keySet().remove(link); } else { linksToDelete.add(link); @@ -248,12 +263,11 @@ removeLinksFromCounting(linksToDelete); - addLinksForCounting (links,projectId); + addLinksForCounting (links,projectId,counterDesc.getSorting()); } catch (Exception e) { - System.out.println ("[DOWNLOADCOUNTER] Problem with opening project "+ - projectId+" download counter descriptor."); - e.printStackTrace(); + logger.warn("Problem with opening project "+ + projectId+" download counter descriptor.",e); } } @@ -290,6 +304,17 @@ } /** + * Method sets sorting order in which this counter will be displayed. + * @param link + * The link to the counter. + * @param sorting + * Requested sorting order. + */ + private synchronized void setCounterSorting (String link,Sorting sorting) { + downloadCounters.get(link).setSorting(sorting); + } + + /** * Method adds links which are wished to be tracked. * * @param links @@ -297,10 +322,10 @@ * @param projectId * Project id name for which the links are added. */ - private synchronized void addLinksForCounting (Map<String,Boolean> links,String projectId) { + private synchronized void addLinksForCounting (Map<String,Boolean> links,String projectId,Sorting sorting) { // Adding new download links for tracking. for (String link:links.keySet()) { - downloadCounters.put(link,new Counter(0,projectId,links.get(link))); + downloadCounters.put(link,new Counter(0,projectId,links.get(link),sorting)); } } @@ -353,7 +378,53 @@ */ public synchronized Map<String,Long> getValuesForPortlet (String projectId) { Map<String,Boolean> links = getProjectLinks(projectId); - Map<String,Long> values = new Hashtable<String,Long>(links.size()); + Map<String,Long> values = null; + if (links.size()==0) { + values = new Hashtable<String,Long>(0); + return values; + } + + // Resolving way of sorting for counters. + Sorting sorting = downloadCounters.get(links.keySet().iterator().next()).getSorting(); + if (sorting==Sorting.ASC || sorting==Sorting.ASCENDING) { + values = new TreeMap<String,Long>(new Comparator<String>() { + /** + * This method is used for comparing counters taking to consideration their values. + * If defines ascending order. + * @param o1 + * First link to compare. + * @param o2 + * Second link to compare. + * @return + * negative integer - when counter for the first link is lower than for second one + * zero - when counters for both links are equal + * positive integer - when counter for the first link is greater than for second one + */ + public synchronized int compare(String link1, String link2) { + return (int)(downloadCounters.get(link1).getValue()-downloadCounters.get(link2).getValue()); + } + }); + } else if (sorting==Sorting.DESC || sorting==Sorting.DESCENDING) { + values = new TreeMap<String,Long>(new Comparator<String>() { + /** + * This method is used for comparing counters taking to consideration their values. + * It defines descending order. + * @param o1 + * First link to compare. + * @param o2 + * Second link to compare. + * @return + * negative integer - when counter for the first link is greater than for second one + * zero - when counters for both links are equal + * positive integer - when counter for the first link is lower than for second one + */ + public synchronized int compare(String link1, String link2) { + return (int)(downloadCounters.get(link2).getValue()-downloadCounters.get(link1).getValue()); + } + }); + } else { + values = new Hashtable<String,Long>(links.size()); + } for (String link : links.keySet()) { if (links.get(link)) { values.put(link,downloadCounters.get(link).getValue()); @@ -417,6 +488,9 @@ Node counterVisibility = doc.createAttribute(VISIBILITY); counterVisibility.appendChild(doc.createTextNode(temporary.getVisible().toString())); newCounter.getAttributes().setNamedItem(counterVisibility); + Node counterSorting = doc.createAttribute(SORTING); + counterSorting.appendChild(doc.createTextNode(temporary.getSorting().name())); + newCounter.getAttributes().setNamedItem(counterSorting); Node newLink = doc.createElement(LINK); Node newLinkText = doc.createTextNode(link); @@ -501,6 +575,17 @@ n = nodes.item(i); if (n.getNodeType() == Node.ELEMENT_NODE) { if (n.getNodeName().equals(DownloadCountersDescriptor.COUNTER)) { + Sorting tempSorting = Sorting.RANDOM; + String sortingAtt = XmlTools.getAttributeValue(n,SORTING); + if (sortingAtt!=null && + (sortingAtt.compareToIgnoreCase(Sorting.ASCENDING.name())==0 + || sortingAtt.compareToIgnoreCase(Sorting.ASC.name())==0)) { + tempSorting = Sorting.ASCENDING; + } else if (sortingAtt!=null && + (sortingAtt.compareToIgnoreCase(Sorting.DESCENDING.name())==0 + || sortingAtt.compareToIgnoreCase(Sorting.DESC.name())==0)) { + tempSorting = Sorting.DESCENDING; + } NodeList counterProps = n.getChildNodes(); String tempLink = null; String tempValue = null; @@ -524,7 +609,7 @@ } } if (tempLink!=null && tempValue!=null && tempId!=null) { - values.put(tempLink,new Counter(Long.valueOf(tempValue),tempId,visibility)); + values.put(tempLink,new Counter(Long.valueOf(tempValue),tempId,visibility,tempSorting)); } } } @@ -532,4 +617,6 @@ return values; } + + } Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersWatcher.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersWatcher.java 2006-01-09 17:22:30 UTC (rev 2042) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersWatcher.java 2006-01-09 18:02:16 UTC (rev 2043) @@ -23,7 +23,6 @@ package org.jboss.forge.common.projects; -import java.util.Collection; import java.util.Set; import org.jboss.forge.common.service.NodeWatcher; Added: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/Sorting.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/Sorting.java 2006-01-09 17:22:30 UTC (rev 2042) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/Sorting.java 2006-01-09 18:02:16 UTC (rev 2043) @@ -0,0 +1,5 @@ +package org.jboss.forge.common.projects; + +public enum Sorting { + ASCENDING,ASC,DESCENDING,DESC,RANDOM +} Modified: trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/portlet/DownloadCounterPortlet.java =================================================================== --- trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/portlet/DownloadCounterPortlet.java 2006-01-09 17:22:30 UTC (rev 2042) +++ trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/portlet/DownloadCounterPortlet.java 2006-01-09 18:02:16 UTC (rev 2043) @@ -41,8 +41,9 @@ import org.jboss.shotoku.aop.Inject; /** + * DownloadCounters portlet. + * * @author Ryszard Kozmik - * Downlaod Counter portlet. */ public class DownloadCounterPortlet extends JBossPortlet { |