/*
* $Id: AnyUtils.java,v 1.21 2002/09/16 08:05:02 jkl Exp $
*
* Copyright (c) 2002 Njet Communications Ltd. All Rights Reserved.
*
* Use is subject to license terms, as defined in
* Anvil Sofware License, Version 1.1. See LICENSE
* file, or http://njet.org/license-1.1.txt
*/
package anvil.core;
import anvil.script.Context;
import anvil.script.Function;
import anvil.script.ScriptException;
import anvil.java.util.BindingEnumeration;
import anvil.core.arrays.AnyStringArray;
import anvil.server.Zone;
import java.util.Comparator;
import java.util.Iterator;
/*import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;*/
import java.lang.reflect.Method;
import org.apache.oro.text.regex.MatchResult;
import org.apache.oro.text.regex.Pattern;
import org.apache.oro.text.regex.PatternMatcher;
import org.apache.oro.text.regex.PatternMatcherInput;
import org.apache.oro.text.regex.Substitution;
import org.apache.oro.text.regex.Perl5Matcher;
import org.apache.oro.text.regex.Perl5Substitution;
/**
* class AnyComparators
*
* @author: Jani Lehtim�ki
*/
public class AnyUtils
{
public static Comparator COMPARE_BY_VALUE = new ValueComparator();
public static Comparator COMPARE_BY_KEY = new KeyComparator();
public static final String[] toStringArray(Any parameter)
{
if (parameter == null || parameter.isNull()) {
return null;
}
if (parameter.isString()) {
return new String[]{ parameter.toString() };
}
if (parameter instanceof AnyStringArray) {
return ((AnyStringArray)parameter).toStringArray();
}
BindingEnumeration enum = parameter.enumeration();
int n = parameter.sizeOf();
String[] array = new String[n];
int i = 0;
while(i<n && enum.hasMoreElements()) {
array[i++] = enum.nextElement().toString();
}
if (i<n) {
String[] newarray = new String[i];
System.arraycopy(array, 0, newarray, 0, i);
array = newarray;
}
return array;
}
public static class ValueComparator implements Comparator {
public int compare(Object o1, Object o2)
{
Any a = (Any)((Array.Entry)o1).value;
Any b = (Any)((Array.Entry)o2).value;
return a.compareTo(b);
}
}
public static class KeyComparator implements Comparator {
public int compare(Object o1, Object o2)
{
Any a = (Any)((Array.Entry)o1).key;
Any b = (Any)((Array.Entry)o2).key;
return a.compareTo(b);
}
}
public static class ArrayComparator implements Comparator {
private Context _context;
private Any _callable;
private Any[] _parameters = new Any[5];
public ArrayComparator(Context context, Any callable, Any data)
{
_context = context;
_callable = callable;
_parameters[4] = data;
}
public int compare(Object o1, Object o2)
{
Array.Entry a = (Array.Entry)o1;
Array.Entry b = (Array.Entry)o2;
Any[] p = _parameters;
p[0] = Any.create(a.key);
p[1] = Any.create(a.value);
p[2] = Any.create(b.key);
p[3] = Any.create(b.value);
return _callable.execute(_context, p).toInt();
}
}
public static class EnumerationComparator implements Comparator {
private Context _context;
private Any _callable;
private Any _data;
public EnumerationComparator(Context context, Any callable, Any data)
{
_context = context;
_callable = callable;
_data = data;
}
public int compare(Object o1, Object o2)
{
return _callable.execute(_context, Any.create(o1), Any.create(o2), _data).toInt();
}
}
public static class SequenceComparator implements Comparator
{
private Context _context;
private Any _callable;
private Any _data;
public SequenceComparator(Context context, Any callable, Any data)
{
_context = context;
_callable = callable;
_data = data;
}
public int compare(Object o1, Object o2)
{
return _callable.execute(_context, Any.create(o1), Any.create(o2), _data).toInt();
}
}
public static class FunctionSubstitute implements Substitution
{
private Context _context;
private Any _callable;
public FunctionSubstitute(Context context, Any callable)
{
_context = context;
_callable = callable;
}
public void appendSubstitution(java.lang.StringBuffer buffer,
MatchResult match, int substitutionCount, java.lang.String originalInput,
PatternMatcher matcher, Pattern pattern)
{
int n = match.groups();
Any[] parents = new Any[n];
for(int i=0; i<n; i++) {
parents[i] = Any.create(match.group(i));
}
buffer.append(_callable.execute(_context, new AnyList(parents)).toString());
}
}
public static class StringPatternMatcher implements BindingEnumeration
{
private Perl5Matcher _matcher = new Perl5Matcher();
private Pattern _pattern;
private PatternMatcherInput _input;
private int _index = 0;
public StringPatternMatcher(Pattern pattern, String string)
{
_pattern = pattern;
_input = new PatternMatcherInput(string);
}
public boolean hasMoreElements()
{
return _matcher.contains(_input, _pattern);
}
public Object nextKey()
{
return Any.create(_index);
}
public Object nextElement()
{
MatchResult match = _matcher.getMatch();
int n = match.groups();
Any[] list = new Any[n];
for(int i=0; i<n; i++) {
list[i] = Any.create(match.group(i));
}
return new AnyList(list);
}
}
public static final class SelectEnumeration implements BindingEnumeration
{
private Context _context;
private Any _selector;
private BindingEnumeration _enum;
private int _index = 0;
private Any _next = null;
private Any _data;
public SelectEnumeration(Context context, Any selector, BindingEnumeration enum, Any data)
{
_context = context;
_selector = selector;
_enum = enum;
_data = data;
}
private Any getNext()
{
if (_next == null) {
while(_enum.hasMoreElements()) {
Any key = Any.create(_enum.nextKey());
Any value = Any.create(_enum.nextElement());
if (_selector.execute(_context, value, key, _data).toBoolean()) {
_next = value;
break;
}
}
}
return _next;
}
public boolean hasMoreElements()
{
return getNext() != null;
}
public Object nextKey()
{
return Any.create(_index);
}
public Object nextElement()
{
Any next = getNext();
if (next != null) {
_index++;
_next = null;
return next;
} else {
return Any.UNDEFINED;
}
}
}
public static final class PipeEnumeration implements BindingEnumeration
{
private Context _context;
private Any _pipe;
private BindingEnumeration _enum;
private int _index = 0;
private Any _data;
public PipeEnumeration(Context context, Any pipe, BindingEnumeration enum, Any data)
{
_context = context;
_pipe = pipe;
_enum = enum;
_data = data;
}
public boolean hasMoreElements()
{
return _enum.hasMoreElements();
}
public Object nextKey()
{
return Any.create(_index);
}
public Object nextElement()
{
if (_enum.hasMoreElements()) {
_index++;
Any key = Any.create(_enum.nextKey());
Any value = Any.create(_enum.nextElement());
return _pipe.execute(_context, value, key, _data);
} else {
return Any.UNDEFINED;
}
}
}
public static class IteratorToEnumeration implements BindingEnumeration
{
protected Iterator _iterator;
protected int _index = 0;
public IteratorToEnumeration(Iterator iter)
{
_iterator = iter;
}
public boolean hasMoreElements()
{
return _iterator.hasNext();
}
public Object nextKey()
{
return Any.create(_index);
}
public Object nextElement()
{
_index++;
return _iterator.next();
}
}
/*public static class FunctionInvocationHandler implements InvocationHandler
{
protected Zone _zone;
protected Any _handler;
public FunctionInvocationHandler(Zone zone, Any handler)
{
_zone = zone;
_handler = handler;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
try {
Any[] params;
if (args == null) {
params = new Any[] { Any.create(method.getName()) };
} else {
int n = args.length;
params = new Any[n+1];
params[0] = Any.create(method.getName());
for(int i=0; i<n; i++) {
params[i+1] = Any.create(args[i]);
}
}
return _handler.execute(Context.getInstance(_zone), params).toObject();
} catch (ScriptException e) {
System.out.println(e.getData());
_zone.log().error(e);
e.fillInStackTrace();
throw e;
}
}
}*/
}