blob: 8449639f2f3f26ac51f1dc55db12f7b9002cddb4 [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.vinci.transport.vns.service;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.StringTokenizer;
/**
* Data structure for storing/indexing/querying the set of service entries.
*/
public class ServiceTree {
Object value = null;
Hashtable children;
public ServiceTree() {
value = null;
children = new Hashtable();
}
public ServiceTree(Object o) {
value = o;
children = new Hashtable();
}
// Add the value under the specified key
public void setitem(String key, Object value) {
StringTokenizer str = new StringTokenizer(key, ".");
ServiceTree at = this;
ServiceTree temp;
String s;
while (str.hasMoreTokens()) {
if ((temp = (ServiceTree) at.children.get(s = str.nextToken())) == null) {
at.children.put(s, (at = new ServiceTree()));
} else {
at = temp;
}
}
at.value = value;
}
// Find the value for the key specified or null if not found
public Object find(String s) {
StringTokenizer str = new StringTokenizer(s, ".");
ServiceTree at = this;
while (str.countTokens() != 0) {
at = (ServiceTree) at.children.get(str.nextToken());
if (at == null) {
return null;
}
}
return at.value;
}
// Returns the all the values whose key has the specified prefix
public Object[] findprefix(String s) {
StringTokenizer str = new StringTokenizer(s, ".");
ServiceTree at = this;
while (str.countTokens() != 0) {
at = (ServiceTree) at.children.get(str.nextToken());
if (at == null)
return null;
}
ArrayList V = new ArrayList();
if (at.value != null)
V.add(at.value);
Object[] C = at.children.values().toArray();
Object[] O;
for (int i = 0; i < C.length; i++) {
O = ((ServiceTree) C[i]).findprefix("");
if (O == null)
continue;
for (int j = 0; j < O.length; j++) {
if (O[j] != null) {
V.add(O[j]);
}
}
}
return (V.size() > 0) ? V.toArray() : null;
}
public static void main(String[] args) throws Exception {
ServiceTree root = new ServiceTree();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s, k, v;
Object[] O;
while (true) {
System.out.print("Enter a command (I, F, FP) : ");
s = br.readLine();
if (s == null || s.equals(""))
break;
s = s.trim().toUpperCase();
if (!(s.equals("I") || s.equals("F") || s.equals("FP")))
continue;
System.out.print("Enter the key : ");
k = br.readLine();
if (k == null)
continue;
if (s.equals("F")) {
System.out.println("RESULT: " + root.find(k));
continue;
}
if (s.equals("FP")) {
O = root.findprefix(k);
if (O == null) {
System.out.println("No entries found");
continue;
}
for (int i = 0; i < O.length; i++)
System.out.println("[" + i + "] : " + O[i].toString());
continue;
}
if (s.equals("I")) {
System.out.print("Enter the value for " + k + " : ");
v = br.readLine();
root.setitem(k, v);
System.out.println("Done");
continue;
}
}
}
}