blob: 661736c46ec528b3a2503672d2934bc90246abd0 [file] [log] [blame]
/*
* 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.wicket;
import java.util.Arrays;
/**
* Manages the component queue.
*
* @author igor
*/
class ComponentQueue
{
private static final int INITIAL = 8;
private static final int ADDITIONAL = 8;
private Component[] queue;
private int queueSize = 0;
private boolean dirty = false;
private String[] seen;
private int seenSize = 0;
void add(Component... components)
{
// TODO queueing this can be a more efficient implementation since we know the size of the
// array
for (Component component : components)
{
add(component);
}
}
void add(Component component)
{
if (component == null)
{
throw new IllegalArgumentException("component cannot be null");
}
if (seen != null)
{
for (int i = 0; i < seenSize; i++)
{
if (seen[i].equals(component.getId()))
{
throw new WicketRuntimeException("A component with id: " + component.getId()
+ " has already been queued");
}
}
}
if (dirty)
{
if (queueSize == 0)
{
queue = null;
}
else
{
Component[] replacement = new Component[queueSize + ADDITIONAL];
int pos = 0;
for (int i = 0; i < queue.length; i++)
{
if (queue[i] != null)
{
replacement[pos++] = queue[i];
}
}
queue = replacement;
}
}
if (queue == null)
{
queue = new Component[INITIAL];
}
else if (queue.length == queueSize)
{
queue = Arrays.copyOf(queue, queue.length + ADDITIONAL);
}
queue[queueSize] = component;
queueSize++;
if (seen == null)
{
seen = new String[INITIAL];
}
else if (seenSize == seen.length)
{
seen = Arrays.copyOf(seen, seen.length + ADDITIONAL);
}
seen[seenSize] = component.getId();
seenSize++;
}
Component remove(String id)
{
int seen = 0;
for (int i = 0; i < queue.length && seen < queueSize; i++)
{
Component component = queue[i];
if (component != null)
{
seen++;
if (component.getId().equals(id))
{
queue[i] = null;
dirty = true;
queueSize--;
return component;
}
}
}
return null;
}
public boolean isEmpty()
{
return queueSize == 0;
}
public Component get(String id)
{
for (Component component : queue)
{
if (component != null && component.getId().equals(id))
{
return component;
}
}
return null;
}
@Override
public String toString()
{
return "ComponentQueue{" +
"queueSize=" + queueSize +
", queue=" + Arrays.toString(queue) +
'}';
}
}