/* * 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. */ /** * @author Stepan M. Mishura * @version $Revision$ */ package org.apache.harmony.security.asn1; import java.util.Arrays; import org.apache.harmony.security.x501.AttributeType; /** * Represents Information Object Set. * * @see <a href="http://asn1.elibel.tm.fr/en/standards/index.htm">ASN.1</a> */ public class InformationObjectSet { private final int capacity; private final Entry[][] pool; public InformationObjectSet() { this(64, 10); } public InformationObjectSet(int capacity, int size) { this.capacity = capacity; pool = new Entry[capacity][size]; } public void put(AttributeType at) { put(at.oid.getOid(), at); } public void put(int[] oid, Object object) { int index = hashIntArray(oid) % capacity; // look for OID in the pool Entry[] list = pool[index]; int i = 0; for (; list[i] != null; i++) { // check wrong static initialization: no duplicate OIDs if (Arrays.equals(oid, list[i].oid)) { throw new Error(); //FIXME message } } // check : to avoid NPE if (i == (capacity - 1)) { throw new Error(); //FIXME message } list[i] = new Entry(oid, object); } public Object get(int[] oid) { int index = hashIntArray(oid) % capacity; // look for OID in the pool Entry[] list = pool[index]; for (int i = 0; list[i] != null; i++) { if (Arrays.equals(oid, list[i].oid)) { return list[i].object; } } return null; } // FIXME change me to Arrays.hashCode(int[]) private int hashIntArray(int[] array) { int intHash = 0; for (int i = 0; i < array.length && i < 4; i++) { intHash += array[i] << (8 * i); //TODO what about to find better one? } return intHash & 0x7FFFFFFF; // only positive } private static class Entry { public int[] oid; public Object object; public Entry(int[] oid, Object object) { this.oid = oid; this.object = object; } } }