Package org.apache.jetspeed.portlets.clone

Source Code of org.apache.jetspeed.portlets.clone.PortletCloneManagerPortlet

/*
* 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.jetspeed.portlets.clone;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletConfig;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.jetspeed.CommonPortletServices;
import org.apache.jetspeed.components.portletpreferences.PortletPreferencesProvider;
import org.apache.jetspeed.components.portletregistry.PortletRegistry;
import org.apache.jetspeed.om.portlet.DisplayName;
import org.apache.jetspeed.om.portlet.PortletDefinition;
import org.apache.jetspeed.om.portlet.Preference;
import org.apache.jetspeed.om.portlet.Preferences;
import org.apache.jetspeed.request.RequestContext;
import org.apache.portals.bridges.common.GenericServletPortlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Portlet Clone Manager Portlet
*
* @version $Id$
*/
public class PortletCloneManagerPortlet extends GenericServletPortlet
{
    private static Logger log = LoggerFactory.getLogger(PortletCloneManagerPortlet.class);
   
    private PortletRegistry registry;
    private PortletPreferencesProvider prefProvider;
   
    @Override
    public void init(PortletConfig config) throws PortletException
    {
        super.init(config);
        registry = (PortletRegistry) config.getPortletContext().getAttribute(CommonPortletServices.CPS_REGISTRY_COMPONENT);
        prefProvider = (PortletPreferencesProvider) config.getPortletContext().getAttribute(CommonPortletServices.CPS_PORTLET_PREFERENCES_PROVIDER);

    }
   
    @Override
    public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException
    {
        RequestContext rc = (RequestContext) request.getAttribute(RequestContext.REQUEST_PORTALENV);
        String portletUniqueName = rc.getRequestParameter("portlet");
       
        if (portletUniqueName == null)
        {
            portletUniqueName = (String) request.getPortletSession(true).getAttribute("originalPortletUniqueName");
        }
       
        PortletDefinition def = null;
       
        if (!StringUtils.isBlank(portletUniqueName))
        {
            request.getPortletSession(true).setAttribute("originalPortletUniqueName", portletUniqueName);
            def = registry.getPortletDefinitionByUniqueName(portletUniqueName);
        }
       
        if (def == null)
        {
            log.error("Cannot find the portlet or clone: {}", portletUniqueName);
        }
        else
        {
            ClonePortletInfo clonePortletInfo = new ClonePortletInfo();
            clonePortletInfo.setOriginalPortletUniqueName(portletUniqueName);
            clonePortletInfo.setPortletName(def.getPortletName());
            clonePortletInfo.setPortletDisplayName(def.getDisplayNameText(Locale.getDefault()));
            clonePortletInfo.setPortletTitle(def.getPortletInfo().getTitle());
            clonePortletInfo.setPortletShortTitle(def.getPortletInfo().getShortTitle());
            clonePortletInfo.setPortletKeywords(def.getPortletInfo().getKeywords());
            Map<String, List<String>> prefsMap = new HashMap<String, List<String>>();
           
            for (Preference pref : def.getPortletPreferences().getPortletPreferences())
            {
                String prefName = pref.getName();
                List<String> prefValues = new ArrayList<String>(pref.getValues());
                prefsMap.put(prefName, prefValues);
            }
           
            clonePortletInfo.setPortletPreferences(prefsMap);
            request.setAttribute("clonePortletInfo", clonePortletInfo);
        }
       
        super.doView(request, response);
    }
   
    @Override
    public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException
    {
        String status = "fail";
        ClonePortletInfo clonePortletInfo = readClonePortletInfoFromRequest(request);
        PortletDefinition def = registry.getPortletDefinitionByUniqueName(clonePortletInfo.getOriginalPortletUniqueName());
       
        try
        {
            if (def == null)
            {
                throw new IllegalArgumentException("Cannot find the portlet or clone: " + clonePortletInfo.getOriginalPortletUniqueName());
            }
           
            if (StringUtils.isBlank(clonePortletInfo.getPortletName()))
            {
                throw new IllegalArgumentException("Invalid clone name: " + clonePortletInfo.getPortletName());
            }

            PortletDefinition clone = registry.clonePortletDefinition(def, StringUtils.trim(clonePortletInfo.getPortletName()));
            clone.getPortletInfo().setTitle(StringUtils.defaultString(clonePortletInfo.getPortletTitle()));
            clone.getPortletInfo().setShortTitle(StringUtils.defaultString(clonePortletInfo.getPortletShortTitle()));
            clone.getPortletInfo().setKeywords(StringUtils.defaultString(clonePortletInfo.getPortletKeywords()));
           
            Locale defaultLocale = Locale.getDefault();
            DisplayName defaultDisplayName = null;
           
            for (DisplayName displayName : clone.getDisplayNames())
            {
                if (displayName.getLocale().equals(defaultLocale))
                {
                    defaultDisplayName = displayName;
                    break;
                }
            }
           
            if (defaultDisplayName == null)
            {
                defaultDisplayName = clone.addDisplayName(defaultLocale.toString());
            }
           
            defaultDisplayName.setDisplayName(StringUtils.defaultString(clonePortletInfo.getPortletDisplayName()));
           
            for (Map.Entry<String, List<String>> entry : clonePortletInfo.getPortletPreferences().entrySet())
            {
                String prefName = entry.getKey();
                List<String> prefValues = entry.getValue();
                Preferences prefs = clone.getPortletPreferences();
                Preference pref = prefs.getPortletPreference(prefName);
               
                if (pref == null)
                {
                    pref = prefs.addPreference(prefName);
                }
               
                List<String> values = pref.getValues();
                values.clear();
                values.addAll(prefValues);
               
                prefProvider.storeDefaults(clone, pref);
            }
           
            registry.savePortletDefinition(clone);
            status = "success";
        }
        catch (Exception e)
        {
            request.getPortletSession(true).setAttribute("errorMessage", e.toString());
            log.error("Failed to clone portlet from " + clonePortletInfo.getOriginalPortletUniqueName() + " to " + clonePortletInfo.getPortletName(), e);
        }
       
        request.getPortletSession(true).setAttribute("status", status);
    }
   
    private ClonePortletInfo readClonePortletInfoFromRequest(ActionRequest request)
    {
        ClonePortletInfo clonePortletInfo = new ClonePortletInfo();
        clonePortletInfo.setOriginalPortletUniqueName(request.getParameter("originalPortletUniqueName"));
        clonePortletInfo.setPortletName(request.getParameter("portlet_name"));
        clonePortletInfo.setPortletDisplayName(request.getParameter("portlet_displayName"));
        clonePortletInfo.setPortletTitle(request.getParameter("portlet_title"));
        clonePortletInfo.setPortletShortTitle(request.getParameter("portlet_shortTitle"));
        clonePortletInfo.setPortletKeywords(request.getParameter("portlet_keywords"));
       
        Map<String, List<String>> prefsMap = new HashMap<String, List<String>>();
       
        for (Enumeration<String> paramNames = request.getParameterNames(); paramNames.hasMoreElements(); )
        {
            String paramName = paramNames.nextElement();
           
            if (paramName.startsWith("prefs_"))
            {
                String prefName = paramName.substring("prefs_".length());
                String [] prefValues = request.getParameterValues(paramName);
                List<String> prefValueList = null;
                if (prefValues == null)
                {
                    prefValueList = Collections.emptyList();
                }
                else
                {
                    prefValueList = Arrays.asList(prefValues);
                }
                prefsMap.put(prefName, prefValueList);
            }
        }
       
        clonePortletInfo.setPortletPreferences(prefsMap);
       
        return clonePortletInfo;
    }
   
}
TOP

Related Classes of org.apache.jetspeed.portlets.clone.PortletCloneManagerPortlet

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.