/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.app.xmlui.aspect.administrative.item; import java.sql.SQLException; import java.util.ArrayList; import org.apache.commons.lang.StringUtils; import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer; 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.Button; import org.dspace.app.xmlui.wing.element.Cell; import org.dspace.app.xmlui.wing.element.CheckBox; import org.dspace.app.xmlui.wing.element.Division; import org.dspace.app.xmlui.wing.element.Highlight; import org.dspace.app.xmlui.wing.element.List; import org.dspace.app.xmlui.wing.element.PageMeta; import org.dspace.app.xmlui.wing.element.Para; import org.dspace.app.xmlui.wing.element.Row; import org.dspace.app.xmlui.wing.element.Table; import org.dspace.authorize.AuthorizeManager; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; import org.dspace.content.Bundle; import org.dspace.content.Item; import org.dspace.core.Constants; /** * Show a list of the item's bitstreams allowing the user to delete them, * edit them, or upload new bitstreams. * * @author Jay Paz * @author Scott phillips */ public class EditItemBitstreamsForm extends AbstractDSpaceTransformer { /** Language strings */ private static final Message T_dspace_home = message("xmlui.general.dspace_home"); private static final Message T_submit_return = message("xmlui.general.return"); private static final Message T_item_trail = message("xmlui.administrative.item.general.item_trail"); private static final Message T_option_head = message("xmlui.administrative.item.general.option_head"); private static final Message T_option_status = message("xmlui.administrative.item.general.option_status"); private static final Message T_option_bitstreams = message("xmlui.administrative.item.general.option_bitstreams"); private static final Message T_option_metadata = message("xmlui.administrative.item.general.option_metadata"); private static final Message T_option_view = message("xmlui.administrative.item.general.option_view"); private static final Message T_option_curate = message("xmlui.administrative.item.general.option_curate"); private static final Message T_title = message("xmlui.administrative.item.EditItemBitstreamsForm.title"); private static final Message T_trail = message("xmlui.administrative.item.EditItemBitstreamsForm.trail"); private static final Message T_head1 = message("xmlui.administrative.item.EditItemBitstreamsForm.head1"); private static final Message T_column1 = message("xmlui.administrative.item.EditItemBitstreamsForm.column1"); private static final Message T_column2 = message("xmlui.administrative.item.EditItemBitstreamsForm.column2"); private static final Message T_column3 = message("xmlui.administrative.item.EditItemBitstreamsForm.column3"); private static final Message T_column4 = message("xmlui.administrative.item.EditItemBitstreamsForm.column4"); private static final Message T_column5 = message("xmlui.administrative.item.EditItemBitstreamsForm.column5"); private static final Message T_column6 = message("xmlui.administrative.item.EditItemBitstreamsForm.column6"); private static final Message T_column7 = message("xmlui.administrative.item.EditItemBitstreamsForm.column7"); private static final Message T_bundle_label = message("xmlui.administrative.item.EditItemBitstreamsForm.bundle_label"); private static final Message T_primary_label = message("xmlui.administrative.item.EditItemBitstreamsForm.primary_label"); private static final Message T_view_link = message("xmlui.administrative.item.EditItemBitstreamsForm.view_link"); private static final Message T_submit_add = message("xmlui.administrative.item.EditItemBitstreamsForm.submit_add"); private static final Message T_submit_delete = message("xmlui.administrative.item.EditItemBitstreamsForm.submit_delete"); private static final Message T_no_upload = message("xmlui.administrative.item.EditItemBitstreamsForm.no_upload"); private static final Message T_no_remove = message("xmlui.administrative.item.EditItemBitstreamsForm.no_remove"); private static final Message T_submit_reorder = message("xmlui.administrative.item.EditItemBitstreamsForm.submit_reorder"); private static final Message T_order_up = message("xmlui.administrative.item.EditItemBitstreamsForm.order_up"); private static final Message T_order_down = message("xmlui.administrative.item.EditItemBitstreamsForm.order_down"); public void addPageMeta(PageMeta pageMeta) throws WingException { pageMeta.addMetadata("title").addContent(T_title); pageMeta.addTrailLink(contextPath + "/", T_dspace_home); pageMeta.addTrailLink(contextPath + "/admin/item", T_item_trail); pageMeta.addTrail().addContent(T_trail); } public void addBody(Body body) throws SQLException, WingException { // Get our parameters and state int itemID = parameters.getParameterAsInteger("itemID",-1); Item item = Item.find(context, itemID); String baseURL = contextPath+"/admin/item?administrative-continue="+knot.getId(); // DIVISION: main div Division main = body.addInteractiveDivision("edit-item-status", contextPath+"/admin/item", Division.METHOD_POST,"primary administrative item"); main.setHead(T_option_head); // LIST: options List options = main.addList("options",List.TYPE_SIMPLE,"horizontal"); options.addItem().addXref(baseURL+"&submit_status",T_option_status); options.addItem().addHighlight("bold").addXref(baseURL+"&submit_bitstreams",T_option_bitstreams); options.addItem().addXref(baseURL+"&submit_metadata",T_option_metadata); options.addItem().addXref(baseURL + "&view_item", T_option_view); options.addItem().addXref(baseURL + "&submit_curate", T_option_curate); // TABLE: Bitstream summary Table files = main.addTable("editItemBitstreams", 1, 1); files.setHead(T_head1); Row header = files.addRow(Row.ROLE_HEADER); header.addCellContent(T_column1); header.addCellContent(T_column2); header.addCellContent(T_column3); header.addCellContent(T_column4); header.addCellContent(T_column5); header.addCellContent(T_column6); header.addCellContent(T_column7); Bundle[] bundles = item.getBundles(); boolean showBitstreamUpdateOrderButton = false; for (Bundle bundle : bundles) { Cell bundleCell = files.addRow("bundle_head_" + bundle.getID(), Row.ROLE_DATA, "").addCell(1, 5); bundleCell.addContent(T_bundle_label.parameterize(bundle.getName())); Bitstream[] bitstreams = bundle.getBitstreams(); ArrayList<Integer> bitstreamIdOrder = new ArrayList<Integer>(); for (Bitstream bitstream : bitstreams) { bitstreamIdOrder.add(bitstream.getID()); } for (int bitstreamIndex = 0; bitstreamIndex < bitstreams.length; bitstreamIndex++) { Bitstream bitstream = bitstreams[bitstreamIndex]; boolean primary = (bundle.getPrimaryBitstreamID() == bitstream.getID()); String name = bitstream.getName(); if (name != null && name.length() > 50) { // If the fiel name is too long the shorten it so that it will display nicely. String shortName = name.substring(0, 15); shortName += " ... "; shortName += name.substring(name.length() - 25, name.length()); name = shortName; } String description = bitstream.getDescription(); String format = null; BitstreamFormat bitstreamFormat = bitstream.getFormat(); if (bitstreamFormat != null) { format = bitstreamFormat.getShortDescription(); } String editURL = contextPath + "/admin/item?administrative-continue=" + knot.getId() + "&bitstreamID=" + bitstream.getID() + "&submit_edit"; String viewURL = contextPath + "/bitstream/id/" + bitstream.getID() + "/" + bitstream.getName(); Row row = files.addRow("bitstream_row_" + bitstream.getID(), Row.ROLE_DATA, ""); CheckBox remove = row.addCell().addCheckBox("remove"); remove.setLabel("remove"); remove.addOption(bundle.getID() + "/" + bitstream.getID()); if (!AuthorizeManager.authorizeActionBoolean(context, item, Constants.REMOVE)) { remove.setDisabled(); } if (AuthorizeManager.authorizeActionBoolean(context, bitstream, Constants.WRITE)) { // The user can edit the bitstream give them a link. Cell cell = row.addCell(); cell.addXref(editURL, name); if (primary) { cell.addXref(editURL, T_primary_label); } row.addCell().addXref(editURL, description); row.addCell().addXref(editURL, format); } else { // The user can't edit the bitstream just show them it. Cell cell = row.addCell(); cell.addContent(name); if (primary) { cell.addContent(T_primary_label); } row.addCell().addContent(description); row.addCell().addContent(format); } Highlight highlight = row.addCell().addHighlight("fade"); highlight.addContent("["); highlight.addXref(viewURL, T_view_link); highlight.addContent("]"); if (AuthorizeManager.authorizeActionBoolean(context, bundle, Constants.WRITE)) { Cell cell = row.addCell("bitstream_order_" + bitstream.getID(), Cell.ROLE_DATA, ""); //Add the +1 to make it more human readable cell.addHidden("order_" + bitstream.getID()).setValue(String.valueOf(bitstreamIndex + 1)); showBitstreamUpdateOrderButton = true; Button upButton = cell.addButton("submit_order_" + bundle.getID() + "_" + bitstream.getID() + "_up", ((bitstreamIndex == 0) ? "disabled" : "") + " icon-button arrowUp "); if((bitstreamIndex == 0)){ upButton.setDisabled(); } upButton.setValue(T_order_up); upButton.setHelp(T_order_up); Button downButton = cell.addButton("submit_order_" + bundle.getID() + "_" + bitstream.getID() + "_down", (bitstreamIndex == (bitstreams.length - 1) ? "disabled" : "") + " icon-button arrowDown "); if(bitstreamIndex == (bitstreams.length - 1)){ downButton.setDisabled(); } downButton.setValue(T_order_down); downButton.setHelp(T_order_down); //These values will only be used IF javascript is disabled or isn't working cell.addHidden(bundle.getID() + "_" + bitstream.getID() + "_up_value").setValue(retrieveOrderUpButtonValue((java.util.List<Integer>) bitstreamIdOrder.clone(), bitstreamIndex)); cell.addHidden(bundle.getID() + "_" + bitstream.getID() + "_down_value").setValue(retrieveOrderDownButtonValue((java.util.List<Integer>) bitstreamIdOrder.clone(), bitstreamIndex)); }else{ row.addCell().addContent(String.valueOf(bitstreamIndex)); } } } if (AuthorizeManager.authorizeActionBoolean(context, item, Constants.ADD)) { Cell cell = files.addRow().addCell(1, 5); cell.addXref(contextPath+"/admin/item?administrative-continue="+knot.getId()+"&submit_add",T_submit_add); } else { Cell cell = files.addRow().addCell(1, 5); cell.addHighlight("fade").addContent(T_no_upload); } // PARA: actions Para actions = main.addPara("editItemActionsP","editItemActionsP" ); if (showBitstreamUpdateOrderButton) { //Add a button to submit the new order (this button is hidden & will be displayed by the javascript) //Should javascript be disabled for some reason this button isn't used. actions.addButton("submit_update_order", "hidden").setValue(T_submit_reorder); } // Only System Administrators can delete bitstreams if (AuthorizeManager.authorizeActionBoolean(context, item, Constants.REMOVE)) { actions.addButton("submit_delete").setValue(T_submit_delete); } else { Button button = actions.addButton("submit_delete"); button.setValue(T_submit_delete); button.setDisabled(); main.addPara().addHighlight("fade").addContent(T_no_remove); } actions.addButton("submit_return").setValue(T_submit_return); main.addHidden("administrative-continue").setValue(knot.getId()); } private String retrieveOrderUpButtonValue(java.util.List<Integer> bitstreamIdOrder, int bitstreamIndex) { if(0 != bitstreamIndex){ //We don't have the first button, so create a value where the current bitstreamId moves one up Integer temp = bitstreamIdOrder.get(bitstreamIndex); bitstreamIdOrder.set(bitstreamIndex, bitstreamIdOrder.get(bitstreamIndex - 1)); bitstreamIdOrder.set(bitstreamIndex - 1, temp); } return StringUtils.join(bitstreamIdOrder.toArray(new Integer[bitstreamIdOrder.size()]), ","); } private String retrieveOrderDownButtonValue(java.util.List<Integer> bitstreamIdOrder, int bitstreamIndex) { if(bitstreamIndex < (bitstreamIdOrder.size()) -1){ //We don't have the first button, so create a value where the current bitstreamId moves one up Integer temp = bitstreamIdOrder.get(bitstreamIndex); bitstreamIdOrder.set(bitstreamIndex, bitstreamIdOrder.get(bitstreamIndex + 1)); bitstreamIdOrder.set(bitstreamIndex + 1, temp); } return StringUtils.join(bitstreamIdOrder.toArray(new Integer[bitstreamIdOrder.size()]), ","); } }