Following code gives an exception; a can't figure out how to get scrollable cursor for metadata:

import static org.junit.Assert.*;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.derby.client.am.Cursor;
import org.apache.derby.client.am.ResultSet;
import org.apache.derby.iapi.sql.Statement;
import org.apache.derby.iapi.sql.execute.CursorResultSet;
import org.apache.derby.impl.jdbc.EmbedResultSet40;
import org.apache.derby.impl.jdbc.EmbedStatement40;
import org.apache.derbyTesting.functionTests.tests.lang.CursorTest;
import org.apache.derbyTesting.junit.Derby;
import org.hamcrest.core.Is;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class DatabaseMetaDataTest {
private static java.sql.Connection derby_conn;
/**
* @throws java.lang.Exception
*/
private static java.sql.DatabaseMetaData metadata;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
derby_conn = DriverManager.getConnection("jdbc:derby:repository;create=true");
}

/**
* @throws java.lang.Exception
*/
@AfterClass
public static void tearDownAfterClass() throws Exception {
derby_conn.close();
}

/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
Statement stmt = (EmbedStatement40) derby_conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
metadata = derby_conn.getMetaData();
}

/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getSchemaTerm()}.
* @throws SQLException 
*/
@Test
public final void testGetSchemaTerm() throws SQLException {
String schemaTerm = metadata.getSchemaTerm();
assertNotNull("...", schemaTerm);
assertTrue(schemaTerm.length() > 0);
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#isCatalogAtStart()}.
* @throws SQLException 
*/
@Test
public final void testIsCatalogAtStart() throws SQLException {
boolean isAtStart = metadata.isCatalogAtStart();
assertNotNull(isAtStart);
assertTrue(isAtStart);
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getMaxColumnNameLength()}.
* @throws SQLException 
*/
@Test
public final void testGetMaxColumnNameLength() throws SQLException {
int length = metadata.getMaxColumnNameLength();
assertNotNull(length);
assertTrue("", length > 0);
assertTrue("", length > 10);
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getMaxColumnsInGroupBy()}.
*/
@Test
public final void testGetMaxColumnsInGroupBy() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getMaxColumnsInIndex()}.
*/
@Test
public final void testGetMaxColumnsInIndex() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getMaxColumnsInSelect()}.
*/
@Test
public final void testGetMaxColumnsInSelect() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getMaxColumnsInTable()}.
*/
@Test
public final void testGetMaxColumnsInTable() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getSchemas()}.
*/
@Test
public final void testGetSchemas() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getCatalogs()}.
*/
@Test
public final void testGetCatalogs() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getColumns(java.lang.String, java.lang.String, java.lang.String, java.lang.String)}.
* @throws SQLException 
*/
@Test
public final void testGetColumns() throws SQLException {
java.sql.ResultSet column_set = metadata.getColumns("APP", null, "SERVER_SHUTDOWN_TYPE", null);
column_set.relative(2);
String column_name = column_set.getString("COLUMN_NAME");
assertNotNull(column_name);
assertTrue(column_name.length()>0);
//For scrollable result set:
//column_set.absolute(1);
//assertTrue(column_set.first());
//column_set.beforeFirst();
//assertTrue(column_set.next());
//assertTrue(column_set.isFirst());
//For updatable result set:
//column_set.moveToCurrentRow();
//assertTrue(column_set.next());

}
private static int getRowCount(java.sql.ResultSet columnSet) throws SQLException
int rowCount;  
  int currentRow = columnSet.getRow();            // Get current row  
  rowCount = columnSet.last() ? columnSet.getRow() : 0; // Determine number of rows  
  if (currentRow == 0)                      // If there was no current row  
     columnSet.beforeFirst();                     // We want next() to go to first row  
  else                                      // If there WAS a current row  
     columnSet.absolute(currentRow);              // Restore it  
  return rowCount;  
}
/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getBestRowIdentifier(java.lang.String, java.lang.String, java.lang.String, int, boolean)}.
*/
@Test
public final void testGetBestRowIdentifier() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getVersionColumns(java.lang.String, java.lang.String, java.lang.String)}.
*/
@Test
public final void testGetVersionColumns() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getPrimaryKeys(java.lang.String, java.lang.String, java.lang.String)}.
* @throws SQLException 
*/
@Test
public final void testGetPrimaryKeys() throws SQLException {
java.sql.ResultSet pk_set = metadata.getPrimaryKeys("APP", null, "SERVER_SHUTDOWN_TYPE");
assertTrue(getRowCount(pk_set) > 0);
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getImportedKeys(java.lang.String, java.lang.String, java.lang.String)}.
*/
@Test
public final void testGetImportedKeys() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getExportedKeys(java.lang.String, java.lang.String, java.lang.String)}.
*/
@Test
public final void testGetExportedKeys() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getTypeInfo()}.
*/
@Test
public final void testGetTypeInfo() {
fail("Not yet implemented"); // TODO
}

}


And .next() throws an exception about undefined cursor state:

import static org.junit.Assert.*;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.derby.client.am.Cursor;
import org.apache.derby.client.am.ResultSet;
import org.apache.derby.iapi.sql.Statement;
import org.apache.derby.iapi.sql.execute.CursorResultSet;
import org.apache.derby.impl.jdbc.EmbedResultSet40;
import org.apache.derby.impl.jdbc.EmbedStatement40;
import org.apache.derby.jdbc.EmbeddedDriver;
import org.apache.derbyTesting.functionTests.tests.lang.CursorTest;
import org.apache.derbyTesting.junit.Derby;
import org.hamcrest.core.Is;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class DatabaseMetaDataTest {
private static EmbeddedDriver driver;
private static java.sql.Connection derby_conn;
/**
* @throws java.lang.Exception
*/
private static java.sql.DatabaseMetaData metadata;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
driver = new org.apache.derby.jdbc.EmbeddedDriver();
derby_conn = driver.connect("jdbc:derby:repository;create=true", null);
}

/**
* @throws java.lang.Exception
*/
@AfterClass
public static void tearDownAfterClass() throws Exception {
derby_conn.close();
}

/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
derby_conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
metadata = derby_conn.getMetaData();
}

/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getSchemaTerm()}.
* @throws SQLException 
*/
@Test
public final void testGetSchemaTerm() throws SQLException {
String schemaTerm = metadata.getSchemaTerm();
assertNotNull("...", schemaTerm);
assertTrue(schemaTerm.length() > 0);
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#isCatalogAtStart()}.
* @throws SQLException 
*/
@Test
public final void testIsCatalogAtStart() throws SQLException {
boolean isAtStart = metadata.isCatalogAtStart();
assertNotNull(isAtStart);
assertTrue(isAtStart);
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getMaxColumnNameLength()}.
* @throws SQLException 
*/
@Test
public final void testGetMaxColumnNameLength() throws SQLException {
int length = metadata.getMaxColumnNameLength();
assertNotNull(length);
assertTrue("", length > 0);
assertTrue("", length > 10);
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getMaxColumnsInGroupBy()}.
*/
@Test
public final void testGetMaxColumnsInGroupBy() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getMaxColumnsInIndex()}.
*/
@Test
public final void testGetMaxColumnsInIndex() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getMaxColumnsInSelect()}.
*/
@Test
public final void testGetMaxColumnsInSelect() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getMaxColumnsInTable()}.
*/
@Test
public final void testGetMaxColumnsInTable() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getSchemas()}.
*/
@Test
public final void testGetSchemas() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getCatalogs()}.
*/
@Test
public final void testGetCatalogs() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getColumns(java.lang.String, java.lang.String, java.lang.String, java.lang.String)}.
* @throws SQLException 
*/
@Test
public final void testGetColumns() throws SQLException {
java.sql.ResultSet column_set = metadata.getColumns("APP", null, "SERVER_SHUTDOWN_TYPE", null);
column_set.relative(2);
String column_name = column_set.getString("COLUMN_NAME");
assertNotNull(column_name);
assertTrue(column_name.length()>0);
//For scrollable result set:
//column_set.absolute(1);
//assertTrue(column_set.first());
//column_set.beforeFirst();
//assertTrue(column_set.next());
//assertTrue(column_set.isFirst());
//For updatable result set:
//column_set.moveToCurrentRow();
//assertTrue(column_set.next());

}
private static int getRowCount(java.sql.ResultSet columnSet) throws SQLException
int rowCount;  
  int currentRow = columnSet.getRow();            // Get current row  
  rowCount = columnSet.last() ? columnSet.getRow() : 0; // Determine number of rows  
  if (currentRow == 0)                      // If there was no current row  
     columnSet.beforeFirst();                     // We want next() to go to first row  
  else                                      // If there WAS a current row  
     columnSet.absolute(currentRow);              // Restore it  
  return rowCount;  
}
/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getBestRowIdentifier(java.lang.String, java.lang.String, java.lang.String, int, boolean)}.
*/
@Test
public final void testGetBestRowIdentifier() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getVersionColumns(java.lang.String, java.lang.String, java.lang.String)}.
*/
@Test
public final void testGetVersionColumns() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getPrimaryKeys(java.lang.String, java.lang.String, java.lang.String)}.
* @throws SQLException 
*/
@Test
public final void testGetPrimaryKeys() throws SQLException {
java.sql.ResultSet pk_set = metadata.getPrimaryKeys("APP", null, "SERVER_SHUTDOWN_TYPE");
assertTrue(getRowCount(pk_set) > 0);
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getImportedKeys(java.lang.String, java.lang.String, java.lang.String)}.
*/
@Test
public final void testGetImportedKeys() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getExportedKeys(java.lang.String, java.lang.String, java.lang.String)}.
*/
@Test
public final void testGetExportedKeys() {
fail("Not yet implemented"); // TODO
}

/**
* Test method for {@link org.apache.derby.client.am.DatabaseMetaData#getTypeInfo()}.
*/
@Test
public final void testGetTypeInfo() {
fail("Not yet implemented"); // TODO
}

}

In the mean time this code from Derby tests works fine:

DatabaseMetaDataTest.java:
    public void testGetColumnsReadOnly() throws Exception
    {
        ResultSet[] rs = getColumns(null, null, null, null);
        for ( int j =0 ; j<2 ; j++) {
            checkColumnsShape(rs[j], j);
            crossCheckGetColumnsAndResultSetMetaData(rs[j], false, j);
        }
    }

Please help anyone. John