Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   *
   * Copyright (c) 1997-2010 Oracle and/or its affiliates. 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://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
  * or packager/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 packager/legal/LICENSE.txt.
  *
  * GPL Classpath Exception:
  * Oracle designates this particular file as subject to the "Classpath"
  * exception as provided by Oracle in the GPL Version 2 section of the License
  * file that accompanied this code.
  *
  * Modifications:
  * If applicable, add the following below the License Header, with the fields
  * enclosed by brackets [] replaced by your own identifying information:
  * "Portions Copyright [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.
  *
  *
  * This file incorporates work covered by the following copyright and
  * permission notice:
  *
  * Copyright 2004 The Apache Software Foundation
  *
  * 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.
  */
 
 package org.apache.tomcat.util.collections;
 
 import java.io.*;
 import java.util.*;
 import java.text.*;
 
 // Originally MimeHeaders
 
An efficient representation for certain type of map. The keys can have a single or multi values, but most of the time there are single values. The data is of "MessageBytes" type, meaning bytes[] that can be converted to Strings ( if needed, and encoding is lazy-binded ). This is a base class for MimeHeaders, Parameters and Cookies. Data structures: each field is a single-valued key/value. The fields are allocated when needed, and are recycled. The current implementation does linear search, in future we'll also use the hashkey.

Author(s):
dac@eng.sun.com
James Todd [gonzo@eng.sun.com]
Costin Manolache
 
 public class MultiMap {
 
     protected Field[] fields;
     // fields in use
     protected int count;

    
 
     public MultiMap(int initial_size) {
 	=new Field[initial_size];
     }

    
Clears all header fields.
    public void recycle() {
	for (int i = 0; i < i++) {
	    [i].recycle();
	}
	 = 0;
    }
    // -------------------- Idx access to headers ----------
    // This allows external iterators.
    
    
Returns the current number of header fields.
    public int size() {
	return ;
    }

    
Returns the Nth header name This may be used to iterate through all header fields. An exception is thrown if the index is not valid ( <0 or >size )
    public MessageBytes getName(int n) {
	// n >= 0 && n < count ? headers[n].getName() : null
	return [n].;
    }

    
Returns the Nth header value This may be used to iterate through all header fields.
    public MessageBytes getValue(int n) {
	return [n].;
    }

    
Find the index of a field with the given name.
    public int findString nameint starting ) {
	// We can use a hash - but it's not clear how much
	// benefit you can get - there is an  overhead 
	// and the number of headers is small (4-5 ?)
	// Another problem is that we'll pay the overhead
	// of constructing the hashtable
	// A custom search tree may be better
        for (int i = startingi < i++) {
	    if ([i]..equals(name)) {
                return i;
            }
        }
        return -1;
    }

    
Find the index of a field with the given name.
    public int findIgnoreCaseString nameint starting ) {
	// We can use a hash - but it's not clear how much
	// benefit you can get - there is an  overhead 
	// and the number of headers is small (4-5 ?)
	// Another problem is that we'll pay the overhead
	// of constructing the hashtable
	// A custom search tree may be better
        for (int i = startingi < i++) {
	    if ([i]..equalsIgnoreCase(name)) {
                return i;
            }
        }
        return -1;
    }

    
Removes the field at the specified position. MultiMap will preserve the order of field add unless remove() is called. This is not thread-safe, and will invalidate all iterators. This is not a frequent operation for Headers and Parameters - there are better ways ( like adding a "isValid" field )
    public void removeint i ) {
	// reset and swap with last header
	Field mh = [i];
	// reset the field
	mh.recycle();
	[i] = [ - 1];
	[ - 1] = mh;
    }

    
Create a new, unitialized entry.
    public int addField() {
	int len = .;
	int pos=;
	if ( >= len) {
	    // expand header list array
	    Field tmp[] = new Field[pos * 2];
	    System.arraycopy(, 0, tmp, 0, len);
	     = tmp;
	}
	if ([pos] == null) {
	    [pos] = new Field();
	}
	return pos;
    }
    public MessageBytes getString name) {
        for (int i = 0; i < i++) {
	    if ([i]..equals(name)) {
		return [i].;
	    }
	}
        return null;
    }
    public int findFirstString name ) {
        for (int i = 0; i < i++) {
	    if ([i]..equals(name)) {
		return i;
	    }
	}
        return -1;
    }
    public int findNextint startPos ) {
	int next[startPos].;
	ifnext != . ) {
	    return next;
	}
	// next==NEED_NEXT, we never searched for this header
	MessageBytes name=[startPos].;
        for (int i = startPosi < i++) {
	    if ([i]..equals(name)) {
		// cache the search result
		[startPos].=i;
		return i;
	    }
	}
        return -1;
    }
    // workaround for JDK1.1.8/solaris
    static final int NEED_NEXT=-2;
    static final int LAST=-1;
    // -------------------- Internal representation --------------------
    final class Field {
	// Extra info for speed
	//  multiple fields with same name - a linked list will
	// speed up multiple name enumerations and search.
	int nextPos;
	Field() {
	}
	void recycle() {
	    .recycle();
	    .recycle();
	}
    }
New to GrepCode? Check out our FAQ X