net.eusashead.hateoas.response.impl.AbstractResponseBuilder.java Source code

Java tutorial

Introduction

Here is the source code for net.eusashead.hateoas.response.impl.AbstractResponseBuilder.java

Source

package net.eusashead.hateoas.response.impl;

/*
 * #[license]
 * spring-responseentitybuilder
 * %%
 * Copyright (C) 2013 Eusa's Head
 * %%
 * Licensed 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.
 * %[license]
 */

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import net.eusashead.hateoas.header.Header;
import net.eusashead.hateoas.header.impl.CacheControlHeaderImpl;
import net.eusashead.hateoas.header.impl.ETagHeaderImpl;
import net.eusashead.hateoas.header.impl.ExpiresHeaderImpl;
import net.eusashead.hateoas.header.impl.LastModifiedHeaderImpl;
import net.eusashead.hateoas.response.ResponseBuilder;

import org.springframework.http.HttpHeaders;

public abstract class AbstractResponseBuilder<T> implements ResponseBuilder<T> {

    protected final HttpServletRequest request;
    protected final HttpHeaders headers;

    public AbstractResponseBuilder(HttpServletRequest request) {

        // Validate the request
        if (request == null) {
            throw new IllegalArgumentException("HttpServletRequest is null.");
        }

        // Set the request
        this.request = request;

        // Check the HTTP verb is supported
        this.assertVerb();

        // Create new headers
        this.headers = new HttpHeaders();
    }

    @Override
    public HttpServletRequest getRequest() {
        return this.request;
    }

    @Override
    public ResponseBuilder<T> addHeader(Header<?> header) {
        this.headers.add(header.getName(), header.getValue().toString());
        return this;
    }

    @Override
    public ResponseBuilder<T> addHeader(String name, String value) {
        this.headers.add(name, value);
        return this;
    }

    /**
     * All implementations must 
     * provide validation that they can 
     * handle the verb in the inbound request
     */
    protected abstract void assertVerb();

    protected void setEtagHeader(Date date) {
        // Weak ETag
        this.headers.setETag(new ETagHeaderImpl(date).toString());
    }

    protected void setEtagHeader(Integer version) {
        // Strong ETag
        this.headers.setETag(new ETagHeaderImpl(version).toString());
    }

    protected void setEtagHeader(Long version) {
        // Strong ETag
        this.headers.setETag(new ETagHeaderImpl(version).toString());
    }

    protected void setLastModifiedHeader(Date date) {
        this.headers.setLastModified(new LastModifiedHeaderImpl(date).getValue());
    }

    protected void setExpiryHeaders(long millis) {
        Date now = new Date();
        this.headers.setDate(now.getTime());
        this.headers.setExpires(new ExpiresHeaderImpl(now, millis).getValue());
        this.headers.setCacheControl(new CacheControlHeaderImpl(millis).getValue());
    }

    /**
     * Compare the supplied ETag
     * with the ETag in the
     * request
     * @param eTag
     * @return
     */
    protected boolean compareEtagWithIfNoneMatch(String eTag) {
        return checkEtag(eTag, "If-None-Match");
    }

    /**
     * Compare outgoing ETag
     * to incoming "If-None-Match"
     * header and return true
     * if they match
     * @param eTag
     * @return
     */
    private boolean checkEtag(String eTag, String header) {
        String providedTag = request.getHeader(header);
        if (providedTag == null || !eTag.equals(providedTag)) {
            return false;
        } else {
            return true;
        }
    }

}