diff --git a/dspace-xmlui/dspace-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/statistics/StatisticsAuthorizedMatcher.java b/dspace-xmlui/dspace-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/statistics/StatisticsAuthorizedMatcher.java
new file mode 100644
index 0000000000..7cf1077bf0
--- /dev/null
+++ b/dspace-xmlui/dspace-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/statistics/StatisticsAuthorizedMatcher.java
@@ -0,0 +1,128 @@
+/**
+ * $Id: $
+ * $URL: $
+ * *************************************************************************
+ * Copyright (c) 2002-2009, DuraSpace. All rights reserved
+ * Licensed under the DuraSpace Foundation License.
+ *
+ * A copy of the DuraSpace License has been included in this
+ * distribution and is available at: http://scm.dspace.org/svn/repo/licenses/LICENSE.txt
+ */
+package org.dspace.app.xmlui.aspect.statistics;
+
+import org.apache.cocoon.matching.Matcher;
+import org.apache.cocoon.sitemap.PatternException;
+import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.dspace.core.Context;
+import org.dspace.core.ConfigurationManager;
+import org.dspace.app.xmlui.utils.ContextUtil;
+import org.dspace.app.xmlui.utils.HandleUtil;
+import org.dspace.content.DSpaceObject;
+import org.dspace.content.Community;
+import org.dspace.content.Collection;
+import org.dspace.content.Item;
+import org.dspace.authorize.AuthorizeManager;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.sql.SQLException;
+
+/**
+ * User: @author kevinvandevelde (kevin at atmire.com)
+ * Date: 19-nov-2009
+ * Time: 17:19:56
+ */
+public class StatisticsAuthorizedMatcher extends AbstractLogEnabled implements Matcher{
+
+
+ public Map match(String pattern, Map objectModel, Parameters parameters) throws PatternException {
+ // Are we checking for *NOT* the action or the action.
+ boolean not = false;
+ int action = -1; // the action to check
+
+ if (pattern.startsWith("!"))
+ {
+ not = true;
+ pattern = pattern.substring(1);
+ }
+
+ if(!pattern.equals("READ"))
+ {
+ getLogger().warn("Invalid action: '"+pattern+"'");
+ return null;
+ }
+
+ try
+ {
+ Context context = ContextUtil.obtainContext(objectModel);
+ DSpaceObject dso = HandleUtil.obtainHandle(objectModel);
+
+ if (dso == null)
+ return null;
+
+ boolean authorized = AuthorizeManager.authorizeActionBoolean(context, dso, action, false);
+ //If we are not authorized check for any other authorizations present
+ if(!authorized && context.getCurrentUser() != null
+ && ConfigurationManager.getBooleanProperty("statistics.item.authorization.admin"))
+ {
+ //Check for admin
+ authorized = AuthorizeManager.isAdmin(context);
+ if(!authorized)
+ //Check if we have authorization for the owning colls, comms, ...
+ authorized = checkParentAuthorization(context, dso);
+ }
+
+ // XOR
+ if (not ^ authorized)
+ {
+ return new HashMap();
+ }
+ else
+ {
+ return null;
+ }
+
+
+ }
+ catch (SQLException sqle)
+ {
+ throw new PatternException("Unable to obtain DSpace Context", sqle);
+ }
+ }
+
+ public static boolean checkParentAuthorization(Context context, DSpaceObject dso) throws SQLException {
+ if(dso instanceof Community)
+ {
+ Community comm = (Community) dso;
+ if(AuthorizeManager.isAdmin(context, comm))
+ return true;
+ else if(comm.getParentCommunity() != null)
+ return checkParentAuthorization(context, comm);
+ }else
+ if(dso instanceof Collection)
+ {
+ Collection coll = (Collection) dso;
+ if(AuthorizeManager.isAdmin(context, coll))
+ return true;
+ else{
+ //Check if any of our parent communities has authorization
+ for (int i = 0; i < coll.getCommunities().length; i++) {
+ Community community = coll.getCommunities()[i];
+ boolean authorized = checkParentAuthorization(context, community);
+ if(authorized)
+ return true;
+ }
+ }
+ }else
+ if(dso instanceof Item){
+ //Check if we have read rights for our owning collections
+ for(Collection coll : ((Item) dso).getCollections()){
+ boolean authorized = checkParentAuthorization(context, coll);
+ if(authorized)
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/dspace-xmlui/dspace-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/statistics/StatisticsTransformer.java b/dspace-xmlui/dspace-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/statistics/StatisticsTransformer.java
index 85b57918ed..54e4cb4dbc 100644
--- a/dspace-xmlui/dspace-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/statistics/StatisticsTransformer.java
+++ b/dspace-xmlui/dspace-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/statistics/StatisticsTransformer.java
@@ -48,10 +48,8 @@ public class StatisticsTransformer extends AbstractDSpaceTransformer {
* Add a page title and trail links
*/
public void addPageMeta(PageMeta pageMeta) throws SAXException, WingException, UIException, SQLException, IOException, AuthorizeException {
- String handle = parameters.getParameter("handle", null);
- DSpaceObject dso = null;
- if(handle != null)
- dso = HandleManager.resolveToObject(context, handle);
+ //Try to find our dspace object
+ DSpaceObject dso = HandleUtil.obtainHandle(objectModel);
pageMeta.addTrailLink(contextPath + "/",T_dspace_home);
@@ -70,10 +68,7 @@ public class StatisticsTransformer extends AbstractDSpaceTransformer {
UIException, SQLException, IOException, AuthorizeException {
//Try to find our dspace object
- String handle = parameters.getParameter("handle", null);
- DSpaceObject dso = null;
- if(handle != null)
- dso = HandleManager.resolveToObject(context, handle);
+ DSpaceObject dso = HandleUtil.obtainHandle(objectModel);
try
{
diff --git a/dspace-xmlui/dspace-xmlui-api/src/main/resources/aspects/Statistics/sitemap.xmap b/dspace-xmlui/dspace-xmlui-api/src/main/resources/aspects/Statistics/sitemap.xmap
index 559c9abd16..b7528d45f3 100644
--- a/dspace-xmlui/dspace-xmlui-api/src/main/resources/aspects/Statistics/sitemap.xmap
+++ b/dspace-xmlui/dspace-xmlui-api/src/main/resources/aspects/Statistics/sitemap.xmap
@@ -16,11 +16,15 @@
+
-
+
+
+
+
@@ -32,10 +36,25 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg
index 135bb71c70..9a04d67587 100644
--- a/dspace/config/dspace.cfg
+++ b/dspace/config/dspace.cfg
@@ -1903,6 +1903,8 @@ statistics.items.type.1=dcinput
statistics.items.type.2=date
statistics.default.start.datepick = 01/01/1977
+statistics.item.authorization.admin=true
+
##### Authority Control Settings #####
#plugin.named.org.dspace.content.authority.ChoiceAuthority = \