/******************************************************************************* * ***** BEGIN LICENSE BLOCK Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for * the specific language governing rights and limitations under the License. * * The Original Code is the OpenCustomer CRM. * * The Initial Developer of the Original Code is Thomas Bader (Bader & Jene * Software-Ingenieurb�ro). Portions created by the Initial Developer are * Copyright (C) 2005 the Initial Developer. All Rights Reserved. * * Contributor(s): Thomas Bader <thomas.bader@bader-jene.de> * * ***** END LICENSE BLOCK ***** */ package org.opencustomer.framework.webapp.panel; import java.io.Serializable; import java.util.ArrayList; import java.util.Enumeration; import java.util.Hashtable; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.log4j.Logger; import org.opencustomer.db.EntityAccessUtility; import org.opencustomer.db.vo.system.UserVO; import org.opencustomer.framework.db.vo.BaseVO; import org.opencustomer.framework.db.vo.EntityAccess; import org.opencustomer.webapp.auth.AuthenticatorUtility; import org.opencustomer.webapp.auth.Right; public final class EditPanel extends EntityPanel implements Serializable { private static final long serialVersionUID = -7714593175899323240L; private static final Logger log = Logger.getLogger(EditPanel.class); private List<Page> pages = new ArrayList<Page>(); private boolean editable = true; private Right editRight; private Page activePage; private Hashtable<Action.Type, Action> actions = new Hashtable<Action.Type, Action>(); public final static String TITLE_DELETE = "title_delete"; public EditPanel(Right editRight, BaseVO entity) { super(Type.EDIT); this.editRight = editRight; setEntity(entity); if(entity != null) setName("Panel: "+entity.getClass().getSimpleName()+" "+entity.getId()); else setName("Panel: no entity"); } public Right getEditRight() { return editRight; } public static boolean checkEditable(HttpServletRequest request) { return checkEditable(request, (EditPanel)Panel.getPanelStack(request).peek()); } public static boolean checkEditable(HttpServletRequest request, EditPanel panel) { EntityAccess entityAccess = null; if(panel.getEntity() instanceof EntityAccess) { entityAccess = (EntityAccess)panel.getEntity(); } return checkEditable(request, panel, entityAccess); } public static boolean checkEditable(HttpServletRequest request, EditPanel panel, EntityAccess entityAccess) { UserVO user = (UserVO)request.getSession().getAttribute(org.opencustomer.webapp.Globals.USER_KEY); return checkEditable(request, panel, entityAccess, user); } public static boolean checkEditable(HttpServletRequest request, EditPanel panel, EntityAccess entityAccess, UserVO user) { if(log.isDebugEnabled()) log.debug("test for user "+user); boolean editable = false; if(panel.getEditRight() == null || AuthenticatorUtility.getInstance().authenticate(request, panel.getEditRight())) { editable = true; if(log.isDebugEnabled()) log.debug("access valid for panel controlled by right: "+panel.getEditRight()); } if(entityAccess != null) { if(log.isDebugEnabled()) log.debug("test access for panel via entity access"); if(!EntityAccessUtility.isAccessGranted(user, entityAccess, EntityAccess.Access.WRITE)) { editable = false; if(log.isDebugEnabled()) log.debug("access not valid for panel controlled by entity access: "+panel.getEntity()); } } return editable; } public final boolean isEditable() { return editable; } public final void setEditable(boolean editable) { this.editable = editable; } public List<Page> getPages() { return pages; } public void addPage(String name, String action, String key) { addPage(name, action, key, true); } public void addPage(String name, String action, String key, boolean selectable) { addPage(name, action, key, selectable, null); } public void addPage(String name, String action, String key, boolean selectable, Boolean editable) { Page page = new Page(name, action, key, selectable, editable); this.pages.add(page); if(activePage == null && page.isSelectable()) activatePage(page); } public boolean activatePage(Page page) { boolean changed = false; if(page != null && (activePage == null || !activePage.equals(page)) && page.isSelectable()) { activePage = page; setPath(activePage.getAction()); changed = true; } return changed; } public Page findPage(HttpServletRequest request) { Page page = null; if(!pages.isEmpty()) { String panelName = null; Enumeration params = request.getParameterNames(); while(params.hasMoreElements()) { String name = (String)params.nextElement(); if(name.startsWith("doPage_")) { panelName = name.substring(7); break; } } page = findPage(panelName); } return page; } public Page findPage(String name) { Page page = null; for(Page testPage : pages) { if(testPage.getName().equals(name)) { page = testPage; break; } } return page; } public Page getActivePage() { if(this.activePage == null) { if(pages.isEmpty()) return null; else return pages.get(0); } else return activePage; } public void addAction(Action.Type actionType, String action, boolean selectable) { actions.put(actionType, new Action(action, selectable)); } public Action getAction(Action.Type actionType) { return actions.get(actionType); } public void addAction(Action.Type actionType, String action) { addAction(actionType, action, true); } @Override public String toString() { ToStringBuilder builder = new ToStringBuilder(this); builder.append("entity", getEntity()); builder.append("editRight", editRight); return builder.toString(); } }