diff options
Diffstat (limited to 'java/test/Freeze/dbmap/Client.java')
-rw-r--r-- | java/test/Freeze/dbmap/Client.java | 2189 |
1 files changed, 0 insertions, 2189 deletions
diff --git a/java/test/Freeze/dbmap/Client.java b/java/test/Freeze/dbmap/Client.java deleted file mode 100644 index fe6c9a06680..00000000000 --- a/java/test/Freeze/dbmap/Client.java +++ /dev/null @@ -1,2189 +0,0 @@ -// ********************************************************************** -// -// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. -// -// This copy of Ice is licensed to you under the terms described in the -// ICE_LICENSE file included in this distribution. -// -// ********************************************************************** - -package test.Freeze.dbmap; - -import Freeze.*; - -public class Client -{ - static class ReadThread extends Thread - { - @Override - public void - run() - { - try - { - for(int i = 0; i < 10; ++i) - { - for(;;) - { - Transaction tx = _connection.beginTransaction(); - - try - { - java.util.Iterator<java.util.Map.Entry<Byte, Integer>> p = _map.entrySet().iterator(); - while(p.hasNext()) - { - java.util.Map.Entry<Byte, Integer> e = p.next(); - byte v = e.getKey().byteValue(); - test(e.getValue().equals(new Integer(v - (byte)'a'))); - } - - break; - } - catch(DeadlockException ex) - { - // System.err.print("r"); - // - // Try again - // - } - finally - { - tx.rollback(); - } - } - } - } - catch(Exception ex) - { - ex.printStackTrace(); - System.err.println(ex); - } - finally - { - ((Freeze.Map<Byte, Integer>)_map).close(); - _connection.close(); - } - } - - ReadThread(Ice.Communicator communicator, String envName, String dbName) - { - _connection = Freeze.Util.createConnection(communicator, envName); - _map = new ByteIntMap(_connection, dbName, true); - } - - private Freeze.Connection _connection; - private java.util.Map<Byte, Integer> _map; - } - - static class WriteThread extends Thread - { - @Override - public void - run() - { - try - { - for(int i = 0; i < 4; ++i) - { - for(;;) - { - Transaction tx = _connection.beginTransaction(); - - try - { - java.util.Iterator<java.util.Map.Entry<Byte, Integer>> p = _map.entrySet().iterator(); - while(p.hasNext()) - { - java.util.Map.Entry<Byte, Integer> e = p.next(); - int v = e.getValue().intValue() + 1; - e.setValue(v); - p.remove(); - } - - tx.commit(); - tx = null; - - break; - } - catch(DeadlockException ex) - { - // System.err.print("w"); - // - // Try again - // - } - finally - { - if(tx != null) - { - tx.rollback(); - } - } - } - populateDB(_connection, _map); - } - } - catch(Exception ex) - { - ex.printStackTrace(); - System.err.println(ex); - } - finally - { - ((Freeze.Map<Byte, Integer>)_map).close(); - _connection.close(); - } - } - - WriteThread(Ice.Communicator communicator, String envName, String dbName) - { - _connection = Freeze.Util.createConnection(communicator, envName); - _map = new ByteIntMap(_connection, dbName, true); - } - - private Freeze.Connection _connection; - private java.util.Map<Byte, Integer> _map; - } - - static String alphabet = "abcdefghijklmnopqrstuvwxyz"; - - private static void - test(boolean b) - { - if(!b) - { - throw new RuntimeException(); - } - } - - private static void - populateDB(Freeze.Connection connection, java.util.Map<Byte, Integer> m) - throws DatabaseException - { - int length = alphabet.length(); - - for(;;) - { - - try - { - Transaction tx = connection.beginTransaction(); - for(int j = 0; j < length; ++j) - { - m.put((byte)alphabet.charAt(j), j); - } - tx.commit(); - break; // for(;;) - } - catch(Freeze.DeadlockException dx) - { - length = length / 2; - // System.err.print("t"); - // - // Try again - // - } - finally - { - if(connection.currentTransaction() != null) - { - connection.currentTransaction().rollback(); - } - } - } - } - - private static int - run(String[] args, Ice.Communicator communicator, String envName, String dbName) - throws DatabaseException - { - Freeze.Connection connection = Freeze.Util.createConnection(communicator, envName); - - // - // Open/close db within transaction - // - { - Transaction tx = connection.beginTransaction(); - ByteIntMap m = new ByteIntMap(connection, dbName, true); - - m.put((byte)'a', 1); - m.close(); - tx.rollback(); - } - - java.util.Map<Byte, Integer> m = new ByteIntMap(connection, dbName, true); - - // - // Populate the database with the alphabet. - // - populateDB(connection, m); - - int j; - - System.out.print("testing populate... "); - System.out.flush(); - for(j = 0; j < alphabet.length(); ++j) - { - Integer value = m.get((byte)alphabet.charAt(j)); - test(value != null); - } - test(m.get((byte)'0') == null); - for(j = 0; j < alphabet.length(); ++j) - { - test(m.containsKey((byte)alphabet.charAt(j))); - } - test(!m.containsKey((byte)'0')); - for(j = 0; j < alphabet.length(); ++j) - { - test(m.containsValue(j)); - } - test(!m.containsValue(-1)); - test(m.size() == alphabet.length()); - test(!m.isEmpty()); - System.out.println("ok"); - - System.out.print("testing erase... "); - System.out.flush(); - m.remove((byte)'a'); - m.remove((byte)'b'); - m.remove((byte)'c'); - for(j = 3; j < alphabet.length(); ++j) - { - Integer value = m.get((byte)alphabet.charAt(j)); - test(value != null); - } - test(m.get((byte)'a') == null); - test(m.get((byte)'b') == null); - test(m.get((byte)'c') == null); - test(((ByteIntMap)m).fastRemove((byte)'d') == true); - test(((ByteIntMap)m).fastRemove((byte)'d') == false); - System.out.println("ok"); - - // - // Re-populate. - // - populateDB(connection, m); - - { - System.out.print("testing keySet... "); - System.out.flush(); - java.util.Set<Byte> keys = m.keySet(); - test(keys.size() == alphabet.length()); - test(!keys.isEmpty()); - java.util.Iterator<Byte> p = keys.iterator(); - while(p.hasNext()) - { - Byte b = p.next(); - test(keys.contains(b)); - test(m.containsKey(b)); - } - - // - // The iterator should have already been closed when we reached the last entry. - // - int count = ((Freeze.Map<Byte, Integer>)m).closeAllIterators(); - test(count == 0); - - try - { - keys.remove((byte)'a'); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - no transaction. - } - - count = ((Freeze.Map<Byte, Integer>)m).closeAllIterators(); - test(count == 1); // Opened by keys.remove() - - Transaction tx = connection.beginTransaction(); - - test(keys.size() == alphabet.length()); - test(keys.remove((byte)'a') == true); - - // Verify that size is transactional - test(keys.size() == alphabet.length() - 1); - test(keys.remove((byte)'a') == false); - tx.commit(); - test(m.containsKey((byte)'a') == false); - - System.out.println("ok"); - } - - // - // Re-populate. - // - populateDB(connection, m); - - { - System.out.print("testing values... "); - System.out.flush(); - java.util.Collection<Integer> values = m.values(); - test(values.size() == alphabet.length()); - test(!values.isEmpty()); - java.util.Iterator<Integer> p = values.iterator(); - while(p.hasNext()) - { - Integer i = p.next(); - test(values.contains(i)); - test(m.containsValue(i)); - } - - // - // The iterator should have already been closed when we reached the last entry. - // - int count = ((Freeze.Map<Byte, Integer>)m).closeAllIterators(); - test(count == 0); - - try - { - values.remove(0); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - no transaction. - } - - count = ((Freeze.Map<Byte, Integer>)m).closeAllIterators(); - test(count == 1); // Opened by keys.remove() - - Transaction tx = connection.beginTransaction(); - test(values.remove(0) == true); - test(values.remove(0) == false); - tx.commit(); - test(m.containsKey((byte)'a') == false); - - System.out.println("ok"); - } - - // - // Re-populate. - // - populateDB(connection, m); - - { - System.out.print("testing entrySet... "); - System.out.flush(); - java.util.Set<java.util.Map.Entry<Byte, Integer>> entrySet = m.entrySet(); - test(entrySet.size() == alphabet.length()); - test(!entrySet.isEmpty()); - java.util.Iterator<java.util.Map.Entry<Byte, Integer>> p = entrySet.iterator(); - while(p.hasNext()) - { - java.util.Map.Entry<Byte, Integer> e = p.next(); - test(entrySet.contains(e)); - test(m.containsKey(e.getKey())); - test(m.containsValue(e.getValue())); - } - - // - // The iterator should have already been closed when we reached the last entry. - // - int count = ((Freeze.Map<Byte, Integer>)m).closeAllIterators(); - test(count == 0); - System.out.println("ok"); - } - - { - System.out.print("testing unsorted map... "); - System.out.flush(); - - NavigableMap<Byte, Integer> nm = (NavigableMap<Byte, Integer>)m; - final byte firstByte = (byte)alphabet.charAt(0); - final byte lastByte = (byte)alphabet.charAt(alphabet.length() - 1); - final int length = alphabet.length(); - - // - // Keys - // - - Byte key; - - key = nm.firstKey(); - test(key != null); - test(key.byteValue() == firstByte); - - key = nm.lastKey(); - test(key != null); - test(key.byteValue() == lastByte); - - try - { - nm.ceilingKey((byte)0); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - a comparator is required. - } - - try - { - nm.floorKey((byte)0); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - a comparator is required. - } - - try - { - nm.higherKey((byte)0); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - a comparator is required. - } - - try - { - nm.lowerKey((byte)0); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - a comparator is required. - } - - m.clear(); - test(m.size() == 0); - try - { - nm.firstKey(); - test(false); - } - catch(java.util.NoSuchElementException ex) - { - // Expected. - } - try - { - nm.lastKey(); - test(false); - } - catch(java.util.NoSuchElementException ex) - { - // Expected. - } - - populateDB(connection, m); - - // - // Entries - // - - java.util.Map.Entry<Byte, Integer> e; - - e = nm.firstEntry(); - test(e != null); - test(e.getKey().byteValue() == firstByte); - test(e.getValue().intValue() == 0); - - e = nm.lastEntry(); - test(e != null); - test(e.getKey().byteValue() == lastByte); - test(e.getValue().intValue() == length - 1); - - try - { - nm.ceilingEntry((byte)0); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - a comparator is required. - } - - try - { - nm.floorEntry((byte)0); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - a comparator is required. - } - - try - { - nm.higherEntry((byte)0); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - a comparator is required. - } - - try - { - nm.lowerEntry((byte)0); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - a comparator is required. - } - - e = nm.pollFirstEntry(); - test(e != null); - test(e.getKey().byteValue() == firstByte); - test(e.getValue().intValue() == 0); - test(!nm.containsKey(firstByte)); - - e = nm.pollLastEntry(); - test(e != null); - test(e.getKey().byteValue() == lastByte); - test(e.getValue().intValue() == length - 1); - test(!nm.containsKey(lastByte)); - - ByteIntMap typedM = (ByteIntMap)m; - - try - { - typedM.headMapForValue(0); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - a comparator is required. - } - - try - { - typedM.tailMapForValue(0); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - a comparator is required. - } - - try - { - typedM.subMapForValue(0, 0); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - a comparator is required. - } - - try - { - typedM.mapForValue(); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected - a comparator is required. - } - - m.clear(); - test(nm.firstEntry() == null); - test(nm.lastEntry() == null); - populateDB(connection, m); - - System.out.println("ok"); - } - - { - System.out.print("testing for loop... "); - System.out.flush(); - for(java.util.Map.Entry<Byte, Integer> e : m.entrySet()) - { - test(m.containsKey(e.getKey())); - test(m.containsValue(e.getValue())); - } - - // - // The iterator should have already been closed when we reached the last entry. - // - int count = ((Freeze.Map<Byte, Integer>)m).closeAllIterators(); - test(count == 0); - - System.out.println("ok"); - } - - { - System.out.print("testing iterator.remove... "); - System.out.flush(); - - Freeze.Map<Byte, Integer> fm = (Freeze.Map<Byte, Integer>)m; - java.util.Iterator<java.util.Map.Entry<Byte, Integer>> p; - Transaction tx; - int count; - - test(m.size() == 26); - test(m.get((byte)'b') != null); - test(m.get((byte)'n') != null); - test(m.get((byte)'z') != null); - - // - // Verify that remove fails without a transaction. - // - p = m.entrySet().iterator(); - test(p.hasNext()); - p.next(); - try - { - p.remove(); - } - catch(UnsupportedOperationException ex) - { - // Expected. - } - - count = fm.closeAllIterators(); - test(count == 1); - - tx = connection.beginTransaction(); - p = m.entrySet().iterator(); - while(p.hasNext()) - { - java.util.Map.Entry<Byte, Integer> e = p.next(); - Byte b = e.getKey(); - byte v = b.byteValue(); - if(v == (byte)'b' || v == (byte)'n' || v == (byte)'z') - { - p.remove(); - try - { - p.remove(); - } - catch(IllegalStateException ex) - { - // Expected. - } - } - } - tx.commit(); - count = fm.closeAllIterators(); // Committing the transaction should close the iterator. - test(count == 0); - - test(m.size() == 23); - test(m.get((byte)'b') == null); - test(m.get((byte)'n') == null); - test(m.get((byte)'z') == null); - - // - // Re-populate. - // - populateDB(connection, m); - - test(m.size() == 26); - - tx = connection.beginTransaction(); - p = m.entrySet().iterator(); - while(p.hasNext()) - { - java.util.Map.Entry<Byte, Integer> e = p.next(); - byte v = e.getKey().byteValue(); - if(v == (byte)'a' || v == (byte)'b' || v == (byte)'c') - { - p.remove(); - } - } - tx.commit(); - count = fm.closeAllIterators(); // Committing the transaction should close the iterator. - test(count == 0); - - test(m.size() == 23); - test(m.get((byte)'a') == null); - test(m.get((byte)'b') == null); - test(m.get((byte)'c') == null); - System.out.println("ok"); - } - - { - System.out.print("testing entry.setValue... "); - System.out.flush(); - - // - // Re-populate. - // - populateDB(connection, m); - - Freeze.Map<Byte, Integer> fm = (Freeze.Map<Byte, Integer>)m; - java.util.Iterator<java.util.Map.Entry<Byte, Integer>> p; - Transaction tx; - java.util.Map.Entry<Byte, Integer> e; - - // - // Verify that setValue on an iterator fails without a transaction. - // - p = m.entrySet().iterator(); - test(p.hasNext()); - try - { - e = p.next(); - e.setValue(0); - } - catch(UnsupportedOperationException ex) - { - // Expected. - } - - tx = connection.beginTransaction(); - p = m.entrySet().iterator(); - while(p.hasNext()) - { - e = p.next(); - byte v = e.getKey().byteValue(); - if(v == (byte)'b' || v == (byte)'n' || v == (byte)'z') - { - e.setValue(v + 100); - } - } - tx.commit(); - test(m.size() == 26); - test(m.get((byte)'b') != null); - test(m.get((byte)'n') != null); - test(m.get((byte)'z') != null); - - p = m.entrySet().iterator(); - while(p.hasNext()) - { - e = p.next(); - byte v = e.getKey().byteValue(); - if(v == (byte)'b' || v == (byte)'n' || v == (byte)'z') - { - test(e.getValue().equals(new Integer(v + 100))); - } - else - { - test(e.getValue().equals(new Integer(v - (byte)'a'))); - } - } - - // - // No transaction is necessary for entries obtained without an iterator. - // - e = fm.firstEntry(); - test(e != null); - e.setValue(-1); - test(e.getValue().intValue() == -1); - e = fm.firstEntry(); - test(e != null); - test(e.getValue().intValue() == -1); - - System.out.println("ok"); - } - - { - System.out.print("testing clear... "); - System.out.flush(); - test(m.size() > 0); - m.clear(); - test(m.size() == 0); - System.out.println("ok"); - } - - { - System.out.print("testing index... "); - System.out.flush(); - - // - // Re-populate. - // - populateDB(connection, m); - - ByteIntMap typedM = (ByteIntMap)m; - - java.util.Map.Entry<Byte, Integer> e; - java.util.Iterator<java.util.Map.Entry<Byte, Integer>> p; - Transaction tx; - - int length = alphabet.length(); - - for(int k = 0; k < length; ++k) - { - p = typedM.findByValue(k); - test(p.hasNext()); - e = p.next(); - test(e.getKey().byteValue() == (byte)alphabet.charAt(k)); - test(!p.hasNext()); - } - - // - // Change the value associated with key 21 to 17. - // - m.put((byte)alphabet.charAt(21), 17); - - // - // Verify that the index no longer has an entry for value 21. - // - p = typedM.findByValue(21); - test(!p.hasNext()); - - // - // Verify that the iterator returns two entries for value 17. - // - p = typedM.findByValue(17); - test(p.hasNext()); - e = p.next(); - byte v = e.getKey().byteValue(); - test(v == (byte)alphabet.charAt(17) || v == (byte)alphabet.charAt(21)); - - test(p.hasNext()); - e = p.next(); - v = e.getKey().byteValue(); - test(v == (byte)alphabet.charAt(17) || v == (byte)alphabet.charAt(21)); - - test(!p.hasNext()); // Iterator defaults to returning only exact matches. - test(typedM.valueCount(17) == 2); - - // - // Cannot remove without a transaction. - // - p = typedM.findByValue(17); - test(p.hasNext()); - p.next(); - try - { - p.remove(); - } - catch(UnsupportedOperationException ex) - { - // Expected. - } - - tx = connection.beginTransaction(); - p = typedM.findByValue(17); - test(p.hasNext()); - p.next(); - p.remove(); - test(p.hasNext()); - e = p.next(); - v = e.getKey().byteValue(); - test(v == (byte)alphabet.charAt(17) || v == (byte)alphabet.charAt(21)); - test(!p.hasNext()); - tx.commit(); - - int count = typedM.closeAllIterators(); - test(count == 0); // Committing the transaction also closes the iterators. - - test(typedM.valueCount(17) == 1); - - p = typedM.findByValue(17); - test(p.hasNext()); - e = p.next(); - - // - // Cannot set a value on an index iterator. - // - try - { - e.setValue(18); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected. - } - - v = e.getKey().byteValue(); - test(v == (byte)alphabet.charAt(17) || v == (byte)alphabet.charAt(21)); - test(typedM.valueCount(17) == 1); - - m.put((byte)alphabet.charAt(21), 17); - - // - // Non-exact match - // - p = typedM.findByValue(21); - test(!p.hasNext()); - - test(typedM.valueCount(21) == 0); - - p = typedM.findByValue(21, false); - test(!p.hasNext()); - - p = typedM.findByValue(22, false); - int previous = 21; - count = 0; - while(p.hasNext()) - { - e = p.next(); - - int val = e.getValue().intValue(); - - test(val > previous); - previous = val; - count++; - } - test(count == 4); - - System.out.println("ok"); - } - - ((Freeze.Map<Byte, Integer>)m).closeAllIterators(); - - { - System.out.print("testing concurrent access... "); - System.out.flush(); - - m.clear(); - populateDB(connection, m); - - java.util.List<Thread> l = new java.util.ArrayList<Thread>(); - - // - // Create each thread. - // - for(int i = 0; i < 5; ++i) - { - l.add(new ReadThread(communicator, envName, dbName)); - l.add(new WriteThread(communicator, envName, dbName)); - } - - // - // Start each thread. - // - for(Thread t : l) - { - t.start(); - } - - // - // Wait for each thread to terminate. - // - for(Thread t : l) - { - while(t.isAlive()) - { - try - { - t.join(); - } - catch(InterruptedException e) - { - } - } - } - - System.out.println("ok"); - } - - System.out.print("testing index creation... "); - System.out.flush(); - - { - IntIdentityMap iim = new IntIdentityMap(connection, "intIdentity", true); - - Ice.Identity odd = new Ice.Identity(); - odd.name = "foo"; - odd.category = "odd"; - - Ice.Identity even = new Ice.Identity(); - even.name = "bar"; - even.category = "even"; - - Transaction tx = connection.beginTransaction(); - for(int i = 0; i < 1000; i++) - { - if(i % 2 == 0) - { - iim.fastPut(i, even); - } - else - { - iim.fastPut(i, odd); - } - } - tx.commit(); - iim.closeDb(); - } - - { - // - // Need true to create the index - // - IntIdentityMapWithIndex iim = new IntIdentityMapWithIndex(connection, "intIdentity", true); - - test(iim.categoryCount("even") == 500); - test(iim.categoryCount("odd") == 500); - - int count = 0; - java.util.Iterator<java.util.Map.Entry<Integer, Ice.Identity>> p = iim.findByCategory("even"); - while(p.hasNext()) - { - java.util.Map.Entry<Integer, Ice.Identity> e = p.next(); - int k = e.getKey().intValue(); - test(k % 2 == 0); - ++count; - } - test(count == 500); - - count = 0; - p = iim.findByCategory("odd"); - while(p.hasNext()) - { - java.util.Map.Entry<Integer, Ice.Identity> e = p.next(); - int k = e.getKey().intValue(); - test(k % 2 == 1); - ++count; - } - test(count == 500); - - iim.destroy(); - } - System.out.println("ok"); - - // - // Sorting - // - - final java.util.Comparator<Integer> less = new java.util.Comparator<Integer>() - { - @Override - public int compare(Integer i1, Integer i2) - { - if(i1 == i2) - { - return 0; - } - else if(i1 == null) - { - return -i2.compareTo(i1); - } - else - { - return i1.compareTo(i2); - } - } - }; - - java.util.Comparator<String> greater = new java.util.Comparator<String>() - { - @Override - public int compare(String s1, String s2) - { - if(s1 == s2) - { - return 0; - } - else if(s1 == null) - { - return s2.compareTo(s1); - } - else - { - return -s1.compareTo(s2); - } - } - }; - - SortedMap.IndexComparators indexComparators = new SortedMap.IndexComparators(); - indexComparators.categoryComparator = greater; - java.util.Random rand = new java.util.Random(); - - { - SortedMap sm = new SortedMap(connection, "sortedMap", true, less, indexComparators); - - Transaction tx = connection.beginTransaction(); - for(int i = 0; i < 500; i++) - { - int k = rand.nextInt(1000); - Ice.Identity id = new Ice.Identity("foo", String.valueOf(alphabet.charAt(k % 26))); - sm.fastPut(k, id); - } - tx.commit(); - sm.close(); - } - - { - SortedMap sm = new SortedMap(connection, "sortedMap", true, less, indexComparators); - NavigableMap<Integer, Ice.Identity> sub = null; - - System.out.print("testing sorting with primary key... "); - System.out.flush(); - - testSortedMap(sm, true); - - { - final Integer first = sm.firstKey(); - - // - // fastRemove - // - sub = sm.headMap(first, true); - - Ice.Identity id = sub.get(first); - test(sub.fastRemove(first) == true); - test(sub.fastRemove(first) == false); - test(sm.containsKey(first) == false); - sm.put(first, id); - test(sm.containsKey(first) == true); - } - - System.out.println("ok"); - - // - // Category index - // - - { - System.out.print("testing sorting with secondary key... "); - System.out.flush(); - - NavigableMap<String, java.util.Set<java.util.Map.Entry<Integer, Ice.Identity>>> isub = null; - - isub = sm.mapForCategory(); - - { - Transaction tx = connection.beginTransaction(); - - Ice.Identity id = sm.get(sm.firstKey()); - int sz = isub.get(id.category).size(); - test(sz > 0); - - - test(sm.fastRemove(sm.firstKey()) == true); - - - if(sz == 1) - { - test(isub.get(id.category) == null); - } - else - { - // System.out.println("Check size within tx"); - test(isub.get(id.category).size() == sz -1); - } - tx.rollback(); - test(isub.get(id.category).size() == sz); - } - - final String first = isub.firstKey(); - final String last = isub.lastKey(); - - // - // Head map - // - isub = sm.headMapForCategory(last); - test(greater.compare(isub.lastKey(), last) < 0); - isub = sm.headMapForCategory(last, true); - test(greater.compare(isub.lastKey(), last) == 0); - isub = sm.headMapForCategory(first); - test(isub.firstEntry() == null); // map is empty - isub = sm.headMapForCategory(first, true); - test(greater.compare(isub.firstKey(), first) == 0); - test(greater.compare(isub.lastKey(), first) == 0); - - sm.headMapForCategory(first, true).headMap(first, true); - sm.headMapForCategory(first, true).headMap(first); - sm.headMapForCategory(first).headMap(first); - try - { - sm.headMapForCategory(first).headMap(first, true); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - - { - String category = null; - while(true) - { - int k = rand.nextInt(1000); - category = String.valueOf(alphabet.charAt(k % 26)); - isub = sm.headMapForCategory(category); - if(isub.firstEntry() != null) // Make sure submap isn't empty. - { - break; - } - } - - testSecondaryKey(isub, null, false, category, false); - - try - { - isub.tailMap(category); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - } - - { - String category = null; - while(true) - { - int k = rand.nextInt(1000); - category = String.valueOf(alphabet.charAt(k % 26)); - isub = sm.headMapForCategory(category, true); - if(isub.firstEntry() != null) // Make sure submap isn't empty. - { - break; - } - } - - testSecondaryKey(isub, null, false, category, true); - - try - { - String invalid = String.valueOf(category.charAt(0) + 1); - isub.tailMap(invalid); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - } - - // - // Tail map - // - isub = sm.tailMapForCategory(first); - test(greater.compare(isub.firstKey(), first) == 0); - isub = sm.tailMapForCategory(first, false); - test(greater.compare(isub.firstKey(), first) > 0); - isub = sm.tailMapForCategory(last); - test(greater.compare(isub.firstKey(), last) == 0); - test(greater.compare(isub.lastKey(), last) == 0); - isub = sm.tailMapForCategory(last, false); - test(isub.firstEntry() == null); // map is empty - - sm.tailMapForCategory(last).tailMap(last); - sm.tailMapForCategory(last).tailMap(last, false); - try - { - sm.tailMapForCategory(last, false).tailMap(last); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - - { - String category = null; - while(true) - { - int k = rand.nextInt(1000); - category = String.valueOf(alphabet.charAt(k % 26)); - isub = sm.tailMapForCategory(category); - if(isub.firstEntry() != null) // Make sure submap isn't empty. - { - break; - } - } - - testSecondaryKey(isub, category, true, null, false); - - try - { - String invalid = String.valueOf((char)(category.charAt(0) + 1)); - isub.headMap(invalid); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - } - - { - String category = null; - while(true) - { - int k = rand.nextInt(1000); - category = String.valueOf(alphabet.charAt(k % 26)); - isub = sm.tailMapForCategory(category, false); - if(isub.firstEntry() != null) // Make sure submap isn't empty. - { - break; - } - } - - testSecondaryKey(isub, category, false, null, false); - - try - { - isub.headMap(category); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - } - - // - // Sub map - // - isub = sm.subMapForCategory(first, last); - test(greater.compare(isub.firstKey(), first) == 0); - test(greater.compare(isub.lastKey(), last) < 0); - isub = sm.subMapForCategory(first, false, last, false); - test(greater.compare(isub.firstKey(), first) > 0); - isub = sm.subMapForCategory(first, true, last, true); - test(greater.compare(isub.firstKey(), first) == 0); - test(greater.compare(isub.lastKey(), last) == 0); - - try - { - sm.subMapForCategory(first, false, first, false); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - - NavigableMap<String, java.util.Set<java.util.Map.Entry<Integer, Ice.Identity>>> isubsub = null; - - isubsub = isub.subMap(first, true, last, true); - test(greater.compare(isubsub.firstKey(), first) == 0); - test(greater.compare(isubsub.lastKey(), last) == 0); - - isubsub = isub.subMap(first, false, last, false); - test(greater.compare(isubsub.firstKey(), first) > 0); - test(greater.compare(isubsub.lastKey(), last) < 0); - - try - { - isubsub.subMap(first, true, last, false); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - - try - { - isubsub.subMap(first, false, last, true); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - - { - final boolean fromInclusive[] = { false, false, true, true }; - final boolean toInclusive[] = { false, true, false, true }; - for(int i = 0; i < 4; ++i) - { - String from = null, to = null; - while(true) - { - int f = rand.nextInt(1000) % 26; - int t = rand.nextInt(1000) % 26; - int f1 = Math.max(f, t); - int t1 = Math.min(f, t); - if(f1 - t1 < 10) - { - continue; - } - from = String.valueOf(alphabet.charAt(f1 % 26)); - to = String.valueOf(alphabet.charAt(t1 % 26)); - isub = sm.subMapForCategory(from, fromInclusive[i], to, toInclusive[i]); - if(isub.firstEntry() != null) // Make sure submap isn't empty. - { - break; - } - } - - testSecondaryKey(isub, from, fromInclusive[i], to, toInclusive[i]); - } - } - - // - // fastRemove - // - isub = sm.headMapForCategory(first, true); - try - { - isub.fastRemove(first); - test(false); - } - catch(UnsupportedOperationException ex) - { - // Expected. - } - - System.out.println("ok"); - } - - sm.close(); - } - - { - SortedMap sm = new SortedMap(connection, "sortedMap", true, less, indexComparators); - - System.out.print("testing descending map... "); - System.out.flush(); - - { - NavigableMap<Integer, Ice.Identity> dmap = sm.descendingMap(); - - testSortedMap(dmap, false); - testSortedMap(dmap.descendingMap(), true); // Ascending submap. - - } - - int finc, tinc; // Inclusive flags - - for(tinc = 0; tinc < 2; ++tinc) - { - while(true) - { - NavigableMap<Integer, Ice.Identity> sub = sm.headMap(rand.nextInt(1000), tinc == 0); - if(sub.firstEntry() == null) - { - continue; - } - NavigableMap<Integer, Ice.Identity> dmap = sub.descendingMap(); - test(dmap.firstKey().equals(sub.lastKey())); - test(dmap.lastKey().equals(sub.firstKey())); - break; - } - } - - for(finc = 0; finc < 2; ++finc) - { - while(true) - { - NavigableMap<Integer, Ice.Identity> sub = sm.tailMap(rand.nextInt(1000), finc == 0); - if(sub.firstEntry() == null) - { - continue; - } - NavigableMap<Integer, Ice.Identity> dmap = sub.descendingMap(); - test(dmap.firstKey().equals(sub.lastKey())); - test(dmap.lastKey().equals(sub.firstKey())); - break; - } - } - - for(finc = 0; finc < 2; ++finc) - { - for(tinc = 0; tinc < 2; ++tinc) - { - while(true) - { - int f = rand.nextInt(1000); - int t = rand.nextInt(1000); - int from = Math.min(f, t); - int to = Math.max(f, t); - if(to - from < 100) - { - continue; - } - NavigableMap<Integer, Ice.Identity> sub = sm.subMap(from, finc == 0, to, tinc == 0); - if(sub.firstEntry() == null) - { - continue; - } - NavigableMap<Integer, Ice.Identity> dmap = sub.descendingMap(); - test(dmap.firstKey().equals(sub.lastKey())); - test(dmap.lastKey().equals(sub.firstKey())); - break; - } - } - } - - { - NavigableMap<String, java.util.Set<java.util.Map.Entry<Integer, Ice.Identity>>> isub, dmap; - java.util.Comparator<? super String> c; - - isub = sm.mapForCategory(); // An iterator for this map visits keys in descending order. - dmap = isub.descendingMap(); // An iterator for this map visits keys in ascending order. - test(dmap.firstKey().equals(isub.lastKey())); - test(dmap.lastKey().equals(isub.firstKey())); - c = dmap.comparator(); - String prev = null; - for(java.util.Map.Entry<String, java.util.Set<java.util.Map.Entry<Integer, Ice.Identity>>> e : - dmap.entrySet()) - { - if(prev != null) - { - test(c.compare(e.getKey(), prev) > 0); - } - prev = e.getKey(); - } - - dmap = dmap.descendingMap(); - test(dmap.firstKey().equals(isub.firstKey())); - test(dmap.lastKey().equals(isub.lastKey())); - } - - for(tinc = 0; tinc < 2; ++tinc) - { - while(true) - { - String category = String.valueOf(alphabet.charAt(rand.nextInt(1000) % 26)); - NavigableMap<String, java.util.Set<java.util.Map.Entry<Integer, Ice.Identity>>> isub = - sm.headMapForCategory(category, tinc == 0); - if(isub.firstEntry() == null) - { - continue; - } - NavigableMap<String, java.util.Set<java.util.Map.Entry<Integer, Ice.Identity>>> dmap = - isub.descendingMap(); - test(dmap.firstKey().equals(isub.lastKey())); - test(dmap.lastKey().equals(isub.firstKey())); - break; - } - } - - for(finc = 0; finc < 2; ++finc) - { - while(true) - { - String category = String.valueOf(alphabet.charAt(rand.nextInt(1000) % 26)); - NavigableMap<String, java.util.Set<java.util.Map.Entry<Integer, Ice.Identity>>> isub = - sm.tailMapForCategory(category, finc == 0); - if(isub.firstEntry() == null) - { - continue; - } - NavigableMap<String, java.util.Set<java.util.Map.Entry<Integer, Ice.Identity>>> dmap = - isub.descendingMap(); - test(dmap.firstKey().equals(isub.lastKey())); - test(dmap.lastKey().equals(isub.firstKey())); - break; - } - } - - for(finc = 0; finc < 2; ++finc) - { - for(tinc = 0; tinc < 2; ++tinc) - { - while(true) - { - int f = rand.nextInt(1000) % 26; - int t = rand.nextInt(1000) % 26; - int f1 = Math.max(f, t); - int t1 = Math.min(f, t); - if(f1 - t1 < 10) - { - continue; - } - String from = String.valueOf(alphabet.charAt(f1 % 26)); - String to = String.valueOf(alphabet.charAt(t1 % 26)); - NavigableMap<String, java.util.Set<java.util.Map.Entry<Integer, Ice.Identity>>> isub = - sm.subMapForCategory(from, finc == 0, to, tinc == 0); - if(isub.firstEntry() == null) - { - continue; - } - NavigableMap<String, java.util.Set<java.util.Map.Entry<Integer, Ice.Identity>>> dmap = - isub.descendingMap(); - test(dmap.firstKey().equals(isub.lastKey())); - test(dmap.lastKey().equals(isub.firstKey())); - break; - } - } - } - - { - java.util.Set<Integer> keys = sm.descendingKeySet(); - Integer prev = null; - for(Integer i : keys) - { - if(prev != null) - { - test(i.compareTo(prev) < 0); - } - prev = i; - } - } - - { - java.util.Set<String> keys = sm.mapForCategory().descendingKeySet(); - String prev = null; - for(String category : keys) - { - if(prev != null) - { - test(category.compareTo(prev) > 0); - } - prev = category; - } - } - - sm.close(); - - System.out.println("ok"); - } - - { - SortedMap sm = new SortedMap(connection, "sortedMap", true, less, indexComparators); - - System.out.print("testing empty map... "); - System.out.flush(); - - sm.clear(); - - testEmptyMap(sm); - testEmptyMap(sm.headMap(0, false)); - testEmptyMap(sm.headMap(0, false).headMap(0, false)); - testEmptyMap(sm.tailMap(0, false)); - testEmptyMap(sm.tailMap(0, false).tailMap(0, false)); - testEmptyMap(sm.subMap(0, false, 1000, false)); - testEmptyMap(sm.subMap(0, false, 1000, false).subMap(0, false, 1000, false)); - - sm.close(); - - System.out.println("ok"); - } - - connection.close(); - - return 0; - } - - static void - testSortedMap(NavigableMap<Integer, Ice.Identity> sm, boolean ascending) - { - java.util.Comparator<? super Integer> c = sm.comparator(); - java.util.Random rand = new java.util.Random(); - NavigableMap<Integer, Ice.Identity> sub = null; - - final int first = sm.firstKey().intValue(); - final int last = sm.lastKey().intValue(); - - testPrimaryKey(sm, null, false, null, false); - - // - // Head map - // - sub = (NavigableMap<Integer, Ice.Identity>)sm.headMap(last); - test(c.compare(sub.lastKey(), last) < 0); - sub = sm.headMap(last, true); - test(c.compare(sub.lastKey(), last) == 0); - sub = (NavigableMap<Integer, Ice.Identity>)sm.headMap(first); - test(sub.firstEntry() == null); // map is empty - sub = sm.headMap(first, true); - test(c.compare(sub.firstKey(), first) == 0); - test(c.compare(sub.lastKey(), first) == 0); - - sm.headMap(first, true).headMap(first, true); - sm.headMap(first, true).headMap(first); - sm.headMap(first).headMap(first); - try - { - ((NavigableMap<Integer, Ice.Identity>)sm.headMap(first)).headMap(first, true); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - - { - int k = 0; - while(true) - { - k = rand.nextInt(1000); - sub = (NavigableMap<Integer, Ice.Identity>)sm.headMap(k); - if(sub.firstEntry() != null) // Make sure submap isn't empty. - { - break; - } - } - - testPrimaryKey(sub, null, false, k, false); - - try - { - sub.tailMap(k); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - } - - { - int k = 0; - while(true) - { - k = rand.nextInt(1000); - sub = sm.headMap(k, true); - if(sub.firstEntry() != null) // Make sure submap isn't empty. - { - break; - } - } - - testPrimaryKey(sub, null, false, k, true); - - try - { - sub.tailMap(k, false); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - } - - // - // Tail map - // - sub = (NavigableMap<Integer, Ice.Identity>)sm.tailMap(first); - test(c.compare(sub.firstKey(), first) == 0); - sub = sm.tailMap(first, false); - test(c.compare(sub.firstKey(), first) > 0); - sub = (NavigableMap<Integer, Ice.Identity>)sm.tailMap(last); - test(c.compare(sub.firstKey(), last) == 0); - test(c.compare(sub.lastKey(), last) == 0); - sub = sm.tailMap(last, false); - test(sub.firstEntry() == null); // map is empty - - sm.tailMap(last).tailMap(last); - ((NavigableMap<Integer, Ice.Identity>)sm.tailMap(last)).tailMap(last, false); - try - { - sm.tailMap(last, false).tailMap(last); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - - { - int k = 0; - while(true) - { - k = rand.nextInt(1000); - sub = (NavigableMap<Integer, Ice.Identity>)sm.tailMap(k); - if(sub.firstEntry() != null) // Make sure submap isn't empty. - { - break; - } - } - - testPrimaryKey(sub, k, true, null, false); - - try - { - sub.headMap(k); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - } - - { - int k = 0; - while(true) - { - k = rand.nextInt(1000); - sub = sm.tailMap(k, false); - if(sub.firstEntry() != null) // Make sure submap isn't empty. - { - break; - } - } - - testPrimaryKey(sub, k, false, null, false); - - try - { - sub.headMap(k); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - } - - // - // Sub map - // - sub = (NavigableMap<Integer, Ice.Identity>)sm.subMap(first, last); - test(c.compare(sub.firstKey(), first) == 0); - test(c.compare(sub.lastKey(), last) < 0); - sub = sm.subMap(first, false, last, false); - test(c.compare(sub.firstKey(), first) > 0); - sub = sm.subMap(first, true, last, true); - test(c.compare(sub.firstKey(), first) == 0); - test(c.compare(sub.lastKey(), last) == 0); - - try - { - sm.subMap(first, false, first, false); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - - NavigableMap<Integer, Ice.Identity> subsub = null; - - subsub = sub.subMap(first, true, last, true); - test(c.compare(subsub.firstKey(), first) == 0); - test(c.compare(subsub.lastKey(), last) == 0); - - subsub = sub.subMap(first, false, last, false); - test(c.compare(subsub.firstKey(), first) > 0); - test(c.compare(subsub.lastKey(), last) < 0); - - try - { - subsub.subMap(first, true, last, false); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - - try - { - subsub.subMap(first, false, last, true); - test(false); - } - catch(IllegalArgumentException ex) - { - // Expected. - } - - { - final boolean fromInclusive[] = { false, false, true, true }; - final boolean toInclusive[] = { false, true, false, true }; - for(int i = 0; i < 4; ++i) - { - int from = 0, to = 0; - while(true) - { - int f = rand.nextInt(1000); - int t = rand.nextInt(1000); - if(ascending) - { - from = Math.min(f, t); - to = Math.max(f, t); - } - else - { - from = Math.max(f, t); - to = Math.min(f, t); - } - if(Math.abs(to - from) < 100) - { - continue; - } - sub = sm.subMap(from, fromInclusive[i], to, toInclusive[i]); - if(sub.firstEntry() != null) // Make sure submap isn't empty. - { - break; - } - } - - testPrimaryKey(sub, from, fromInclusive[i], to, toInclusive[i]); - } - } - } - - static void - testPrimaryKey(NavigableMap<Integer, Ice.Identity> m, Integer from, boolean fromInclusive, Integer to, - boolean toInclusive) - { - java.util.Comparator<? super Integer> c = m.comparator(); - - Integer first = m.firstKey(); - Integer last = m.lastKey(); - - test(inRange(c, first, from, fromInclusive, to, toInclusive)); - test(inRange(c, last, from, fromInclusive, to, toInclusive)); - - java.util.Random rand = new java.util.Random(); - int i = 0; - while(i < 100) - { - int k = rand.nextInt(1000); - if(!inRange(c, k, from, fromInclusive, to, toInclusive)) - { - continue; - } - - java.util.Map.Entry<Integer, Ice.Identity> e; - Integer key; - - key = m.ceilingKey(k); - if(key == null) - { - test(c.compare(k, last) > 0); - } - else - { - test(c.compare(key, k) >= 0); - } - e = m.ceilingEntry(k); - test((key == null && e == null) || key.equals(e.getKey())); - - key = m.floorKey(k); - if(key == null) - { - test(c.compare(k, first) < 0); - } - else - { - test(c.compare(key, k) <= 0); - } - e = m.floorEntry(k); - test((key == null && e == null) || key.equals(e.getKey())); - - key = m.higherKey(k); - if(key == null) - { - test(c.compare(k, last) >= 0); - } - else - { - test(c.compare(key, k) > 0); - } - e = m.higherEntry(k); - test((key == null && e == null) || key.equals(e.getKey())); - - key = m.lowerKey(k); - if(key == null) - { - test(c.compare(k, first) <= 0); - } - else - { - test(c.compare(key, k) < 0); - } - e = m.lowerEntry(k); - test((key == null && e == null) || key.equals(e.getKey())); - - ++i; - } - - for(java.util.Map.Entry<Integer, Ice.Identity> p : m.entrySet()) - { - test(inRange(c, p.getKey(), from, fromInclusive, to, toInclusive)); - } - } - - static boolean - inRange(java.util.Comparator<? super Integer> c, Integer val, Integer from, boolean fromInclusive, Integer to, - boolean toInclusive) - { - if(from != null) - { - int cmp = c.compare(val, from); - if((fromInclusive && cmp < 0) || (!fromInclusive && cmp <= 0)) - { - return false; - } - } - if(to != null) - { - int cmp = c.compare(val, to); - if((toInclusive && cmp > 0) || (!toInclusive && cmp >= 0)) - { - return false; - } - } - return true; - } - - static void - testSecondaryKey(NavigableMap<String, java.util.Set<java.util.Map.Entry<Integer, Ice.Identity>>> m, String from, - boolean fromInclusive, String to, boolean toInclusive) - { - java.util.Comparator<? super String> c = m.comparator(); - - String first = m.firstKey(); - String last = m.lastKey(); - - test(inRange(c, first, from, fromInclusive, to, toInclusive)); - test(inRange(c, last, from, fromInclusive, to, toInclusive)); - - java.util.Random rand = new java.util.Random(); - int i = 0; - while(i < 100) - { - String category = String.valueOf(alphabet.charAt(rand.nextInt(1000) % 26)); - if(!inRange(c, category, from, fromInclusive, to, toInclusive)) - { - continue; - } - - java.util.Map.Entry<String, java.util.Set<java.util.Map.Entry<Integer, Ice.Identity>>> e; - String key; - - key = m.ceilingKey(category); - if(key == null) - { - test(c.compare(category, last) > 0); - } - else - { - test(c.compare(key, category) >= 0); - } - e = m.ceilingEntry(category); - test((key == null && e == null) || key.equals(e.getKey())); - - key = m.floorKey(category); - if(key == null) - { - test(c.compare(category, first) < 0); - } - else - { - test(c.compare(key, category) <= 0); - } - e = m.floorEntry(category); - test((key == null && e == null) || key.equals(e.getKey())); - - key = m.higherKey(category); - if(key == null) - { - test(c.compare(category, last) >= 0); - } - else - { - test(c.compare(key, category) > 0); - } - e = m.higherEntry(category); - test((key == null && e == null) || key.equals(e.getKey())); - - key = m.lowerKey(category); - if(key == null) - { - test(c.compare(category, first) <= 0); - } - else - { - test(c.compare(key, category) < 0); - } - e = m.lowerEntry(category); - test((key == null && e == null) || key.equals(e.getKey())); - - for(java.util.Map.Entry<String, java.util.Set<java.util.Map.Entry<Integer, Ice.Identity>>> p : m.entrySet()) - { - test(inRange(c, p.getKey(), from, fromInclusive, to, toInclusive)); - } - - ++i; - } - } - - static boolean - inRange(java.util.Comparator<? super String> c, String val, String from, boolean fromInclusive, String to, - boolean toInclusive) - { - if(from != null) - { - int cmp = c.compare(val, from); - if((fromInclusive && cmp < 0) || (!fromInclusive && cmp <= 0)) - { - return false; - } - } - if(to != null) - { - int cmp = c.compare(val, to); - if((toInclusive && cmp > 0) || (!toInclusive && cmp >= 0)) - { - return false; - } - } - return true; - } - - static private void - testEmptyMap(NavigableMap<Integer, Ice.Identity> m) - { - test(m.firstEntry() == null); - test(m.lastEntry() == null); - test(m.ceilingEntry(0) == null); - test(m.floorEntry(0) == null); - test(m.higherEntry(0) == null); - test(m.lowerEntry(0) == null); - test(m.pollFirstEntry() == null); - test(m.pollLastEntry() == null); - - try - { - m.firstKey(); - test(false); - } - catch(java.util.NoSuchElementException ex) - { - // Expected. - } - try - { - m.lastKey(); - test(false); - } - catch(java.util.NoSuchElementException ex) - { - // Expected. - } - - test(m.ceilingKey(0) == null); - test(m.floorKey(0) == null); - test(m.higherKey(0) == null); - test(m.lowerKey(0) == null); - } - - static public void - main(String[] args) - { - int status; - Ice.Communicator communicator = null; - String envName = "db"; - - try - { - Ice.StringSeqHolder holder = new Ice.StringSeqHolder(); - holder.value = args; - communicator = Ice.Util.initialize(holder); - args = holder.value; - if(args.length > 0) - { - envName = args[0]; - envName += "/"; - envName += "db"; - } - - status = run(args, communicator, envName, "binary"); - } - catch(Exception ex) - { - ex.printStackTrace(); - status = 1; - } - - if(communicator != null) - { - try - { - communicator.destroy(); - } - catch(Exception ex) - { - System.err.println(ex); - status = 1; - } - } - - System.exit(status); - } -} |