directory-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From akaras...@apache.org
Subject svn commit: r616488 - in /directory/sandbox/akarasulu/bigbang/apacheds: core/src/main/java/org/apache/directory/server/core/partition/impl/btree/ jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/ jdbm-store/src/test/j...
Date Tue, 29 Jan 2008 19:14:50 GMT
Author: akarasulu
Date: Tue Jan 29 11:14:49 2008
New Revision: 616488

URL: http://svn.apache.org/viewvc?rev=616488&view=rev
Log:
checkpointing some cleanups and preparing to write more tests

Added:
    directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmNoDupsCursorTest.java
Modified:
    directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java
    directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultSearchEngine.java
    directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/Optimizer.java
    directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/SearchEngine.java
    directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java
    directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableNoDuplicatesTest.java
    directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableWithDuplicatesTest.java

Modified: directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java?rev=616488&r1=616487&r2=616488&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java
(original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java
Tue Jan 29 11:14:49 2008
@@ -73,7 +73,7 @@
      *
      * @see Optimizer#annotate(ExprNode)
      */
-    public void annotate( ExprNode node ) throws NamingException
+    public void annotate( ExprNode node ) throws Exception
     {
         // Start off with the worst case unless scan count says otherwise.
         Long count = Long.MAX_VALUE;
@@ -187,14 +187,13 @@
      * @return the calculated scan count
      * @throws NamingException if there is an error
      */
-    private long getConjunctionScan( BranchNode node ) throws NamingException
+    private long getConjunctionScan( BranchNode node ) throws Exception
     {
         long count = Long.MAX_VALUE;
         List<ExprNode> children = node.getChildren();
 
-        for ( int ii = 0; ii < children.size(); ii++ )
+        for ( ExprNode child : children )
         {
-            ExprNode child = children.get( ii );
             annotate( child );
             count = Math.min( ( ( Long ) child.get( "count" ) ), count );
         }
@@ -227,14 +226,13 @@
      * @return the scan count on the OR node
      * @throws NamingException if there is an error
      */
-    private long getDisjunctionScan( BranchNode node ) throws NamingException
+    private long getDisjunctionScan( BranchNode node ) throws Exception
     {
         List<ExprNode> children = node.getChildren();
         long total = 0L;
 
-        for ( int ii = 0; ii < children.size(); ii++ )
+        for ( ExprNode child : children )
         {
-            ExprNode child = children.get( ii );
             annotate( child );
             total += ( Long ) child.get( "count" );
         }
@@ -251,19 +249,12 @@
      * @return the worst case
      * @throws NamingException if there is an error accessing an index
      */
-    private long getEqualityScan( SimpleNode node ) throws NamingException
+    private long getEqualityScan( SimpleNode node ) throws Exception
     {
         if ( db.hasUserIndexOn( node.getAttribute() ) )
         {
             Index idx = db.getUserIndex( node.getAttribute() );
-            try
-            {
-                return Long.valueOf( idx.count( node.getValue() ) );
-            }
-            catch ( java.io.IOException e )
-            {
-                e.printStackTrace();  //To change body of catch statement use File | Settings
| File Templates.
-            }
+            return idx.count( node.getValue() );
         }
 
         // count for non-indexed attribute is unknown so we presume da worst
@@ -280,20 +271,19 @@
      * @return the scan count of all nodes satisfying the AVA
      * @throws NamingException if there is an error accessing an index
      */
-    private long getGreaterLessScan( SimpleNode node, boolean isGreaterThan ) throws NamingException
+    private long getGreaterLessScan( SimpleNode node, boolean isGreaterThan ) throws Exception
     {
         if ( db.hasUserIndexOn( node.getAttribute() ) )
         {
             Index idx = db.getUserIndex( node.getAttribute() );
-            try
+            if ( isGreaterThan )
             {
-                int count = idx.count( node.getValue(), isGreaterThan );
+                return idx.greaterThanCount( node.getValue() );
             }
-            catch ( java.io.IOException e )
+            else
             {
-                e.printStackTrace();  //To change body of catch statement use File | Settings
| File Templates.
+                return idx.lessThanCount( node.getValue() );
             }
-            return Long.valueOf( count );
         }
 
         // count for non-indexed attribute is unknown so we presume da worst
@@ -310,20 +300,12 @@
      * @return the worst case full scan count
      * @throws NamingException if there is an error access database indices
      */
-    private long getFullScan( LeafNode node ) throws NamingException
+    private long getFullScan( LeafNode node ) throws Exception
     {
         if ( db.hasUserIndexOn( node.getAttribute() ) )
         {
             Index idx = db.getUserIndex( node.getAttribute() );
-            try
-            {
-                int count = idx.count();
-            }
-            catch ( java.io.IOException e )
-            {
-                e.printStackTrace();  //To change body of catch statement use File | Settings
| File Templates.
-            }
-            return Long.valueOf( count );
+            return idx.count();
         }
 
         return Long.MAX_VALUE;
@@ -338,20 +320,12 @@
      * @return the number of entries matched for the presence of an attribute
      * @throws NamingException if errors result
      */
-    private long getPresenceScan( PresenceNode node ) throws NamingException
+    private long getPresenceScan( PresenceNode node ) throws Exception
     {
         if ( db.hasUserIndexOn( node.getAttribute() ) )
         {
             Index idx = db.getExistanceIndex();
-            try
-            {
-                int count = idx.count( node.getAttribute() );
-            }
-            catch ( java.io.IOException e )
-            {
-                e.printStackTrace();  //To change body of catch statement use File | Settings
| File Templates.
-            }
-            return Long.valueOf( count );
+            return idx.count( node.getAttribute() );
         }
 
         return Long.MAX_VALUE;
@@ -365,7 +339,7 @@
      * @return the scan count for scope
      * @throws NamingException if any errors result
      */
-    private long getScopeScan( ScopeNode node ) throws NamingException
+    private long getScopeScan( ScopeNode node ) throws Exception
     {
         switch ( node.getScope() )
         {
@@ -374,10 +348,10 @@
             
             case ( SearchControls.ONELEVEL_SCOPE  ):
                 Long id = db.getEntryId( node.getBaseDn() );
-                return Long.valueOf( db.getChildCount( id ) );
+                return db.getChildCount( id );
                 
             case ( SearchControls.SUBTREE_SCOPE  ):
-                return Long.valueOf( db.count() );
+                return db.count();
             
             default:
                 throw new IllegalArgumentException( "Unrecognized search scope " + "value
for filter scope node" );

Modified: directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultSearchEngine.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultSearchEngine.java?rev=616488&r1=616487&r2=616488&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultSearchEngine.java
(original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultSearchEngine.java
Tue Jan 29 11:14:49 2008
@@ -86,18 +86,11 @@
 
 
     public NamingEnumeration search( Name base, AliasDerefMode aliasDerefMode, ExprNode filter,
SearchControls searchCtls )
-        throws NamingException
+        throws Exception
     {
         Name effectiveBase;
         Long baseId = db.getEntryId( base.toString() );
-        try
-        {
-            String aliasedBase = ( String ) db.getAliasIndex().reverseLookup( baseId );
-        }
-        catch ( java.io.IOException e )
-        {
-            e.printStackTrace();  //To change body of catch statement use File | Settings
| File Templates.
-        }
+        String aliasedBase = ( String ) db.getAliasIndex().reverseLookup( baseId );
 
         // --------------------------------------------------------------------
         // Determine the eective base with aliases

Modified: directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/Optimizer.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/Optimizer.java?rev=616488&r1=616487&r2=616488&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/Optimizer.java
(original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/Optimizer.java
Tue Jan 29 11:14:49 2008
@@ -44,5 +44,5 @@
      * @param node the root of the expression node tree
      * @throws NamingException if there are failures while optimizing
      */
-    void annotate( ExprNode node ) throws NamingException;
+    void annotate( ExprNode node ) throws Exception;
 }

Modified: directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/SearchEngine.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/SearchEngine.java?rev=616488&r1=616487&r2=616488&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/SearchEngine.java
(original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/SearchEngine.java
Tue Jan 29 11:14:49 2008
@@ -82,10 +82,10 @@
      * @param filter the search filter AST root
      * @param searchCtls the JNDI search controls
      * @return enumeration over SearchResults
-     * @throws NamingException if the search fails
+     * @throws Exception if the search fails
      */
     NamingEnumeration search( Name base, AliasDerefMode aliasDerefMode, ExprNode filter,
-                              SearchControls searchCtls ) throws NamingException;
+                              SearchControls searchCtls ) throws Exception;
 
 
     /**
@@ -94,7 +94,7 @@
      * @param filter the filter root AST node
      * @param id the id of the entry to test
      * @return true if the filter passes the entry, false otherwise
-     * @throws NamingException if something goes wrong while accessing the db
+     * @throws Exception if something goes wrong while accessing the db
      */
-    boolean evaluate( ExprNode filter, Long id ) throws NamingException;
+    boolean evaluate( ExprNode filter, Long id ) throws Exception;
 }

Modified: directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java?rev=616488&r1=616487&r2=616488&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java
(original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java
Tue Jan 29 11:14:49 2008
@@ -696,7 +696,7 @@
     }
 
 
-    public Cursor<Tuple<K,V>> cursor() throws IOException
+    public Cursor<Tuple<K,V>> cursor() throws Exception
     {
         if ( allowsDuplicates )
         {

Added: directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmNoDupsCursorTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmNoDupsCursorTest.java?rev=616488&view=auto
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmNoDupsCursorTest.java
(added)
+++ directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmNoDupsCursorTest.java
Tue Jan 29 11:14:49 2008
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.directory.server.core.partition.impl.btree.jdbm;
+
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.directory.server.core.partition.impl.btree.Table;
+import org.apache.directory.server.core.partition.impl.btree.Tuple;
+import org.apache.directory.server.core.cursor.Cursor;
+import org.apache.directory.server.schema.SerializableComparator;
+import org.apache.directory.server.schema.registries.ComparatorRegistry;
+import org.apache.directory.shared.ldap.schema.syntax.ComparatorDescription;
+import org.junit.Before;
+import org.junit.After;
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;import static org.junit.Assert.assertFalse;
+
+import java.io.File;
+import java.util.Comparator;
+import java.util.Iterator;
+
+import jdbm.RecordManager;
+import jdbm.recman.BaseRecordManager;
+
+import javax.naming.NamingException;
+
+
+/**
+ * Tests the Cursor functionality of a JdbmTable when duplicate keys are not
+ * supported.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class JdbmNoDupsCursorTest
+{
+    private static final Logger LOG = LoggerFactory.getLogger( JdbmNoDupsCursorTest.class.getSimpleName()
);
+    private static final String TEST_OUTPUT_PATH = "test.output.path";
+
+    transient Table<Integer,Integer> table;
+    transient File dbFile;
+    transient RecordManager recman;
+
+
+    @Before
+    public void createTable() throws Exception
+    {
+        File tmpDir = null;
+        if ( System.getProperty( TEST_OUTPUT_PATH, null ) != null )
+        {
+            tmpDir = new File( System.getProperty( TEST_OUTPUT_PATH ) );
+        }
+
+        dbFile = File.createTempFile( getClass().getSimpleName(), "db", tmpDir );
+        recman = new BaseRecordManager( dbFile.getAbsolutePath() );
+
+        // gosh this is a terrible use of a global static variable
+        SerializableComparator.setRegistry( new MockComparatorRegistry() );
+        table = new JdbmTable<Integer,Integer>( "test", recman, new SerializableComparator<Integer>(
"" ), null, null );
+        LOG.debug( "Created new table and populated it with data" );
+    }
+
+
+    @After
+    public void destryTable() throws Exception
+    {
+        table.close();
+        table = null;
+        recman.close();
+        recman = null;
+        dbFile.deleteOnExit();
+        dbFile = null;
+    }
+
+
+    @Test
+    public void testOnEmptyTable() throws Exception
+    {
+        Cursor<Tuple<Integer,Integer>> cursor = table.cursor();
+        assertNotNull( cursor );
+        
+        assertFalse( cursor.isClosed() );
+    }
+
+
+    private class MockComparatorRegistry implements ComparatorRegistry
+    {
+        private Comparator<Integer> comparator = new Comparator<Integer>()
+        {
+            public int compare( Integer i1, Integer i2 )
+            {
+                return i1.compareTo( i2 );
+            }
+        };
+
+        public String getSchemaName( String oid ) throws NamingException
+        {
+            return null;
+        }
+
+
+        public void register( ComparatorDescription description, Comparator comparator )
throws NamingException
+        {
+        }
+
+
+        public Comparator lookup( String oid ) throws NamingException
+        {
+            return comparator;
+        }
+
+
+        public boolean hasComparator( String oid )
+        {
+            return true;
+        }
+
+
+        public Iterator<String> oidIterator()
+        {
+            return null;
+        }
+
+
+        public Iterator<ComparatorDescription> comparatorDescriptionIterator()
+        {
+            return null;
+        }
+
+
+        public void unregister( String oid ) throws NamingException
+        {
+        }
+
+
+        public void unregisterSchemaElements( String schemaName )
+        {
+        }
+
+
+        public void renameSchema( String originalSchemaName, String newSchemaName )
+        {
+        }
+    }
+}

Modified: directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableNoDuplicatesTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableNoDuplicatesTest.java?rev=616488&r1=616487&r2=616488&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableNoDuplicatesTest.java
(original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableNoDuplicatesTest.java
Tue Jan 29 11:14:49 2008
@@ -37,7 +37,6 @@
 import java.util.Iterator;
 
 import jdbm.RecordManager;
-import jdbm.helper.StringComparator;
 import jdbm.recman.BaseRecordManager;
 
 import javax.naming.NamingException;
@@ -51,7 +50,7 @@
  */
 public class JdbmTableNoDuplicatesTest
 {
-    private static final Logger LOG = LoggerFactory.getLogger( KeyCursorTest.class.getSimpleName()
);
+    private static final Logger LOG = LoggerFactory.getLogger( JdbmTableNoDuplicatesTest.class.getSimpleName()
);
     private static final String TEST_OUTPUT_PATH = "test.output.path";
 
     transient Table<Integer,Integer> table;
@@ -68,7 +67,7 @@
             tmpDir = new File( System.getProperty( TEST_OUTPUT_PATH ) );
         }
 
-        dbFile = File.createTempFile( "test", "db", tmpDir );
+        dbFile = File.createTempFile( getClass().getSimpleName(), "db", tmpDir );
         recman = new BaseRecordManager( dbFile.getAbsolutePath() );
 
         // gosh this is a terrible use of a global static variable
@@ -179,6 +178,7 @@
     
     /**
      * Let's test keys with a null or lack of any values.
+     * @throws Exception on error
      */
     @Test
     public void testNullOrEmptyKeyValue() throws Exception

Modified: directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableWithDuplicatesTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableWithDuplicatesTest.java?rev=616488&r1=616487&r2=616488&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableWithDuplicatesTest.java
(original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableWithDuplicatesTest.java
Tue Jan 29 11:14:49 2008
@@ -35,26 +35,24 @@
 import org.apache.directory.shared.ldap.schema.syntax.ComparatorDescription;
 
 import java.io.File;
-import java.io.IOException;
 import java.util.Comparator;
 import java.util.Iterator;
 
 import jdbm.RecordManager;
-import jdbm.helper.StringComparator;
 import jdbm.recman.BaseRecordManager;
 
 import javax.naming.NamingException;
 
 
 /**
- * Document me!
+ * Tests JdbmTable operations with duplicates.  Does not test Cursor capabilities.
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$, $Date$
  */
 public class JdbmTableWithDuplicatesTest
 {
-    private static final Logger LOG = LoggerFactory.getLogger( KeyCursorTest.class.getSimpleName()
);
+    private static final Logger LOG = LoggerFactory.getLogger( JdbmTableWithDuplicatesTest.class.getSimpleName()
);
     private static final String TEST_OUTPUT_PATH = "test.output.path";
     private static final int SIZE = 15;
     
@@ -62,6 +60,7 @@
     transient File dbFile;
     transient RecordManager recman;
 
+    
     @Before
     public void createTable() throws Exception
     {
@@ -71,7 +70,7 @@
             tmpDir = new File( System.getProperty( TEST_OUTPUT_PATH ) );
         }
 
-        dbFile = File.createTempFile( "JdbmTableWithDuplicatesTest", "db", tmpDir );
+        dbFile = File.createTempFile( getClass().getSimpleName(), "db", tmpDir );
         recman = new BaseRecordManager( dbFile.getAbsolutePath() );
 
         // gosh this is a terrible use of a global static variable
@@ -321,6 +320,7 @@
     
     /**
      * Let's test keys with a null or lack of any values.
+     * @throws Exception on error
      */
     @Test
     public void testNullOrEmptyKeyValueAfterDuplicateLimit() throws Exception
@@ -369,6 +369,7 @@
     
     /**
      * Let's test keys with a null or lack of any values.
+     * @throws Exception on error
      */
     @Test
     public void testNullOrEmptyKeyValue() throws Exception



Mime
View raw message