/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package javax.xml.soap; import java.util.*; public class MimeHeaders { private final HashMap<String,ArrayList<MimeHeader>> _headers = new HashMap<String,ArrayList<MimeHeader>>(); public MimeHeaders() { } public void addHeader(String name, String value) { if (name == null || "".equals(name)) throw new IllegalArgumentException(); ArrayList<MimeHeader> list = _headers.get(name); if (list == null) { list = new ArrayList<MimeHeader>(); _headers.put(name, list); } list.add(new MimeHeader(name, value)); } public Iterator getAllHeaders() { return new BlacklistHeaderIterator(); } public String[] getHeader(String name) { ArrayList<MimeHeader> list = _headers.get(name); if (list == null) return new String[0]; String[] values = new String[list.size()]; for (int i = 0; i < list.size(); i++) values[i] = list.get(i).getValue(); return values; } public Iterator getMatchingHeaders(String[] names) { return new MatchingHeaderIterator(names); } public Iterator getNonMatchingHeaders(String[] names) { return new BlacklistHeaderIterator(names); } public void removeAllHeaders() { _headers.clear(); } public void removeHeader(String name) { _headers.remove(name); } public void setHeader(String name, String value) { if (name == null || "".equals(name)) throw new IllegalArgumentException(); ArrayList<MimeHeader> list = _headers.get(name); if (list == null) { list = new ArrayList<MimeHeader>(); _headers.put(name, list); } if (list.size() > 0) list.set(0, new MimeHeader(name, value)); else list.add(new MimeHeader(name, value)); } private class BlacklistHeaderIterator implements Iterator { private String[] _blackList; private Iterator<Map.Entry<String,ArrayList<MimeHeader>>> _topIterator; private Iterator<MimeHeader> _bottomIterator; public BlacklistHeaderIterator() { this(null); } public BlacklistHeaderIterator(String[] blackList) { _blackList = blackList; _topIterator = _headers.entrySet().iterator(); } private void prepareIterator() { if (_bottomIterator == null || ! _bottomIterator.hasNext()) { _bottomIterator = null; while (_topIterator.hasNext()) { Map.Entry<String,ArrayList<MimeHeader>> entry = _topIterator.next(); boolean ok = true; if (_blackList != null) { for (int i = 0; i < _blackList.length; i++) { if (entry.getKey().equals(_blackList[i])) ok = false; } } if (ok) { _bottomIterator = entry.getValue().iterator(); break; } } } } public Object next() { prepareIterator(); if (_bottomIterator == null) throw new NoSuchElementException(); return _bottomIterator.next(); } public boolean hasNext() { prepareIterator(); if (_bottomIterator == null) return false; return _bottomIterator.hasNext(); } public void remove() { throw new UnsupportedOperationException(); } } private class MatchingHeaderIterator implements Iterator { private int _name = -1; private String[] _names; private Iterator<MimeHeader> _iterator; public MatchingHeaderIterator(String[] names) { _names = names; } private void prepareIterator() { if (_iterator == null || ! _iterator.hasNext()) { _iterator = null; for (_name++; _name < _names.length; _name++) { ArrayList<MimeHeader> list = _headers.get(_names[_name]); if (list != null) { _iterator = list.iterator(); if (_iterator.hasNext()) break; _iterator = null; } } } } public Object next() { prepareIterator(); if (_iterator == null) throw new NoSuchElementException(); return _iterator.next(); } public boolean hasNext() { prepareIterator(); if (_iterator == null) return false; return _iterator.hasNext(); } public void remove() { throw new UnsupportedOperationException(); } } }