📄 pageadminportlet.java
字号:
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.pluto.driver.portlets;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.pluto.driver.AttributeKeys;
import org.apache.pluto.driver.PortalDriverServlet;
import org.apache.pluto.driver.config.DriverConfiguration;
import org.apache.pluto.driver.services.portal.PageConfig;
import org.apache.pluto.driver.services.portal.PortletWindowConfig;
import org.apache.pluto.driver.services.portal.RenderConfigService;
public class PageAdminPortlet extends GenericPlutoPortlet {
private static final Log LOG = LogFactory.getLog(PageAdminPortlet.class);
private static final String JSP_DIR = "/WEB-INF/fragments/admin/page/";
private static final String VIEW_PAGE = JSP_DIR + "view.jsp";
private static final String EDIT_PAGE = JSP_DIR + "edit.jsp";
private static final String HELP_PAGE = JSP_DIR + "help.jsp";
private static final String CONFIG_FILE_PATH = "/WEB-INF/pluto-portal-driver-config.xml";
/** Token used to search for default page value in config file */
private static final String RENDER_CONFIG_SEARCH_TOKEN = "<render-config default=\"";
public void processAction(ActionRequest request, ActionResponse response) {
String command = request.getParameter("command");
try {
if("Add Portlet".equalsIgnoreCase(command)) {
doAddPortlet(request);
} else if ("Remove Portlet".equalsIgnoreCase(command)) {
doRemovePortlet(request);
} else if ("Add Page".equalsIgnoreCase(command)) {
doAddPage(request);
} else if ("Remove Page".equalsIgnoreCase(command)) {
doRemovePage(request);
}
persistPages();
} catch (IOException e) {
String msg = "Problem persisting configuration changes. Changes will not be persisted.";
LOG.error(msg, e);
//TODO: send message back to UI
}
//TODO: send 'success' message back to UI
}
public void doAddPortlet(ActionRequest request) {
String page = request.getParameter("page");
String applicationName = request.getParameter("applications");
String portletName = request.getParameter("availablePortlets");
LOG.info("Request: Add [applicationName=" + applicationName + ":portletName=" + portletName + "] to page '" + page + "'");
String contextPath = applicationName;
if (contextPath.length() > 0)
{
contextPath = "/" + contextPath;
}
PageConfig config = getPageConfig(page);
config.addPortlet(contextPath, portletName);
}
/**
* Adds a page to the portal via the <code>RenderConfigService</code>.
*
* This does not add portlets to the new page. Do that when the page is created
* using the Add Portlet button.
*
* @param request The action request.
*/
public void doAddPage(ActionRequest request) {
String page = request.getParameter("newPage");//newPage text input element
//Check if page is null or empty
if (page == null || page.equals("")) {
LOG.warn("Page parameter is null or empty. Page addition will be ignored.");
//TODO: send message back to UI
return;
}
//TODO: add page URI input to form
String uri = request.getParameter("pageURI");
if (uri == null) {
uri = PortalDriverServlet.DEFAULT_PAGE_URI;
}
DriverConfiguration driverConfig = (DriverConfiguration) getPortletContext()
.getAttribute(AttributeKeys.DRIVER_CONFIG);
PageConfig pageConfig = new PageConfig();
pageConfig.setName(page);
pageConfig.setUri(uri);
RenderConfigService renderConfig = driverConfig.getRenderConfigService();
renderConfig.addPage(pageConfig);
}
/**
* Removes a page from the portal ignoring any requests to remove the default page
* or the Pluto Admin page.
*
* The page's portlets are still available, but no longer associated with the deleted page.
*
* @param request The action request.
* @throws IOException If a problem occurs accessing the config file.
*/
public void doRemovePage(ActionRequest request) throws IOException {
String page = request.getParameter("page");
DriverConfiguration driverConfig = (DriverConfiguration) getPortletContext()
.getAttribute(AttributeKeys.DRIVER_CONFIG);
//make sure we are not deleting the default page
String defaultPage = getDefaultPage();
if (page.equalsIgnoreCase(defaultPage)) {
LOG.warn("Trying to delete the default page. Page deletion will be ignored.");
//TODO: send message back to UI
return;
}
//make sure we are not deleting the Pluto Admin page
if (page.equalsIgnoreCase("Pluto Admin")) {
LOG.warn("Trying to delete the Pluto Admin page. Page deletion will be ignored.");
return;
}
PageConfig pageConfig = getPageConfig(page);
RenderConfigService renderConfig = driverConfig.getRenderConfigService();
renderConfig.removePage(pageConfig);
}
public void doRemovePortlet(ActionRequest request) {
String page = request.getParameter("page");
String portletId = request.getParameter("placedPortlets");
LOG.info("Request: Remove [portletId=" + portletId + "] from page '" + page + "'");
PageConfig config = getPageConfig(page);
config.removePortlet(portletId);
}
private PageConfig getPageConfig(String page) {
DriverConfiguration driverConfig = (DriverConfiguration) getPortletContext()
.getAttribute(AttributeKeys.DRIVER_CONFIG);
PageConfig config = driverConfig.getPageConfig(page);
return config;
}
public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
request.setAttribute("availablePages", getAvailablePages());
super.doView(request, response);
}
public String getViewPage() {
return VIEW_PAGE;
}
public String getEditPage() {
return EDIT_PAGE;
}
public String getHelpPage(RenderRequest request) {
String incPage = HELP_PAGE;
String page = request.getParameter("helpPage");
if (page != null) {
incPage = JSP_DIR + page;
}
return incPage;
}
public Collection getAvailablePages() {
DriverConfiguration configuration =
(DriverConfiguration) getPortletContext().getAttribute(AttributeKeys.DRIVER_CONFIG);
ArrayList list = new ArrayList();
Iterator it = configuration.getPages().iterator();
while (it.hasNext()) {
PageConfig config = (PageConfig) it.next();
ArrayList portlets = new ArrayList();
Iterator pids = config.getPortletIds().iterator();
while (pids.hasNext()) {
String pid = pids.next().toString();
String name = PortletWindowConfig.parsePortletName(pid);
portlets.add(new Placement(pid, name));
}
list.add(new Page(config.getName(), config.getName(), portlets));
}
return list;
}
/**
* Persist page configuration changes to render-config section of pluto-portal-driver-config.xml.
*
* TODO: Use JAXB for config file parsing and persistence.
*
* @throws IOException
*/
private void persistPages() throws IOException {
//TODO: Null checks??? Substitute empty string or throw an Exception
final String NL = System.getProperty("line.separator");
DriverConfiguration driverConfig = (DriverConfiguration) getPortletContext()
.getAttribute(AttributeKeys.DRIVER_CONFIG);
StringBuffer renderConfig = new StringBuffer();
//start with render-config element
renderConfig.append(" ");//indent
renderConfig.append(RENDER_CONFIG_SEARCH_TOKEN);
renderConfig.append(getDefaultPage());
renderConfig.append("\">");
renderConfig.append(NL);
Collection pages = getAvailablePages();
//iterate through pages
for (Iterator iter = pages.iterator(); iter.hasNext();) {
Page page = (Page) iter.next();
PageConfig config = driverConfig.getPageConfig(page.getName());
renderConfig.append(" <page name=\"");
String pageName = config.getName();
renderConfig.append(pageName);
renderConfig.append("\" uri=\"");
String uri = config.getUri();
renderConfig.append(uri);
renderConfig.append("\">");
renderConfig.append(NL);
//iterate through portlets in current page
Collection portletIds = config.getPortletIds();
for (Iterator iterator = portletIds.iterator(); iterator.hasNext();) {
renderConfig.append(" <portlet context=\"");
String pid = (String) iterator.next();
String pletContext = PortletWindowConfig.parseContextPath(pid);
renderConfig.append(pletContext);
renderConfig.append("\" name=\"");
String pletName = PortletWindowConfig.parsePortletName(pid);
renderConfig.append(pletName);
renderConfig.append("\"/>");
renderConfig.append(NL);
}
renderConfig.append(" </page>");
renderConfig.append(NL);
}
renderConfig.append(" </render-config>");
renderConfig.append(NL);
renderConfig.append(NL);
renderConfig.append("</pluto-portal-driver>");
renderConfig.append(NL);
//create new config file content
StringBuffer newFileContents = new StringBuffer();
newFileContents.append(getContentBeforeRenderConfig(getConfigFileContents()));
newFileContents.append(renderConfig);
//persist content to new config file
FileUtils.writeStringToFile(getConfigFile(), newFileContents.toString());
}
private String getConfigFileContents() throws IOException {
return FileUtils.readFileToString(getConfigFile());
}
private File getConfigFile() {
String path = getPortletContext().getRealPath(CONFIG_FILE_PATH);
return new File(path);
}
/**
* Get the page name of the default page from pluto-portal-driver-config.xml.
*
* @return
* @throws IOException
*/
private String getDefaultPage() throws IOException {
String configFileContents = getConfigFileContents();
return parseDefaultPage(configFileContents);
}
/**
* Gets the content of the config page before the render-config element
* (also including the default attribute of render-config - see RENDER_CONFIG_SEARCH_TOKEN above).
*
* @param contents pluto-portal-driver-config.xml file contents.
* @return
*/
protected static String getContentBeforeRenderConfig(String contents) {
return contents.substring(0, contents.indexOf(RENDER_CONFIG_SEARCH_TOKEN));
}
/**
* Parse out default attribute value of render-config element in pluto-portal-driver-config.xml.
* This method is protected to allow unit testing (see <code>PageAdminPortletTest.testParseDefaultPage()</code>.)
*
* @param configFileContents Contents of pluto-portal-driver-config.xml file.
* @return The value of the default attribute in the render-config element.
*/
protected static String parseDefaultPage(String configFileContents) {
String defPage = null;
//length of token used to find default page
final int DEF_TOK_LEN = RENDER_CONFIG_SEARCH_TOKEN.length();
//index of start of default attribute value
int startInd = configFileContents.indexOf(RENDER_CONFIG_SEARCH_TOKEN) + DEF_TOK_LEN;
//rest of file after DEFAULT_TOK
String restOfConfigFile = configFileContents.substring(startInd);
//index of first quote in substring, which indicates end of default attribute value
int endInd = restOfConfigFile.indexOf('"');
defPage = configFileContents.substring(startInd, startInd + endInd);
return defPage;
}
public class Page {
private String id;
private String name;
private Collection portlets;
public Page(String pageId, String pageName, Collection portlets) {
this.id = pageId;
this.name = pageName;
this.portlets = portlets;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Collection getPortlets() {
return portlets;
}
public void setPortlets(Collection portlets) {
this.portlets = portlets;
}
}
public class Placement {
private String id;
private String portletName;
public Placement(String id, String portletName) {
this.id = id;
this.portletName = portletName;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPortletName() {
return portletName;
}
public void setPortletName(String portletName) {
this.portletName = portletName;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -