/**
* 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.portlet;
import com.liferay.portal.kernel.model.PortletApp;
import com.liferay.portal.kernel.util.InstanceFactory;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.portlet.PortletContext;
import javax.portlet.PortletException;
import javax.portlet.UnavailableException;
import javax.portlet.filter.FilterConfig;
import javax.portlet.filter.PortletFilter;
/**
* @author Brian Wing Shun Chan
*/
public class PortletFilterFactory {
public static PortletFilter create(
com.liferay.portal.kernel.model.PortletFilter portletFilterModel,
PortletContext ctx)
throws PortletException {
return _instance._create(portletFilterModel, ctx);
}
public static void destroy(
com.liferay.portal.kernel.model.PortletFilter portletFilterModel) {
_instance._destroy(portletFilterModel);
}
private PortletFilterFactory() {
_portletFilters = new ConcurrentHashMap<>();
}
private PortletFilter _create(
com.liferay.portal.kernel.model.PortletFilter portletFilterModel,
PortletContext portletContext)
throws PortletException {
PortletApp portletApp = portletFilterModel.getPortletApp();
Map<String, PortletFilter> portletFilters = _portletFilters.get(
portletApp.getServletContextName());
if (portletFilters == null) {
portletFilters = new ConcurrentHashMap<>();
_portletFilters.put(
portletApp.getServletContextName(), portletFilters);
}
PortletFilter portletFilter = portletFilters.get(
portletFilterModel.getFilterName());
if (portletFilter != null) {
return portletFilter;
}
FilterConfig filterConfig = FilterConfigFactory.create(
portletFilterModel, portletContext);
if (portletApp.isWARFile()) {
PortletContextBag portletContextBag = PortletContextBagPool.get(
portletApp.getServletContextName());
Map<String, PortletFilter> curPortletFilters =
portletContextBag.getPortletFilters();
portletFilter = curPortletFilters.get(
portletFilterModel.getFilterName());
portletFilter = _init(
portletFilterModel, filterConfig, portletFilter);
}
else {
portletFilter = _init(portletFilterModel, filterConfig);
}
portletFilters.put(portletFilterModel.getFilterName(), portletFilter);
return portletFilter;
}
private void _destroy(
com.liferay.portal.kernel.model.PortletFilter portletFilterModel) {
PortletApp portletApp = portletFilterModel.getPortletApp();
Map<String, PortletFilter> portletFilters = _portletFilters.get(
portletApp.getServletContextName());
if (portletFilters == null) {
return;
}
PortletFilter portletFilter = portletFilters.get(
portletFilterModel.getFilterName());
if (portletFilter == null) {
return;
}
portletFilter.destroy();
portletFilters.remove(portletFilterModel.getFilterName());
FilterConfigFactory.destroy(portletFilterModel);
}
private PortletFilter _init(
com.liferay.portal.kernel.model.PortletFilter portletFilterModel,
FilterConfig filterConfig)
throws PortletException {
return _init(portletFilterModel, filterConfig, null);
}
private PortletFilter _init(
com.liferay.portal.kernel.model.PortletFilter portletFilterModel,
FilterConfig filterConfig, PortletFilter portletFilter)
throws PortletException {
try {
if (portletFilter == null) {
portletFilter = (PortletFilter)InstanceFactory.newInstance(
portletFilterModel.getFilterClass());
}
portletFilter.init(filterConfig);
}
catch (PortletException pe) {
throw pe;
}
catch (Exception e) {
throw new UnavailableException(e.getMessage());
}
return portletFilter;
}
private static final PortletFilterFactory _instance =
new PortletFilterFactory();
private final Map<String, Map<String, PortletFilter>> _portletFilters;
}