package net.eusashead.bjugquerydsl.hateoas; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.springframework.http.HttpHeaders; import org.springframework.web.util.UriTemplate; public abstract class BaseResponseEntityBuilder<T> implements ResponseEntityBuilder<T>{ public static final String LAST_MODIFIED_HEADER = "Last-Modified"; public static final String ETAG_HEADER = "Etag"; public static final String LOCATION_HEADER = "Location"; public static final String RFC2822DATE = "EEE, dd MMM yyyy HH:mm:ss Z"; protected final HttpServletRequest request; protected final HttpHeaders headers; protected final String domain; public BaseResponseEntityBuilder(HttpServletRequest request) { // Validate the request if (request == null) { throw new IllegalArgumentException("HttpServletRequest is null."); } // Set the request this.request = request; // Set the root URL this.domain = request.getScheme() + "://" + request.getServerName(); // Create new headers this.headers = new HttpHeaders(); } @Override public ResponseEntityBuilder<T> location(String path, Object...objects) { UriTemplate uriTemplate = new UriTemplate(path); this.headers.add(LOCATION_HEADER, this.domain + uriTemplate.expand(objects).toString()); return this; } @Override public ResponseEntityBuilder<T> etag(Date date) { // Weak etag this.headers.add(ETAG_HEADER, "w/" + Long.valueOf(date.getTime()).toString()); return this; } @Override public ResponseEntityBuilder<T> etag(Integer version) { // Strong etag this.headers.add(ETAG_HEADER, version.toString()); return this; } @Override public ResponseEntityBuilder<T> lastModified(Date date) { this.headers.add(LAST_MODIFIED_HEADER, new SimpleDateFormat(RFC2822DATE).format(date)); return this; } @Override public ResponseEntityBuilder<T> expireIn(long millis) { Date now = new Date(); this.headers.setExpires(millis + now.getTime()); this.headers.setCacheControl(String.format("max-age=%d", millis/1000)); return this; } }