responsebuilderimpl.java

来自「resetful样式的ws样例,一种面向资源的webservices服务」· Java 代码 · 共 286 行

JAVA
286
字号
/* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. *  * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved. *  * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License").  You * may not use this file except in compliance with the License. You can obtain * a copy of the License at https://jersey.dev.java.net/CDDL+GPL.html * or jersey/legal/LICENSE.txt.  See the License for the specific * language governing permissions and limitations under the License. *  * When distributing the software, include this License Header Notice in each * file and include the License file at jersey/legal/LICENSE.txt. * Sun designates this particular file as subject to the "Classpath" exception * as provided by Sun in the GPL Version 2 section of the License file that * accompanied this code.  If applicable, add the following below the License * Header, with the fields enclosed by brackets [] replaced by your own * identifying information: "Portions Copyrighted [year] * [name of copyright owner]" *  * Contributor(s): *  * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license."  If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above.  However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */package com.sun.jersey.impl;import com.sun.jersey.impl.util.KeyComparatorHashMap;import com.sun.jersey.impl.util.StringIgnoreCaseKeyComparator;import java.net.URI;import java.util.ArrayList;import java.util.Collections;import java.util.Date;import java.util.List;import java.util.Map;import javax.ws.rs.core.CacheControl;import javax.ws.rs.core.EntityTag;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.NewCookie;import javax.ws.rs.core.Response;import javax.ws.rs.core.Response.ResponseBuilder;import javax.ws.rs.core.Variant;/** * * @author Paul.Sandoz@Sun.Com */public final class ResponseBuilderImpl extends Response.ResponseBuilder {        static final int CACHE_CONTROL     = 0;    static final int CONTENT_LANGUAGE  = 1;    static final int CONTENT_LOCATION  = 2;    static final int CONTENT_TYPE      = 3;    static final int ETAG              = 4;    static final int LAST_MODIFIED     = 5;    static final int LOCATION          = 6;    private static final Object[] EMPTY_VALUES = new Object[0];        private static final Map<String, Integer> HEADER_MAP = createHeaderMap();                private static final String[] HEADER_ARRAY = createHeaderArray();        private static Map<String, Integer> createHeaderMap() {        Map<String, Integer> m = new KeyComparatorHashMap<String, Integer>(                StringIgnoreCaseKeyComparator.SINGLETON);                m.put("Cache-Control", CACHE_CONTROL);        m.put("Content-Language", CONTENT_LANGUAGE);        m.put("Content-Location", CONTENT_LOCATION);        m.put("Content-Type", CONTENT_TYPE);        m.put("ETag", ETAG);        m.put("Last-Modified", LAST_MODIFIED);        m.put("Location", LOCATION);                return Collections.unmodifiableMap(m);    }        private static String[] createHeaderArray() {        Map<String, Integer> m = createHeaderMap();                String[] a = new String[m.size()];        for (Map.Entry<String, Integer> e : m.entrySet()) {            a[e.getValue()] = e.getKey();        }                        return a;    }        static String getHeader(int id) {        return HEADER_ARRAY[id];    }        private int status = 204;    private Object entity;        private Object[] values;        private List<Object> nameValuePairs;    // Response.Builder        public ResponseBuilderImpl() { }            private ResponseBuilderImpl(ResponseBuilderImpl that) {        this.entity = that.entity;        this.values = that.values.clone();        if (that.nameValuePairs != null)            this.nameValuePairs = new ArrayList<Object>(that.nameValuePairs);        }        public Response build() {        Response r = new ResponseImpl(status, entity,                 (values != null) ? values : EMPTY_VALUES,                 (nameValuePairs != null) ? nameValuePairs : Collections.emptyList());        reset();        return r;    }        private void reset() {        status = 204;        entity = null;        values = null;        nameValuePairs = null;    }    @Override    public ResponseBuilder clone() {        return new ResponseBuilderImpl(this);    }        public Response.ResponseBuilder status(int status) {        this.status = status;        return this;    }    public Response.ResponseBuilder entity(Object entity) {        this.entity = entity;        return this;    }    public Response.ResponseBuilder type(MediaType type) {        set(CONTENT_TYPE, type);        return this;    }    public Response.ResponseBuilder type(String type) {        set(CONTENT_TYPE, MediaType.valueOf(type));        return this;    }    public Response.ResponseBuilder variant(Variant variant) {        type(variant.getMediaType());        // TODO set charset        language(variant.getLanguage());        if (variant.getEncoding() != null)            header("Content-Encoding", variant.getEncoding());                return this;    }        public Response.ResponseBuilder variants(List<Variant> variants) {        status(406);        if (variants.isEmpty())            return this;        MediaType accept = variants.get(0).getMediaType();        boolean vAccept = false;                String acceptLanguage = variants.get(0).getLanguage();        boolean vAcceptLanguage = false;                String acceptEncoding = variants.get(0).getEncoding();        boolean vAcceptEncoding = false;        for (Variant v : variants) {            vAccept |= !vAccept && vary(v.getMediaType(), accept);            vAcceptLanguage |= !vAcceptLanguage && vary(v.getLanguage(), acceptLanguage);            vAcceptEncoding |= !vAcceptEncoding && vary(v.getEncoding(), acceptEncoding);        }                StringBuilder vary = new StringBuilder();        append(vary, vAccept, "Accept");        append(vary, vAcceptLanguage, "Accept-Language");        append(vary, vAcceptEncoding, "Accept-Encoding");                if (vary.length() > 0)            header("Vary", vary.toString());        return this;    }            private boolean vary(MediaType v, MediaType vary) {        return v != null && !v.equals(vary);    }        private boolean vary(String v, String vary) {        return v != null && !v.equalsIgnoreCase(vary);    }        private void append(StringBuilder sb, boolean v, String s) {        if (v) {            if (sb.length() > 0)                sb.append(',');            sb.append(s);        }            }        public Response.ResponseBuilder language(String language) {        set(CONTENT_LANGUAGE, language);        return this;    }    public Response.ResponseBuilder location(URI location) {        set(LOCATION, location);        return this;    }    public Response.ResponseBuilder contentLocation(URI location) {        set(CONTENT_LOCATION, location);        return this;    }    public Response.ResponseBuilder tag(EntityTag tag) {        set(ETAG, tag);        return this;    }    public Response.ResponseBuilder tag(String tag) {        set(ETAG, new EntityTag(tag));        return this;    }    public Response.ResponseBuilder lastModified(Date lastModified) {        set(LAST_MODIFIED, lastModified);        return this;    }    public Response.ResponseBuilder cacheControl(CacheControl cacheControl) {        set(CACHE_CONTROL, cacheControl);        return this;    }    public Response.ResponseBuilder cookie(NewCookie... cookies) {        for (NewCookie cookie : cookies)            add("Set-Cookie", cookie);        return this;    }        public Response.ResponseBuilder header(String name, Object value) {        Integer id = HEADER_MAP.get(name);        if (id != null)            set(id, value);        else             add(name, value);        return this;    }        private void add(String name, Object value) {        if (nameValuePairs == null)            nameValuePairs = new ArrayList<Object>();        nameValuePairs.add(name);        nameValuePairs.add(value);    }        private void set(int id, Object value) {        if (values == null)            values = new Object[HEADER_MAP.size()];                values[id] = value;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?