/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) * * This library 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 library 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. * * For further information about Alkacon Software GmbH, please see the * company website: http://www.alkacon.com * * For further information about OpenCms, please see the * project website: http://www.opencms.org * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.opencms.workplace.commons; import org.opencms.db.CmsDbEntryNotFoundException; import org.opencms.file.CmsObject; import org.opencms.file.CmsProject; import org.opencms.file.CmsResource; import org.opencms.file.CmsResourceFilter; import org.opencms.file.CmsVfsResourceNotFoundException; import org.opencms.file.history.CmsHistoryProject; import org.opencms.file.history.CmsHistoryResourceHandler; import org.opencms.file.history.I_CmsHistoryResource; import org.opencms.jsp.CmsJspActionElement; import org.opencms.main.CmsException; import org.opencms.main.CmsLog; import org.opencms.main.CmsRuntimeException; import org.opencms.main.OpenCms; import org.opencms.security.CmsPrincipal; import org.opencms.util.CmsStringUtil; import org.opencms.util.CmsUUID; import org.opencms.workplace.list.A_CmsListDialog; import org.opencms.workplace.list.CmsListColumnAlignEnum; import org.opencms.workplace.list.CmsListColumnDefinition; import org.opencms.workplace.list.CmsListDirectAction; import org.opencms.workplace.list.CmsListItem; import org.opencms.workplace.list.CmsListItemActionIconComparator; import org.opencms.workplace.list.CmsListItemDetails; import org.opencms.workplace.list.CmsListItemDetailsFormatter; import org.opencms.workplace.list.CmsListItemSelectionAction; import org.opencms.workplace.list.CmsListMetadata; import org.opencms.workplace.list.CmsListOrderEnum; import org.opencms.workplace.list.CmsListRadioMultiAction; import org.opencms.workplace.list.CmsListResourceIconAction; import org.opencms.workplace.list.I_CmsListFormatter; import org.opencms.workplace.tools.CmsToolDialog; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import org.apache.commons.logging.Log; /** * Displays the history of a file.<p> * * @since 6.0.2 */ public class CmsHistoryList extends A_CmsListDialog { /** * Wrapper class for the version which is either an integer or the string "offline".<p> */ public static class CmsVersionWrapper implements Comparable { /** the version. */ private Integer m_version; /** * Constructs a new version wrapper.<p> * * @param version the version of the file */ public CmsVersionWrapper(int version) { m_version = new Integer(version); } /** * * @see java.lang.Comparable#compareTo(java.lang.Object) */ public int compareTo(Object o) { if (this == o) { return 0; } if (o instanceof CmsVersionWrapper) { CmsVersionWrapper version = (CmsVersionWrapper)o; Integer v1 = m_version; Integer v2 = version.getVersion(); if (v1.intValue() < 0) { v1 = new Integer(-1 * v1.intValue()); } if (v2.intValue() < 0) { v2 = new Integer(-1 * v2.intValue()); } return ((Comparable)v1).compareTo(v2); } return 0; } /** * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof CmsVersionWrapper) { CmsVersionWrapper version = (CmsVersionWrapper)obj; return getVersion().equals(version.getVersion()); } return false; } /** * Returns the version of the file.<p> * * @return the version of the file */ public Integer getVersion() { return m_version; } /** * @see java.lang.Object#hashCode() */ public int hashCode() { return getVersion().hashCode(); } /** * * @see java.lang.Object#toString() */ public String toString() { return m_version.toString(); } } /** list item detail id constant. */ public static final String GUI_LIST_HISTORY_DETAIL_PROJECT_0 = "lhdp"; /** List action export. */ public static final String LIST_ACTION_RESTORE = "ar"; /** list action id constant. */ public static final String LIST_ACTION_VIEW = "av"; /** list column id constant. */ public static final String LIST_COLUMN_DATE_LAST_MODIFIED = "cm"; /** list column id constant. */ public static final String LIST_COLUMN_DATE_PUBLISHED = "cdp"; /** list column id constant. */ public static final String LIST_COLUMN_FILE_TYPE = "ct"; /** list column id constant. */ public static final String LIST_COLUMN_ICON = "ci"; /** list column id constant. */ public static final String LIST_COLUMN_PUBLISH_TAG = "cbt"; /** list column id constant. */ public static final String LIST_COLUMN_RESOURCE_PATH = "crp"; /** List column delete. */ public static final String LIST_COLUMN_RESTORE = "cr"; /** list column id constant. */ public static final String LIST_COLUMN_SEL1 = "cs1"; /** list column id constant. */ public static final String LIST_COLUMN_SEL2 = "cs2"; /** list column id constant. */ public static final String LIST_COLUMN_SIZE = "cs"; /** list column id constant. */ public static final String LIST_COLUMN_STRUCTURE_ID = "csi"; /** List column export. */ public static final String LIST_COLUMN_USER = "cu"; /** list column id constant. */ public static final String LIST_COLUMN_VERSION = "cv"; /** List column export. */ public static final String LIST_COLUMN_VIEW = "cp"; /** list id constant. */ public static final String LIST_ID = "him"; /** list independent action id constant. */ public static final String LIST_RACTION_SEL1 = "rs1"; /** list independent action id constant. */ public static final String LIST_RACTION_SEL2 = "rs2"; /** parameter for the path of the first resource. */ public static final String PARAM_ID_1 = "id1"; /** parameter for the path of the second resource. */ public static final String PARAM_ID_2 = "id2"; /** parameter for the version of the first resource. */ public static final String PARAM_VERSION_1 = "version1"; /** parameter for the version of the second resource. */ public static final String PARAM_VERSION_2 = "version2"; /** Path to the list buttons. */ public static final String PATH_BUTTONS = "buttons/"; /** list multi action id constant. */ private static final String LIST_MACTION_COMPARE = "mc"; /** The log object for this class. */ private static final Log LOG = CmsLog.getLog(CmsHistoryList.class); /** * Public constructor.<p> * * @param jsp an initialized JSP action element */ public CmsHistoryList(CmsJspActionElement jsp) { super( jsp, LIST_ID, Messages.get().container(Messages.GUI_HISTORY_0), LIST_COLUMN_VERSION, CmsListOrderEnum.ORDER_DESCENDING, null); } /** * Public constructor with JSP variables.<p> * * @param context the JSP page context * @param req the JSP request * @param res the JSP response */ public CmsHistoryList(PageContext context, HttpServletRequest req, HttpServletResponse res) { this(new CmsJspActionElement(context, req, res)); } /** * Returns the version number from a version parameter.<p> * * @param version might be negative for the online version * @param locale if the result is for display purposes, the locale has to be <code>!= null</code> * * @return the display name */ public static String getDisplayVersion(String version, Locale locale) { int ver = Integer.parseInt(version); if (ver == CmsHistoryResourceHandler.PROJECT_OFFLINE_VERSION) { return Messages.get().getBundle(locale).key(Messages.GUI_PROJECT_OFFLINE_0); } if (ver < 0) { ver *= -1; if (locale != null) { return Messages.get().getBundle(locale).key(Messages.GUI_PROJECT_ONLINE_1, new Integer(ver)); } } return "" + ver; } /** * Returns the link to an historical file.<p> * * @param cms the cms context * @param structureId the structure id of the file * @param version the version number of the file * * @return the link to an historical file */ public static String getHistoryLink(CmsObject cms, CmsUUID structureId, String version) { String resourcePath; CmsResource resource; try { resource = cms.readResource(structureId, CmsResourceFilter.ALL); resourcePath = resource.getRootPath(); } catch (CmsException e) { throw new CmsRuntimeException(e.getMessageContainer(), e); } StringBuffer link = new StringBuffer(); link.append(CmsHistoryResourceHandler.HISTORY_HANDLER); link.append(resourcePath); link.append('?'); link.append(CmsHistoryResourceHandler.PARAM_VERSION); link.append('='); link.append(getVersion("" + version)); return link.toString(); } /** * Returns the version number from a version parameter.<p> * * @param version might be negative for the online version * * @return the positive value */ public static int getVersion(String version) { int ver = Integer.parseInt(version); return Math.abs(ver); } /** * @see org.opencms.workplace.list.A_CmsListDialog#actionDialog() */ @Override public void actionDialog() throws JspException, ServletException, IOException { super.actionDialog(); // ensure the list is correcly sorted if (CmsStringUtil.isEmptyOrWhitespaceOnly(getList().getSortedColumn())) { getList().setSortedColumn(LIST_COLUMN_VERSION); } } /** * @see org.opencms.workplace.list.A_CmsListDialog#executeListMultiActions() */ public void executeListMultiActions() throws IOException, ServletException { if (getParamListAction().equals(LIST_MACTION_COMPARE)) { CmsListItem item1 = (CmsListItem)getSelectedItems().get(0); CmsListItem item2 = (CmsListItem)getSelectedItems().get(1); Map params = new HashMap(); if (((Comparable)item2.get(LIST_COLUMN_VERSION)).compareTo(item1.get(LIST_COLUMN_VERSION)) > 0) { params.put(PARAM_VERSION_1, item1.get(LIST_COLUMN_VERSION)); params.put(PARAM_VERSION_2, item2.get(LIST_COLUMN_VERSION)); params.put(PARAM_ID_1, item1.get(LIST_COLUMN_STRUCTURE_ID)); params.put(PARAM_ID_2, item2.get(LIST_COLUMN_STRUCTURE_ID)); } else { params.put(PARAM_VERSION_1, item2.get(LIST_COLUMN_VERSION)); params.put(PARAM_VERSION_2, item1.get(LIST_COLUMN_VERSION)); params.put(PARAM_ID_1, item2.get(LIST_COLUMN_STRUCTURE_ID)); params.put(PARAM_ID_2, item1.get(LIST_COLUMN_STRUCTURE_ID)); } params.put(PARAM_ACTION, DIALOG_INITIAL); params.put(PARAM_STYLE, CmsToolDialog.STYLE_NEW); params.put(PARAM_RESOURCE, getParamResource()); getToolManager().jspForwardTool(this, "/history/comparison", params); } refreshList(); } /** * @see org.opencms.workplace.list.A_CmsListDialog#executeListSingleActions() */ public void executeListSingleActions() throws IOException, ServletException { if (getParamListAction().equals(LIST_ACTION_RESTORE)) { try { performRestoreOperation(); Map params = new HashMap(); params.put(PARAM_ACTION, DIALOG_INITIAL); getToolManager().jspForwardPage(this, "/system/workplace/views/explorer/explorer_files.jsp", params); } catch (CmsException e) { LOG.error(e.getMessage(), e); throw new CmsRuntimeException(e.getMessageContainer()); } } refreshList(); } /** * @see org.opencms.workplace.list.A_CmsListDialog#defaultActionHtmlStart() */ protected String defaultActionHtmlStart() { return getList().listJs() + dialogContentStart(getParamTitle()); } /** * @see org.opencms.workplace.list.A_CmsListDialog#fillDetails(java.lang.String) */ protected void fillDetails(String detailId) { // get content List items = getList().getAllContent(); Iterator itItems = items.iterator(); CmsListItem item; while (itItems.hasNext()) { item = (CmsListItem)itItems.next(); if (detailId.equals(GUI_LIST_HISTORY_DETAIL_PROJECT_0)) { fillDetailProject(item, detailId); } } } /** * @see org.opencms.workplace.list.A_CmsListDialog#getListItems() */ protected List getListItems() throws CmsException { List result = new ArrayList(); List historicalVersions = getCms().readAllAvailableVersions(getParamResource()); Iterator itVersions = historicalVersions.iterator(); while (itVersions.hasNext()) { I_CmsHistoryResource histRes = (I_CmsHistoryResource)itVersions.next(); // the publish tag for the history project int publishTag = histRes.getPublishTag(); CmsHistoryProject project = getCms().readHistoryProject(publishTag); String filetype = String.valueOf(histRes.getTypeId()); String dateLastModified = getMessages().getDateTime(histRes.getDateLastModified()); String datePublished = getMessages().getDateTime(project.getPublishingDate()); CmsListItem item = getList().newItem("" + histRes.getVersion()); int factor = 1; if (result.isEmpty() && !histRes.getState().isDeleted()) { factor = -1; } CmsVersionWrapper version = new CmsVersionWrapper(factor * histRes.getVersion()); //version item.set(LIST_COLUMN_VERSION, version); // publish date item.set(LIST_COLUMN_DATE_PUBLISHED, datePublished); // last modification date item.set(LIST_COLUMN_DATE_LAST_MODIFIED, dateLastModified); // resource type item.set(LIST_COLUMN_FILE_TYPE, filetype); // user String user = histRes.getUserLastModified().toString(); try { user = CmsPrincipal.readPrincipalIncludingHistory(getCms(), histRes.getUserLastModified()).getName(); } catch (CmsDbEntryNotFoundException e) { // ignore } item.set(LIST_COLUMN_USER, user); // path item.set(LIST_COLUMN_RESOURCE_PATH, getCms().getRequestContext().removeSiteRoot(histRes.getRootPath())); // size item.set(LIST_COLUMN_SIZE, new Integer(histRes.getLength()).toString()); // invisible publish tag (for reading history project in fillDetails) item.set(LIST_COLUMN_PUBLISH_TAG, new Integer(publishTag)); // invisible structure id item.set(LIST_COLUMN_STRUCTURE_ID, histRes.getStructureId().toString()); result.add(item); } if (result.isEmpty()) { CmsResource onlineResource = null; // this is to prevent problems after an update without keeping historical info CmsProject project = getCms().getRequestContext().getCurrentProject(); try { getCms().getRequestContext().setCurrentProject(getCms().readProject(CmsProject.ONLINE_PROJECT_ID)); onlineResource = getCms().readResource(getParamResource(), CmsResourceFilter.IGNORE_EXPIRATION); CmsListItem item = getList().newItem("" + onlineResource.getVersion()); //version item.set(LIST_COLUMN_VERSION, new CmsVersionWrapper(-1 * onlineResource.getVersion())); // publish date item.set(LIST_COLUMN_DATE_PUBLISHED, "-"); // last modification date item.set( LIST_COLUMN_DATE_LAST_MODIFIED, getMessages().getDateTime(onlineResource.getDateLastModified())); // resource type item.set(LIST_COLUMN_FILE_TYPE, String.valueOf(onlineResource.getTypeId())); // user String user = onlineResource.getUserLastModified().toString(); try { user = CmsPrincipal.readPrincipalIncludingHistory(getCms(), onlineResource.getUserLastModified()).getName(); } catch (CmsDbEntryNotFoundException e) { // ignore } item.set(LIST_COLUMN_USER, user); // size item.set(LIST_COLUMN_SIZE, new Integer(onlineResource.getLength()).toString()); // path item.set(LIST_COLUMN_RESOURCE_PATH, getCms().getSitePath(onlineResource)); // invisible structure id item.set(LIST_COLUMN_STRUCTURE_ID, onlineResource.getStructureId().toString()); result.add(item); } catch (CmsVfsResourceNotFoundException e) { // ignore, most likely the file is new } finally { getCms().getRequestContext().setCurrentProject(project); } } CmsResource offlineResource = getCms().readResource(getParamResource(), CmsResourceFilter.IGNORE_EXPIRATION); // hide the size for folders getList().getMetadata().getColumnDefinition(LIST_COLUMN_SIZE).setVisible(offlineResource.isFile()); // hide the preview button for folders getList().getMetadata().getColumnDefinition(LIST_COLUMN_ICON).setVisible(offlineResource.isFile()); // display offline version, if state is not unchanged if (!offlineResource.getState().isUnchanged()) { CmsListItem item = getList().newItem("" + CmsHistoryResourceHandler.PROJECT_OFFLINE_VERSION); //version item.set(LIST_COLUMN_VERSION, new CmsVersionWrapper(CmsHistoryResourceHandler.PROJECT_OFFLINE_VERSION)); // publish date item.set(LIST_COLUMN_DATE_PUBLISHED, "-"); // last modification date item.set(LIST_COLUMN_DATE_LAST_MODIFIED, getMessages().getDateTime(offlineResource.getDateLastModified())); // resource type item.set(LIST_COLUMN_FILE_TYPE, String.valueOf(offlineResource.getTypeId())); // user String user = offlineResource.getUserLastModified().toString(); try { user = CmsPrincipal.readPrincipalIncludingHistory(getCms(), offlineResource.getUserLastModified()).getName(); } catch (CmsDbEntryNotFoundException e) { // ignore } item.set(LIST_COLUMN_USER, user); // size item.set(LIST_COLUMN_SIZE, new Integer(offlineResource.getLength()).toString()); // path item.set(LIST_COLUMN_RESOURCE_PATH, getCms().getSitePath(offlineResource)); // invisible structure id item.set(LIST_COLUMN_STRUCTURE_ID, offlineResource.getStructureId().toString()); result.add(item); } boolean comparable = (result.size() > 1); getList().getMetadata().getColumnDefinition(LIST_COLUMN_SEL1).setVisible(comparable); getList().getMetadata().getColumnDefinition(LIST_COLUMN_SEL2).setVisible(comparable); getList().getMetadata().getMultiAction(LIST_MACTION_COMPARE).setVisible(comparable); return result; } /** * Restores a backed up resource version.<p> * * @throws CmsException if something goes wrong */ protected void performRestoreOperation() throws CmsException { CmsUUID structureId = new CmsUUID((String)getSelectedItem().get(LIST_COLUMN_STRUCTURE_ID)); int version = Integer.parseInt(((CmsListItem)getSelectedItems().get(0)).getId()); if (version == CmsHistoryResourceHandler.PROJECT_OFFLINE_VERSION) { // it is not possible to restore the offline version return; } CmsResource res = getCms().readResource(structureId, CmsResourceFilter.IGNORE_EXPIRATION); checkLock(getCms().getSitePath(res)); getCms().restoreResourceVersion(res.getStructureId(), version); } /** * @see org.opencms.workplace.list.A_CmsListDialog#setColumns(org.opencms.workplace.list.CmsListMetadata) */ protected void setColumns(CmsListMetadata metadata) { CmsListColumnDefinition previewCol = new CmsListColumnDefinition(LIST_COLUMN_VIEW); previewCol.setName(Messages.get().container(Messages.GUI_HISTORY_COLS_VIEW_0)); previewCol.setWidth("20"); previewCol.setVisible(false); previewCol.setAlign(CmsListColumnAlignEnum.ALIGN_CENTER); previewCol.setSorteable(false); // create column for icon CmsListColumnDefinition restoreCol = new CmsListColumnDefinition(LIST_COLUMN_RESTORE); restoreCol.setName(Messages.get().container(Messages.GUI_HISTORY_COLS_RESTORE_0)); restoreCol.setWidth("20"); restoreCol.setAlign(CmsListColumnAlignEnum.ALIGN_CENTER); restoreCol.setListItemComparator(new CmsListItemActionIconComparator()); restoreCol.setSorteable(false); // add icon action CmsListDirectAction restoreAction = new CmsListDirectAction(LIST_ACTION_RESTORE); restoreAction.setName(Messages.get().container(Messages.GUI_HISTORY_RESTORE_VERSION_0)); restoreAction.setIconPath("tools/ex_history/buttons/restore.png"); restoreAction.setConfirmationMessage(Messages.get().container(Messages.GUI_HISTORY_CONFIRMATION_0)); restoreAction.setEnabled(true); restoreCol.addDirectAction(restoreAction); // add it to the list definition metadata.addColumn(restoreCol); // create column for icon CmsListColumnDefinition iconCol = new CmsListColumnDefinition(LIST_COLUMN_ICON); iconCol.setName(Messages.get().container(Messages.GUI_HISTORY_COLS_VIEW_0)); iconCol.setWidth("20"); iconCol.setAlign(CmsListColumnAlignEnum.ALIGN_CENTER); iconCol.setListItemComparator(new CmsListItemActionIconComparator()); // add icon action CmsListDirectAction fileAction = new CmsListResourceIconAction( LIST_ACTION_VIEW, LIST_COLUMN_FILE_TYPE, getCms()) { /** * @see org.opencms.workplace.list.CmsListResourceIconAction#defButtonHtml(CmsObject, java.lang.String, java.lang.String, java.lang.String, java.lang.String, boolean, java.lang.String, java.lang.String, java.lang.String, boolean) */ public String defButtonHtml( CmsObject cms, String id, String helpId, String name, String helpText, boolean enabled, String iconPath, String confirmationMessage, String onClick, boolean singleHelp) { StringBuffer jsCode = new StringBuffer(512); jsCode.append("window.open('"); CmsVersionWrapper version = (CmsVersionWrapper)getItem().get(LIST_COLUMN_VERSION); // is the resource already a sibling already deleted? jsCode.append(OpenCms.getLinkManager().substituteLink( cms, getHistoryLink( cms, new CmsUUID(getItem().get(LIST_COLUMN_STRUCTURE_ID).toString()), version.toString()))); jsCode.append("','version','scrollbars=yes, resizable=yes, width=800, height=600')"); return super.defButtonHtml( cms, id, helpId, name, helpText, enabled, iconPath, confirmationMessage, jsCode.toString(), singleHelp); } }; fileAction.setName(Messages.get().container(Messages.GUI_HISTORY_PREVIEW_0)); fileAction.setEnabled(true); iconCol.addDirectAction(fileAction); // add it to the list definition metadata.addColumn(iconCol); iconCol.setPrintable(false); // add column for version CmsListColumnDefinition versionCol = new CmsListColumnDefinition(LIST_COLUMN_VERSION); versionCol.setName(Messages.get().container(Messages.GUI_HISTORY_COLS_VERSION_0)); versionCol.setWidth("5%"); versionCol.setAlign(CmsListColumnAlignEnum.ALIGN_CENTER); versionCol.setFormatter(new I_CmsListFormatter() { /** * @see org.opencms.workplace.list.I_CmsListFormatter#format(java.lang.Object, java.util.Locale) */ public String format(Object data, Locale locale) { if ((data == null) || !(data instanceof CmsVersionWrapper)) { return ""; } CmsVersionWrapper version = (CmsVersionWrapper)data; return CmsHistoryList.getDisplayVersion(version.toString(), locale); } }); metadata.addColumn(versionCol); // add column for file type CmsListColumnDefinition groupCol = new CmsListColumnDefinition(LIST_COLUMN_FILE_TYPE); groupCol.setVisible(false); metadata.addColumn(groupCol); // add column for resource path CmsListColumnDefinition pathCol = new CmsListColumnDefinition(LIST_COLUMN_RESOURCE_PATH); pathCol.setName(Messages.get().container(Messages.GUI_HISTORY_COLS_RESOURCE_PATH_0)); pathCol.setAlign(CmsListColumnAlignEnum.ALIGN_LEFT); pathCol.setWidth("40%"); metadata.addColumn(pathCol); // add column for date published CmsListColumnDefinition datePublishedCol = new CmsListColumnDefinition(LIST_COLUMN_DATE_PUBLISHED); datePublishedCol.setName(Messages.get().container(Messages.GUI_HISTORY_COLS_DATE_PUBLISHED_0)); datePublishedCol.setWidth("20%"); datePublishedCol.setAlign(CmsListColumnAlignEnum.ALIGN_LEFT); metadata.addColumn(datePublishedCol); // add column for date last modified CmsListColumnDefinition nicenameCol = new CmsListColumnDefinition(LIST_COLUMN_DATE_LAST_MODIFIED); nicenameCol.setName(Messages.get().container(Messages.GUI_HISTORY_COLS_DATE_LAST_MODIFIED_0)); nicenameCol.setWidth("20%"); nicenameCol.setAlign(CmsListColumnAlignEnum.ALIGN_LEFT); metadata.addColumn(nicenameCol); // add column for user modified CmsListColumnDefinition userCol = new CmsListColumnDefinition(LIST_COLUMN_USER); userCol.setName(Messages.get().container(Messages.GUI_HISTORY_COLS_USER_0)); userCol.setWidth("30%"); userCol.setAlign(CmsListColumnAlignEnum.ALIGN_LEFT); metadata.addColumn(userCol); // add column for date last modified CmsListColumnDefinition sizeCol = new CmsListColumnDefinition(LIST_COLUMN_SIZE); sizeCol.setName(Messages.get().container(Messages.GUI_HISTORY_COLS_SIZE_0)); sizeCol.setWidth("10%"); sizeCol.setAlign(CmsListColumnAlignEnum.ALIGN_LEFT); metadata.addColumn(sizeCol); // create column for radio button 1 CmsListColumnDefinition radioSel1Col = new CmsListColumnDefinition(LIST_COLUMN_SEL1); radioSel1Col.setName(Messages.get().container(Messages.GUI_HISTORY_COLS_VERSION1_0)); radioSel1Col.setWidth("20"); radioSel1Col.setAlign(CmsListColumnAlignEnum.ALIGN_CENTER); radioSel1Col.setSorteable(false); // add item selection action CmsListItemSelectionAction sel1Action = new CmsListItemSelectionAction(LIST_RACTION_SEL1, LIST_MACTION_COMPARE); sel1Action.setName(Messages.get().container(Messages.GUI_HISTORY_FIRST_VERSION_0)); sel1Action.setEnabled(true); radioSel1Col.addDirectAction(sel1Action); metadata.addColumn(radioSel1Col); // create column for radio button 2 CmsListColumnDefinition radioSel2Col = new CmsListColumnDefinition(LIST_COLUMN_SEL2); radioSel2Col.setName(Messages.get().container(Messages.GUI_HISTORY_COLS_VERSION2_0)); radioSel2Col.setWidth("20"); radioSel2Col.setAlign(CmsListColumnAlignEnum.ALIGN_CENTER); radioSel2Col.setSorteable(false); // add item selection action CmsListItemSelectionAction sel2Action = new CmsListItemSelectionAction(LIST_RACTION_SEL2, LIST_MACTION_COMPARE); sel2Action.setName(Messages.get().container(Messages.GUI_HISTORY_SECOND_VERSION_0)); sel2Action.setEnabled(true); radioSel2Col.addDirectAction(sel2Action); metadata.addColumn(radioSel2Col); // create invisible publish tag column to allow fillDetails to be able to read the proper // historical project CmsListColumnDefinition publishTagCol = new CmsListColumnDefinition(LIST_COLUMN_PUBLISH_TAG); publishTagCol.setSorteable(false); publishTagCol.setVisible(false); metadata.addColumn(publishTagCol); // create invisible strcuture id column CmsListColumnDefinition strIdCol = new CmsListColumnDefinition(LIST_COLUMN_STRUCTURE_ID); strIdCol.setSorteable(false); strIdCol.setVisible(false); metadata.addColumn(strIdCol); } /** * @see org.opencms.workplace.list.A_CmsListDialog#setIndependentActions(org.opencms.workplace.list.CmsListMetadata) */ protected void setIndependentActions(CmsListMetadata metadata) { // add index source details CmsListItemDetails indexDetails = new CmsListItemDetails(GUI_LIST_HISTORY_DETAIL_PROJECT_0); indexDetails.setAtColumn(LIST_COLUMN_VERSION); indexDetails.setVisible(false); indexDetails.setShowActionName(Messages.get().container(Messages.GUI_LIST_HISTORY_DETAIL_PROJECT_NAME_SHOW_0)); indexDetails.setShowActionHelpText(Messages.get().container( Messages.GUI_LIST_HISTORY_DETAIL_PROJECT_SHOW_HELP_0)); indexDetails.setHideActionName(Messages.get().container(Messages.GUI_LIST_HISTORY_DETAIL_PROJECT_NAME_HIDE_0)); indexDetails.setHideActionHelpText(Messages.get().container( Messages.GUI_LIST_HISTORY_DETAIL_PROJECT_HIDE_HELP_0)); indexDetails.setName(Messages.get().container(Messages.GUI_LIST_HISTORY_DETAIL_PROJECT_INFO_0)); indexDetails.setFormatter(new CmsListItemDetailsFormatter(Messages.get().container( Messages.GUI_LIST_HISTORY_DETAIL_PROJECT_INFO_0))); metadata.addItemDetails(indexDetails); } /** * @see org.opencms.workplace.list.A_CmsListDialog#setMultiActions(org.opencms.workplace.list.CmsListMetadata) */ protected void setMultiActions(CmsListMetadata metadata) { // add compare action CmsListRadioMultiAction compareAction = new CmsListRadioMultiAction( LIST_MACTION_COMPARE, Arrays.asList(new String[] {LIST_RACTION_SEL1, LIST_RACTION_SEL2})); compareAction.setName(Messages.get().container(Messages.GUI_HISTORY_COMPARE_0)); compareAction.setIconPath("tools/ex_history/buttons/compare.png"); metadata.addMultiAction(compareAction); } /** * Fills details of the project into the given item. <p> * * @param item the list item to fill * * @param detailId the id for the detail to fill * */ private void fillDetailProject(CmsListItem item, String detailId) { StringBuffer html = new StringBuffer(); // search /read for the corresponding history project: it's tag id transmitted from getListItems() // in a hidden column Object tagIdObj = item.get(LIST_COLUMN_PUBLISH_TAG); if (tagIdObj != null) { // it is null if the offline version with changes is shown here: now history project available then int tagId = ((Integer)tagIdObj).intValue(); try { CmsHistoryProject project = getCms().readHistoryProject(tagId); // output of project info html.append(project.getName()).append("<br/>").append(project.getDescription()); } catch (CmsException cmse) { html.append(cmse.getMessageContainer().key(this.getLocale())); } } item.set(detailId, html.toString()); } }