/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* 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 the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>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.apereo.portal.portlet.container;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.pluto.container.PortletContainer;
import org.apache.pluto.container.PortletResponseContext;
import org.apache.pluto.container.ResourceURLProvider;
import org.apereo.portal.portlet.container.properties.IRequestPropertiesManager;
import org.apereo.portal.portlet.container.services.IPortletCookieService;
import org.apereo.portal.portlet.om.IPortletWindow;
import org.apereo.portal.portlet.om.IPortletWindowId;
import org.apereo.portal.url.ResourceUrlProviderImpl;
import org.springframework.util.Assert;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
*/
public class PortletResponseContextImpl extends AbstractPortletContextImpl
implements PortletResponseContext {
private boolean closed = false;
private boolean released = false;
protected final IRequestPropertiesManager requestPropertiesManager;
public PortletResponseContextImpl(
PortletContainer portletContainer,
IPortletWindow portletWindow,
HttpServletRequest containerRequest,
HttpServletResponse containerResponse,
IRequestPropertiesManager requestPropertiesManager,
IPortletCookieService portletCookieService) {
super(
portletContainer,
portletWindow,
containerRequest,
containerResponse,
portletCookieService);
Assert.notNull(requestPropertiesManager, "requestPropertiesManager can not be null");
this.requestPropertiesManager = requestPropertiesManager;
}
@Override
public void addProperty(Cookie cookie) {
final IPortletWindowId portletWindowId = this.portletWindow.getPortletWindowId();
this.portletCookieService.addCookie(this.servletRequest, portletWindowId, cookie);
}
@Override
public final void addProperty(String key, Element element) {
//uPortal doesn't support XML properties
}
@Override
public final void addProperty(String key, String value) {
managerAddProperty(key, value);
}
@Override
public final void setProperty(String key, String value) {
managerSetProperty(key, value);
}
protected boolean managerSetProperty(String key, String value) {
return this.requestPropertiesManager.setResponseProperty(
this.servletRequest, this.portletWindow, key, value);
}
protected boolean managerAddProperty(String key, String value) {
return this.requestPropertiesManager.addResponseProperty(
this.servletRequest, this.portletWindow, key, value);
}
@Override
public Element createElement(String tagName) throws DOMException {
// TODO this is terribly inefficient
final DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
final DocumentBuilder docBuilder;
try {
docBuilder = dbfac.newDocumentBuilder();
final Document doc = docBuilder.newDocument();
return doc.createElement(tagName);
} catch (ParserConfigurationException e) {
throw new DOMException((short) 0, "Initialization failure");
}
}
@Override
public ResourceURLProvider getResourceURLProvider() {
return new ResourceUrlProviderImpl(portletWindow, containerRequest);
}
@Override
public void close() {
this.closed = true;
}
@Override
public void release() {
this.closed = true;
this.released = true;
this.servletRequest = null;
this.servletResponse = null;
}
/**
* Check if the status of the response, if the context has been closed or released an {@link
* IllegalStateException} is thrown.
*/
protected void checkContextStatus() {
if (this.closed || this.released) {
throw new IllegalStateException(this.getClass().getSimpleName() + " has been closed");
}
}
public boolean isClosed() {
return this.closed;
}
public boolean isReleased() {
return this.released;
}
}