File: Relation.java

package info (click to toggle)
lib-xt-java 0.19990725-1
  • links: PTS
  • area: main
  • in suites: potato
  • size: 1,224 kB
  • ctags: 2,133
  • sloc: java: 9,665; makefile: 54; xml: 28
file content (117 lines) | stat: -rw-r--r-- 3,349 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package com.jclark.xsl.expr;

import com.jclark.xsl.om.*;

abstract class Relation {
  abstract boolean relate(String s1, String s2);
  abstract boolean relate(boolean b1, boolean b2);
  abstract boolean relate(double d1, double d2);
  
  boolean relate(NodeIterator iter1, NodeIterator iter2) throws XSLException {
    if (!(iter2 instanceof CloneableNodeIterator))
      iter2 = new CloneableNodeIteratorImpl(iter2);
    for (;;) {
      Node node1 = iter1.next();
      if (node1 == null)
	break;
      String s1 = Converter.toString(node1);
      NodeIterator tem = (NodeIterator)((CloneableNodeIterator)iter2).clone();
      for (;;) {
	Node node2 = tem.next();
	if (node2 == null)
	  break;
	if (relate(s1, Converter.toString(node2)))
	  return true;
      }
    }
    return false;
  }

  boolean relate(NodeIterator iter, boolean b) throws XSLException {
    return relate(iter.next() != null, b);
  }

  boolean relate(NodeIterator iter, double d) throws XSLException {
    for (;;) {
      Node node = iter.next();
      if (node == null)
	break;
      if (relate(Converter.toNumber(Converter.toString(node)), d))
	return true;
    }
    return false;
  }

  boolean relate(NodeIterator iter, String s) throws XSLException {
    for (;;) {
      Node node = iter.next();
      if (node == null)
	break;
      if (relate(Converter.toString(node), s))
	return true;
    }
    return false;
  }

  boolean relate(boolean b, NodeIterator iter) throws XSLException {
    return relate(b, iter.next() != null);
  }

  boolean relate(double d, NodeIterator iter) throws XSLException {
    for (;;) {
      Node node = iter.next();
      if (node == null)
	break;
      if (relate(d, Converter.toNumber(Converter.toString(node))))
	return true;
    }
    return false;
  }

  boolean relate(String s, NodeIterator iter) throws XSLException {
    for (;;) {
      Node node = iter.next();
      if (node == null)
	break;
      if (relate(s, Converter.toString(node)))
	return true;
    }
    return false;
  }

  boolean relate(Variant obj1, Variant obj2) throws XSLException {
    if (obj1.isNodeSet()) {
      if (obj2.isNodeSet())
	return relate(obj1.convertToNodeSet(),
		      obj2.convertToNodeSet());
      if (obj2.isNumber())
	return relate(obj1.convertToNodeSet(),
		      obj2.convertToNumber());
      if (obj2.isBoolean())
	return relate(obj1.convertToNodeSet(),
		      obj2.convertToBoolean());
      return relate(obj1.convertToNodeSet(),
		    obj2.convertToString());
    }
    if (obj2.isNodeSet()) {
      if (obj1.isNumber())
	return relate(obj1.convertToNumber(),
		      obj2.convertToNodeSet());
		      
      if (obj1.isBoolean())
	return relate(obj1.convertToBoolean(),
		      obj2.convertToNodeSet());
      return relate(obj1.convertToString(),
		    obj2.convertToNodeSet());
    }
    return relateAtomic(obj1, obj2);
  }

  boolean relateAtomic(Variant obj1, Variant obj2) throws XSLException {
    if (obj1.isBoolean() || obj2.isBoolean())
      return relate(obj1.convertToBoolean(), obj2.convertToBoolean());
    if (obj1.isNumber() || obj2.isNumber())
      return relate(obj1.convertToNumber(), obj2.convertToNumber());
    return relate(obj1.convertToString(), obj2.convertToString());
  }
}