org.apache.jetspeed.portlets.custom.CustomConfigModePortlet.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.jetspeed.portlets.custom.CustomConfigModePortlet.java

Source

/*
 * 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.custom;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletConfig;
import javax.portlet.PortletContext;
import javax.portlet.PortletException;
import javax.portlet.PortletMode;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.WindowState;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.jetspeed.CommonPortletServices;
import org.apache.jetspeed.PortalReservedParameters;
import org.apache.jetspeed.layout.PageLayoutComponent;
import org.apache.jetspeed.om.common.SecurityConstraint;
import org.apache.jetspeed.om.common.SecurityConstraints;
import org.apache.jetspeed.om.page.ContentFragment;
import org.apache.jetspeed.om.page.ContentPage;
import org.apache.jetspeed.page.PageManager;
import org.apache.jetspeed.request.RequestContext;
import org.apache.portals.bridges.velocity.GenericVelocityPortlet;

/**
 * Common Custom Config Mode Portlet
 * 
 * @version $Id$
 */
public class CustomConfigModePortlet extends GenericVelocityPortlet {
    private static final PortletMode CONFIG_MODE = new PortletMode("config");
    private static final String DELIMITERS = "[],; \t\r\n";

    private PageManager pageManager;
    private PageLayoutComponent pageLayoutComponent;
    private String configPage;

    @Override
    public void init(PortletConfig config) throws PortletException {
        super.init(config);

        configPage = config.getInitParameter("ConfigPage");

        PortletContext context = getPortletContext();

        pageManager = (PageManager) context.getAttribute(CommonPortletServices.CPS_PAGE_MANAGER_COMPONENT);

        if (pageManager == null) {
            throw new PortletException("Could not get instance of pageManager component");
        }

        pageLayoutComponent = (PageLayoutComponent) context
                .getAttribute(CommonPortletServices.CPS_PAGE_LAYOUT_COMPONENT);

        if (pageLayoutComponent == null) {
            throw new PortletException("Could not get instance of pageLayoutComponent");
        }
    }

    @Override
    protected void doDispatch(RenderRequest request, RenderResponse response) throws PortletException, IOException {
        if (!request.getWindowState().equals(WindowState.MINIMIZED)) {
            PortletMode curMode = request.getPortletMode();

            if (CONFIG_MODE.equals(curMode)) {
                ContentFragment curFragment = (ContentFragment) request
                        .getAttribute(PortalReservedParameters.FRAGMENT_ATTRIBUTE);

                if (curFragment == null) {
                    throw new PortletException("Cannot retrieve current fragment from the request.");
                }

                List securityContraintRefList = null;

                try {
                    securityContraintRefList = this.pageManager.getPageSecurity().getSecurityConstraintsDefs();
                } catch (Exception e) {
                    throw new PortletException("Cannot find page security constraint definitions.", e);
                }

                if (securityContraintRefList != null) {
                    request.setAttribute("securityContraintRefList", securityContraintRefList);
                }

                request.setAttribute("fragmentId", curFragment.getId());
                request.setAttribute("securityConstraints",
                        new TransientSecurityConstraints(curFragment.getSecurityConstraints()));

                request.setAttribute(PARAM_EDIT_PAGE, this.configPage);

                doEdit(request, response);
            } else {
                super.doDispatch(request, response);
            }
        }
    }

    @Override
    public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException {
        String action = request.getParameter("action");

        if ("addConstraint".equals(action)) {
            addSecurityConstraint(request, response);
        } else if ("removeConstraint".equals(action)) {
            removeSecurityConstraint(request, response);
        } else if ("updateConstraintRefs".equals(action)) {
            updateSecurityConstraintRefs(request, response);
        }
    }

    @Override
    protected String getTitle(RenderRequest request) {
        String title = null;

        try {
            ContentFragment curFragment = (ContentFragment) request
                    .getAttribute(PortalReservedParameters.FRAGMENT_ATTRIBUTE);
            title = curFragment.getPortletContent().getTitle();
        } catch (Exception ignore) {
        }

        if (title != null) {
            return title;
        }

        return super.getTitle(request);
    }

    private void addSecurityConstraint(ActionRequest request, ActionResponse response)
            throws PortletException, IOException {
        try {
            RequestContext requestContext = (RequestContext) request.getAttribute(RequestContext.REQUEST_PORTALENV);
            ContentPage page = requestContext.getPage();
            String fragmentId = request.getParameter("fragment");

            ContentFragment fragment = page.getFragmentById(fragmentId);

            if (fragment == null) {
                throw new PortletException("Cannot find fragment: " + fragmentId);
            }

            SecurityConstraints constraints = new TransientSecurityConstraints(fragment.getSecurityConstraints());
            SecurityConstraint constraint = new TransientSecurityConstraint(fragment.newSecurityConstraint());
            String[] rolesArray = StringUtils.split(request.getParameter("roles"), DELIMITERS);
            String[] groupsArray = StringUtils.split(request.getParameter("groups"), DELIMITERS);
            String[] usersArray = StringUtils.split(request.getParameter("users"), DELIMITERS);

            if (!ArrayUtils.isEmpty(rolesArray)) {
                constraint.setRoles(Arrays.asList(rolesArray));
            }

            if (!ArrayUtils.isEmpty(groupsArray)) {
                constraint.setGroups(Arrays.asList(groupsArray));
            }

            if (!ArrayUtils.isEmpty(usersArray)) {
                constraint.setUsers(Arrays.asList(usersArray));
            }

            String[] permissionArray = StringUtils
                    .split(StringUtils.defaultString(request.getParameter("permissions")), DELIMITERS);

            if (!ArrayUtils.isEmpty(permissionArray)) {
                constraint.setPermissions(Arrays.asList(permissionArray));
            }

            List<SecurityConstraint> constraintList = constraints.getSecurityConstraints();

            if (constraintList == null) {
                constraintList = new ArrayList<SecurityConstraint>();
            }

            constraintList.add(constraint);
            constraints.setSecurityConstraints(constraintList);

            pageLayoutComponent.updateSecurityConstraints(fragment, constraints);
        } catch (Exception e) {
            throw new PortletException("Failed to add security constraint.", e);
        }
    }

    private void removeSecurityConstraint(ActionRequest request, ActionResponse response)
            throws PortletException, IOException {
        try {
            RequestContext requestContext = (RequestContext) request.getAttribute(RequestContext.REQUEST_PORTALENV);
            ContentPage page = requestContext.getPage();
            String fragmentId = request.getParameter("fragment");

            ContentFragment fragment = page.getFragmentById(fragmentId);

            if (fragment == null) {
                throw new PortletException("Cannot find fragment: " + fragmentId);
            }

            String roles = request.getParameter("roles");
            String groups = request.getParameter("groups");
            String users = request.getParameter("users");
            String permissions = request.getParameter("permissions");

            SecurityConstraints constraints = new TransientSecurityConstraints(fragment.getSecurityConstraints());

            List<SecurityConstraint> constraintList = null;

            if (constraints != null) {
                constraintList = constraints.getSecurityConstraints();

                if (constraintList != null) {
                    for (Iterator it = constraintList.iterator(); it.hasNext();) {
                        SecurityConstraint constraint = (SecurityConstraint) it.next();

                        String[] removeRoleArray = StringUtils.split(roles, DELIMITERS);
                        String[] removeGroupArray = StringUtils.split(groups, DELIMITERS);
                        String[] removeUserArray = StringUtils.split(users, DELIMITERS);

                        List<String> roleList = constraint.getRoles();
                        List<String> groupList = constraint.getGroups();
                        List<String> userList = constraint.getUsers();

                        if (hasEqualItems(removeRoleArray, roleList) && hasEqualItems(removeGroupArray, groupList)
                                && hasEqualItems(removeUserArray, userList)) {
                            it.remove();
                            break;
                        }
                    }
                }
            }

            if (constraints != null && constraintList != null) {
                constraints.setSecurityConstraints(constraintList);
            }

            pageLayoutComponent.updateSecurityConstraints(fragment, constraints);
        } catch (Exception e) {
            throw new PortletException("Failed to remove security constraint.", e);
        }
    }

    private void updateSecurityConstraintRefs(ActionRequest request, ActionResponse response)
            throws PortletException, IOException {
        try {
            RequestContext requestContext = (RequestContext) request.getAttribute(RequestContext.REQUEST_PORTALENV);
            ContentPage page = requestContext.getPage();
            String fragmentId = request.getParameter("fragment");

            ContentFragment fragment = page.getFragmentById(fragmentId);

            if (fragment == null) {
                throw new PortletException("Cannot find fragment: " + fragmentId);
            }

            String[] securityConstraintRefs = request.getParameterValues("securityConstraintRef");

            SecurityConstraints constraints = new TransientSecurityConstraints(fragment.getSecurityConstraints());

            Set<String> constraintRefSet = new HashSet<String>();

            if (securityConstraintRefs != null) {
                for (int i = 0; i < securityConstraintRefs.length; i++) {
                    if (!"".equals(securityConstraintRefs[i])) {
                        constraintRefSet.add(securityConstraintRefs[i]);
                    }
                }
            }

            constraints.setSecurityConstraintsRefs(
                    constraintRefSet.isEmpty() ? null : new ArrayList<String>(constraintRefSet));

            pageLayoutComponent.updateSecurityConstraints(fragment, constraints);
        } catch (Exception e) {
            throw new PortletException("Failed to remove security constraint.", e);
        }
    }

    private boolean hasEqualItems(String[] array, List<String> list) {
        if (ArrayUtils.isEmpty(array)) {
            return (list == null || list.isEmpty());
        } else if (list == null) {
            return ArrayUtils.isEmpty(array);
        } else if (ArrayUtils.getLength(array) == list.size()) {
            for (String item : array) {
                if (!list.contains(item)) {
                    return false;
                }
            }

            return true;
        }

        return false;
    }

    private class TransientSecurityConstraints implements SecurityConstraints {
        private String owner;
        private List<SecurityConstraint> securityConstraints;
        private List<String> securityConstraintsRefs;

        public TransientSecurityConstraints(SecurityConstraints sourceSecurityConstraints) {
            if (sourceSecurityConstraints != null) {
                this.owner = sourceSecurityConstraints.getOwner();

                List<SecurityConstraint> sourceConstraintList = sourceSecurityConstraints.getSecurityConstraints();

                if (sourceConstraintList != null) {
                    this.securityConstraints = new ArrayList<SecurityConstraint>();

                    for (SecurityConstraint constraint : sourceConstraintList) {
                        this.securityConstraints.add(new TransientSecurityConstraint(constraint));
                    }
                }

                List<String> constraintsRefs = sourceSecurityConstraints.getSecurityConstraintsRefs();

                if (constraintsRefs != null) {
                    securityConstraintsRefs = new ArrayList<String>(constraintsRefs);
                }
            }
        }

        public String getOwner() {
            return owner;
        }

        public List getSecurityConstraints() {
            return securityConstraints;
        }

        public List getSecurityConstraintsRefs() {
            return securityConstraintsRefs;
        }

        public boolean isEmpty() {
            return (this.securityConstraints == null || this.securityConstraints.isEmpty())
                    && (this.securityConstraintsRefs == null || this.securityConstraintsRefs.isEmpty());
        }

        public void setOwner(String owner) {
            this.owner = owner;
        }

        public void setSecurityConstraints(List constraints) {
            this.securityConstraints = constraints;
        }

        public void setSecurityConstraintsRefs(List constraintsRefs) {
            this.securityConstraintsRefs = constraintsRefs;
        }
    }

    private class TransientSecurityConstraint implements SecurityConstraint {
        private List<String> roles;
        private List<String> groups;
        private List<String> users;
        private List<String> permissions;

        public TransientSecurityConstraint(SecurityConstraint sourceSecurityConstraint) {
            if (sourceSecurityConstraint.getRoles() != null) {
                this.roles = new ArrayList<String>(sourceSecurityConstraint.getRoles());
            }

            if (sourceSecurityConstraint.getGroups() != null) {
                this.groups = new ArrayList<String>(sourceSecurityConstraint.getGroups());
            }

            if (sourceSecurityConstraint.getUsers() != null) {
                this.users = new ArrayList<String>(sourceSecurityConstraint.getUsers());
            }

            if (sourceSecurityConstraint.getPermissions() != null) {
                this.permissions = new ArrayList<String>(sourceSecurityConstraint.getPermissions());
            }
        }

        public List getGroups() {
            return groups;
        }

        public List getPermissions() {
            return permissions;
        }

        public List getRoles() {
            return roles;
        }

        public List getUsers() {
            return users;
        }

        public void setGroups(List groups) {
            this.groups = groups;
        }

        public void setPermissions(List permissions) {
            this.permissions = permissions;
        }

        public void setRoles(List roles) {
            this.roles = roles;
        }

        public void setUsers(List users) {
            this.users = users;
        }
    }

}