Author: tmortagne
Date: 2010-03-16 14:37:11 +0100 (Tue, 16 Mar 2010)
New Revision: 27653
Added:
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/rightsmanager/RightsManagerListener.java
Modified:
platform/core/trunk/xwiki-core/pom.xml
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/rightsmanager/RightsManager.java
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/rightsmanager/RightsManagerPlugin.java
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/stats/impl/StatsUtil.java
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/stats/impl/xwiki/XWikiStatsReader.java
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/user/api/XWikiRightService.java
platform/core/trunk/xwiki-core/src/test/java/com/xpn/xwiki/stats/impl/StatsUtilTest.java
Log:
XWIKI-4606: Statistics exclusions by user
Modified: platform/core/trunk/xwiki-core/pom.xml
===================================================================
--- platform/core/trunk/xwiki-core/pom.xml 2010-03-16 13:07:30 UTC (rev 27652)
+++ platform/core/trunk/xwiki-core/pom.xml 2010-03-16 13:37:11 UTC (rev 27653)
@@ -1396,7 +1396,8 @@
**/user/impl/LDAP/LDAPProfileXClass.java,
**/user/impl/exo/ExoAuthServiceImpl.java,
**/user/impl/exo/ExoFilter.java,
- **/user/impl/exo/ExoGroupServiceImpl.java
+ **/user/impl/exo/ExoGroupServiceImpl.java,
Should there be a comment here that this is excluded because of a fanout complexity
violation?
Caleb
+
**/stats/impl/xwiki/XWikiStatsReader.java
</excludes>
</configuration>
</plugin>
Modified:
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/rightsmanager/RightsManager.java
===================================================================
---
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/rightsmanager/RightsManager.java 2010-03-16
13:07:30 UTC (rev 27652)
+++
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/rightsmanager/RightsManager.java 2010-03-16
13:37:11 UTC (rev 27653)
@@ -23,17 +23,15 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
-import java.util.Hashtable;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.xwiki.observation.EventListener;
-import org.xwiki.observation.event.DocumentDeleteEvent;
-import org.xwiki.observation.event.Event;
-import org.xwiki.observation.remote.RemoteObservationManagerContext;
+import org.xwiki.model.reference.DocumentReference;
+import org.xwiki.model.reference.DocumentReferenceResolver;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
@@ -46,15 +44,16 @@
import com.xpn.xwiki.plugin.rightsmanager.utils.LevelTree;
import com.xpn.xwiki.plugin.rightsmanager.utils.RequestLimit;
import com.xpn.xwiki.plugin.rightsmanager.utils.UsersGroups;
+import com.xpn.xwiki.user.api.XWikiRightService;
import com.xpn.xwiki.web.Utils;
/**
- * Hidden toolkit use by the plugin API that make all the plugin's actions.
+ * Hidden toolkit used by the plugin API that make all the plugin's actions.
*
* @version $Id$
* @since XWiki Core 1.1.2, XWiki Core 1.2M2 (public since 1.4M1)
*/
-public final class RightsManager implements EventListener
+public final class RightsManager
{
/**
* Name of the default space where users and groups are stored.
@@ -134,26 +133,21 @@
// ////////////////////////////////////////////////////////////////////////////
/**
- * The name of the listener.
+ * Unique instance of RightsManager.
*/
- private static final String NAME = "rightsmanager";
+ private static RightsManager instance;
/**
- * The events to match.
+ * Used to resolve document reference based on another reference.
*/
- private static final List<Event> EVENTS = new ArrayList<Event>()
- {
- {
- add(new DocumentDeleteEvent());
- }
- };
+ private DocumentReferenceResolver<String> explicitDocumentReferenceResolver =
+ Utils.getComponent(DocumentReferenceResolver.class, "explicit");
- // ////////////////////////////////////////////////////////////////////////////
-
/**
- * Unique instance of RightsManager.
+ * Used to resolve reference based on context.
*/
- private static RightsManager instance;
+ private DocumentReferenceResolver<String> currentDocumentReferenceResolver =
+ Utils.getComponent(DocumentReferenceResolver.class, "current");
/**
* Hidden constructor of RightsManager only access via getInstance().
@@ -176,120 +170,6 @@
return instance;
}
- /**
- * Remove reference to provided user or group in all groups and rights in current
wiki.
- *
- * @param userOrGroupWiki the wiki name of the group or user.
- * @param userOrGroupSpace the space name of the group or user.
- * @param userOrGroupName the name of the group or user.
- * @param user indicate if it is a user or a group.
- * @param context the XWiki context.
- * @throws XWikiException error when browsing groups or rights.
- */
- private void cleanDeletedUserOrGroupInLocalWiki(String userOrGroupWiki, String
userOrGroupSpace,
- String userOrGroupName, boolean user, XWikiContext context) throws
XWikiException
- {
- removeUserOrGroupFromAllRights(userOrGroupWiki, userOrGroupSpace,
userOrGroupName, user, context);
-
context.getWiki().getGroupService(context).removeUserOrGroupFromAllGroups(userOrGroupWiki,
userOrGroupSpace,
- userOrGroupName, context);
- }
-
- /**
- * Remove reference to provided user or group in all groups and rights in all
wikis.
- *
- * @param userOrGroupWiki the wiki name of the group or user.
- * @param userOrGroupSpace the space name of the group or user.
- * @param userOrGroupName the name of the group or user.
- * @param user indicate if it is a user or a group.
- * @param context the XWiki context.
- * @throws XWikiException error when browsing groups or rights.
- */
- private void cleanDeletedUserOrGroup(String userOrGroupWiki, String
userOrGroupSpace, String userOrGroupName,
- boolean user, XWikiContext context) throws XWikiException
- {
- if (!context.getWiki().isVirtualMode()) {
- cleanDeletedUserOrGroupInLocalWiki(userOrGroupWiki, userOrGroupSpace,
userOrGroupName, user, context);
- } else {
- List<String> wikiList =
context.getWiki().getVirtualWikisDatabaseNames(context);
-
- String database = context.getDatabase();
- try {
- boolean foundMainWiki = false;
-
- for (String wikiName : wikiList) {
- if (context.isMainWiki(wikiName)) {
- foundMainWiki = true;
- }
-
- context.setDatabase(wikiName);
- cleanDeletedUserOrGroupInLocalWiki(userOrGroupWiki,
userOrGroupSpace, userOrGroupName, user,
- context);
- }
-
- if (!foundMainWiki) {
- context.setDatabase(context.getMainXWiki());
- cleanDeletedUserOrGroupInLocalWiki(userOrGroupWiki,
userOrGroupSpace, userOrGroupName, user,
- context);
- }
- } finally {
- context.setDatabase(database);
- }
- }
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.xwiki.observation.EventListener#getName()
- */
- public String getName()
- {
- return NAME;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.xwiki.observation.EventListener#getEvents()
- */
- public List<Event> getEvents()
- {
- return EVENTS;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see
org.xwiki.observation.EventListener#onEvent(org.xwiki.observation.event.Event,
java.lang.Object,
- * java.lang.Object)
- */
- public void onEvent(Event event, Object source, Object data)
- {
- // Only take into account local events
- if (!Utils.getComponent(RemoteObservationManagerContext.class).isRemoteState())
{
- XWikiDocument document = ((XWikiDocument) source).getOriginalDocument();
- XWikiContext context = (XWikiContext) data;
-
- String userOrGroupWiki = document.getDatabase();
- String userOrGroupSpace = document.getSpace();
- String userOrGroupName = document.getName();
-
- if (document.getObject("XWiki.XWikiUsers") != null) {
- try {
- cleanDeletedUserOrGroup(userOrGroupWiki, userOrGroupSpace,
userOrGroupName, true, context);
- } catch (XWikiException e) {
- LOG.warn("Error when cleaning for deleted user", e);
- }
- } else if (document.getObject("XWiki.XWikiGroups") != null) {
- try {
- cleanDeletedUserOrGroup(userOrGroupWiki, userOrGroupSpace,
userOrGroupName, false, context);
- } catch (XWikiException e) {
- LOG.warn("Error when cleaning for deleted group", e);
- }
- }
- }
- }
-
// Groups and users management
/**
@@ -1201,14 +1081,12 @@
Map<String, Collection<String>> groupCache = groupCacheIn;
if (groupCache == null) {
- groupCache = new Hashtable<String, Collection<String>>();
+ groupCache = new HashMap<String, Collection<String>>();
}
- Collection<String> memberList;
+ Collection<String> memberList = groupCache.get(groupName);
- if (groupCache.containsKey(groupName)) {
- memberList = groupCache.get(groupName);
- } else {
+ if (memberList == null) {
memberList =
context.getWiki().getGroupService(context).getAllMembersNamesForGroup(groupName, 0, 0,
context);
groupCache.put(groupName, memberList);
@@ -1228,4 +1106,91 @@
return found;
}
+
+ /**
+ * Resolve passed user or group into users references list.
+ *
+ * @param userOrGroup the user or group
+ * @param context the XWikiContext the XWiki context
+ * @return the list of users references
+ * @throws XWikiException error when getting documents
+ */
+ public Collection<DocumentReference> resolveUsers(DocumentReference
userOrGroup, XWikiContext context)
+ throws XWikiException
+ {
+ Collection<DocumentReference> users = new
LinkedHashSet<DocumentReference>();
+
+ // Try it as virtual user (guest, superadmin)
+
+ if
(userOrGroup.getLastSpaceReference().getName().equals(DEFAULT_USERORGROUP_SPACE)
+ &&
(userOrGroup.getName().equalsIgnoreCase(XWikiRightService.SUPERADMIN_USER) ||
userOrGroup.getName()
+ .equals(XWikiRightService.GUEST_USER))) {
+ users.add(userOrGroup);
+ }
+
+ // resolve
+
+ XWikiDocument document = context.getWiki().getDocument(userOrGroup, context);
+
+ if (!document.isNew()) {
+ // Try it as user
+
+ DocumentReference userClassReference =
+ new DocumentReference(document.getDatabase(), DEFAULT_USERORGROUP_SPACE,
"XWikiUsers");
+
+ if (document.getXObject(userClassReference) != null) {
+ users.add(userOrGroup);
+ }
+
+ // Try it as group
+
+ DocumentReference groupClassReference =
+ new DocumentReference(document.getDatabase(), DEFAULT_USERORGROUP_SPACE,
"XWikiGroups");
+
+ List<BaseObject> members = document.getXObjects(groupClassReference);
+ if (members != null) {
+ for (BaseObject memberObj : members) {
+ String member = memberObj.getStringValue("member");
+
+
users.addAll(resolveUsers(this.explicitDocumentReferenceResolver.resolve(member,
userOrGroup),
+ context));
+ }
+ }
+ }
+
+ return users;
+ }
+
+ /**
+ * Resolve passed user or group into users references list.
+ *
+ * @param userOrGroup the user or group
+ * @param context the XWikiContext the XWiki context
+ * @return the list of users references
+ * @throws XWikiException error when getting documents
+ */
+ public Collection<DocumentReference> resolveUsers(String userOrGroup,
XWikiContext context) throws XWikiException
+ {
+ return resolveUsers(this.currentDocumentReferenceResolver.resolve(userOrGroup),
context);
+ }
+
+ /**
+ * Resolve passed users and groups into users references list.
+ *
+ * @param referenceList the list of users and groups
+ * @param context the XWikiContext the XWiki context
+ * @return the list of users references
+ * @throws XWikiException error when getting documents
+ */
+ public Collection<DocumentReference> resolveUsers(List<String>
referenceList, XWikiContext context)
+ throws XWikiException
+ {
+ Collection<DocumentReference> users = new
LinkedHashSet<DocumentReference>();
+
+ for (String reference : referenceList) {
+ users.addAll(resolveUsers(reference, context));
+ }
+
+ return users;
+ }
}
Added:
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/rightsmanager/RightsManagerListener.java
===================================================================
---
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/rightsmanager/RightsManagerListener.java
(rev 0)
+++
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/rightsmanager/RightsManagerListener.java 2010-03-16
13:37:11 UTC (rev 27653)
@@ -0,0 +1,208 @@
+/*
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+
+package com.xpn.xwiki.plugin.rightsmanager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.xwiki.observation.EventListener;
+import org.xwiki.observation.event.DocumentDeleteEvent;
+import org.xwiki.observation.event.Event;
+import org.xwiki.observation.remote.RemoteObservationManagerContext;
+
+import com.xpn.xwiki.XWikiContext;
+import com.xpn.xwiki.XWikiException;
+import com.xpn.xwiki.doc.XWikiDocument;
+import com.xpn.xwiki.web.Utils;
+
+/**
+ * Listener to user and groups events to apply related automatic task like cleaning
groups and rights objects.
+ *
+ * @version $Id: RightsManager.java 22782 2009-08-18 13:50:24Z tmortagne $
+ * @since XWiki Core 2.2.3
+ */
+public final class RightsManagerListener implements EventListener
+{
+ /**
+ * The logging tool.
+ */
+ private static final Log LOG = LogFactory.getLog(RightsManagerListener.class);
+
+ /**
+ * The name of the listener.
+ */
+ private static final String NAME = "rightsmanager";
+
+ /**
+ * The events to match.
+ */
+ private static final List<Event> EVENTS = new ArrayList<Event>()
+ {
+ {
+ add(new DocumentDeleteEvent());
+ }
+ };
+
+ // ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Unique instance of RightsManager.
+ */
+ private static RightsManagerListener instance;
+
+ /**
+ * Hidden constructor of RightsManager only access via getInstance().
+ */
+ private RightsManagerListener()
+ {
+ }
+
+ /**
+ * @return a unique instance of RightsManager. Thread safe.
+ */
+ public static RightsManagerListener getInstance()
+ {
+ synchronized (RightsManagerListener.class) {
+ if (instance == null) {
+ instance = new RightsManagerListener();
+ }
+ }
+
+ return instance;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.xwiki.observation.EventListener#getName()
+ */
+ public String getName()
+ {
+ return NAME;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.xwiki.observation.EventListener#getEvents()
+ */
+ public List<Event> getEvents()
+ {
+ return EVENTS;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see
org.xwiki.observation.EventListener#onEvent(org.xwiki.observation.event.Event,
java.lang.Object,
+ * java.lang.Object)
+ */
+ public void onEvent(Event event, Object source, Object data)
+ {
+ // Only take into account local events
+ if (!Utils.getComponent(RemoteObservationManagerContext.class).isRemoteState())
{
+ XWikiDocument document = ((XWikiDocument) source).getOriginalDocument();
+ XWikiContext context = (XWikiContext) data;
+
+ String userOrGroupWiki = document.getDatabase();
+ String userOrGroupSpace = document.getSpace();
+ String userOrGroupName = document.getName();
+
+ if (document.getObject("XWiki.XWikiUsers") != null) {
+ try {
+ cleanDeletedUserOrGroup(userOrGroupWiki, userOrGroupSpace,
userOrGroupName, true, context);
+ } catch (XWikiException e) {
+ LOG.warn("Error when cleaning for deleted user", e);
+ }
+ } else if (document.getObject("XWiki.XWikiGroups") != null) {
+ try {
+ cleanDeletedUserOrGroup(userOrGroupWiki, userOrGroupSpace,
userOrGroupName, false, context);
+ } catch (XWikiException e) {
+ LOG.warn("Error when cleaning for deleted group", e);
+ }
+ }
+ }
+ }
+
+ /**
+ * Remove reference to provided user or group in all groups and rights in current
wiki.
+ *
+ * @param userOrGroupWiki the wiki name of the group or user.
+ * @param userOrGroupSpace the space name of the group or user.
+ * @param userOrGroupName the name of the group or user.
+ * @param user indicate if it is a user or a group.
+ * @param context the XWiki context.
+ * @throws XWikiException error when browsing groups or rights.
+ */
+ private void cleanDeletedUserOrGroupInLocalWiki(String userOrGroupWiki, String
userOrGroupSpace,
+ String userOrGroupName, boolean user, XWikiContext context) throws
XWikiException
+ {
+ RightsManager.getInstance().removeUserOrGroupFromAllRights(userOrGroupWiki,
userOrGroupSpace, userOrGroupName,
+ user, context);
+
context.getWiki().getGroupService(context).removeUserOrGroupFromAllGroups(userOrGroupWiki,
userOrGroupSpace,
+ userOrGroupName, context);
+ }
+
+ /**
+ * Remove reference to provided user or group in all groups and rights in all
wikis.
+ *
+ * @param userOrGroupWiki the wiki name of the group or user.
+ * @param userOrGroupSpace the space name of the group or user.
+ * @param userOrGroupName the name of the group or user.
+ * @param user indicate if it is a user or a group.
+ * @param context the XWiki context.
+ * @throws XWikiException error when browsing groups or rights.
+ */
+ private void cleanDeletedUserOrGroup(String userOrGroupWiki, String
userOrGroupSpace, String userOrGroupName,
+ boolean user, XWikiContext context) throws XWikiException
+ {
+ if (!context.getWiki().isVirtualMode()) {
+ cleanDeletedUserOrGroupInLocalWiki(userOrGroupWiki, userOrGroupSpace,
userOrGroupName, user, context);
+ } else {
+ List<String> wikiList =
context.getWiki().getVirtualWikisDatabaseNames(context);
+
+ String database = context.getDatabase();
+ try {
+ boolean foundMainWiki = false;
+
+ for (String wikiName : wikiList) {
+ if (context.isMainWiki(wikiName)) {
+ foundMainWiki = true;
+ }
+
+ context.setDatabase(wikiName);
+ cleanDeletedUserOrGroupInLocalWiki(userOrGroupWiki,
userOrGroupSpace, userOrGroupName, user,
+ context);
+ }
+
+ if (!foundMainWiki) {
+ context.setDatabase(context.getMainXWiki());
+ cleanDeletedUserOrGroupInLocalWiki(userOrGroupWiki,
userOrGroupSpace, userOrGroupName, user,
+ context);
+ }
+ } finally {
+ context.setDatabase(database);
+ }
+ }
+ }
+}
Property changes on:
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/rightsmanager/RightsManagerListener.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified:
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/rightsmanager/RightsManagerPlugin.java
===================================================================
---
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/rightsmanager/RightsManagerPlugin.java 2010-03-16
13:07:30 UTC (rev 27652)
+++
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/plugin/rightsmanager/RightsManagerPlugin.java 2010-03-16
13:37:11 UTC (rev 27653)
@@ -75,10 +75,10 @@
// removed in order to remove that user from its groups.
// Make sure we allow this plugin to be initialized several times in a row; i.e.
don't re-register the
// listener if it's already registered.
- RightsManager rightsManager = RightsManager.getInstance();
+ RightsManagerListener rightsManagerListener =
RightsManagerListener.getInstance();
ObservationManager observationManager =
Utils.getComponent(ObservationManager.class);
- if (observationManager.getListener(rightsManager.getName()) == null) {
- observationManager.addListener(rightsManager);
+ if (observationManager.getListener(rightsManagerListener.getName()) == null) {
+ observationManager.addListener(rightsManagerListener);
}
}
Modified:
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/stats/impl/StatsUtil.java
===================================================================
---
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/stats/impl/StatsUtil.java 2010-03-16
13:07:30 UTC (rev 27652)
+++
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/stats/impl/StatsUtil.java 2010-03-16
13:37:11 UTC (rev 27653)
@@ -23,8 +23,10 @@
import java.net.MalformedURLException;
import java.net.URL;
+import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
+import java.util.Collections;
import java.util.Date;
import java.util.List;
@@ -36,12 +38,13 @@
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.xwiki.model.reference.DocumentReference;
+import org.xwiki.query.Query;
+import org.xwiki.query.QueryManager;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
-import org.xwiki.query.Query;
-import org.xwiki.query.QueryManager;
-
+import com.xpn.xwiki.plugin.rightsmanager.RightsManager;
import com.xpn.xwiki.user.api.XWikiRightService;
import com.xpn.xwiki.util.Util;
import com.xpn.xwiki.web.XWikiRequest;
@@ -59,11 +62,26 @@
private static final Log LOG = LogFactory.getLog(StatsUtil.class);
/**
+ * Default separator for a list.
+ */
+ private static final String LIST_SEPARATOR = ",";
+
+ /**
+ * Default separator for a list in escaped form.
+ */
+ private static final String ESCAPED_LIST_SEPARATOR = "\\,";
+
+ /**
* The name of the property in XWiki configuration file containing the list of
cookie domains.
*/
private static final String CFGPROP_COOKIEDOMAINS =
"xwiki.authentication.cookiedomains";
/**
+ * Separator for the property in XWiki configuration file containing the list of
cookie domains.
+ */
+ private static final char CFGPROP_COOKIEDOMAINS_SEP = ',';
+
+ /**
* The name of the property in XWiki configuration file indicating if statistics are
enabled.
*/
private static final String CFGPROP_STATS = "xwiki.stats";
@@ -74,6 +92,12 @@
private static final String CFGPROP_STATS_DEFAULT =
"xwiki.stats.default";
/**
+ * The name of the property in XWiki configuration file containing the list of users
and group to filter in
+ * statistics requests.
+ */
+ private static final String CFGPROP_STATS_EXCLUDEDUSERSANDGROUPS =
"xwiki.stats.excludedUsersAndGroups";
+
+ /**
* The prefix name of the session property containing recent statistics actions.
*/
private static final String SESSPROP_RECENT_PREFFIX = "recent_";
@@ -94,6 +118,12 @@
private static final String PREFPROP_STATISTICS = "statistics";
/**
+ * The name of the XWiki preferences property containing the list of users and group
to filter in statistics
+ * requests.
+ */
+ private static final String PREFPROP_EXCLUDEDUSERSANDGROUPS =
"statistics_excludedUsersAndGroups";
+
+ /**
* The name of the request property containing the referer.
*/
private static final String REQPROP_REFERER = "referer";
@@ -158,7 +188,8 @@
* <ul>
* <li>"yyyMMdd" for {@link PeriodType#DAY}</li>
* <li>"yyyMM" for {@link PeriodType#MONTH}</li>
- * </ul>.
+ * </ul>
+ * .
*
* @param date the date for which to return an integer representation.
* @param type the date type. It can be {@link PeriodType#DAY} or {@link
PeriodType#MONTH}.
@@ -195,7 +226,8 @@
public static String[] getCookieDomains(XWikiContext context)
{
if (cookieDomains == null) {
- cookieDomains =
StringUtils.split(context.getWiki().Param(CFGPROP_COOKIEDOMAINS), ",");
+ cookieDomains =
+ StringUtils.split(context.getWiki().Param(CFGPROP_COOKIEDOMAINS),
CFGPROP_COOKIEDOMAINS_SEP);
}
return cookieDomains;
@@ -345,7 +377,7 @@
}
}
- if ((!context.getUser().equals(XWikiRightService.GUEST_USER_FULLNAME))
+ if ((!context.getUser().equals(XWikiRightService.GUEST_USER_FULLNAME))
&&
(visitObject.getUser().equals(XWikiRightService.GUEST_USER_FULLNAME))) {
// The user has changed from guest to an authenticated user
// We want to record this
@@ -653,4 +685,51 @@
return referer;
}
+
+ /**
+ * The list of users to filter in request.
+ *
+ * @param context the XWiki context
+ * @return the list of users references
+ * @throws XWikiException error when trying to resolve users
+ */
+ public static Collection<DocumentReference> getFilteredUsers(XWikiContext
context) throws XWikiException
+ {
+ List<String> userList;
+
+ String users =
context.getWiki().getXWikiPreference(PREFPROP_EXCLUDEDUSERSANDGROUPS, "",
context);
+
+ if (StringUtils.isEmpty(users)) {
+ users = context.getWiki().Param(CFGPROP_STATS_EXCLUDEDUSERSANDGROUPS);
+ }
+
+ if (!StringUtils.isBlank(users)) {
+ userList = new ArrayList<String>();
+
+ int begin = 0;
+ boolean escaped = false;
+ for (int i = 0; i < users.length(); ++i) {
+ char c = users.charAt(i);
+
+ if (!escaped) {
+ if (c == '\\') {
+ escaped = true;
+ } else if (c == ',') {
+ userList.add(users.substring(begin,
i).replace(ESCAPED_LIST_SEPARATOR, LIST_SEPARATOR));
+ begin = i + 1;
+ }
+ } else {
+ escaped = false;
+ }
+ }
+
+ if (begin < users.length()) {
+ userList.add(users.substring(begin).replace(ESCAPED_LIST_SEPARATOR,
LIST_SEPARATOR));
+ }
+ } else {
+ userList = Collections.emptyList();
+ }
+
+ return RightsManager.getInstance().resolveUsers(userList, context);
+ }
}
Modified:
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/stats/impl/xwiki/XWikiStatsReader.java
===================================================================
---
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/stats/impl/xwiki/XWikiStatsReader.java 2010-03-16
13:07:30 UTC (rev 27652)
+++
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/stats/impl/xwiki/XWikiStatsReader.java 2010-03-16
13:37:11 UTC (rev 27653)
@@ -32,7 +32,11 @@
import java.util.Map;
import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.joda.time.DateTime;
+import org.xwiki.model.reference.DocumentReference;
+import org.xwiki.model.reference.EntityReferenceSerializer;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
@@ -49,6 +53,7 @@
import com.xpn.xwiki.store.XWikiHibernateStore;
import com.xpn.xwiki.web.DownloadAction;
import com.xpn.xwiki.web.SaveAction;
+import com.xpn.xwiki.web.Utils;
import com.xpn.xwiki.web.ViewAction;
/**
@@ -60,6 +65,17 @@
public class XWikiStatsReader
{
/**
+ * Logging tool.
+ */
+ private static final Log LOG = LogFactory.getLog(XWikiStatsReader.class);
+
+ /**
+ * Used to convert a proper Document Reference to a string but without the wiki
name.
+ */
+ private EntityReferenceSerializer<String> compactwikiEntityReferenceSerializer
=
+ Utils.getComponent(EntityReferenceSerializer.class, "compactwiki");
+
+ /**
* Return the statistics action stored.
*
* @param action the action.
@@ -137,8 +153,7 @@
}
/**
- * Shows how the statistics for the specified action have evolved over the specified
period of
- * time.
+ * Shows how the statistics for the specified action have evolved over the specified
period of time.
*
* @param action the action for which to retrieve statistics.
* @param scope the set of documents to consider.
@@ -147,14 +162,13 @@
* @param context the XWiki context.
* @return a map of (date, actionCount) pairs.
*/
- public Map<DateTime, Integer> getActionStatistics(String action, Scope scope,
Period period,
- Duration step, XWikiContext context)
+ public Map<DateTime, Integer> getActionStatistics(String action, Scope scope,
Period period, Duration step,
+ XWikiContext context)
{
DateTime stepStart = new DateTime(period.getStart());
DateTime periodEnd = new DateTime(period.getEnd());
org.joda.time.Period stepDuration =
- new org.joda.time.Period(step.getYears(), step.getMonths(), step.getWeeks(),
step
- .getDays(), 0, 0, 0, 0);
+ new org.joda.time.Period(step.getYears(), step.getMonths(), step.getWeeks(),
step.getDays(), 0, 0, 0, 0);
Map<DateTime, Integer> activity = new HashMap<DateTime, Integer>();
while (stepStart.compareTo(periodEnd) < 0) {
@@ -163,8 +177,8 @@
stepEnd = periodEnd;
}
List<DocumentStats> stats =
- getDocumentStatistics(action, scope, new Period(stepStart.getMillis(),
stepEnd
- .getMillis()), RangeFactory.FIRST, context);
+ getDocumentStatistics(action, scope, new Period(stepStart.getMillis(),
stepEnd.getMillis()),
+ RangeFactory.FIRST, context);
int actionCount = 0;
if (stats.size() > 0) {
actionCount = stats.get(0).getPageViews();
@@ -179,18 +193,16 @@
/**
* Retrieves document statistics.
*
- * @param action the action the results should be ordered by. It can be one of:
"view", "save"
- * or "download". If the action is "view" then the
documents are ordered by the
- * number of times they have been viewed so far.
+ * @param action the action the results should be ordered by. It can be one of:
"view", "save" or "download". If the
+ * action is "view" then the documents are ordered by the
number of times they have been viewed so far.
* @param scope the set of documents for which to retrieve statistics.
* @param period the period of time, including its start date but excluding its end
date.
- * @param range the sub-range to return from the entire result set. Use this
parameter for
- * pagination.
+ * @param range the sub-range to return from the entire result set. Use this
parameter for pagination.
* @param context the XWiki context.
* @return A list of DocumentStats objects
*/
- public List<DocumentStats> getDocumentStatistics(String action, Scope scope,
Period period,
- Range range, XWikiContext context)
+ public List<DocumentStats> getDocumentStatistics(String action, Scope scope,
Period period, Range range,
+ XWikiContext context)
{
List<DocumentStats> documentStatsList;
@@ -203,18 +215,17 @@
XWikiHibernateStore store = context.getWiki().getHibernateStore();
try {
- String query = MessageFormat.format(
- "select name, sum(pageViews) from DocumentStats"
- + " where {0} and action=? and ? <= period and period < ?
group by name order"
- + " by sum(pageViews) {1}", nameFilter, sortOrder);
+ String query =
+ MessageFormat.format("select name, sum(pageViews) from
DocumentStats"
+ + " where {0} and action=? and ? <= period and period < ?
group by name order"
+ + " by sum(pageViews) {1}", nameFilter, sortOrder);
paramList.add(action);
paramList.add(period.getStartCode());
paramList.add(period.getEndCode());
List< ? > solist =
- store.search(query, range.getAbsoluteSize(), range.getAbsoluteStart(),
paramList,
- context);
+ store.search(query, range.getAbsoluteSize(), range.getAbsoluteStart(),
paramList, context);
documentStatsList = getDocumentStatistics(solist, action);
if (range.getSize() < 0) {
@@ -233,8 +244,7 @@
* @param resultSet the result of a database query for document statistics.
* @param action the action for which the statistics were retrieved.
* @return a list of {@link com.xpn.xwiki.stats.impl.DocumentStats} objects.
- * @see #getDocumentStatistics(String, Scope, com.xpn.xwiki.criteria.impl.Period ,
Range ,
- * XWikiContext)
+ * @see #getDocumentStatistics(String, Scope, com.xpn.xwiki.criteria.impl.Period ,
Range , XWikiContext)
*/
private List<DocumentStats> getDocumentStatistics(List< ? > resultSet,
String action)
{
@@ -246,8 +256,7 @@
Object[] result = (Object[]) it.next();
// We can't represent a custom period (e.g. year, week or some time
interval) in the
// database and thus we use a default one, which sould be ignored
- DocumentStats docStats =
- new DocumentStats((String) result[0], action, now, PeriodType.DAY);
+ DocumentStats docStats = new DocumentStats((String) result[0], action, now,
PeriodType.DAY);
docStats.setPageViews(((Number) result[1]).intValue());
documentStatsList.add(docStats);
}
@@ -261,13 +270,12 @@
* @param domain the domain used for filtering the results.
* @param scope the scope of referred documents for which to retrieve statistics.
* @param period the period of time, including its start date but excluding its end
date.
- * @param range the sub-range to return from the entire result set. Use this
parameter for
- * pagination.
+ * @param range the sub-range to return from the entire result set. Use this
parameter for pagination.
* @param context the XWiki context.
* @return a list of DocumentStats objects.
*/
- public List<DocumentStats> getBackLinkStatistics(String domain, Scope scope,
Period period,
- Range range, XWikiContext context)
+ public List<DocumentStats> getBackLinkStatistics(String domain, Scope scope,
Period period, Range range,
+ XWikiContext context)
{
List<DocumentStats> documentStatsList;
@@ -279,18 +287,17 @@
XWikiHibernateStore store = context.getWiki().getHibernateStore();
try {
- String query = MessageFormat.format(
- "select name, sum(pageViews) from RefererStats"
- + " where {0} and referer like ? and ? <= period and period <
? group by name"
- + " order by sum(pageViews) {1}", nameFilter, sortOrder);
+ String query =
+ MessageFormat.format("select name, sum(pageViews) from
RefererStats"
+ + " where {0} and referer like ? and ? <= period and period
< ? group by name"
+ + " order by sum(pageViews) {1}", nameFilter, sortOrder);
paramList.add(getHqlValidDomain(domain));
paramList.add(period.getStartCode());
paramList.add(period.getEndCode());
List< ? > solist =
- store.search(query, range.getAbsoluteSize(), range.getAbsoluteStart(),
paramList,
- context);
+ store.search(query, range.getAbsoluteSize(), range.getAbsoluteStart(),
paramList, context);
documentStatsList = getDocumentStatistics(solist, "refer");
if (range.getSize() < 0) {
@@ -306,17 +313,16 @@
/**
* Retrieves referrer statistics.
*
- * @param domain the domain for which to retrieve statistics. To retrieve statistics
for all
- * domains use the empty string.
+ * @param domain the domain for which to retrieve statistics. To retrieve statistics
for all domains use the empty
+ * string.
* @param scope the scope of referred documents to use for filtering the results.
* @param period the period of time, including its start date but excluding its end
date.
- * @param range the sub-range to return from the entire result set. Use this
parameter for
- * pagination.
+ * @param range the sub-range to return from the entire result set. Use this
parameter for pagination.
* @param context the XWiki context.
* @return a list of RefererStats objects.
*/
- public List<RefererStats> getRefererStatistics(String domain, Scope scope,
Period period,
- Range range, XWikiContext context)
+ public List<RefererStats> getRefererStatistics(String domain, Scope scope,
Period period, Range range,
+ XWikiContext context)
{
List<RefererStats> refererList;
@@ -338,8 +344,7 @@
paramList.add(period.getEndCode());
List< ? > solist =
- store.search(query, range.getAbsoluteSize(), range.getAbsoluteStart(),
paramList,
- context);
+ store.search(query, range.getAbsoluteSize(), range.getAbsoluteStart(),
paramList, context);
refererList = getRefererStatistics(solist);
if (range.getSize() < 0) {
@@ -353,8 +358,8 @@
}
/**
- * Converts the rows retrieved from the database to a list of
- * {@link com.xpn.xwiki.stats.impl.RefererStats} instances.
+ * Converts the rows retrieved from the database to a list of {@link
com.xpn.xwiki.stats.impl.RefererStats}
+ * instances.
*
* @param resultSet The result of a database query for referer statistics
* @return A list of {@link com.xpn.xwiki.stats.impl.RefererStats} objects
@@ -379,60 +384,103 @@
}
/**
- * Retrieves visit statistics.
+ * Generate the HQL query used in {@link #getVisitStatistics(String, Period, Range,
XWikiContext)}.
*
- * @param action the action the results should be ordered by. It can be one of:
"view", "save"
- * or "download". If the action is "view" then the
visitors are ordered by the number
- * of pages they have viewed so far.
+ * @param action the action the results should be ordered by. It can be one of:
"view", "save" or "download". If the
+ * action is "view" then the visitors are ordered by the number
of pages they have viewed so far.
* @param period the period of time, including its start date but excluding its end
date.
- * @param range the sub-range to return from the entire result set. Use this
parameter for
- * pagination.
+ * @param range the sub-range to return from the entire result set. Use this
parameter for pagination.
+ * @param paramList the list of query parameters to fill.
* @param context the XWiki context.
- * @return a list of VisitStats objects.
+ * @return the HQL query
*/
- public List<VisitStats> getVisitStatistics(String action, Period period, Range
range,
+ private String createVisitStatisticsQuery(String action, Period period, Range range,
List<Object> paramList,
XWikiContext context)
{
- List<VisitStats> visiStatList;
+ StringBuffer query = new StringBuffer("select name, sum(pageSaves),
sum(pageViews), sum(downloads)");
- List<Object> paramList = new ArrayList<Object>(2);
+ query.append(" from VisitStats");
+ query.append(" where");
+
+ // user filter
+
+ StringBuffer userListWhere = new StringBuffer();
+ try {
+ for (DocumentReference user : StatsUtil.getFilteredUsers(context)) {
+ if (userListWhere.length() > 0) {
+ userListWhere.append(", ");
+ }
+ userListWhere.append('?');
+
+
paramList.add(this.compactwikiEntityReferenceSerializer.serialize(user));
+ }
+ } catch (Exception e) {
+ LOG.error("Faild to get filter users list", e);
+ }
+
+ if (userListWhere.length() > 0) {
+ query.append(" name NOT IN (");
+ query.append(userListWhere);
+ query.append(") and ");
+ }
+
+ // date filter
+
+ query.append(" ? <= startDate and endDate < ? group by name");
+ paramList.add(new Date(period.getStart()));
+ paramList.add(new Date(period.getEnd()));
+
+ // order
+
+ query.append(' ');
+
String sortOrder = getHqlSortOrderFromRange(range);
- String orderByClause;
if (action.equals(SaveAction.ACTION_NAME)) {
- orderByClause = "order by sum(pageSaves) " + sortOrder;
+ query.append("order by sum(pageSaves) " + sortOrder);
} else if (action.equals(ViewAction.VIEW_ACTION)) {
- orderByClause = "order by sum(pageViews) " + sortOrder;
+ query.append("order by sum(pageViews) " + sortOrder);
} else if (action.equals(DownloadAction.ACTION_NAME)) {
- orderByClause = "order by sum(downloads) " + sortOrder;
+ query.append("order by sum(downloads) " + sortOrder);
} else {
- orderByClause =
- MessageFormat.format("order by sum(pageSaves) {0}," + "
sum(pageViews) {0},"
- + " sum(downloads) {0}", sortOrder);
+ query.append(MessageFormat.format("order by sum(pageSaves) {0},
sum(pageViews) {0}, sum(downloads) {0}",
+ sortOrder));
}
+ return query.toString();
+ }
+
+ /**
+ * Retrieves visit statistics.
+ *
+ * @param action the action the results should be ordered by. It can be one of:
"view", "save" or "download". If the
+ * action is "view" then the visitors are ordered by the number
of pages they have viewed so far.
+ * @param period the period of time, including its start date but excluding its end
date.
+ * @param range the sub-range to return from the entire result set. Use this
parameter for pagination.
+ * @param context the XWiki context.
+ * @return a list of VisitStats objects.
+ */
+ public List<VisitStats> getVisitStatistics(String action, Period period, Range
range, XWikiContext context)
+ {
+ List<VisitStats> visiStatList;
+
+ List<Object> paramList = new ArrayList<Object>(2);
+
+ String query = createVisitStatisticsQuery(action, period, range, paramList,
context);
+
XWikiHibernateStore store = context.getWiki().getHibernateStore();
try {
- String query =
- "select name, sum(pageSaves), sum(pageViews), sum(downloads)"
- + " from VisitStats" + " where ? <= startDate and
endDate < ? group by name "
- + orderByClause;
-
- paramList.add(new Date(period.getStart()));
- paramList.add(new Date(period.getEnd()));
-
List< ? > solist =
- store.search(query, range.getAbsoluteSize(), range.getAbsoluteStart(),
paramList,
- context);
+ store.search(query, range.getAbsoluteSize(), range.getAbsoluteStart(),
paramList, context);
- visiStatList =
- getVisitStatistics(solist, new DateTime(period.getStart()), new
DateTime(period
- .getEnd()));
+ visiStatList = getVisitStatistics(solist, new DateTime(period.getStart()),
new DateTime(period.getEnd()));
if (range.getSize() < 0) {
Collections.reverse(visiStatList);
}
} catch (XWikiException e) {
+ LOG.error("Faild to search for vist statistics", e);
+
visiStatList = Collections.emptyList();
}
@@ -446,10 +494,9 @@
* @param startDate the start date used in the query.
* @param endDate the end date used in the query.
* @return a list of {@link com.xpn.xwiki.stats.impl.VisitStats} objects.
- * @see #getVisitStatistics(com.xpn.xwiki.criteria.impl.Period , Range ,
XWikiContext)
+ * @see #getVisitStatistics(String, Period, Range, XWikiContext)
*/
- private List<VisitStats> getVisitStatistics(List< ? > resultSet,
DateTime startDate,
- DateTime endDate)
+ private List<VisitStats> getVisitStatistics(List< ? > resultSet,
DateTime startDate, DateTime endDate)
{
List<VisitStats> stats = new
ArrayList<VisitStats>(resultSet.size());
@@ -466,8 +513,7 @@
int downloads = ((Number) result[3]).intValue();
VisitStats vs =
- new VisitStats(name, uniqueID, cookie, ip, userAgent, new
Date(startDate
- .getMillis()), PeriodType.DAY);
+ new VisitStats(name, uniqueID, cookie, ip, userAgent, new
Date(startDate.getMillis()), PeriodType.DAY);
vs.setStartDate(new Date(startDate.getMillis()));
vs.setEndDate(new Date(endDate.getMillis()));
vs.setPageSaves(pageSaves);
@@ -492,12 +538,10 @@
* @param month the month.
* @param context the XWiki context.
* @return DocumentStats - statistics object.
- * @deprecated use {@link #getDocumentStatistics(String, Scope, Period, Range ,
XWikiContext)}
- * instead.
+ * @deprecated use {@link #getDocumentStatistics(String, Scope, Period, Range ,
XWikiContext)} instead.
*/
@Deprecated
- public DocumentStats getDocMonthStats(String docname, String action, Date month,
- XWikiContext context)
+ public DocumentStats getDocMonthStats(String docname, String action, Date month,
XWikiContext context)
{
XWikiHibernateStore store = context.getWiki().getHibernateStore();
DocumentStats object = new DocumentStats(docname, action, month,
PeriodType.MONTH);
@@ -518,12 +562,10 @@
* @param context the XWiki context.
* @return the monthly referer statistics.
* @throws XWikiException error when searching for referer statistics.
- * @deprecated use {@link #getRefererStatistics(String, Scope, Period, Range,
XWikiContext)}
- * instead.
+ * @deprecated use {@link #getRefererStatistics(String, Scope, Period, Range,
XWikiContext)} instead.
*/
@Deprecated
- public List< ? > getRefMonthStats(String docName, Date month, XWikiContext
context)
- throws XWikiException
+ public List< ? > getRefMonthStats(String docName, Date month, XWikiContext
context) throws XWikiException
{
XWikiHibernateStore store = context.getWiki().getHibernateStore();
@@ -531,9 +573,7 @@
if (store != null) {
List<Object> paramList = new ArrayList<Object>(1);
paramList.add(docName);
- solist =
- store.search("from RefererStats as obj where obj.name=?", 0,
0, paramList,
- context);
+ solist = store.search("from RefererStats as obj where obj.name=?",
0, 0, paramList, context);
} else {
solist = Collections.emptyList();
}
Modified:
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/user/api/XWikiRightService.java
===================================================================
---
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/user/api/XWikiRightService.java 2010-03-16
13:07:30 UTC (rev 27652)
+++
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/user/api/XWikiRightService.java 2010-03-16
13:37:11 UTC (rev 27653)
@@ -40,9 +40,14 @@
public static final String SUPERADMIN_USER_FULLNAME = "XWiki." +
SUPERADMIN_USER;
/**
+ * The Guest username.
+ */
+ public static final String GUEST_USER = "XWikiGuest";
+
+ /**
* The Guest full name.
*/
- public static final String GUEST_USER_FULLNAME = "XWiki.XWikiGuest";
+ public static final String GUEST_USER_FULLNAME = "XWiki." + GUEST_USER;
/**
* Checks if the wiki current user has the right to execute (@code action} on the
document {@code doc}, along with
Modified:
platform/core/trunk/xwiki-core/src/test/java/com/xpn/xwiki/stats/impl/StatsUtilTest.java
===================================================================
---
platform/core/trunk/xwiki-core/src/test/java/com/xpn/xwiki/stats/impl/StatsUtilTest.java 2010-03-16
13:07:30 UTC (rev 27652)
+++
platform/core/trunk/xwiki-core/src/test/java/com/xpn/xwiki/stats/impl/StatsUtilTest.java 2010-03-16
13:37:11 UTC (rev 27653)
@@ -20,18 +20,45 @@
package com.xpn.xwiki.stats.impl;
import java.text.SimpleDateFormat;
+import java.util.Arrays;
import java.util.Calendar;
+import java.util.HashSet;
+import org.jmock.Mock;
+import org.xwiki.model.reference.DocumentReference;
+
+import com.xpn.xwiki.XWiki;
+import com.xpn.xwiki.XWikiException;
+import com.xpn.xwiki.doc.XWikiDocument;
+import com.xpn.xwiki.objects.BaseObject;
import com.xpn.xwiki.stats.impl.StatsUtil.PeriodType;
+import com.xpn.xwiki.test.AbstractBridgedXWikiComponentTestCase;
-import junit.framework.TestCase;
-
/**
* Unit tests for the {@link StatsUtil} class.
+ *
+ * @version $Id$
*/
-public class StatsUtilTest extends TestCase
+public class StatsUtilTest extends AbstractBridgedXWikiComponentTestCase
{
+ private Mock mockXWiki;
+
/**
+ * {@inheritDoc}
+ *
+ * @see com.xpn.xwiki.test.AbstractBridgedXWikiComponentTestCase#setUp()
+ */
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ this.mockXWiki = mock(XWiki.class);
+
+ getContext().setWiki((XWiki) this.mockXWiki.proxy());
+ }
+
+ /**
* Test for the {@link StatsUtil#getPeriodAsInt(java.util.Date, PeriodType)}.
*/
public void testGetPeriodAsInt()
@@ -48,4 +75,62 @@
b = StatsUtil.getPeriodAsInt(cal.getTime(), PeriodType.DAY) + "";
assertEquals("Wrong day period format", a, b);
}
+
+ public void testGetFilteredUsers() throws XWikiException
+ {
+
this.mockXWiki.stubs().method("getXWikiPreference").will(returnValue(null));
+ this.mockXWiki.stubs().method("Param").will(returnValue(null));
+
+ assertEquals(new HashSet<DocumentReference>(),
StatsUtil.getFilteredUsers(getContext()));
+
+
this.mockXWiki.stubs().method("Param").will(returnValue("XWiki.XWikiGuest"));
+
+ assertEquals(new HashSet<DocumentReference>(Arrays.asList(new
DocumentReference("xwiki", "XWiki", "XWikiGuest"))),
StatsUtil.getFilteredUsers(getContext()));
+
+
this.mockXWiki.stubs().method("Param").will(returnValue("XWiki.supeRadmin"));
+
+ assertEquals(new HashSet<DocumentReference>(Arrays.asList(new
DocumentReference("xwiki", "XWiki", "supeRadmin"))),
StatsUtil.getFilteredUsers(getContext()));
+
+
this.mockXWiki.stubs().method("Param").will(returnValue("invalid"));
+ this.mockXWiki.stubs().method("getDocument").will(returnValue(new
XWikiDocument("xwiki", "Space", "invalid")));
+
+ assertEquals(new HashSet<DocumentReference>(),
StatsUtil.getFilteredUsers(getContext()));
+
+ DocumentReference userReference = new DocumentReference("xwiki",
"XWiki", "user");
+ final XWikiDocument userDoc = new XWikiDocument(userReference);
+ userDoc.addXObject(new DocumentReference("xwiki", "XWiki",
"XWikiUsers"), new BaseObject());
+
+
this.mockXWiki.stubs().method("Param").will(returnValue("XWiki.user"));
+ this.mockXWiki.stubs().method("getDocument").with(eq(userReference),
ANYTHING).will(returnValue(userDoc));
+
+ assertEquals(new HashSet<DocumentReference>(Arrays.asList(userReference)),
StatsUtil
+ .getFilteredUsers(getContext()));
+
+ DocumentReference user2Reference = new DocumentReference("xwiki",
"XWiki", "user2");
+ final XWikiDocument user2Doc = new XWikiDocument(user2Reference);
+ user2Doc.addXObject(new DocumentReference("xwiki", "XWiki",
"XWikiUsers"), new BaseObject());
+
+
this.mockXWiki.stubs().method("Param").will(returnValue("XWiki.user,XWiki.user2"));
+ this.mockXWiki.stubs().method("getDocument").with(eq(user2Reference),
ANYTHING).will(returnValue(user2Doc));
+
+ assertEquals(new HashSet<DocumentReference>(Arrays.asList(userReference,
user2Reference)), StatsUtil
+ .getFilteredUsers(getContext()));
+
+ DocumentReference user3Reference = new DocumentReference("otherwiki",
"XWiki", "user3");
+ final XWikiDocument user3Doc = new XWikiDocument(user3Reference);
+ user3Doc.addXObject(new DocumentReference("otherwiki",
"XWiki", "XWikiUsers"), new BaseObject());
+
+ DocumentReference groupReference = new DocumentReference("otherwiki",
"XWiki", "group");
+ final XWikiDocument groupDoc = new XWikiDocument(groupReference);
+ BaseObject member = new BaseObject();
+ member.setStringValue("member", "user3");
+ groupDoc.addXObject(new DocumentReference("otherwiki",
"XWiki", "XWikiGroups"), member);
+
+
this.mockXWiki.stubs().method("Param").will(returnValue("XWiki.user,XWiki.user2,otherwiki:XWiki.group"));
+ this.mockXWiki.stubs().method("getDocument").with(eq(groupReference),
ANYTHING).will(returnValue(groupDoc));
+ this.mockXWiki.stubs().method("getDocument").with(eq(user3Reference),
ANYTHING).will(returnValue(user3Doc));
+
+ assertEquals(new HashSet<DocumentReference>(Arrays.asList(userReference,
user2Reference, user3Reference)),
+ StatsUtil.getFilteredUsers(getContext()));
+ }
}
_______________________________________________
notifications mailing list
notifications(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/notifications