Package org.dspace.app.xmlui.aspect.administrative

Source Code of org.dspace.app.xmlui.aspect.administrative.ControlPanel

/*
* ControlPanel.java
*
* Version: $Revision: 4228 $
*
* Date: $Date: 2009-08-24 21:18:09 +0000 (Mon, 24 Aug 2009) $
*
* Copyright (c) 2002, Hewlett-Packard Company and Massachusetts
* Institute of Technology.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of the Hewlett-Packard Company nor the name of the
* Massachusetts Institute of Technology nor the names of their
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
package org.dspace.app.xmlui.aspect.administrative;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashMap;

import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.Serviceable;
import org.apache.cocoon.components.flow.ContinuationsManager;
import org.apache.cocoon.components.flow.WebContinuation;
import org.apache.cocoon.components.flow.WebContinuationDataBean;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.utils.UIException;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.app.xmlui.wing.WingException;
import org.dspace.app.xmlui.wing.element.Body;
import org.dspace.app.xmlui.wing.element.Division;
import org.dspace.app.xmlui.wing.element.Item;
import org.dspace.app.xmlui.wing.element.List;
import org.dspace.app.xmlui.wing.element.PageMeta;
import org.dspace.app.xmlui.wing.element.Row;
import org.dspace.app.xmlui.wing.element.Select;
import org.dspace.app.xmlui.wing.element.Table;
import org.dspace.app.xmlui.wing.element.TextArea;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.AuthorizeManager;
import org.dspace.content.Collection;
import org.dspace.harvest.HarvestedCollection;
import org.dspace.harvest.OAIHarvester.HarvestScheduler;
import org.dspace.core.ConfigurationManager;
import org.dspace.eperson.EPerson;
import org.xml.sax.SAXException;

/**
* This page displays important (and some not-so important) systems
* type information about your running dspace.
*
* @author Jay Paz
* @author Scott Phillips
*/
public class ControlPanel extends AbstractDSpaceTransformer implements Serviceable{
 
  /** Language Strings */
    private static final Message T_DSPACE_HOME =
        message("xmlui.general.dspace_home");
    private static final Message T_title         = message("xmlui.administrative.ControlPanel.title");
  private static final Message T_trail         = message("xmlui.administrative.ControlPanel.trail");
  private static final Message T_head           = message("xmlui.administrative.ControlPanel.head");
  private static final Message T_option_java      = message("xmlui.administrative.ControlPanel.option_java");
  private static final Message T_option_dspace      = message("xmlui.administrative.ControlPanel.option_dspace");
  private static final Message T_option_alerts      = message("xmlui.administrative.ControlPanel.option_alerts");
  private static final Message T_seconds         = message("xmlui.administrative.ControlPanel.seconds");
  private static final Message T_hours         = message("xmlui.administrative.ControlPanel.hours");
  private static final Message T_minutes         = message("xmlui.administrative.ControlPanel.minutes");
  private static final Message T_JAVA_HEAD       = message("xmlui.administrative.ControlPanel.java_head");
  private static final Message T_JAVA_VERSION     = message("xmlui.administrative.ControlPanel.java_version");
  private static final Message T_JAVA_VENDOR       = message("xmlui.administrative.ControlPanel.java_vendor");
  private static final Message T_OS_NAME         = message("xmlui.administrative.ControlPanel.os_name");
    private static final Message T_OS_ARCH         = message("xmlui.administrative.ControlPanel.os_arch");
    private static final Message T_OS_VERSION       = message("xmlui.administrative.ControlPanel.os_version");
    private static final Message T_RUNTIME_HEAD     = message("xmlui.administrative.ControlPanel.runtime_head");  
    private static final Message T_RUNTIME_PROCESSORS   = message("xmlui.administrative.ControlPanel.runtime_processors");
    private static final Message T_RUNTIME_MAX       = message("xmlui.administrative.ControlPanel.runtime_max");
    private static final Message T_RUNTIME_TOTAL     = message("xmlui.administrative.ControlPanel.runtime_total");
    private static final Message T_RUNTIME_USED     = message("xmlui.administrative.ControlPanel.runtime_used");
    private static final Message T_RUNTIME_FREE     = message("xmlui.administrative.ControlPanel.runtime_free");
    private static final Message T_DSPACE_HEAD       = message("xmlui.administrative.ControlPanel.dspace_head");
    private static final Message T_DSPACE_DIR       = message("xmlui.administrative.ControlPanel.dspace_dir");
    private static final Message T_DSPACE_URL       = message("xmlui.administrative.ControlPanel.dspace_url");
    private static final Message T_DSPACE_HOST_NAME   = message("xmlui.administrative.ControlPanel.dspace_hostname");
    private static final Message T_DSPACE_NAME       = message("xmlui.administrative.ControlPanel.dspace_name");
    private static final Message T_DB_NAME         = message("xmlui.administrative.ControlPanel.db_name");
    private static final Message T_DB_URL         = message("xmlui.administrative.ControlPanel.db_url");
    private static final Message T_DB_DRIVER       = message("xmlui.administrative.ControlPanel.db_driver");
    private static final Message T_DB_MAX_CONN       = message("xmlui.administrative.ControlPanel.db_maxconnections");
    private static final Message T_DB_MAX_WAIT       = message("xmlui.administrative.ControlPanel.db_maxwait");
    private static final Message T_DB_MAX_IDLE       = message("xmlui.administrative.ControlPanel.db_maxidle");
    private static final Message T_MAIL_SERVER       = message("xmlui.administrative.ControlPanel.mail_server");
    private static final Message T_MAIL_FROM_ADDRESS   = message("xmlui.administrative.ControlPanel.mail_from_address");
    private static final Message T_FEEDBACK_RECIPIENT   = message("xmlui.administrative.ControlPanel.mail_feedback_recipient");
    private static final Message T_MAIL_ADMIN       = message("xmlui.administrative.ControlPanel.mail_admin");
  private static final Message T_alerts_head        = message("xmlui.administrative.ControlPanel.alerts_head");
  private static final Message T_alerts_warning      = message("xmlui.administrative.ControlPanel.alerts_warning");
  private static final Message T_alerts_message_label    = message("xmlui.administrative.ControlPanel.alerts_message_label");
  private static final Message T_alerts_message_default  = message("xmlui.administrative.ControlPanel.alerts_message_default");
  private static final Message T_alerts_countdown_label  = message("xmlui.administrative.ControlPanel.alerts_countdown_label");
  private static final Message T_alerts_countdown_none  = message("xmlui.administrative.ControlPanel.alerts_countdown_none");
  private static final Message T_alerts_countdown_5    = message("xmlui.administrative.ControlPanel.alerts_countdown_5");
  private static final Message T_alerts_countdown_15    = message("xmlui.administrative.ControlPanel.alerts_countdown_15");
  private static final Message T_alerts_countdown_30    = message("xmlui.administrative.ControlPanel.alerts_countdown_30");
  private static final Message T_alerts_countdown_60    = message("xmlui.administrative.ControlPanel.alerts_countdown_60");
  private static final Message T_alerts_countdown_keep  = message("xmlui.administrative.ControlPanel.alerts_countdown_keep");
  private static final Message T_alerts_session_label             = message("xmlui.administrative.ControlPanel.alerts_session_label");
  private static final Message T_alerts_session_all_sessions        = message("xmlui.administrative.ControlPanel.alerts_session_all_sessions");
  private static final Message T_alerts_session_current_sessions    = message("xmlui.administrative.ControlPanel.alerts_session_current_sessions");
  private static final Message T_alerts_session_only_administrative = message("xmlui.administrative.ControlPanel.alerts_session_only_administrative_sessions");
  private static final Message T_alerts_session_note                = message("xmlui.administrative.ControlPanel.alerts_session_note")
  private static final Message T_alerts_submit_activate  = message("xmlui.administrative.ControlPanel.alerts_submit_activate");
  private static final Message T_alerts_submit_deactivate  = message("xmlui.administrative.ControlPanel.alerts_submit_deactivate");
  private static final Message T_activity_head       = message("xmlui.administrative.ControlPanel.activity_head");
  private static final Message T_stop_anonymous           = message("xmlui.administrative.ControlPanel.stop_anonymous");
  private static final Message T_start_anonymous          = message("xmlui.administrative.ControlPanel.start_anonymous");
  private static final Message T_stop_bot                 = message("xmlui.administrative.ControlPanel.stop_bot");
  private static final Message T_start_bot                = message("xmlui.administrative.ControlPanel.start_bot");
  private static final Message T_activity_sort_time     = message("xmlui.administrative.ControlPanel.activity_sort_time");
  private static final Message T_activity_sort_user     = message("xmlui.administrative.ControlPanel.activity_sort_user");
  private static final Message T_activity_sort_ip      = message("xmlui.administrative.ControlPanel.activity_sort_ip");
  private static final Message T_activity_sort_url     = message("xmlui.administrative.ControlPanel.activity_sort_url");
  private static final Message T_activity_sort_agent     = message("xmlui.administrative.ControlPanel.activity_sort_Agent");
  private static final Message T_activity_anonymous     = message("xmlui.administrative.ControlPanel.activity_anonymous")
  private static final Message T_activity_none      = message("xmlui.administrative.ControlPanel.activity_none");
  private static final Message T_select_panel             = message("xmlui.administrative.ControlPanel.select_panel");
 
  private static final Message T_option_harvest            = message("xmlui.administrative.ControlPanel.option_harvest");
  private static final Message T_harvest_scheduler_head       = message("xmlui.administrative.ControlPanel.harvest_scheduler_head");
  private static final Message T_harvest_label_status       = message("xmlui.administrative.ControlPanel.harvest_label_status");
  private static final Message T_harvest_label_actions       = message("xmlui.administrative.ControlPanel.harvest_label_actions");
  private static final Message T_harvest_submit_start       = message("xmlui.administrative.ControlPanel.harvest_submit_start");
  private static final Message T_harvest_submit_reset       = message("xmlui.administrative.ControlPanel.harvest_submit_reset");
  private static final Message T_harvest_submit_resume       = message("xmlui.administrative.ControlPanel.harvest_submit_resume");
  private static final Message T_harvest_submit_pause       = message("xmlui.administrative.ControlPanel.harvest_submit_pause");
  private static final Message T_harvest_submit_stop         = message("xmlui.administrative.ControlPanel.harvest_submit_stop");
  private static final Message T_harvest_label_collections     = message("xmlui.administrative.ControlPanel.harvest_label_collections");
  private static final Message T_harvest_label_active       = message("xmlui.administrative.ControlPanel.harvest_label_active");
  private static final Message T_harvest_label_queued       = message("xmlui.administrative.ControlPanel.harvest_label_queued");
  private static final Message T_harvest_label_oai_errors     = message("xmlui.administrative.ControlPanel.harvest_label_oai_errors");
  private static final Message T_harvest_label_internal_errors   = message("xmlui.administrative.ControlPanel.harvest_label_internal_errors");
  private static final Message T_harvest_head_generator_settings   = message("xmlui.administrative.ControlPanel.harvest_head_generator_settings");
  private static final Message T_harvest_label_oai_url       = message("xmlui.administrative.ControlPanel.harvest_label_oai_url");
  private static final Message T_harvest_label_oai_source     = message("xmlui.administrative.ControlPanel.harvest_label_oai_source");
  private static final Message T_harvest_head_harvester_settings   = message("xmlui.administrative.ControlPanel.harvest_head_harvester_settings");
 
 
    /**
     * The service manager allows us to access the continuation's
     * manager, it is obtained from the servicable API
     */
    private ServiceManager serviceManager;
   
    /**
     * The five states that this page can be in.
     */
    private enum OPTIONS {java, dspace, alerts, activity, harvest};
   
    /**
     * From the servicable api, give us a service manager.
     */
    public void service(ServiceManager serviceManager) throws ServiceException
    {
    this.serviceManager = serviceManager;
  }
 
  public void addPageMeta(PageMeta pageMeta) throws SAXException,
      WingException, UIException, SQLException, IOException,
      AuthorizeException {
    pageMeta.addMetadata("title").addContent(T_title);

    pageMeta.addTrailLink(contextPath + "/", T_DSPACE_HOME);
    pageMeta.addTrailLink(contextPath + "/admin/panel", T_trail);
  }

  public void addBody(Body body) throws SAXException, WingException,
      UIException, SQLException, IOException, AuthorizeException {
   
    if (!AuthorizeManager.isAdmin(context))
      throw new AuthorizeException("You are not authorized to view this page.");
   
    Request request = ObjectModelHelper.getRequest(objectModel);
    OPTIONS option = null;
    if (request.getParameter("java") != null)
      option = OPTIONS.java;
    if (request.getParameter("dspace") != null)
      option = OPTIONS.dspace;
    if (request.getParameter("alerts") != null)
      option = OPTIONS.alerts;
    if (request.getParameter("activity") != null)
      option = OPTIONS.activity;
    if (request.getParameter("harvest") != null)
      option = OPTIONS.harvest;
   
    Division div = body.addInteractiveDivision("control-panel", contextPath+"/admin/panel", Division.METHOD_POST, "primary administrative");
    div.setHead(T_head);
   
    // LIST: options
    List options = div.addList("options",List.TYPE_SIMPLE,"horizontal");
   
    // our options, selected or not....
    if (option == OPTIONS.java)
      options.addItem().addHighlight("bold").addXref("?java",T_option_java);
    else
      options.addItemXref("?java",T_option_java);
   
    if (option == OPTIONS.dspace)
      options.addItem().addHighlight("bold").addXref("?dspace",T_option_dspace);
    else
      options.addItemXref("?dspace",T_option_dspace);
   
    if (option == OPTIONS.alerts)
      options.addItem().addHighlight("bold").addXref("?alerts",T_option_alerts);
    else
      options.addItemXref("?alerts",T_option_alerts);
   
    if (option == OPTIONS.harvest)
      options.addItem().addHighlight("bold").addXref("?harvest",T_option_harvest);
    else
      options.addItemXref("?harvest",T_option_harvest);
   
    String userSortTarget = "?activity";
    if (request.getParameter("sortBy") != null)
      userSortTarget += "&sortBy="+request.getParameter("sortBy");
    if (option == OPTIONS.activity)
      options.addItem().addHighlight("bold").addXref(userSortTarget,"Current Activity");
    else
      options.addItemXref(userSortTarget,"Current Activity");
   
   
    // The main content:
    if (option == OPTIONS.java)
      addJavaInformation(div);
    else if (option == OPTIONS.dspace)
      addDSpaceConfiguration(div);
    else if (option == OPTIONS.alerts)
      addAlerts(div);
    else if (option == OPTIONS.activity)
      addActivity(div);
    else if (option == OPTIONS.harvest)
      addHarvest(div);
    else
    {
      div.addPara(T_select_panel);
    }
   
  }
 
  /**
   * Add specific java information including JRE, OS, and runtime memory statistics.
   */
  private void addJavaInformation(Division div) throws WingException
  {
    // Get memory statistics
    int processors = Runtime.getRuntime().availableProcessors();
    long maxMemory = Runtime.getRuntime().maxMemory();
    long totalMemory = Runtime.getRuntime().totalMemory();
        long freeMemory = Runtime.getRuntime().freeMemory();
    long usedMemory = totalMemory-freeMemory;
       
    // Convert bytes into MiB
    maxMemory   = maxMemory   / 1024 / 1024;
    totalMemory = totalMemory / 1024 / 1024;
    usedMemory  = usedMemory  / 1024 / 1024;
    freeMemory  = freeMemory  / 1024 / 1024;
   
    // LIST: Java
    List list = div.addList("javaOs");
    list.setHead(T_JAVA_HEAD);
    list.addLabel(T_JAVA_VERSION);
        list.addItem(System.getProperty("java.version"));
        list.addLabel(T_JAVA_VENDOR);
        list.addItem(System.getProperty("java.vendor"));
        list.addLabel(T_OS_NAME);
        list.addItem(System.getProperty("os.name"));
        list.addLabel(T_OS_ARCH);
        list.addItem(System.getProperty("os.arch"));
        list.addLabel(T_OS_VERSION);
        list.addItem(System.getProperty("os.version"));
   
    // LIST: memory
    List runtime = div.addList("runtime");
    runtime.setHead(T_RUNTIME_HEAD);
    runtime.addLabel(T_RUNTIME_PROCESSORS);
    runtime.addItem(String.valueOf(processors));
    runtime.addLabel(T_RUNTIME_MAX);
    runtime.addItem(String.valueOf(maxMemory) + " MiB");
    runtime.addLabel(T_RUNTIME_TOTAL);
    runtime.addItem(String.valueOf(totalMemory) + " MiB");
    runtime.addLabel(T_RUNTIME_USED);
    runtime.addItem(String.valueOf(usedMemory) + " MiB");
    runtime.addLabel(T_RUNTIME_FREE);
    runtime.addItem(String.valueOf(freeMemory) + " MiB")
  }
 
  /**
   * List important DSpace configuration parameters.
   */
  private void addDSpaceConfiguration(Division div) throws WingException
  {
    // LIST: DSpace
        List dspace = div.addList("dspace");
        dspace.setHead(T_DSPACE_HEAD);
       
        dspace.addLabel(T_DSPACE_DIR);
      dspace.addItem(ConfigurationManager.getProperty("dspace.dir"));
   
        dspace.addLabel(T_DSPACE_URL);
      dspace.addItem(ConfigurationManager.getProperty("dspace.url"));

        dspace.addLabel(T_DSPACE_HOST_NAME);
      dspace.addItem(ConfigurationManager.getProperty("dspace.hostname"));

        dspace.addLabel(T_DSPACE_NAME);
      dspace.addItem(ConfigurationManager.getProperty("dspace.name"));

        dspace.addLabel(T_DB_NAME);
      dspace.addItem(ConfigurationManager.getProperty("db.name"));

      dspace.addLabel(T_DB_URL);
      dspace.addItem(ConfigurationManager.getProperty("db.url"));

        dspace.addLabel(T_DB_DRIVER);
      dspace.addItem(ConfigurationManager.getProperty("db.driver"));

      dspace.addLabel(T_DB_MAX_CONN);
      dspace.addItem(ConfigurationManager.getProperty("db.maxconnections"));


        dspace.addLabel(T_DB_MAX_WAIT);
      dspace.addItem(ConfigurationManager.getProperty("db.maxwait"));
     
        dspace.addLabel(T_DB_MAX_IDLE);
      dspace.addItem(ConfigurationManager.getProperty("db.maxidle"));

         dspace.addLabel(T_MAIL_SERVER);
      dspace.addItem(ConfigurationManager.getProperty("mail.server"));
        dspace.addLabel(T_MAIL_FROM_ADDRESS);
      dspace.addItem(ConfigurationManager.getProperty("mail.from.address"));

        dspace.addLabel(T_FEEDBACK_RECIPIENT);
      dspace.addItem(ConfigurationManager.getProperty("feedback.recipient"));

        dspace.addLabel(T_MAIL_ADMIN);
      dspace.addItem(ConfigurationManager.getProperty("mail.admin"));       
  }
 
  /**
   * Add a section that allows administrators to activate or deactivate system-wide alerts.
   */
  private void addAlerts(Division div) throws WingException
  {
    // Remember we're in the alerts section
    div.addHidden("alerts").setValue("true");
   
    List form = div.addList("system-wide-alerts",List.TYPE_FORM);
    form.setHead(T_alerts_head);
   
    form.addItem(T_alerts_warning);
   
    TextArea message = form.addItem().addTextArea("message");
    message.setLabel(T_alerts_message_label);
    message.setSize(5, 45);
    if (SystemwideAlerts.getMessage() == null)
      message.setValue(T_alerts_message_default);
    else
      message.setValue(SystemwideAlerts.getMessage());
   
    Select countdown = form.addItem().addSelect("countdown");
    countdown.setLabel(T_alerts_countdown_label);
   
    countdown.addOption(0,T_alerts_countdown_none);
    countdown.addOption(5,T_alerts_countdown_5);
    countdown.addOption(15,T_alerts_countdown_15);
    countdown.addOption(30,T_alerts_countdown_30);
    countdown.addOption(60,T_alerts_countdown_60);
   
    // Is there a current count down active?
    if (SystemwideAlerts.isAlertActive() && SystemwideAlerts.getCountDownToo() - System.currentTimeMillis() > 0)
      countdown.addOption(true,-1,T_alerts_countdown_keep);
    else
      countdown.setOptionSelected(0);
   
    Select restrictsessions = form.addItem().addSelect("restrictsessions");
    restrictsessions.setLabel(T_alerts_session_label);
    restrictsessions.addOption(SystemwideAlerts.STATE_ALL_SESSIONS,T_alerts_session_all_sessions);
    restrictsessions.addOption(SystemwideAlerts.STATE_CURRENT_SESSIONS,T_alerts_session_current_sessions);
    restrictsessions.addOption(SystemwideAlerts.STATE_ONLY_ADMINISTRATIVE_SESSIONS,T_alerts_session_only_administrative);
    restrictsessions.setOptionSelected(SystemwideAlerts.getRestrictSessions());
   
    form.addItem(T_alerts_session_note);
   
   
    Item actions = form.addItem();
    actions.addButton("submit_activate").setValue(T_alerts_submit_activate);
    actions.addButton("submit_deactivate").setValue(T_alerts_submit_deactivate);
   
  }
 
  /** The possible sorting parameters */
  private static enum EventSort { TIME, URL, SESSION, AGENT, IP };
 
  /**
   * Create a list of all activity.
   */
  private void addActivity(Division div) throws WingException, SQLException
  {
   
    // 0) Update recording settings
    Request request = ObjectModelHelper.getRequest(objectModel);

    // Toggle anonymous recording
    String recordAnonymousString = request.getParameter("recordanonymous");
    if (recordAnonymousString != null)
    {
      if ("ON".equals(recordAnonymousString))
        CurrentActivityAction.setRecordAnonymousEvents(true);
      if ("OFF".equals(recordAnonymousString))
        CurrentActivityAction.setRecordAnonymousEvents(false);
    }
   
    // Toggle bot recording
    String recordBotString = request.getParameter("recordbots");
    if (recordBotString != null)
    {
      if ("ON".equals(recordBotString))
        CurrentActivityAction.setRecordBotEvents(true);
      if ("OFF".equals(recordBotString))
        CurrentActivityAction.setRecordBotEvents(false);
    }   
   
    // 1) Determine how to sort
    EventSort sortBy = EventSort.TIME;
    String sortByString = request.getParameter("sortBy");
    if (EventSort.TIME.toString().equals(sortByString))
      sortBy = EventSort.TIME;
    if (EventSort.URL.toString().equals(sortByString))
      sortBy = EventSort.URL;
    if (EventSort.SESSION.toString().equals(sortByString))
      sortBy = EventSort.SESSION;
    if (EventSort.AGENT.toString().equals(sortByString))
      sortBy = EventSort.AGENT;
    if (EventSort.IP.toString().equals(sortByString))
      sortBy = EventSort.IP;
   
    // 2) Sort the events by the requested sorting parameter
    java.util.List<CurrentActivityAction.Event> events = CurrentActivityAction.getEvents();
        Collections.sort(events, new ActivitySort<CurrentActivityAction.Event>(sortBy));
        Collections.reverse(events);
       
        // 3) Toggle controls for anonymous and bot activity
        if (CurrentActivityAction.getRecordAnonymousEvents())
          div.addPara().addXref("?activity&sortBy="+sortBy+"&recordanonymous=OFF").addContent(T_stop_anonymous);
        else
          div.addPara().addXref("?activity&sortBy="+sortBy+"&recordanonymous=ON").addContent(T_start_anonymous);
       
        if (CurrentActivityAction.getRecordBotEvents())
          div.addPara().addXref("?activity&sortBy="+sortBy+"&recordbots=OFF").addContent(T_stop_bot);
        else
          div.addPara().addXref("?activity&sortBy="+sortBy+"&recordbots=ON").addContent(T_start_bot);
        
       
    // 4) Display the results Table
        // TABLE: activeUsers
        Table activeUsers = div.addTable("users",1,1);
        activeUsers.setHead(T_activity_head.parameterize(CurrentActivityAction.MAX_EVENTS));
        Row row = activeUsers.addRow(Row.ROLE_HEADER);
        if (sortBy == EventSort.TIME)
          row.addCell().addHighlight("bold").addXref("?activity&sortBy="+EventSort.TIME).addContent(T_activity_sort_time);
        else
          row.addCell().addXref("?activity&sortBy="+EventSort.TIME).addContent(T_activity_sort_time);
       
        if (sortBy == EventSort.SESSION)
          row.addCell().addHighlight("bold").addXref("?activity&sortBy="+EventSort.SESSION).addContent(T_activity_sort_user);
        else
          row.addCell().addXref("?activity&sortBy="+EventSort.SESSION).addContent(T_activity_sort_user);
       
        if (sortBy == EventSort.IP)
          row.addCell().addHighlight("bold").addXref("?activity&sortBy="+EventSort.IP).addContent(T_activity_sort_ip);
        else
          row.addCell().addXref("?activity&sortBy="+EventSort.IP).addContent(T_activity_sort_ip);
       
        if (sortBy == EventSort.URL)
          row.addCell().addHighlight("bold").addXref("?activity&sortBy="+EventSort.URL).addContent(T_activity_sort_url);
        else
          row.addCell().addXref("?activity&sortBy="+EventSort.URL).addContent(T_activity_sort_url);
       
        if (sortBy == EventSort.AGENT)
          row.addCell().addHighlight("bold").addXref("?activity&sortBy="+EventSort.AGENT).addContent(T_activity_sort_agent);
        else
          row.addCell().addXref("?activity&sortBy="+EventSort.AGENT).addContent(T_activity_sort_agent);
  
        // Keep track of how many individual anonymous users there are, each unique anonymous
        // user is assigned an index based upon the servlet session id.
        HashMap<String,Integer> anonymousHash = new HashMap<String,Integer>();
        int anonymousCount = 1;
   
        int shown = 0;
    for (CurrentActivityAction.Event event : events)
    { 
      if (event == null)
        continue;
     
      shown++;
     
      Message timeStampMessage = null;
          long ago = System.currentTimeMillis() - event.getTimeStamp();
         
          if (ago > 2*60*60*1000)
            timeStampMessage = T_hours.parameterize((ago / (60*60*1000)));
          else if (ago > 60*1000)
            timeStampMessage = T_minutes.parameterize((ago / (60*1000)));
          else
            timeStampMessage = T_seconds.parameterize((ago / (1000)));
         
         
      Row eventRow = activeUsers.addRow();
     
      eventRow.addCellContent(timeStampMessage);
      int eid = event.getEPersonID();
      EPerson eperson = EPerson.find(context, eid);
      if (eperson != null)
      {
        String name = eperson.getFullName();
        eventRow.addCellContent(name);
      }
      else
      {
        // Is this a new anonymous user?
        if (!anonymousHash.containsKey(event.getSessionID()))
          anonymousHash.put(event.getSessionID(), anonymousCount++);
       
        eventRow.addCellContent(T_activity_anonymous.parameterize(anonymousHash.get(event.getSessionID())));
      }
      eventRow.addCellContent(event.getIP());
      eventRow.addCell().addXref(contextPath+"/"+event.getURL()).addContent("/"+event.getURL());
      eventRow.addCellContent(event.getDectectedBrowser());
    }
   
    if (shown == 0)
        {
      activeUsers.addRow().addCell(1, 5).addContent(T_activity_none);
        }
  }
 
  /**
   * Comparator to sort activity events by their access times.
   */
  public static class ActivitySort<E extends CurrentActivityAction.Event> implements Comparator<E>
  {
    // Sort parameter
    private EventSort sortBy;
   
    public ActivitySort(EventSort sortBy)
    {
      this.sortBy = sortBy;
    }
   
    /**
     * Compare these two activity events based upon the given sort parameter. In the case of a tie,
     * allways fallback to sorting based upon the timestamp.
     */
    public int compare(E a, E b)
    {
      // Protect against null events while sorting
      if (a != null && b == null)
        return 1; // A > B
      else if (a == null && b != null)
        return -1; // B > A
      else if (a == null && b == null)
        return 0; // A == B
     
      // Sort by the given ordering matrix
      if (EventSort.URL == sortBy)
      {
        String aURL = a.getURL();
        String bURL = b.getURL();
        int cmp = aURL.compareTo(bURL);
        if (cmp != 0)
          return cmp;
      }
      else if (EventSort.AGENT == sortBy)
      {
        String aAgent = a.getDectectedBrowser();
        String bAgent = b.getDectectedBrowser();
        int cmp = aAgent.compareTo(bAgent);
        if (cmp != 0)
          return cmp;
      }
      else if (EventSort.IP == sortBy)
      {
        String aIP = a.getIP();
        String bIP = b.getIP();
        int cmp = aIP.compareTo(bIP);
        if (cmp != 0)
          return cmp;
       
      }
      else if (EventSort.SESSION == sortBy)
      {
        // Ensure that all sessions with an EPersonID associated are
        // ordered to the top. Otherwise fall back to comparing session
        // IDs. Unfortunitaly we can not compare eperson names because
        // we do not have access to a context object.
        if (a.getEPersonID() > && b.getEPersonID() < 0)
          return 1; // A > B
        else if (a.getEPersonID() < && b.getEPersonID() > 0)
          return -1; // B > A
       
        String aSession = a.getSessionID();
        String bSession = b.getSessionID();
        int cmp = aSession.compareTo(bSession);
        if (cmp != 0)
          return cmp;
      }
     
      // All ways fall back to sorting by time, when events are equal.
      if (a.getTimeStamp() > b.getTimeStamp())
        return 1// A > B
      else if (a.getTimeStamp() > b.getTimeStamp())
        return -1; // B > A
      return 0; // A == B
    }
  }
 
   
  /**
   * Add a section that allows management of the OAI harvester.
   * @throws SQLException
   */
  private void addHarvest(Division div) throws WingException, SQLException
  {
    // Remember we're in the harvest section
    div.addHidden("harvest").setValue("true");
           
    List harvesterControls = div.addList("oai-harvester-controls",List.TYPE_FORM);
    harvesterControls.setHead(T_harvest_scheduler_head);
    harvesterControls.addLabel(T_harvest_label_status);
    Item status = harvesterControls.addItem();
    status.addContent(HarvestScheduler.getStatus());
    status.addXref(contextPath + "/admin/panel?harvest", "(refresh)");
   
    harvesterControls.addLabel(T_harvest_label_actions);
    Item actionsItem = harvesterControls.addItem();
    if (HarvestScheduler.status == HarvestScheduler.HARVESTER_STATUS_STOPPED) {
      actionsItem.addButton("submit_harvest_start").setValue(T_harvest_submit_start);
      actionsItem.addButton("submit_harvest_reset").setValue(T_harvest_submit_reset);
    }
    if (HarvestScheduler.status == HarvestScheduler.HARVESTER_STATUS_PAUSED)
      actionsItem.addButton("submit_harvest_resume").setValue(T_harvest_submit_resume);
    if (HarvestScheduler.status == HarvestScheduler.HARVESTER_STATUS_RUNNING ||
        HarvestScheduler.status == HarvestScheduler.HARVESTER_STATUS_SLEEPING)
      actionsItem.addButton("submit_harvest_pause").setValue(T_harvest_submit_pause);
    if (HarvestScheduler.status != HarvestScheduler.HARVESTER_STATUS_STOPPED)
      actionsItem.addButton("submit_harvest_stop").setValue(T_harvest_submit_stop);
   
    // Can be retrieved via "{context-path}/admin/collection?collectionID={id}"
    String baseURL = contextPath + "/admin/collection?collectionID=";
   
    harvesterControls.addLabel(T_harvest_label_collections);
    Item allCollectionsItem = harvesterControls.addItem();
    java.util.List<Integer> allCollections =  HarvestedCollection.findAll(context);
    for (Integer oaiCollection : allCollections) {
      allCollectionsItem.addXref(baseURL + oaiCollection, oaiCollection.toString());
    }
    harvesterControls.addLabel(T_harvest_label_active);
    Item busyCollectionsItem = harvesterControls.addItem();
    java.util.List<Integer> busyCollections =  HarvestedCollection.findByStatus(context, HarvestedCollection.STATUS_BUSY);
    for (Integer busyCollection : busyCollections) {
      busyCollectionsItem.addXref(baseURL + busyCollection, busyCollection.toString());
    }
    harvesterControls.addLabel(T_harvest_label_queued);
    Item queuedCollectionsItem = harvesterControls.addItem();
    java.util.List<Integer> queuedCollections =  HarvestedCollection.findByStatus(context, HarvestedCollection.STATUS_QUEUED);
    for (Integer queuedCollection : queuedCollections) {
      queuedCollectionsItem.addXref(baseURL + queuedCollection, queuedCollection.toString());
    }
    harvesterControls.addLabel(T_harvest_label_oai_errors);
    Item oaiErrorsItem = harvesterControls.addItem();
    java.util.List<Integer> oaiErrors =  HarvestedCollection.findByStatus(context, HarvestedCollection.STATUS_OAI_ERROR);
    for (Integer oaiError : oaiErrors) {
      oaiErrorsItem.addXref(baseURL + oaiError, oaiError.toString());
    }
    harvesterControls.addLabel(T_harvest_label_internal_errors);
    Item internalErrorsItem = harvesterControls.addItem();
    java.util.List<Integer> internalErrors =  HarvestedCollection.findByStatus(context, HarvestedCollection.STATUS_UNKNOWN_ERROR);
    for (Integer internalError : internalErrors) {
      internalErrorsItem.addXref(baseURL + internalError, internalError.toString());
    }
   
    // OAI Generator settings
    List generatorSettings = div.addList("oai-generator-settings");
    generatorSettings.setHead(T_harvest_head_generator_settings);
   
    generatorSettings.addLabel(T_harvest_label_oai_url);
    String oaiUrl = ConfigurationManager.getProperty("dspace.oai.url");
    if (oaiUrl != null && oaiUrl != "")
      generatorSettings.addItem(oaiUrl);

    generatorSettings.addLabel(T_harvest_label_oai_source);
    String oaiAuthoritativeSource = ConfigurationManager.getProperty("ore.authoritative.source");
    if (oaiAuthoritativeSource != null && oaiAuthoritativeSource != "")
      generatorSettings.addItem(oaiAuthoritativeSource);
    else
      generatorSettings.addItem("oai");
   
    // OAI Harvester settings (just iterate over all the values that start with "harvester")
    List harvesterSettings = div.addList("oai-harvester-settings");
    harvesterSettings.setHead(T_harvest_head_harvester_settings);
   
    String metaString = "harvester.";
        Enumeration pe = ConfigurationManager.propertyNames();
        while (pe.hasMoreElements())
        {
            String key = (String)pe.nextElement();
            if (key.startsWith(metaString)) {
              harvesterSettings.addLabel(key);
              harvesterSettings.addItem(ConfigurationManager.getProperty(key) + " ");
            }
        }
  }
 
}
TOP

Related Classes of org.dspace.app.xmlui.aspect.administrative.ControlPanel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.