/* * 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.chemistry.opencmis.server.support.wrapper; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.chemistry.opencmis.commons.enums.BindingType; import org.apache.chemistry.opencmis.commons.impl.DateTimeHelper; import org.apache.chemistry.opencmis.commons.server.CallContext; import org.apache.chemistry.opencmis.commons.server.CmisService; /** * This abstract service wrapper is intended for manipulating and replacing * server responses. */ public abstract class AbstractBindingCmisServiceWrapper extends AbstractCmisServiceWrapper { private Progress beforeCall = Progress.CONTINUE; private Progress afterCall = Progress.CONTINUE; public AbstractBindingCmisServiceWrapper(CmisService service) { super(service); } @Override public Progress beforeServiceCall() { return beforeCall; } @Override public Progress afterServiceCall() { return afterCall; } /** * Sets whether the server framework should continue before the service is * called. * * @param progress * {@link Progress#CONTINUE} if the server framework should * continue, {@link Progress#STOP} if the server framework should * stop */ public void setBeforeServiceCall(Progress progress) { beforeCall = progress; } /** * Sets whether the server framework should continue after the service is * called. * * @param progress * {@link Progress#CONTINUE} if the server framework should * continue, {@link Progress#STOP} if the server framework should * stop */ public void setAfterServiceCall(Progress progress) { afterCall = progress; } /** * Returns the binding type. * * @return the binding type */ public BindingType getBindingType() { String binding = getCallContext().getBinding(); if (CallContext.BINDING_ATOMPUB.equals(binding)) { return BindingType.ATOMPUB; } else if (CallContext.BINDING_BROWSER.equals(binding)) { return BindingType.BROWSER; } else if (CallContext.BINDING_WEBSERVICES.equals(binding)) { return BindingType.WEBSERVICES; } else if (CallContext.BINDING_LOCAL.equals(binding)) { return BindingType.LOCAL; } else { return BindingType.CUSTOM; } } /** * Returns the {@link HttpServletRequest} object. * * @return the {@link HttpServletRequest} object or {@code null} if the * binding is a non-HTTP binding */ public HttpServletRequest getHttpServletRequest() { return (HttpServletRequest) getCallContext().get(CallContext.HTTP_SERVLET_REQUEST); } /** * Returns the {@link HttpServletResponse} object. * * @return the {@link HttpServletResponse} object or {@code null} if the * binding is a non-HTTP binding */ public HttpServletResponse getHttpServletResponse() { return (HttpServletResponse) getCallContext().get(CallContext.HTTP_SERVLET_RESPONSE); } /** * Gets a request header value as String. * * @param name * the header name * @return the header value or {@code null} if the header isn't set or if * the binding is a non-HTTP binding */ public String getRequestHeader(String name) { HttpServletRequest req = getHttpServletRequest(); if (req == null) { return null; } return req.getHeader(name); } /** * Gets a request header value as Date. * * @param name * the header name * @return the header value or {@code null} if the header isn't set or if * the binding is a non-HTTP binding or if the date cannot be parsed */ public Date getDateRequestHeader(String name) { return DateTimeHelper.parseHttpDateTime(getRequestHeader(name)); } /** * Sets a String response header. * * If the binding is a non-HTTP binding, this method does nothing. * * @param name * the header name * @param value * the header value */ public void setResponseHeader(String name, String value) { HttpServletResponse resp = getHttpServletResponse(); if (resp != null) { resp.setHeader(name, value); } } /** * Sets a Date response header. * * If the binding is a non-HTTP binding, this method does nothing. * * @param name * the header name * @param value * the header value */ public void setResponseHeader(String name, Date value) { HttpServletResponse resp = getHttpServletResponse(); if (resp != null) { resp.setHeader(name, DateTimeHelper.formatHttpDateTime(value)); } } /** * Compares the provided date with the "If-Modified-Since" HTTP header (if * present) and returns whether the resource has been modified or not. * * @param date * date to compare the "If-Modified-Since" HTTP header to * * @return {@code true} if the "If-Modified-Since" HTTP header is set and , * {@code false} otherwise */ public boolean isNotModified(Date date) { if (date == null) { return false; } Date modifiedSince = getDateRequestHeader("If-Modified-Since"); if (modifiedSince == null) { return false; } long dateSecs = (long) Math.floor((double) date.getTime() / 1000); long modifiedSinceSecs = (long) Math.floor((double) modifiedSince.getTime() / 1000); return dateSecs > modifiedSinceSecs; } }