/*
* 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 com.addthis.hydra.data.tree.prop;
import java.util.HashMap;
import java.util.NoSuchElementException;
import com.addthis.basis.util.ClosableIterator;
import com.addthis.hydra.data.tree.TreeNodeData;
import com.addthis.hydra.data.tree.concurrent.ConcurrentTreeNode;
import com.addthis.hydra.data.tree.DataTreeNode;
/**
* phantom node created for reporting
*/
public final class VirtualTreeNode extends ConcurrentTreeNode {
public VirtualTreeNode(final String name, final long hits) {
this(name, hits, null);
}
public VirtualTreeNode(final String name, final long hits, final VirtualTreeNode[] children) {
this.name = name;
this.hits = hits;
this.nodes = children != null ? children.length : 0;
this.children = children;
}
private final VirtualTreeNode[] children;
@Override
public ClosableIterator<DataTreeNode> getNodeIterator() {
return new VirtualTreeNodeIterator();
}
@Override
public ClosableIterator<DataTreeNode> getNodeIterator(String prefix) {
VirtualTreeNodeIterator iter = new VirtualTreeNodeIterator();
while (true) {
VirtualTreeNode peek = iter.peek();
if ((peek == null) || peek.name.startsWith(prefix)) {
break;
}
iter.next();
}
return iter;
}
@Override
public ClosableIterator<DataTreeNode> getNodeIterator(String from, String to) {
VirtualTreeNodeIterator iter = new VirtualTreeNodeIterator();
iter.end = to;
while (true) {
VirtualTreeNode peek = iter.peek();
if (peek == null || (peek.name.compareTo(from) >= 0) && (to == null || peek.name.compareTo(to) <= 0)) {
break;
}
iter.next();
}
return iter;
}
@Override
public ConcurrentTreeNode getNode(String name) {
if (children == null || children.length == 0) {
return null;
}
for (VirtualTreeNode vtn : children) {
if (vtn.name.equals(name)) {
return vtn;
}
}
return null;
}
/**
* Upgrade access modifier of this operation for VirtualTreeNodes.
*/
@Override
public HashMap<String, TreeNodeData> createMap() {
return super.createMap();
}
private class VirtualTreeNodeIterator implements ClosableIterator<DataTreeNode> {
int pos;
String end;
VirtualTreeNode peek() {
return children != null && pos < children.length ? children[pos] : null;
}
@Override
public void close() {
}
@Override
public boolean hasNext() {
if (children != null && pos < children.length) {
if (end != null) {
return children[pos].name.compareTo(end) < 0;
}
return true;
}
return false;
}
@Override
public VirtualTreeNode next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return children[pos++];
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
}