/* * 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.page.util; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import org.apache.jetspeed.om.profile.Entry; import org.apache.jetspeed.om.profile.Layout; import org.apache.jetspeed.om.profile.Portlets; import org.apache.jetspeed.om.profile.Profile; import org.apache.jetspeed.portal.Portlet; import org.apache.jetspeed.portal.security.portlets.PortletWrapper; import org.apache.jetspeed.services.PortletFactory; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.jetspeed.services.rundata.JetspeedRunData; import org.apache.turbine.util.RunData; import org.apache.velocity.context.Context; import com.aimluck.eip.modules.actions.controls.Restore; /** * ページ設定のユーティリティクラスです */ public class PageUtils { /** logger */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(PageUtils.class.getName()); public static final String PAGE_PORTLET_NAME = "Page"; public static Portlets getPortlets(RunData rundata, String portletId) { Portlets portletSet = null; Portlets portlets = ((JetspeedRunData) rundata).getProfile().getDocument().getPortlets(); if (portlets == null) { return null; } Portlets[] portletList = portlets.getPortletsArray(); if (portletList == null) { return null; } int length = portletList.length; for (int i = 0; i < length; i++) { if (portletList[i].getId().equals(portletId)) { portletSet = portletList[i]; break; } } return portletSet; } public static boolean deletePages(RunData rundata, Context context, List<String> values, List<String> msgList) { try { if (values == null || values.size() <= 0) { return false; } // 個人設定のページ ID を取得する. String portletId = rundata.getParameters().getString("js_peid"); String pageId = getPortletSetId(rundata, portletId); Portlets portlets = ((JetspeedRunData) rundata).getProfile().getDocument().getPortlets(); if (portlets == null) { return false; } new Restore().doPerform(rundata); Portlets p = null; List<Integer> deletedList = new ArrayList<Integer>(); List<String> list = new ArrayList<String>(values); int valuesLength = values.size(); int portletsLength = portlets.getPortletsCount(); for (int i = 0; i < portletsLength; i++) { for (int j = 0; j < valuesLength; j++) { p = portlets.getPortlets(i); // 個人設定とシステム管理とマイページのページは削除不可にする. if (p.getId().equals(pageId) || p.getSecurityRef().getParent().equals("admin-view") || p.getTitle().equals("マイページ")) { continue; } if (p.getId().equals(list.get(j))) { deletedList.add(Integer.valueOf(i)); break; } } } int length = deletedList.size(); Collections.sort(deletedList); for (int i = length - 1; i >= 0; i--) { portlets.removePortlets((deletedList.get(i)).intValue()); } doSave(rundata, context); updateLayoutPositions(portlets); } catch (Exception ex) { logger.error("page", ex); return false; } return true; } /** * Updates the layout position based on physical order within the resorted * portlet list. Assures that layout position is always consecutive and within * bounds. * * @param set */ public static void updateLayoutPositions(Portlets set) { if (set == null) { return; } // Load the panes into a list List<Portlets> list = new ArrayList<Portlets>(); for (int i = 0; i < set.getPortletsCount(); i++) { Portlets pane = set.getPortlets(i); list.add(pane); } // Sort list using the current layout position Collections.sort(list, new Comparator<Portlets>() { @Override public int compare(Portlets pane1, Portlets pane2) { Long pos1 = Long.valueOf(pane1.getLayout().getPosition()); Long pos2 = Long.valueOf(pane2.getLayout().getPosition()); return pos1.compareTo(pos2); } }); // Update the layout position based on the physical order within the sorted // list int position = 0; for (Iterator<Portlets> iter = list.iterator(); iter.hasNext();) { Portlets pane = iter.next(); Layout layout = pane.getLayout(); layout.setPosition(position++); } } /** Save the general informations for this set */ public static void doSave(RunData rundata, Context context) throws Exception { Profile profile = ((JetspeedRunData) rundata).getProfile(); try { String mtype = rundata.getParameters().getString("mtype"); if (mtype != null) { profile.setMediaType(mtype); } profile.store(); // PsmlManager.refresh(((JetspeedRunData) // rundata).getCustomizedProfile()); } catch (Exception ex) { logger.error("page", ex); } } /** * 指定したポートレット ID を含むページの ID を取得する. * * @param rundata * @param portletId * @return */ public static String getPortletSetId(RunData rundata, String portletId) { try { Portlets portlets = ((JetspeedRunData) rundata).getProfile().getDocument().getPortlets(); if (portlets == null) { return null; } Portlets[] portletList = portlets.getPortletsArray(); if (portletList == null) { return null; } int length = portletList.length; for (int i = 0; i < length; i++) { Entry[] entries = portletList[i].getEntriesArray(); if (entries == null || entries.length <= 0) { continue; } int ent_length = entries.length; for (int j = 0; j < ent_length; j++) { if (entries[j].getId().equals(portletId)) { return portletList[i].getId(); } } } } catch (Exception ex) { logger.error("page", ex); return null; } return null; } /** * 指定したポートレット ID を持つポートレットのオブジェクトを取得する. * * @param rundata * @param portletId * @return */ public static Portlet getPortlet(RunData rundata, String portletId) { try { Portlets portlets = ((JetspeedRunData) rundata).getProfile().getDocument().getPortlets(); if (portlets == null) { return null; } Portlets[] portletList = portlets.getPortletsArray(); if (portletList == null) { return null; } int length = portletList.length; for (int i = 0; i < length; i++) { Entry[] entries = portletList[i].getEntriesArray(); if (entries == null || entries.length <= 0) { continue; } int ent_length = entries.length; for (int j = 0; j < ent_length; j++) { if (entries[j].getId().equals(portletId)) { PortletWrapper wrapper = (PortletWrapper) PortletFactory.getPortlet(entries[j]); if (wrapper != null) { return wrapper.getPortlet(); } else { return null; } } } } } catch (Exception ex) { logger.error("page", ex); return null; } return null; } }