001: // Copyright (c) Corporation for National Research Initiatives
002:
003: /* Support for java-1.2 collections
004: * XXX: Is this used? Or does the new collections integration
005: * (starting at 2.2a1) make it obsolete?
006: */
007:
008: package org.python.core;
009:
010: import java.util.*;
011:
012: class CollectionProxy2 extends CollectionProxy {
013: public CollectionProxy instanceFindCollection(Object object) {
014: if (object instanceof List) {
015: return new ListProxy(((List) object));
016: }
017: if (object instanceof Map) {
018: return new MapProxy(((Map) object));
019: }
020: if (object instanceof Collection) {
021: return new IteratorProxy(((Collection) object).iterator());
022: }
023: if (object instanceof Iterator) {
024: return new IteratorProxy(((Iterator) object));
025: }
026:
027: return null;
028: }
029: }
030:
031: class ListProxy extends CollectionProxy {
032: List proxy;
033:
034: public ListProxy(List proxy) {
035: this .proxy = proxy;
036: }
037:
038: public int __len__() {
039: return this .proxy.size();
040: }
041:
042: public PyObject __finditem__(int key) {
043: try {
044: return Py.java2py(this .proxy.get(key));
045: } catch (IndexOutOfBoundsException exc) {
046: return null;
047: }
048: }
049:
050: public PyObject __finditem__(PyObject key) {
051: if (key instanceof PyInteger) {
052: return __finditem__(((PyInteger) key).getValue());
053: } else {
054: throw Py.TypeError("only integer keys accepted");
055: }
056: }
057:
058: public void __setitem__(int key, PyObject value) {
059: this .proxy.set(key, Py.tojava(value, Object.class));
060: }
061:
062: public void __setitem__(PyObject key, PyObject value) {
063: if (key instanceof PyInteger) {
064: __setitem__(((PyInteger) key).getValue(), value);
065: } else {
066: throw Py.TypeError("only integer keys accepted");
067: }
068: }
069:
070: public void __delitem__(int key) {
071: this .proxy.remove(key);
072: }
073:
074: public void __delitem__(PyObject key) {
075: if (key instanceof PyInteger) {
076: __delitem__(((PyInteger) key).getValue());
077: } else {
078: throw Py.TypeError("only integer keys accepted");
079: }
080: }
081: }
082:
083: class MapProxy extends CollectionProxy {
084: Map proxy;
085:
086: public MapProxy(Map proxy) {
087: this .proxy = proxy;
088: }
089:
090: public int __len__() {
091: return this .proxy.size();
092: }
093:
094: public PyObject __finditem__(int key) {
095: throw Py.TypeError("loop over non-sequence");
096: }
097:
098: public PyObject __finditem__(PyObject key) {
099: return Py.java2py(this .proxy.get(Py.tojava(key, Object.class)));
100: }
101:
102: public void __setitem__(PyObject key, PyObject value) {
103: this .proxy.put(Py.tojava(key, Object.class), Py.tojava(value,
104: Object.class));
105: }
106:
107: public void __delitem__(PyObject key) {
108: this .proxy.remove(Py.tojava(key, Object.class));
109: }
110: }
111:
112: class IteratorProxy extends CollectionProxy {
113: Iterator proxy;
114:
115: int counter;
116:
117: public IteratorProxy(Iterator proxy) {
118: this .proxy = proxy;
119: this .counter = 0;
120: }
121:
122: public PyObject __finditem__(int key) {
123: if (key != this .counter) {
124: throw Py
125: .ValueError("iterator indices must be consecutive ints starting at 0");
126: }
127: this .counter++;
128: if (this .proxy.hasNext()) {
129: return Py.java2py(this .proxy.next());
130: } else {
131: return null;
132: }
133: }
134:
135: public PyObject __finditem__(PyObject key) {
136: if (key instanceof PyInteger) {
137: return __finditem__(((PyInteger) key).getValue());
138: } else {
139: throw Py.TypeError("only integer keys accepted");
140: }
141: }
142: }
|