org.openide.util.lookup.ArrayStorage Maven / Gradle / Ivy
The newest version!
/*
* 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.openide.util.lookup;
import org.openide.util.Lookup;
import java.util.*;
import java.util.logging.Level;
import org.openide.util.lookup.AbstractLookup.Pair;
/** ArrayStorage of Pairs from AbstractLookup.
* @author Jaroslav Tulach
*/
final class ArrayStorage extends Object
implements AbstractLookup.Storage {
/** list of items */
private Object content;
/** linked list of refernces to results */
private transient AbstractLookup.ReferenceToResult> results;
/** Constructor
*/
public ArrayStorage() {
this(/*default threshold*/11);
}
/** Constructs new ArrayStorage */
public ArrayStorage(Integer treshhold) {
this.content = treshhold;
}
/** Adds an item into the tree.
* @param item to add
* @return true if the Item has been added for the first time or false if some other
* item equal to this one already existed in the lookup
*/
public boolean add(AbstractLookup.Pair> item, Transaction changed) {
Object[] arr = changed.current;
if (changed.arr == null) {
// just simple add of one item
for (int i = 0; i < arr.length; i++) {
if (arr[i] == null) {
arr[i] = item;
changed.add(item);
return true;
}
if (arr[i].equals(item)) {
// reassign the item number
item.setIndex(null, ((AbstractLookup.Pair) arr[i]).getIndex());
// already there, but update it
arr[i] = item;
return false;
}
}
// cannot happen as the beginTransaction ensured we can finish
// correctly
throw new IllegalStateException(
"current objects: " + Arrays.toString(changed.current) +
"\nnew objects: " + Arrays.toString(changed.arr) +
"\ncnt: " + changed.cnt
);
} else {
// doing remainAll after that, let Transaction hold the new array
int newIndex = changed.addPair(item);
for (int i = 0; i < arr.length; i++) {
if (arr[i] == null) {
changed.add(item);
return true;
}
if (arr[i].equals(item)) {
// already there
if (i != newIndex) {
// change in index
changed.add(item);
return false;
} else {
// no change
return false;
}
}
}
// if not found in the original array
changed.add(item);
return true;
}
}
/** Removes an item.
*/
public void remove(AbstractLookup.Pair item, Transaction changed) {
Object[] arr = changed.current;
if (arr == null) {
return;
}
int found = -1;
for (int i = 0; i < arr.length;) {
if (arr[i] == null) {
// end of task
return;
}
if ((found == -1) && arr[i].equals(item)) {
// already there
Pair> p = (Pair>)arr[i];
p.setIndex(null, -1);
changed.add(p);
found = i;
}
i++;
if (found != -1) {
if (i < arr.length && !(arr[i] instanceof Integer)) {
// moving the array
arr[i - 1] = arr[i];
} else {
arr[i - 1] = null;
}
}
}
}
/** Removes all items that are not present in the provided collection.
* @param retain Pair -> AbstractLookup.Info map
* @param changed set of Classes that has possibly changed
*/
public void retainAll(Map retain, Transaction changed) {
Object[] arr = changed.current;
for (int from = 0; from < arr.length; from++) {
if (!(arr[from] instanceof AbstractLookup.Pair)) {
// end of content
break;
}
AbstractLookup.Pair p = (AbstractLookup.Pair) arr[from];
AbstractLookup.Info info = (AbstractLookup.Info) retain.get(p);
if (info == null) {
// was removed
/*
if (info != null) {
if (info.index < arr.length) {
newArr[info.index] = p;
}
if (p.getIndex() != info.index) {
p.setIndex (null, info.index);
changed.add (p);
}
} else {
// removed
*/
changed.add(p);
}
}
}
/** Queries for instances of given class.
* @param clazz the class to check
* @return enumeration of Item
* @see #unsorted
*/
public Enumeration> lookup(final Class clazz) {
if (content instanceof Object[]) {
final Enumeration
© 2015 - 2024 Weber Informatics LLC | Privacy Policy