/* * ItemMapServlet.java * * Version: $Revision: 4942 $ * * Date: $Date: 2010-05-14 01:58:27 +0000 (Fri, 14 May 2010) $ * * Copyright (c) 2002-2005, 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.webui.servlet.admin; import org.apache.log4j.Logger; import org.dspace.app.webui.servlet.DSpaceServlet; import org.dspace.app.webui.util.JSPManager; import org.dspace.app.webui.util.UIUtil; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.AuthorizeManager; import org.dspace.browse.*; import org.dspace.content.Collection; import org.dspace.content.Item; import org.dspace.content.ItemIterator; import org.dspace.core.ConfigurationManager; import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.sort.SortOption; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; /** * Servlet for editing and deleting (expunging) items * * @version $Revision: 4942 $ */ public class ItemMapServlet extends DSpaceServlet { /** Logger */ private static Logger log = Logger.getLogger(ItemMapServlet.class); protected void doDSGet(Context context, HttpServletRequest request, HttpServletResponse response) throws java.sql.SQLException, javax.servlet.ServletException, java.io.IOException, AuthorizeException { doDSPost(context, request, response); } protected void doDSPost(Context context, HttpServletRequest request, HttpServletResponse response) throws java.sql.SQLException, javax.servlet.ServletException, java.io.IOException, AuthorizeException { String jspPage = null; // get with a collection ID means put up browse window int myID = UIUtil.getIntParameter(request, "cid"); // get collection Collection myCollection = Collection.find(context, myID); // authorize check AuthorizeManager.authorizeAction(context, myCollection, Constants.COLLECTION_ADMIN); String action = request.getParameter("action"); if (action == null) { action = ""; } // Defined non-empty value shows that 'Cancel' has been pressed String cancel = request.getParameter("cancel"); if (cancel == null) { cancel = ""; } if (action.equals("") || !cancel.equals("")) { // get with no action parameter set means to put up the main page // which is statistics and some command buttons to add/remove items // // also holds for interruption by pressing 'Cancel' int count_native = 0; // # of items owned by this collection int count_import = 0; // # of virtual items Map myItems = new HashMap(); // # for the browser Map myCollections = new HashMap(); // collections for list Map myCounts = new HashMap(); // counts for each collection // get all items from that collection, add them to a hash ItemIterator i = myCollection.getItems(); try { // iterate through the items in this collection, and count how many // are native, and how many are imports, and which collections they // came from while (i.hasNext()) { Item myItem = i.next(); // get key for hash Integer myKey = new Integer(myItem.getID()); if (myItem.isOwningCollection(myCollection)) { count_native++; } else { count_import++; } // is the collection in the hash? Collection owningCollection = myItem.getOwningCollection(); Integer cKey = new Integer(owningCollection.getID()); if (myCollections.containsKey(cKey)) { Integer x = (Integer) myCounts.get(cKey); int myCount = x.intValue() + 1; // increment count for that collection myCounts.put(cKey, new Integer(myCount)); } else { // store and initialize count myCollections.put(cKey, owningCollection); myCounts.put(cKey, new Integer(1)); } // store the item myItems.put(myKey, myItem); } } finally { if (i != null) i.close(); } // remove this collection's entry because we already have a native // count myCollections.remove(new Integer(myCollection.getID())); // sort items - later // show page request.setAttribute("collection", myCollection); request.setAttribute("count_native", new Integer(count_native)); request.setAttribute("count_import", new Integer(count_import)); request.setAttribute("items", myItems); request.setAttribute("collections", myCollections); request.setAttribute("collection_counts", myCounts); request .setAttribute("all_collections", Collection .findAll(context)); // show this page when we're done jspPage = "itemmap-main.jsp"; // show the page JSPManager.showJSP(request, response, jspPage); } else if (action.equals("Remove")) { // get item IDs to remove String[] itemIDs = request.getParameterValues("item_ids"); String message = "remove"; LinkedList removedItems = new LinkedList(); if (itemIDs == null) { message = "none-removed"; } else { for (int j = 0; j < itemIDs.length; j++) { int i = Integer.parseInt(itemIDs[j]); removedItems.add(itemIDs[j]); Item myItem = Item.find(context, i); // make sure item doesn't belong to this collection if (!myItem.isOwningCollection(myCollection)) { myCollection.removeItem(myItem); try { IndexBrowse ib = new IndexBrowse(context); ib.itemChanged(myItem); } catch (BrowseException e) { log.error("caught exception: ", e); throw new ServletException(e); } } } } request.setAttribute("message", message); request.setAttribute("collection", myCollection); request.setAttribute("processedItems", removedItems); // show this page when we're done jspPage = "itemmap-info.jsp"; // show the page JSPManager.showJSP(request, response, jspPage); } else if (action.equals("Add")) { // get item IDs to add String[] itemIDs = request.getParameterValues("item_ids"); String message = "added"; LinkedList addedItems = new LinkedList(); if (itemIDs == null) { message = "none-selected"; } else { for (int j = 0; j < itemIDs.length; j++) { int i = Integer.parseInt(itemIDs[j]); Item myItem = Item.find(context, i); if (AuthorizeManager.authorizeActionBoolean(context, myItem, Constants.READ)) { // make sure item doesn't belong to this collection if (!myItem.isOwningCollection(myCollection)) { myCollection.addItem(myItem); try { IndexBrowse ib = new IndexBrowse(context); ib.itemChanged(myItem); } catch (BrowseException e) { log.error("caught exception: ", e); throw new ServletException(e); } addedItems.add(itemIDs[j]); } } } } request.setAttribute("message", message); request.setAttribute("collection", myCollection); request.setAttribute("processedItems", addedItems); // show this page when we're done jspPage = "itemmap-info.jsp"; // show the page JSPManager.showJSP(request, response, jspPage); } else if (action.equals("Search Authors")) { String name = (String) request.getParameter("namepart"); String bidx = ConfigurationManager.getProperty("itemmap.author.index"); if (bidx == null) { throw new ServletException("There is no configuration for itemmap.author.index"); } Map items = new HashMap(); try { BrowserScope bs = new BrowserScope(context); BrowseIndex bi = BrowseIndex.getBrowseIndex(bidx); // set up the browse scope bs.setBrowseIndex(bi); bs.setOrder(SortOption.ASCENDING); bs.setFilterValue(name); bs.setFilterValuePartial(true); bs.setJumpToValue(null); bs.setResultsPerPage(10000); // an arbitrary number (large) for the time being bs.setBrowseLevel(1); BrowseEngine be = new BrowseEngine(context); BrowseInfo results = be.browse(bs); Item[] browseItems = results.getItemResults(context); // FIXME: oh god this is so annoying - what an API /Richard // we need to deduplicate against existing items in this collection ItemIterator itr = myCollection.getItems(); try { ArrayList idslist = new ArrayList(); while (itr.hasNext()) { idslist.add(new Integer(itr.nextID())); } for (int i = 0; i < browseItems.length; i++) { // only if it isn't already in this collection if (!idslist.contains(new Integer(browseItems[i].getID()))) { // only put on list if you can read item if (AuthorizeManager.authorizeActionBoolean(context, browseItems[i], Constants.READ)) { items.put(new Integer(browseItems[i].getID()), browseItems[i]); } } } } finally { if (itr != null) itr.close(); } } catch (BrowseException e) { log.error("caught exception: ", e); throw new ServletException(e); } request.setAttribute("collection", myCollection); request.setAttribute("browsetext", name); request.setAttribute("items", items); request.setAttribute("browsetype", new String("Add")); jspPage = "itemmap-browse.jsp"; JSPManager.showJSP(request, response, jspPage); } else if (action.equals("browse")) { // target collection to browse int t = UIUtil.getIntParameter(request, "t"); Collection targetCollection = Collection.find(context, t); // now find all imported items from that collection // seemingly inefficient, but database should have this query cached Map items = new HashMap(); ItemIterator i = myCollection.getItems(); try { while (i.hasNext()) { Item myItem = i.next(); if (myItem.isOwningCollection(targetCollection)) { Integer myKey = new Integer(myItem.getID()); items.put(myKey, myItem); } } } finally { if (i != null) i.close(); } request.setAttribute("collection", myCollection); request.setAttribute("browsetext", targetCollection .getMetadata("name")); request.setAttribute("items", items); request.setAttribute("browsetype", new String("Remove")); // show this page when we're done jspPage = "itemmap-browse.jsp"; // show the page JSPManager.showJSP(request, response, jspPage); } context.complete(); } }