Package anvil.core

Source Code of anvil.core.AnyUtils$FunctionSubstitute

/*
* $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;
      }     
    }
   
  }*/

 
}
TOP

Related Classes of anvil.core.AnyUtils$FunctionSubstitute

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.