com.liferay.wsrp.service.impl.WSRPConsumerPortletLocalServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.wsrp.service.impl.WSRPConsumerPortletLocalServiceImpl.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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 Lesser General Public License for more
 * details.
 */

package com.liferay.wsrp.service.impl;

import com.liferay.counter.service.CounterLocalServiceUtil;
import com.liferay.portal.kernel.cluster.Clusterable;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.portlet.PortletBag;
import com.liferay.portal.kernel.portlet.PortletBagPool;
import com.liferay.portal.kernel.systemevent.SystemEvent;
import com.liferay.portal.kernel.transaction.Propagation;
import com.liferay.portal.kernel.transaction.Transactional;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Tuple;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
import com.liferay.portal.kernel.xml.Namespace;
import com.liferay.portal.kernel.xml.SAXReaderUtil;
import com.liferay.portal.model.Portlet;
import com.liferay.portal.model.PortletApp;
import com.liferay.portal.model.PortletInfo;
import com.liferay.portal.model.SystemEventConstants;
import com.liferay.portal.service.PortletLocalServiceUtil;
import com.liferay.portal.service.ServiceContext;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portlet.InvokerPortlet;
import com.liferay.portlet.PortletInstanceFactoryUtil;
import com.liferay.wsrp.NoSuchConsumerPortletException;
import com.liferay.wsrp.WSRPConsumerPortletHandleException;
import com.liferay.wsrp.WSRPConsumerPortletNameException;
import com.liferay.wsrp.consumer.portlet.ConsumerFriendlyURLMapper;
import com.liferay.wsrp.consumer.portlet.ConsumerPortlet;
import com.liferay.wsrp.model.WSRPConsumer;
import com.liferay.wsrp.model.WSRPConsumerPortlet;
import com.liferay.wsrp.service.ClpSerializer;
import com.liferay.wsrp.service.base.WSRPConsumerPortletLocalServiceBaseImpl;
import com.liferay.wsrp.util.ExtensionHelperUtil;
import com.liferay.wsrp.util.LocalizedStringUtil;
import com.liferay.wsrp.util.WSRPConsumerManager;
import com.liferay.wsrp.util.WSRPConsumerManagerFactory;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import javax.xml.namespace.QName;

import oasis.names.tc.wsrp.v2.types.MarkupType;
import oasis.names.tc.wsrp.v2.types.ParameterDescription;
import oasis.names.tc.wsrp.v2.types.PortletDescription;

import org.apache.axis.message.MessageElement;

/**
 * @author Brian Wing Shun Chan
 */
public class WSRPConsumerPortletLocalServiceImpl extends WSRPConsumerPortletLocalServiceBaseImpl {

    public WSRPConsumerPortlet addWSRPConsumerPortlet(long wsrpConsumerId, String name, String portletHandle,
            ServiceContext serviceContext) throws PortalException {

        WSRPConsumer wsrpConsumer = wsrpConsumerPersistence.findByPrimaryKey(wsrpConsumerId);
        Date now = new Date();

        validate(name, portletHandle);

        long wsrpConsumerPortletId = CounterLocalServiceUtil.increment();

        WSRPConsumerPortlet wsrpConsumerPortlet = wsrpConsumerPortletPersistence.create(wsrpConsumerPortletId);

        wsrpConsumerPortlet.setUuid(serviceContext.getUuid());
        wsrpConsumerPortlet.setCompanyId(wsrpConsumer.getCompanyId());
        wsrpConsumerPortlet.setCreateDate(now);
        wsrpConsumerPortlet.setModifiedDate(now);
        wsrpConsumerPortlet.setWsrpConsumerId(wsrpConsumerId);
        wsrpConsumerPortlet.setName(name);
        wsrpConsumerPortlet.setPortletHandle(portletHandle);

        wsrpConsumerPortletPersistence.update(wsrpConsumerPortlet);

        wsrpConsumerPortletLocalService.initWSRPConsumerPortlet(wsrpConsumer.getCompanyId(), wsrpConsumerId,
                wsrpConsumerPortletId, wsrpConsumerPortlet.getUuid(), name, portletHandle);

        return wsrpConsumerPortlet;
    }

    public WSRPConsumerPortlet addWSRPConsumerPortlet(String wsrpConsumerUuid, String name, String portletHandle,
            ServiceContext serviceContext) throws PortalException {

        WSRPConsumer wsrpConsumer = wsrpConsumerLocalService.getWSRPConsumer(wsrpConsumerUuid);

        return addWSRPConsumerPortlet(wsrpConsumer.getWsrpConsumerId(), name, portletHandle, serviceContext);
    }

    @Override
    public WSRPConsumerPortlet deleteWSRPConsumerPortlet(long wsrpConsumerPortletId) throws PortalException {

        WSRPConsumerPortlet wsrpConsumerPortlet = wsrpConsumerPortletPersistence
                .findByPrimaryKey(wsrpConsumerPortletId);

        return wsrpConsumerPortletLocalService.deleteWSRPConsumerPortlet(wsrpConsumerPortlet);
    }

    public void deleteWSRPConsumerPortlet(String wsrpConsumerPortletUuid) throws PortalException {

        List<WSRPConsumerPortlet> wsrpConsumerPortlets = wsrpConsumerPortletPersistence
                .findByUuid(wsrpConsumerPortletUuid);

        if (!wsrpConsumerPortlets.isEmpty()) {
            wsrpConsumerPortletLocalService.deleteWSRPConsumerPortlet(wsrpConsumerPortlets.get(0));
        }
    }

    @Override
    @SystemEvent(type = SystemEventConstants.TYPE_DELETE)
    public WSRPConsumerPortlet deleteWSRPConsumerPortlet(WSRPConsumerPortlet wsrpConsumerPortlet)
            throws PortalException {

        wsrpConsumerPortletPersistence.remove(wsrpConsumerPortlet);

        WSRPConsumer wsrpConsumer = wsrpConsumerPersistence
                .findByPrimaryKey(wsrpConsumerPortlet.getWsrpConsumerId());

        wsrpConsumerPortletLocalService.destroyWSRPConsumerPortlet(wsrpConsumerPortlet.getWsrpConsumerPortletId(),
                wsrpConsumerPortlet.getUuid(), wsrpConsumer.getUrl());

        return wsrpConsumerPortlet;
    }

    public void deleteWSRPConsumerPortlets(long wsrpConsumerId) throws PortalException {

        List<WSRPConsumerPortlet> wsrpConsumerPortlets = wsrpConsumerPortletPersistence
                .findByWsrpConsumerId(wsrpConsumerId);

        for (WSRPConsumerPortlet wsrpConsumerPortlet : wsrpConsumerPortlets) {
            wsrpConsumerPortletLocalService.deleteWSRPConsumerPortlet(wsrpConsumerPortlet);
        }
    }

    @Clusterable
    public void destroyWSRPConsumerPortlet(long wsrpConsumerPortletId, String wsrpConsumerPortletUuid, String url) {

        try {
            Portlet portlet = _portletsPool.remove(wsrpConsumerPortletUuid);

            if (portlet == null) {
                WSRPConsumerPortlet wsrpConsumerPortlet = getWSRPConsumerPortlet(wsrpConsumerPortletId);

                portlet = PortletLocalServiceUtil.getPortletById(wsrpConsumerPortlet.getCompanyId(),
                        getPortletId(wsrpConsumerPortletUuid));
            } else {
                WSRPConsumerManagerFactory.destroyWSRPConsumerManager(url);

                _failedWSRPConsumerPortlets.remove(wsrpConsumerPortletId);
            }

            PortletInstanceFactoryUtil.destroy(portlet);
        } catch (Exception e) {
            _log.error("Unable to destroy WSRP consumer portlet " + wsrpConsumerPortletId, e);
        }
    }

    public void destroyWSRPConsumerPortlets() throws PortalException {
        List<WSRPConsumerPortlet> wsrpConsumerPortlets = wsrpConsumerPortletPersistence.findAll();

        for (WSRPConsumerPortlet wsrpConsumerPortlet : wsrpConsumerPortlets) {
            WSRPConsumer wsrpConsumer = wsrpConsumerPersistence
                    .findByPrimaryKey(wsrpConsumerPortlet.getWsrpConsumerId());

            destroyWSRPConsumerPortlet(wsrpConsumerPortlet.getWsrpConsumerPortletId(),
                    wsrpConsumerPortlet.getUuid(), wsrpConsumer.getUrl());
        }
    }

    public WSRPConsumerPortlet getWSRPConsumerPortlet(long wsrpConsumerId, String portletHandle)
            throws PortalException {

        return wsrpConsumerPortletPersistence.findByW_P(wsrpConsumerId, portletHandle);
    }

    public WSRPConsumerPortlet getWSRPConsumerPortlet(String wsrpConsumerPortletUuid) throws PortalException {

        List<WSRPConsumerPortlet> wsrpConsumerPortlets = wsrpConsumerPortletPersistence
                .findByUuid(wsrpConsumerPortletUuid);

        if (wsrpConsumerPortlets.isEmpty()) {
            throw new NoSuchConsumerPortletException(
                    "No WSRP consumer portlet exists with uuid " + wsrpConsumerPortletUuid);
        }

        return wsrpConsumerPortlets.get(0);
    }

    public List<WSRPConsumerPortlet> getWSRPConsumerPortlets(long wsrpConsumerId, int start, int end) {

        return wsrpConsumerPortletPersistence.findByWsrpConsumerId(wsrpConsumerId, start, end);
    }

    public int getWSRPConsumerPortletsCount(long wsrpConsumerId) {
        return wsrpConsumerPortletPersistence.countByWsrpConsumerId(wsrpConsumerId);
    }

    @Clusterable
    @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    public void initFailedWSRPConsumerPortlets() {
        for (Map.Entry<Long, Tuple> entry : _failedWSRPConsumerPortlets.entrySet()) {

            long wsrpConsumerPortletId = entry.getKey();
            Tuple tuple = entry.getValue();

            try {
                long companyId = (Long) tuple.getObject(0);
                long wsrpConsumerId = (Long) tuple.getObject(1);
                String wsrpConsumerPortletUuid = (String) tuple.getObject(2);
                String name = (String) tuple.getObject(3);
                String portletHandle = (String) tuple.getObject(4);

                _failedWSRPConsumerPortlets.remove(wsrpConsumerPortletId);

                initWSRPConsumerPortlet(companyId, wsrpConsumerId, wsrpConsumerPortletId, wsrpConsumerPortletUuid,
                        name, portletHandle);
            } catch (Exception e) {
                _log.error("Unable to reinitialize WSRP consumer portlet " + wsrpConsumerPortletId, e);
            }
        }
    }

    @Clusterable
    @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    public void initWSRPConsumerPortlet(long companyId, long wsrpConsumerId, long wsrpConsumerPortletId,
            String wsrpConsumerPortletUuid, String name, String portletHandle) throws PortalException {

        boolean initializationFailed = false;

        try {
            Portlet portlet = getPortlet(companyId, wsrpConsumerId, wsrpConsumerPortletUuid, name, portletHandle);

            if (!portlet.isActive()) {
                initializationFailed = true;
            }

            PortletLocalServiceUtil.deployRemotePortlet(portlet, _WSRP_CATEGORY);
        } catch (PortalException pe) {
            initializationFailed = true;

            throw pe;
        } catch (SystemException se) {
            initializationFailed = true;

            throw se;
        } catch (Exception e) {
            initializationFailed = true;

            throw new SystemException(e);
        } finally {
            if (initializationFailed) {
                Tuple tuple = new Tuple(companyId, wsrpConsumerId, wsrpConsumerPortletUuid, name, portletHandle);

                _failedWSRPConsumerPortlets.put(wsrpConsumerPortletId, tuple);
            }
        }
    }

    @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    public void initWSRPConsumerPortlets() {
        for (WSRPConsumerPortlet wsrpConsumerPortlet : wsrpConsumerPortletPersistence.findAll()) {

            try {
                initWSRPConsumerPortlet(wsrpConsumerPortlet.getCompanyId(), wsrpConsumerPortlet.getWsrpConsumerId(),
                        wsrpConsumerPortlet.getWsrpConsumerPortletId(), wsrpConsumerPortlet.getUuid(),
                        wsrpConsumerPortlet.getName(), wsrpConsumerPortlet.getPortletHandle());
            } catch (Exception e) {
                _log.error("Unable to initialize WSRP consumer portlet " + wsrpConsumerPortlet.getUuid(), e);
            }
        }
    }

    public WSRPConsumerPortlet updateWSRPConsumerPortlet(long wsrpConsumerPortletId, String name)
            throws PortalException {

        validate(name);

        WSRPConsumerPortlet wsrpConsumerPortlet = wsrpConsumerPortletPersistence
                .findByPrimaryKey(wsrpConsumerPortletId);

        wsrpConsumerPortlet.setModifiedDate(new Date());
        wsrpConsumerPortlet.setName(name);

        wsrpConsumerPortletPersistence.update(wsrpConsumerPortlet);

        return wsrpConsumerPortlet;
    }

    protected void addPortletExtraInfo(Portlet portlet, PortletApp portletApp,
            PortletDescription portletDescription, String title) {

        MarkupType[] markupTypes = portletDescription.getMarkupTypes();

        for (MarkupType markupType : markupTypes) {
            Set<String> mimeTypePortletModes = new HashSet<String>();

            for (String portletMode : markupType.getModes()) {
                portletMode = StringUtil.toLowerCase(portletMode);

                if (portletMode.startsWith("wsrp:")) {
                    portletMode = portletMode.substring(5);
                }

                mimeTypePortletModes.add(portletMode);
            }

            portlet.getPortletModes().put(markupType.getMimeType(), mimeTypePortletModes);

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

            for (String windowState : markupType.getWindowStates()) {
                windowState = StringUtil.toLowerCase(windowState);

                if (windowState.startsWith("wsrp:")) {
                    windowState = windowState.substring(5);
                }

                mimeTypeWindowStates.add(windowState);
            }

            portlet.getWindowStates().put(markupType.getMimeType(), mimeTypeWindowStates);
        }

        String shortTitle = LocalizedStringUtil.getLocalizedStringValue(portletDescription.getShortTitle(), title);
        String keywords = StringUtil.merge(
                LocalizedStringUtil.getLocalizedStringValues(portletDescription.getKeywords()), StringPool.SPACE);
        String description = LocalizedStringUtil.getLocalizedStringValue(portletDescription.getShortTitle());

        PortletInfo portletInfo = new PortletInfo(title, shortTitle, keywords, description);

        portlet.setPortletInfo(portletInfo);

        portlet.setFriendlyURLMapperClass(ConsumerFriendlyURLMapper.class.getName());

        ParameterDescription[] parameterDescriptions = portletDescription.getNavigationalPublicValueDescriptions();

        if (parameterDescriptions != null) {
            for (ParameterDescription parameterDescription : parameterDescriptions) {

                QName[] qNames = parameterDescription.getNames();

                if (ArrayUtil.isEmpty(qNames)) {
                    continue;
                }

                com.liferay.portal.kernel.xml.QName qName = getQName(qNames[0]);

                String identifier = parameterDescription.getIdentifier();

                portletApp.addPublicRenderParameter(identifier, qName);

                portlet.addPublicRenderParameter(portletApp.getPublicRenderParameter(identifier));
            }
        }

        QName[] handledEvents = portletDescription.getHandledEvents();

        if (handledEvents != null) {
            for (QName handledEvent : handledEvents) {
                portlet.addProcessingEvent(getQName(handledEvent));
            }
        }

        QName[] publishedEvents = portletDescription.getPublishedEvents();

        if (publishedEvents != null) {
            for (QName publishedEvent : publishedEvents) {
                portlet.addPublishingEvent(getQName(publishedEvent));
            }
        }

        MessageElement[] messageElements = ExtensionHelperUtil
                .getMessageElements(portletDescription.getExtensions());

        if (messageElements != null) {
            for (MessageElement messageElement : messageElements) {
                setExtension(portlet, messageElement);
            }
        }
    }

    protected ConsumerPortlet getConsumerPortletInstance(Portlet portlet) throws Exception {

        if (_consumerPortletClass == null) {
            ClassLoader classLoader = getClassLoader();

            _consumerPortletClass = (Class<ConsumerPortlet>) classLoader.loadClass(portlet.getPortletClass());
        }

        return _consumerPortletClass.newInstance();
    }

    protected Portlet getPortlet(long companyId, long wsrpConsumerId, String wsrpConsumerPortletUuid, String name,
            String portletHandle) throws Exception {

        Portlet portlet = _portletsPool.get(wsrpConsumerPortletUuid);

        if ((portlet != null) && portlet.isActive()) {
            return portlet;
        }

        String portletId = getPortletId(wsrpConsumerPortletUuid);

        portlet = PortletLocalServiceUtil.clonePortlet(_CONSUMER_PORTLET_ID);

        portlet.setCompanyId(companyId);
        portlet.setPortletId(portletId);

        PortletApp portletApp = PortletLocalServiceUtil.getPortletApp(ClpSerializer.getServletContextName());

        portlet.setPortletApp(portletApp);

        portlet.setPortletName(portletId);
        portlet.setDisplayName(portletId);

        Map<String, String> initParams = portlet.getInitParams();

        initParams.put(InvokerPortlet.INIT_INVOKER_PORTLET_NAME, _CONSUMER_PORTLET_NAME);

        WSRPConsumer wsrpConsumer = wsrpConsumerPersistence.findByPrimaryKey(wsrpConsumerId);

        PortletDescription portletDescription = null;

        try {
            WSRPConsumerManager wsrpConsumerManager = WSRPConsumerManagerFactory
                    .getWSRPConsumerManager(wsrpConsumer);

            portletDescription = wsrpConsumerManager.getPortletDescription(portletHandle);
        } catch (Exception e) {
            if (_log.isWarnEnabled()) {
                _log.warn("Unable to connect to WSRP producer for portlet " + wsrpConsumerPortletUuid, e);
            }
        }

        if (portletDescription != null) {
            addPortletExtraInfo(portlet, portletApp, portletDescription, name);

            portlet.setActive(true);
        } else {
            PortletInfo portletInfo = new PortletInfo(name, name, StringPool.BLANK, StringPool.BLANK);

            portlet.setPortletInfo(portletInfo);
        }

        _portletsPool.put(wsrpConsumerPortletUuid, portlet);

        PortletBag portletBag = PortletBagPool.get(_CONSUMER_PORTLET_ID);

        portletBag = (PortletBag) portletBag.clone();

        portletBag.setPortletName(portletId);

        ConsumerPortlet consumerPortletInstance = getConsumerPortletInstance(portlet);

        portletBag.setPortletInstance(consumerPortletInstance);

        PortletBagPool.put(portletId, portletBag);

        return portlet;
    }

    protected String getPortletId(String wsrpConsumerPortletUuid) {
        String portletId = ConsumerPortlet.PORTLET_NAME_PREFIX.concat(wsrpConsumerPortletUuid);

        portletId = PortalUtil.getJsSafePortletId(PortalUUIDUtil.toJsSafeUuid(portletId));

        return portletId;
    }

    protected String getProxyURL(String url) {
        return "/proxy?url=" + HttpUtil.encodeURL(url);
    }

    protected com.liferay.portal.kernel.xml.QName getQName(QName qName) {
        String localPart = qName.getLocalPart();
        String prefix = qName.getPrefix();
        String namespaceURI = qName.getNamespaceURI();

        Namespace namespace = SAXReaderUtil.createNamespace(prefix, namespaceURI);

        return SAXReaderUtil.createQName(localPart, namespace);
    }

    protected void setExtension(Portlet portlet, MessageElement messageElement) {

        String name = ExtensionHelperUtil.getNameAttribute(messageElement);
        String value = messageElement.getValue();

        if (Validator.isNull(name)) {
            if (_log.isInfoEnabled()) {
                _log.info("Message element " + messageElement.toString() + " has a null name");
            }

            return;
        }

        if (name.equals("css-class-wrapper")) {
            portlet.setCssClassWrapper(value);
        } else if (name.equals("footer-portal-css")) {
            portlet.getFooterPortalCss().add(getProxyURL(value));
        } else if (name.equals("footer-portal-javascript")) {
            portlet.getFooterPortalJavaScript().add(getProxyURL(value));
        } else if (name.equals("footer-portlet-css")) {
            portlet.getFooterPortletCss().add(getProxyURL(value));
        } else if (name.equals("footer-portlet-javascript")) {
            portlet.getFooterPortletJavaScript().add(getProxyURL(value));
        } else if (name.equals("header-portal-css")) {
            portlet.getHeaderPortalCss().add(getProxyURL(value));
        } else if (name.equals("header-portal-javascript")) {
            portlet.getHeaderPortalJavaScript().add(getProxyURL(value));
        } else if (name.equals("header-portlet-css")) {
            portlet.getHeaderPortletCss().add(getProxyURL(value));
        } else if (name.equals("header-portlet-javascript")) {
            portlet.getHeaderPortletJavaScript().add(getProxyURL(value));
        }
    }

    protected void validate(String name) throws PortalException {
        if (Validator.isNull(name)) {
            throw new WSRPConsumerPortletNameException();
        }
    }

    protected void validate(String name, String portletHandle) throws PortalException {

        validate(name);

        if (Validator.isNull(portletHandle)) {
            throw new WSRPConsumerPortletHandleException();
        }
    }

    private static final String _CONSUMER_PORTLET_ID = "2_WAR_wsrpportlet";

    private static final String _CONSUMER_PORTLET_NAME = "2";

    private static final String _WSRP_CATEGORY = "category.wsrp";

    private static Log _log = LogFactoryUtil.getLog(WSRPConsumerPortletLocalServiceImpl.class);

    private static Map<String, Portlet> _portletsPool = new ConcurrentHashMap<String, Portlet>();

    private Class<ConsumerPortlet> _consumerPortletClass;
    private Map<Long, Tuple> _failedWSRPConsumerPortlets = new ConcurrentHashMap<Long, Tuple>();

}