/*
* 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.list;
import org.opencms.i18n.CmsMessageContainer;
import org.opencms.jsp.CmsJspActionElement;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.CmsRuntimeException;
import org.opencms.util.CmsCollectionsGenericWrapper;
import org.opencms.util.CmsStringUtil;
import org.opencms.workplace.CmsDialog;
import org.opencms.workplace.CmsWorkplaceSettings;
import org.opencms.workplace.tools.CmsToolDialog;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import org.apache.commons.logging.Log;
/**
* Provides a dialog with a list widget.<p>
*
* @since 6.0.0
*/
public abstract class A_CmsListDialog extends CmsDialog {
/** Value for the action: execute a list item independent action of the list. */
public static final int ACTION_LIST_INDEPENDENT_ACTION = 83;
/** Value for the action: execute an multi action of the list. */
public static final int ACTION_LIST_MULTI_ACTION = 85;
/** Value for the action: search the list. */
public static final int ACTION_LIST_SEARCH = 81;
/** Value for the action: go to a page. */
public static final int ACTION_LIST_SELECT_PAGE = 82;
/** Value for the action: execute a single action of the list. */
public static final int ACTION_LIST_SINGLE_ACTION = 84;
/** Value for the action: sort the list. */
public static final int ACTION_LIST_SORT = 80;
/** Standard list button location. */
public static final String ICON_ACTIVE = "list/active.png";
/** Standard list button location. */
public static final String ICON_ADD = "list/add.png";
/** Standard list button location. */
public static final String ICON_DELETE = "list/delete.png";
/** Standard list button location. */
public static final String ICON_DETAILS_HIDE = "list/details_hide.png";
/** Standard list button location. */
public static final String ICON_DETAILS_SHOW = "list/details_show.png";
/** Standard list button location. */
public static final String ICON_DISABLED = "list/disabled.png";
/** Standard list button location. */
public static final String ICON_INACTIVE = "list/inactive.png";
/** Standard list button location. */
public static final String ICON_MINUS = "list/minus.png";
/** Standard list button location. */
public static final String ICON_MULTI_ACTIVATE = "list/multi_activate.png";
/** Standard list button location. */
public static final String ICON_MULTI_ADD = "list/multi_add.png";
/** Standard list button location. */
public static final String ICON_MULTI_DEACTIVATE = "list/multi_deactivate.png";
/** Standard list button location. */
public static final String ICON_MULTI_DELETE = "list/multi_delete.png";
/** Standard list button location. */
public static final String ICON_MULTI_MINUS = "list/multi_minus.png";
/** Request parameter value for the list action: a list item independent action has been triggered. */
public static final String LIST_INDEPENDENT_ACTION = "listindependentaction";
/** Request parameter value for the list action: a multi action has been triggered. */
public static final String LIST_MULTI_ACTION = "listmultiaction";
/** Request parameter value for the list action: search/filter. */
public static final String LIST_SEARCH = "listsearch";
/** Request parameter value for the list action: select a page. */
public static final String LIST_SELECT_PAGE = "listselectpage";
/** Request parameter value for the list action: a single action has been triggered. */
public static final String LIST_SINGLE_ACTION = "listsingleaction";
/** Request parameter value for the list action: sort. */
public static final String LIST_SORT = "listsort";
/** Request parameter key for the requested page. */
public static final String PARAM_FORMNAME = "formname";
/** Request parameter key for the list action. */
public static final String PARAM_LIST_ACTION = "listaction";
/** Request parameter key for the requested page. */
public static final String PARAM_PAGE = "page";
/** Request parameter key for search the filter. */
public static final String PARAM_SEARCH_FILTER = "searchfilter";
/** Request parameter key for the selected item(s). */
public static final String PARAM_SEL_ITEMS = "selitems";
/** Request parameter key for the column to sort the list. */
public static final String PARAM_SORT_COL = "sortcol";
/** The log object for this class. */
private static final Log LOG = CmsLog.getLog(A_CmsListDialog.class);
/** metadata map for all used list metadata objects. */
private static Map<String, CmsListMetadata> m_metadatas = new HashMap<String, CmsListMetadata>();
/** A flag which indicates whether the list should use database paging (only supported for some lists) .**/
protected boolean m_lazy;
/** Activation decision Flag. */
private boolean m_active;
/** the internal list. */
private CmsHtmlList m_list;
/** The id of the list. */
private String m_listId;
/** Cached List state in case of {@link #refreshList()} method call. */
private CmsListState m_listState;
/** The displayed page. */
private String m_paramFormName;
/** The list action. */
private String m_paramListAction;
/** The displayed page. */
private String m_paramPage;
/** The search filter text. */
private String m_paramSearchFilter;
/** The selected items, comma separated list. */
private String m_paramSelItems;
/** The column to sort the list. */
private String m_paramSortCol;
/** The column to search the list. */
private String m_searchColId;
/**
* Public constructor.<p>
*
* @param jsp an initialized JSP action element
* @param listId the id of the displayed list
* @param listName the name of the list
* @param sortedColId the a priory sorted column
* @param sortOrder the order of the sorted column
* @param searchableColId the column to search into
*/
protected A_CmsListDialog(
CmsJspActionElement jsp,
String listId,
CmsMessageContainer listName,
String sortedColId,
CmsListOrderEnum sortOrder,
String searchableColId) {
this(jsp, listId, listName, sortedColId, sortOrder, searchableColId, false);
}
/**
* Public constructor.<p>
*
* @param jsp an initialized JSP action element
* @param listId the id of the displayed list
* @param listName the name of the list
* @param sortedColId the a priory sorted column
* @param sortOrder the order of the sorted column
* @param searchableColId the column to search into
* @param lazy if this parameter is true, the list should load only load the list items of the current page, if possible
*/
protected A_CmsListDialog(
CmsJspActionElement jsp,
String listId,
CmsMessageContainer listName,
String sortedColId,
CmsListOrderEnum sortOrder,
String searchableColId,
boolean lazy) {
super(jsp);
m_lazy = lazy;
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_START_INIT_LIST_1, listId));
}
// set list id
m_listId = listId;
// set active flag for 2 lists dialog
m_active = (getListId() + "-form").equals(getParamFormName());
setParamFormName(getListId() + "-form");
// abort if already forwarded
if (isForwarded()) {
return;
}
m_searchColId = searchableColId;
// try to read the list from the session
listRecovery(listId);
// initialization
if (getList() == null) {
// create the list
setList(new CmsHtmlList(listId, listName, getMetadata(this.getClass().getName(), listId)));
// set the number of items per page from the user settings
getList().setMaxItemsPerPage(getSettings().getUserSettings().getExplorerFileEntries());
// sort the list
if ((sortedColId != null) && (getList().getMetadata().getColumnDefinition(sortedColId) != null)) {
getList().setWp(this);
getList().setSortedColumn(sortedColId);
if ((sortOrder != null) && (sortOrder == CmsListOrderEnum.ORDER_DESCENDING)) {
getList().setSortedColumn(sortedColId);
}
}
// save the current state of the list
listSave();
}
getList().setWp(this);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_END_INIT_LIST_1, listId));
}
}
/**
* Returns the list object for the given list dialog, or <code>null</code>
* if no list object has been set.<p>
*
* @param listDialog the list dialog class
* @param settings the wp settings for accessing the session
*
* @return the list object for this list dialog, or <code>null</code>
*/
public static CmsHtmlList getListObject(Class<?> listDialog, CmsWorkplaceSettings settings) {
return getListObjectMap(settings).get(listDialog.getName());
}
/**
* Returns the list metadata object for the given dialog.<p>
*
* @param listDialogName the dialog class name
*
* @return the list metadata object
*/
public static CmsListMetadata getMetadata(String listDialogName) {
return m_metadatas.get(listDialogName);
}
/**
* Returns the (internal use only) map of list objects.<p>
*
* @param settings the wp settings for accessing the session
*
* @return the (internal use only) map of list objects
*/
private static Map<String, CmsHtmlList> getListObjectMap(CmsWorkplaceSettings settings) {
Map<String, CmsHtmlList> objects = CmsCollectionsGenericWrapper.map(settings.getListObject());
if (objects == null) {
// using hashtable as most efficient version of a synchronized map
objects = new Hashtable<String, CmsHtmlList>();
settings.setListObject(objects);
}
return objects;
}
/**
* Performs the dialog actions depending on the initialized action.<p>
*
* @throws JspException if dialog actions fail
* @throws IOException in case of errors forwarding to the required result page
* @throws ServletException in case of errors forwarding to the required result page
*/
public void actionDialog() throws JspException, ServletException, IOException {
if (isForwarded()) {
return;
}
if (getAction() == ACTION_CANCEL) {
// ACTION: cancel button pressed
actionCloseDialog();
return;
}
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_START_ACTION_LIST_2,
getListId(),
new Integer(getAction())));
}
switch (getAction()) {
//////////////////// ACTION: default actions
case ACTION_LIST_SEARCH:
case ACTION_LIST_SORT:
case ACTION_LIST_SELECT_PAGE:
executeDefaultActions();
break;
//////////////////// ACTION: execute single list action
case ACTION_LIST_SINGLE_ACTION:
if (getSelectedItem() != null) {
executeListSingleActions();
}
break;
//////////////////// ACTION: execute multiple list actions
case ACTION_LIST_MULTI_ACTION:
executeListMultiActions();
break;
//////////////////// ACTION: execute independent list actions
case ACTION_LIST_INDEPENDENT_ACTION:
executeListIndepActions();
break;
case ACTION_DEFAULT:
default:
// ACTION: show dialog (default)
setParamAction(DIALOG_INITIAL);
}
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_END_ACTION_LIST_2,
getListId(),
new Integer(getAction())));
}
refreshList();
}
/**
* Generates the dialog starting html code.<p>
*
* @return html code
*/
public String defaultActionHtml() {
if ((getList() != null) && getList().getAllContent().isEmpty()) {
// TODO: check the need for this
refreshList();
}
StringBuffer result = new StringBuffer(2048);
result.append(defaultActionHtmlStart());
result.append(customHtmlStart());
result.append(defaultActionHtmlContent());
result.append(customHtmlEnd());
result.append(defaultActionHtmlEnd());
return result.toString();
}
/**
* Performs the dialog actions depending on the initialized action and displays the dialog form.<p>
*
* @throws JspException if dialog actions fail
* @throws IOException if writing to the JSP out fails, or in case of errors forwarding to the required result page
* @throws ServletException in case of errors forwarding to the required result page
*/
public void displayDialog() throws JspException, IOException, ServletException {
displayDialog(false);
}
/**
* Performs the dialog actions depending on the initialized action and displays the dialog form if needed.<p>
*
* @param writeLater if <code>true</code> no output is written,
* you have to call manually the <code>{@link #defaultActionHtml()}</code> method.
*
* @throws JspException if dialog actions fail
* @throws IOException if writing to the JSP out fails, or in case of errors forwarding to the required result page
* @throws ServletException in case of errors forwarding to the required result page
*/
public void displayDialog(boolean writeLater) throws JspException, IOException, ServletException {
actionDialog();
if (writeLater) {
return;
}
writeDialog();
}
/**
* This method execute the default actions for searching, sorting and paging.<p>
*/
public void executeDefaultActions() {
switch (getAction()) {
case ACTION_LIST_SEARCH:
executeSearch();
break;
case ACTION_LIST_SORT:
executeSort();
break;
case ACTION_LIST_SELECT_PAGE:
executeSelectPage();
break;
default:
// ignore
}
listSave();
}
/**
* This method should handle the default list independent actions,
* by comparing <code>{@link #getParamListAction()}</code> with the id
* of the action to execute.<p>
*
* if you want to handle additional independent actions, override this method,
* handling your actions and FINALLY calling <code>super.executeListIndepActions();</code>.<p>
*/
public void executeListIndepActions() {
if (getList().getMetadata().getItemDetailDefinition(getParamListAction()) != null) {
// toggle item details
getList().getMetadata().toogleDetailState(getParamListAction());
// lazy initialization
initializeDetail(getParamListAction());
}
listSave();
}
/**
* This method should handle every defined list multi action,
* by comparing <code>{@link #getParamListAction()}</code> with the id
* of the action to execute.<p>
*
* @throws IOException in case of errors when including a required sub-element
* @throws ServletException in case of errors when including a required sub-element
* @throws CmsRuntimeException to signal that an action is not supported
*/
public abstract void executeListMultiActions() throws IOException, ServletException, CmsRuntimeException;
/**
* This method should handle every defined list single action,
* by comparing <code>{@link #getParamListAction()}</code> with the id
* of the action to execute.<p>
*
* @throws IOException in case of errors when including a required sub-element
* @throws ServletException in case of errors when including a required sub-element
* @throws CmsRuntimeException to signal that an action is not supported
*/
public abstract void executeListSingleActions() throws IOException, ServletException, CmsRuntimeException;
/**
* Returns the list.<p>
*
* @return the list
*/
public CmsHtmlList getList() {
if ((m_list != null) && (m_list.getMetadata() == null)) {
m_list.setMetadata(getMetadata(getClass().getName(), m_list.getId()));
}
return m_list;
}
/**
* Returns the Id of the list.<p>
*
* @return the list Id
*/
public final String getListId() {
return m_listId;
}
/**
* Returns the form name.<p>
*
* @return the form name
*/
public String getParamFormName() {
return m_paramFormName;
}
/**
* Returns the List Action.<p>
*
* @return the List Action
*/
public String getParamListAction() {
return m_paramListAction;
}
/**
* Returns the current Page.<p>
*
* @return the current Page
*/
public String getParamPage() {
return m_paramPage;
}
/**
* Returns the Search Filter.<p>
*
* @return the Search Filter
*/
public String getParamSearchFilter() {
return m_paramSearchFilter;
}
/**
* Returns the selected Items.<p>
*
* @return the selected Items
*/
public String getParamSelItems() {
return m_paramSelItems;
}
/**
* Returns the sorted Column.<p>
*
* @return the sorted Column
*/
public String getParamSortCol() {
return m_paramSortCol;
}
/**
* Returns the current selected item.<p>
*
* @return the current selected item
*/
public CmsListItem getSelectedItem() {
try {
return getList().getItem(
CmsStringUtil.splitAsArray(getParamSelItems(), CmsHtmlList.ITEM_SEPARATOR)[0].trim());
} catch (Exception e) {
try {
return getList().getItem("");
} catch (Exception e1) {
return null;
}
}
}
/**
* Returns a list of current selected items.<p>
*
* @return a list of current selected items
*/
public List<CmsListItem> getSelectedItems() {
Iterator<String> it = CmsStringUtil.splitAsList(getParamSelItems(), CmsHtmlList.ITEM_SEPARATOR, true).iterator();
List<CmsListItem> items = new ArrayList<CmsListItem>();
while (it.hasNext()) {
String id = it.next();
items.add(getList().getItem(id));
}
return items;
}
/**
* Returns the activation flag.<p>
*
* Useful for dialogs with several lists.<p>
*
* Is <code></code> if the original <code>formname</code> parameter
* is equals to <code>${listId}-form</code>.<p>
*
* @return the activation flag
*/
public boolean isActive() {
return m_active;
}
/**
* This method re-read the rows of the list, the user should call this method after executing an action
* that add or remove rows to the list.<p>
*/
public synchronized void refreshList() {
if (getList() == null) {
return;
}
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_START_REFRESH_LIST_1, getListId()));
}
m_listState = getList().getState();
getList().clear();
fillList();
getList().setState(m_listState);
m_listState = null;
listSave();
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_END_REFRESH_LIST_1, getListId()));
}
}
/**
* Removes the list from the workplace settings.<p>
*
* Next time the list is displayed the list will be reloaded.<p>
*/
public void removeList() {
setList(null);
listSave();
}
/**
* Sets the list.<p>
*
* @param list the list to set
*/
public void setList(CmsHtmlList list) {
m_list = list;
}
/**
* Stores the given object as "list object" for the given list dialog in the current users session.<p>
*
* @param listDialog the list dialog class
* @param listObject the list to store
*/
public void setListObject(Class<?> listDialog, CmsHtmlList listObject) {
if (listObject == null) {
// null object: remove the entry from the map
getListObjectMap(getSettings()).remove(listDialog.getName());
} else {
if ((listObject.getMetadata() != null) && listObject.getMetadata().isVolatile()) {
listObject.setMetadata(null);
}
getListObjectMap(getSettings()).put(listDialog.getName(), listObject);
}
}
/**
* Sets the form name.<p>
*
* @param formName the form name to set
*/
public void setParamFormName(String formName) {
m_paramFormName = formName;
}
/**
* Sets the List Action.<p>
*
* @param listAction the list Action to set
*/
public void setParamListAction(String listAction) {
m_paramListAction = listAction;
}
/**
* Sets the current Page.<p>
*
* @param page the current Page to set
*/
public void setParamPage(String page) {
m_paramPage = page;
}
/**
* Sets the Search Filter.<p>
*
* @param searchFilter the Search Filter to set
*/
public void setParamSearchFilter(String searchFilter) {
m_paramSearchFilter = searchFilter;
}
/**
* Sets the selected Items.<p>
*
* @param paramSelItems the selected Items to set
*/
public void setParamSelItems(String paramSelItems) {
m_paramSelItems = paramSelItems;
}
/**
* Sets the sorted Column.<p>
*
* @param sortCol the sorted Column to set
*/
public void setParamSortCol(String sortCol) {
m_paramSortCol = sortCol;
}
/**
* Writes the dialog html code, only if the <code>{@link #ACTION_DEFAULT}</code> is set.<p>
*
* @throws IOException if writing to the JSP out fails, or in case of errros forwarding to the required result page
*/
public void writeDialog() throws IOException {
if (isForwarded()) {
return;
}
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_START_WRITE_LIST_1, getListId()));
}
JspWriter out = getJsp().getJspContext().getOut();
out.print(defaultActionHtml());
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_END_WRITE_LIST_1, getListId()));
}
}
/**
* Can be overwritten to add some code after the list.<p>
*
* @return custom html code
*/
protected String customHtmlEnd() {
return dialogContentEnd();
}
/**
* Can be overwritten to add some code before the list.<p>
*
* @return custom html code
*/
protected String customHtmlStart() {
return "";
}
/**
* Returns the html code for the default action content.<p>
*
* @return html code
*/
protected String defaultActionHtmlContent() {
StringBuffer result = new StringBuffer(2048);
result.append("<form name='");
result.append(getList().getId());
result.append("-form' action='");
result.append(getDialogRealUri());
result.append("' method='post' class='nomargin'");
if (getList().getMetadata().isSearchable()) {
result.append(" onsubmit=\"listSearchAction('");
result.append(getList().getId());
result.append("', '");
result.append(getList().getMetadata().getSearchAction().getId());
result.append("', '");
result.append(getList().getMetadata().getSearchAction().getConfirmationMessage().key(getLocale()));
result.append("');\"");
}
result.append(">\n");
result.append(allParamsAsHidden());
result.append("\n");
getList().setWp(this);
result.append(getList().listHtml());
result.append("\n</form>\n");
return result.toString();
}
/**
* Generates the dialog ending html code.<p>
*
* @return html code
*/
protected String defaultActionHtmlEnd() {
StringBuffer result = new StringBuffer(2048);
result.append(dialogEnd());
result.append(bodyEnd());
result.append(htmlEnd());
return result.toString();
}
/**
* Generates the dialog starting html code.<p>
*
* @return html code
*/
protected String defaultActionHtmlStart() {
StringBuffer result = new StringBuffer(2048);
result.append(htmlStart(null));
result.append(getList().listJs());
result.append(bodyStart("dialog", null));
result.append(dialogStart());
result.append(dialogContentStart(getParamTitle()));
return result.toString();
}
/**
* Filter a list, given the action is set to <code>LIST_SEARCH</code> and
* the filter text is set in the <code>PARAM_SEARCH_FILTER</code> parameter.<p>
*/
protected void executeSearch() {
getList().setSearchFilter(getParamSearchFilter());
}
/**
* Select a page, given the action is set to <code>LIST_SELECT_PAGE</code> and
* the page to go to is set in the <code>PARAM_PAGE</code> parameter.<p>
*/
protected void executeSelectPage() {
int page = Integer.valueOf(getParamPage()).intValue();
getList().setCurrentPage(page);
}
/**
* Sort the list, given the action is set to <code>LIST_SORT</code> and
* the sort column is set in the <code>PARAM_SORT_COL</code> parameter.<p>
*/
protected void executeSort() {
getList().setSortedColumn(getParamSortCol());
}
/**
* Lazy initialization for detail data.<p>
*
* Should fill the given detail column for every list item in <code>{@link CmsHtmlList#getContent()}</code>
*
* Should not throw any kind of exception.<p>
*
* @param detailId the id of the detail to initialize
*/
protected abstract void fillDetails(String detailId);
/**
* Calls the <code>{@link #getListItems}</code> method and catches any exception.<p>
*/
protected void fillList() {
try {
getList().setContent(getListItems());
// initialize detail columns
Iterator<CmsListItemDetails> itDetails = getList().getMetadata().getItemDetailDefinitions().iterator();
while (itDetails.hasNext()) {
initializeDetail(itDetails.next().getId());
}
} catch (Exception e) {
throw new CmsRuntimeException(Messages.get().container(
Messages.ERR_LIST_FILL_1,
getList().getName().key(getLocale()),
null), e);
}
}
/**
* Should generate a list with the list items to be displayed.<p>
*
* @return a list of <code>{@link CmsListItem}</code>s
*
* @throws CmsException if something goes wrong
*/
protected abstract List<CmsListItem> getListItems() throws CmsException;
/**
* Returns the current list state.<p>
*
* @return the current list state
*/
protected CmsListState getListState() {
if (m_listState != null) {
// in case of refreshList call
return m_listState;
}
return getList().getState();
}
/**
* Should generate the metadata definition for the list, and return the
* corresponding <code>{@link CmsListMetadata}</code> object.<p>
*
* @param listDialogName the name of the class generating the list
* @param listId the id of the list
*
* @return The metadata for the given list
*/
protected synchronized CmsListMetadata getMetadata(String listDialogName, String listId) {
if ((m_metadatas.get(listDialogName) == null) || m_metadatas.get(listDialogName).isVolatile()) {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_START_METADATA_LIST_1, getListId()));
}
CmsListMetadata metadata = new CmsListMetadata(listId);
setColumns(metadata);
// always check the search action
setSearchAction(metadata, m_searchColId);
setIndependentActions(metadata);
metadata.addIndependentAction(new CmsListPrintIAction());
setMultiActions(metadata);
metadata.checkIds();
m_metadatas.put(listDialogName, metadata);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_END_METADATA_LIST_1, getListId()));
}
}
return getMetadata(listDialogName);
}
/**
* Lazy details initialization.<p>
*
* @param detailId the id of the detail column
*/
protected void initializeDetail(String detailId) {
// if detail column visible or printable
CmsListItemDetails details = getList().getMetadata().getItemDetailDefinition(detailId);
if (details.isVisible() || details.isPrintable()) {
// if the list is not empty
if (getList().getTotalSize() > 0) {
// if the detail column has not been previously initialized
if (getList().getAllContent().get(0).get(detailId) == null) {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_START_DETAILS_LIST_2,
getListId(),
detailId));
}
fillDetails(detailId);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_END_DETAILS_LIST_2, getListId(), detailId));
}
}
}
}
}
/**
* @see org.opencms.workplace.CmsWorkplace#initWorkplaceRequestValues(org.opencms.workplace.CmsWorkplaceSettings, javax.servlet.http.HttpServletRequest)
*/
@Override
protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) {
super.initWorkplaceRequestValues(settings, request);
// set the action for the JSP switch
if (LIST_SEARCH.equals(getParamAction())) {
setAction(ACTION_LIST_SEARCH);
} else if (LIST_SORT.equals(getParamAction())) {
setAction(ACTION_LIST_SORT);
} else if (LIST_SELECT_PAGE.equals(getParamAction())) {
setAction(ACTION_LIST_SELECT_PAGE);
} else if (LIST_INDEPENDENT_ACTION.equals(getParamAction())) {
setAction(ACTION_LIST_INDEPENDENT_ACTION);
} else if (LIST_SINGLE_ACTION.equals(getParamAction())) {
setAction(ACTION_LIST_SINGLE_ACTION);
} else if (LIST_MULTI_ACTION.equals(getParamAction())) {
setAction(ACTION_LIST_MULTI_ACTION);
}
setParamStyle(CmsToolDialog.STYLE_NEW);
// test the needed parameters
try {
validateParamaters();
} catch (Exception e) {
// redirect to parent if parameters not available
setAction(ACTION_CANCEL);
try {
actionCloseDialog();
} catch (JspException e1) {
// noop
}
return;
}
}
/**
* Recover the last list instance that is read from the request attributes.<p>
*
* This is required for keep the whole list in memory while you browse a page.<p>
*
* @param listId the id of the expected list
*/
protected synchronized void listRecovery(String listId) {
CmsHtmlList list = getListObject(this.getClass(), getSettings());
if ((list != null) && !list.getId().equals(listId)) {
list = null;
}
setList(list);
}
/**
* Save the state of the list in the session.<p>
*/
protected synchronized void listSave() {
setListObject(this.getClass(), getList());
}
/**
* Should create the columns and add them to the given list metadata object.<p>
*
* This method will be just executed once, the first time the constructor is called.<p>
*
* @param metadata the list metadata
*/
protected abstract void setColumns(CmsListMetadata metadata);
/**
* Should add the independent actions to the given list metadata object.<p>
*
* This method will be just executed once, the first time the constructor is called.<p>
*
* @param metadata the list metadata
*/
protected abstract void setIndependentActions(CmsListMetadata metadata);
/**
* Should add the multi actions to the given list metadata object.<p>
*
* This method will be just executed once, the first time the constructor is called.<p>
*
* @param metadata the list metadata
*/
protected abstract void setMultiActions(CmsListMetadata metadata);
/**
* Creates the default search action.<p>
*
* Can be overridden for more sophisticated search.<p>
*
* @param metadata the metadata of the list to do searchable
* @param columnId the if of the column to search into
*/
protected void setSearchAction(CmsListMetadata metadata, String columnId) {
CmsListColumnDefinition col = metadata.getColumnDefinition(columnId);
if ((columnId != null) && (col != null)) {
if (metadata.getSearchAction() == null) {
// makes the list searchable
CmsListSearchAction searchAction = new CmsListSearchAction(col);
searchAction.useDefaultShowAllAction();
metadata.setSearchAction(searchAction);
}
}
}
/**
* A convenient method to throw a list unsupported
* action runtime exception.<p>
*
* Should be triggered if your list implementation does not
* support the <code>{@link #getParamListAction()}</code>
* action.<p>
*
* @throws CmsRuntimeException always to signal that this operation is not supported
*/
protected void throwListUnsupportedActionException() throws CmsRuntimeException {
throw new CmsRuntimeException(Messages.get().container(
Messages.ERR_LIST_UNSUPPORTED_ACTION_2,
getList().getName().key(getLocale()),
getParamListAction()));
}
/**
* Should be overridden for parameter validation.<p>
*
* @throws Exception if the parameters are not valid
*/
protected void validateParamaters() throws Exception {
// valid by default
}
}