You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2011/10/18 23:17:05 UTC

svn commit: r1185871 - in /openejb/trunk/patched-libraries/cxf-bundle-patched/src: ./ main/ main/java/ main/java/org/ main/java/org/apache/ main/java/org/apache/cxf/ main/java/org/apache/cxf/jaxrs/ main/java/org/apache/cxf/jaxrs/impl/ main/java/org/apa...

Author: rmannibucau
Date: Tue Oct 18 21:17:05 2011
New Revision: 1185871

URL: http://svn.apache.org/viewvc?rev=1185871&view=rev
Log:
missing files

Added:
    openejb/trunk/patched-libraries/cxf-bundle-patched/src/
    openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/
    openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/
    openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/
    openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/
    openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/cxf/
    openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/cxf/jaxrs/
    openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/cxf/jaxrs/impl/
    openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/cxf/jaxrs/impl/HttpHeadersImpl.java
    openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/openejb/
    openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/openejb/patch/
    openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/openejb/patch/PatchedMetadataMap.java

Added: openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/cxf/jaxrs/impl/HttpHeadersImpl.java
URL: http://svn.apache.org/viewvc/openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/cxf/jaxrs/impl/HttpHeadersImpl.java?rev=1185871&view=auto
==============================================================================
--- openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/cxf/jaxrs/impl/HttpHeadersImpl.java (added)
+++ openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/cxf/jaxrs/impl/HttpHeadersImpl.java Tue Oct 18 21:17:05 2011
@@ -0,0 +1,275 @@
+/**
+ * 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.cxf.jaxrs.impl;
+
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.ws.rs.core.Cookie;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.apache.cxf.jaxrs.utils.HttpUtils;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
+import org.apache.cxf.message.Message;
+import org.apache.openejb.patch.PatchedMetadataMap;
+
+public class HttpHeadersImpl implements HttpHeaders {
+
+    private static final String COOKIE_SEPARATOR_PROPERTY =
+        "org.apache.cxf.http.cookie.separator";
+    private static final String COOKIE_SEPARATOR_CRLF = "crlf";
+    private static final String DEFAULT_SEPARATOR = ",";
+    
+    private static final String COMPLEX_HEADER_EXPRESSION = 
+        "(([\\w]+=\"[^\"]*\")|([\\w]+=[\\w]+)|([\\w]+))(;(([\\w]+=\"[^\"]*\")|([\\w]+=[\\w]+)|([\\w]+)))?";
+    private static final Pattern COMPLEX_HEADER_PATTERN =
+        Pattern.compile(COMPLEX_HEADER_EXPRESSION);
+    private static final String QUOTE = "\"";
+    private static final Set<String> HEADERS_WITH_POSSIBLE_QUOTES;
+    static {
+        HEADERS_WITH_POSSIBLE_QUOTES = new HashSet<String>();
+        HEADERS_WITH_POSSIBLE_QUOTES.add(HttpHeaders.CONTENT_TYPE);
+        HEADERS_WITH_POSSIBLE_QUOTES.add(HttpHeaders.CACHE_CONTROL);
+        HEADERS_WITH_POSSIBLE_QUOTES.add(HttpHeaders.ETAG);
+        HEADERS_WITH_POSSIBLE_QUOTES.add(HttpHeaders.IF_MATCH);
+        HEADERS_WITH_POSSIBLE_QUOTES.add(HttpHeaders.IF_NONE_MATCH);
+        HEADERS_WITH_POSSIBLE_QUOTES.add(HttpHeaders.COOKIE);
+        HEADERS_WITH_POSSIBLE_QUOTES.add(HttpHeaders.SET_COOKIE);
+    }
+    
+    
+    private Message message;
+    private MultivaluedMap<String, String> headers;
+    
+    @SuppressWarnings("unchecked")
+    public HttpHeadersImpl(Message message) {
+        this.message = message;
+        this.headers = new MetadataMap<String, String>(
+            (Map<String, List<String>>)message.get(Message.PROTOCOL_HEADERS), true, true);
+    }
+    
+    public List<MediaType> getAcceptableMediaTypes() {
+        List<String> lValues = headers.get(HttpHeaders.ACCEPT);
+        if (lValues == null || lValues.isEmpty()) {
+            return Collections.emptyList();
+        }
+        List<MediaType> mediaTypes = JAXRSUtils.parseMediaTypes(lValues.get(0));
+        sortMediaTypesUsingQualityFactor(mediaTypes); 
+        return mediaTypes;
+    }
+
+    public Map<String, Cookie> getCookies() {
+        List<String> values = headers.get(HttpHeaders.COOKIE);
+        if (values == null || values.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        
+        Map<String, Cookie> cl = new HashMap<String, Cookie>();
+        for (String value : values) {
+            if (value == null) {
+                continue;
+            }
+            List<String> cs = getHeaderValues(HttpHeaders.COOKIE, value, getCookieSeparator());
+            for (String c : cs) {
+                Cookie cookie = Cookie.valueOf(c);
+                cl.put(cookie.getName(), cookie);
+            }
+        }
+        return cl;
+    }
+
+    private String getCookieSeparator() {
+        Object cookiePropValue = message.getContextualProperty(COOKIE_SEPARATOR_PROPERTY);
+        if (cookiePropValue != null) {
+            return COOKIE_SEPARATOR_CRLF.equals(cookiePropValue.toString()) 
+                ? "\r\n" : cookiePropValue.toString();
+        } else {
+            return DEFAULT_SEPARATOR;
+        }
+    }
+    
+    public Locale getLanguage() {
+        List<String> values = getListValues(HttpHeaders.CONTENT_LANGUAGE);
+        return values.size() == 0 ? null : createLocale(values.get(0).trim());
+    }
+
+    public MediaType getMediaType() {
+        List<String> values = getListValues(HttpHeaders.CONTENT_TYPE);
+        return values.size() == 0 ? null : MediaType.valueOf(values.get(0));
+    }
+
+    public MultivaluedMap<String, String> getRequestHeaders() {
+        Map<String, List<String>> newHeaders = new LinkedHashMap<String, List<String>>();
+        for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
+            newHeaders.put(entry.getKey(), getRequestHeader(entry.getKey()));
+        }
+        return new PatchedMetadataMap(newHeaders, true, true);
+    }
+
+    public List<Locale> getAcceptableLanguages() {
+        List<String> ls = getListValues(HttpHeaders.ACCEPT_LANGUAGE);
+        
+        List<Locale> newLs = new ArrayList<Locale>(); 
+        Map<Locale, Float> prefs = new HashMap<Locale, Float>();
+        for (String l : ls) {
+            String[] pair = l.split(";");
+            
+            Locale locale = createLocale(pair[0].trim());
+            
+            newLs.add(locale);
+            if (pair.length > 1) {
+                String[] pair2 = pair[1].split("=");
+                if (pair2.length > 1) {
+                    prefs.put(locale, JAXRSUtils.getMediaTypeQualityFactor(pair2[1].trim()));
+                } else {
+                    prefs.put(locale, 1F);
+                }
+            } else {
+                prefs.put(locale, 1F);
+            }
+        }
+        if (newLs.size() <= 1) {
+            return newLs;
+        }
+        
+        Collections.sort(newLs, new AcceptLanguageComparator(prefs));
+        return newLs;
+        
+    }
+
+    public List<String> getRequestHeader(String name) {
+        List<String> values = headers.get(name);
+        if (values == null || values.isEmpty() || values.get(0) == null) {
+            return Collections.emptyList();
+        }
+        if (HttpUtils.isDateRelatedHeader(name)) {
+            return values;
+        }
+        String sep = HttpHeaders.COOKIE.equalsIgnoreCase(name) ? getCookieSeparator() : DEFAULT_SEPARATOR;
+        List<String> ls = new LinkedList<String>();
+        for (String value : values) {
+            if (value == null) {
+                continue;
+            }
+            ls.addAll(getHeaderValues(name, value, sep));
+        }
+        return ls;
+    }
+
+    private List<String> getListValues(String headerName) {
+        List<String> values = headers.get(headerName);
+        if (values == null || values.isEmpty() || values.get(0) == null) {
+            return Collections.emptyList();
+        }
+        if (HttpUtils.isDateRelatedHeader(headerName)) {
+            return values;
+        }
+        return getHeaderValues(headerName, values.get(0));
+    }
+    
+    private List<String> getHeaderValues(String headerName, String originalValue) {
+        return getHeaderValues(headerName, originalValue, DEFAULT_SEPARATOR);
+    }
+    
+    private List<String> getHeaderValues(String headerName, String originalValue, String sep) {
+        if (!originalValue.contains(QUOTE)
+            || HEADERS_WITH_POSSIBLE_QUOTES.contains(headerName)) {
+            String[] ls = originalValue.split(sep);
+            if (ls.length == 1) {
+                return Collections.singletonList(ls[0].trim());
+            } else {
+                List<String> newValues = new ArrayList<String>();
+                for (String v : ls) {
+                    newValues.add(v.trim());
+                }
+                return newValues;
+            }
+        }
+        if (originalValue.startsWith("\"") && originalValue.endsWith("\"")) {
+            String actualValue = originalValue.length() == 2 ? "" 
+                : originalValue.substring(1, originalValue.length() - 1);
+            return Collections.singletonList(actualValue);
+        }
+        List<String> values = new ArrayList<String>(4);
+        Matcher m = COMPLEX_HEADER_PATTERN.matcher(originalValue);
+        while (m.find()) {
+            String val = m.group().trim();
+            if (val.length() > 0) {
+                values.add(val);
+            }
+        }
+        return values;
+    }
+    
+    private static class AcceptLanguageComparator implements Comparator<Locale> {
+        private Map<Locale, Float> prefs;
+        
+        public AcceptLanguageComparator(Map<Locale, Float> prefs) {
+            this.prefs = prefs;
+        }
+
+        public int compare(Locale lang1, Locale lang2) {
+            float p1 = prefs.get(lang1);
+            float p2 = prefs.get(lang2);
+            return Float.compare(p1, p2) * -1;
+        }
+    }
+    
+    private Locale createLocale(String value) {
+        String[] values = value.split("-");
+        if (values.length == 0 || values.length > 2) {
+            throw new IllegalArgumentException("Illegal locale value : " + value);
+        }
+        if (values.length == 1) {
+            return new Locale(values[0]);
+        } else {
+            return new Locale(values[0], values[1]);
+        }
+        
+    }
+    
+    private void sortMediaTypesUsingQualityFactor(List<MediaType> types) {
+        if (types.size() > 1) {
+            Collections.sort(types, new Comparator<MediaType>() {
+
+                public int compare(MediaType mt1, MediaType mt2) {
+                    return JAXRSUtils.compareMediaTypesQualityFactors(mt1, mt2);
+                }
+                
+            });
+        }
+    }
+    
+}

Added: openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/openejb/patch/PatchedMetadataMap.java
URL: http://svn.apache.org/viewvc/openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/openejb/patch/PatchedMetadataMap.java?rev=1185871&view=auto
==============================================================================
--- openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/openejb/patch/PatchedMetadataMap.java (added)
+++ openejb/trunk/patched-libraries/cxf-bundle-patched/src/main/java/org/apache/openejb/patch/PatchedMetadataMap.java Tue Oct 18 21:17:05 2011
@@ -0,0 +1,23 @@
+package org.apache.openejb.patch;
+
+import org.apache.cxf.jaxrs.impl.MetadataMap;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+/**
+ * @author rmannibucau
+ */
+public class PatchedMetadataMap extends MetadataMap<String, String> {
+    public PatchedMetadataMap(Map<String, List<String>> store, boolean ro, boolean ci) {
+        super(store, ro, ci);
+    }
+
+    public Set<String> keySet() {
+        Set<String> set = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
+        set.addAll(super.keySet());
+        return set;
+    }
+}