/* * Aipo is a groupware program developed by TOWN, Inc. * Copyright (C) 2004-2015 TOWN, Inc. * http://www.aipo.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.aimluck.eip.portal.controls; // Turbine stuff import java.io.Serializable; import java.util.Collection; import java.util.Comparator; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.TreeSet; import java.util.Vector; import org.apache.jetspeed.om.security.JetspeedUser; import org.apache.jetspeed.portal.PanedPortletController; import org.apache.jetspeed.portal.Portlet; import org.apache.jetspeed.portal.PortletInstance; import org.apache.jetspeed.portal.PortletSet; import org.apache.jetspeed.portal.PortletState; import org.apache.jetspeed.services.JetspeedSecurity; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.jetspeed.services.persistence.PersistenceManager; import org.apache.jetspeed.services.resources.JetspeedResources; import org.apache.jetspeed.services.rundata.JetspeedRunData; import org.apache.jetspeed.services.security.PortalResource; import org.apache.jetspeed.services.statemanager.SessionState; import org.apache.jetspeed.util.template.JetspeedLink; import org.apache.jetspeed.util.template.JetspeedLinkFactory; import org.apache.turbine.util.RunData; import org.apache.velocity.context.Context; import com.aimluck.commons.field.ALStringField; import com.aimluck.eip.common.ALEipConstants; import com.aimluck.eip.services.accessctl.ALAccessControlConstants; import com.aimluck.eip.services.orgutils.ALOrgUtilsService; import com.aimluck.eip.util.ALEipUtils; /** * A Velocity based portlet control designed for handling a PortletSet child * * @author <a href="mailto:raphael@apache.org">Rapha�l Luta</a> * */ public class ALVelocityPortletSetControl extends ALVelocityPortletControl { private static final long serialVersionUID = 1054029676869610792L; /** * Static initialization of the logger for this class */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(ALVelocityPortletSetControl.class.getName()); /** * This method adds the control specific objects to the context * * @param rundata * the RunData object for this request * @param context * the Context used by the template */ @Override public void buildContext(RunData rundata, Context context) { ALOrgUtilsService.assignCommonContext(context); if (Boolean.parseBoolean((String) rundata.getSession().getAttribute( "changeToPc"))) { // PC表示切り替え用 context.put("client", ALEipUtils.getClient(rundata)); } if (getPortlet() instanceof PortletSet) { PortletSet set = (PortletSet) getPortlet(); Collection<PortletTab> tabs = getTabs(set, rundata, context); // remove "個人設定" for (Iterator<PortletTab> i = tabs.iterator(); i.hasNext();) { PortletTab tab = i.next(); if (tab.getTitle().toString().equals("個人設定")) { i.remove(); } if (tab.getTitle().toString().equals("システム管理")) { i.remove(); } } context.put("tabs", tabs); String mypageId = ""; for (Enumeration<?> en = set.getPortlets(); en.hasMoreElements();) { Portlet p = (Portlet) en.nextElement(); if ("マイページ".equals(p.getTitle())) { mypageId = p.getID(); } } context.put("mypageId", mypageId); context.put("globalPortlets", ALEipUtils.getGlobalPortlets(rundata)); } } /** * Populate a list of tabs that should be displayed by this control. Each tab * represents a child portlet. * * This method works best if the child of this control is a PortletSet whose * controller implements the PanedPortletController interface. * * @param portlet * the base portlet to explore for children @ */ private Collection<PortletTab> getTabs(PortletSet portlets, RunData rundata, Context context) { TreeSet<PortletTab> tabs = new TreeSet<PortletTab>(new PortletTabComparator()); PanedPortletController controller = null; // if portlet is a PortletSet, try to retrieve the Controller // we need a PanedPortletController to work properly. if (portlets.getController() instanceof PanedPortletController) { controller = (PanedPortletController) portlets.getController(); } // アクセス権限 boolean hasAuthority = ALEipUtils.getHasAuthority( rundata, context, ALAccessControlConstants.VALUE_ACL_LIST); context.put(ALEipConstants.SECURE_ID, rundata.getUser().getTemp( ALEipConstants.SECURE_ID)); String portletId = portlets.getID(); if (controller != null) { String peid = rundata.getParameters().getString(controller.getPaneParameter()); if (portletId.equals(peid)) { SessionState state = ((JetspeedRunData) rundata).getPortletSessionState(portletId); state.setAttribute(JetspeedResources.PATH_PANEID_KEY, null); } } for (Enumeration<?> en = portlets.getPortlets(); en.hasMoreElements();) { Portlet p = (Portlet) en.nextElement(); PortalResource portalResource = new PortalResource(p); if (("Activity".equals(p.getName()) || "Message".equals(p.getName())) && !portlets.getController().getConfig().getName().equals( "MenuController")) { continue; } // Secure the tabs JetspeedLink jsLink = null; try { jsLink = JetspeedLinkFactory.getInstance(rundata); portalResource.setOwner(jsLink.getUserName()); JetspeedLinkFactory.putInstance(jsLink); } catch (Exception e) { logger.warn("[ALVelocityPortletSetControl]", e); portalResource.setOwner(null); } JetspeedRunData jdata = (JetspeedRunData) rundata; boolean hasView = JetspeedSecurity.checkPermission( (JetspeedUser) jdata.getUser(), portalResource, JetspeedSecurity.PERMISSION_VIEW); if (!hasView) { continue; } // skip any closed portlet if ((p instanceof PortletState) && (((PortletState) p).isClosed(rundata))) { continue; } String mstate = p.getAttribute("_menustate", "open", rundata); if (mstate.equals("closed")) { continue; } PortletTab tab = new PortletTab(); tab.setId(p.getID()); // Handle the portlet title String title = null; PortletInstance pi = PersistenceManager.getInstance(p, rundata); if (pi != null) { title = pi.getTitle(); if (title == null) { title = (p.getTitle() != null) ? p.getTitle() : p.getName(); } } tab.setTitle(title); tab.setPosition(p.getPortletConfig().getPosition()); if (tabs.contains(tab)) { PortletTab lastTab = tabs.last(); int nextPos = lastTab.getPosition() + 1; tab.setPosition(nextPos); } if (controller != null) { tab.setSelected(controller.isSelected(p, rundata)); if ("IPHONE".equals(ALEipUtils.getClient(rundata))) { tab.setLink(jsLink.getPortletById(p.getID()).addQueryData( "action", "controls.Maximize").toString()); } else { tab.setLink(controller.getPortletURI(p, rundata).toString() + "?action=controls.Restore"); } } // 修正 :最大化時とノーマル時のポートレットの表示を切り替え可能にするため, // メソッド buildActionList(RunData rundata,Portlet portlet,Context context) // を呼ぶように修正した. tab.setActions(buildActionList(rundata, p, context)); tab.setAuthority(hasAuthority); tabs.add(tab); } return tabs; } /** * Utilty class describing a Tab elemnt in the template Velocity Context */ public static class PortletTab { private String id = null; private final ALStringField title = new ALStringField(); private boolean selected = false; private String link = null; private List<PortletAction> actions = null; private int position = -1; private boolean authority = true; public String getId() { return id; } public void setId(String id) { this.id = id; } public ALStringField getTitle() { return this.title; } public void setTitle(String title) { this.title.setValue(title); } public boolean isSelected() { return this.selected; } public void setSelected(boolean selected) { this.selected = selected; } public String getLink() { return this.link; } public void setLink(String link) { this.link = link; } public List<PortletAction> getActions() { return (this.actions == null) ? new Vector<PortletAction>() : this.actions; } public void setActions(List<PortletAction> actions) { this.actions = actions; } public int getPosition() { return position; } public void setPosition(int pos) { position = pos; } public boolean getAuthority() { return authority; } public void setAuthority(boolean flg) { authority = flg; } } /** * Used to correctly order tabs based on the position value that is found each * PortletTab's parent Portlet's PortletConfig object. */ public static class PortletTabComparator implements Comparator<PortletTab>, Serializable { /** * * @param o1 * @param o2 * @return */ @Override public int compare(PortletTab o1, PortletTab o2) { try { PortletTab pt1 = o1; PortletTab pt2 = o2; int pos1 = pt1.getPosition(); int pos2 = pt2.getPosition(); if (pos1 < pos2) { return -1; } else if (pos1 > pos2) { return 1; } else { return 0; } } catch (ClassCastException e) { logger.error("ALVelocityPortletSetControl.compare", e); return 0; } } } }