/*
* Copyright 2009 Udai Gupta, Ralf Joachim
*
* Licensed 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.castor.cpa.test.test11;
import java.io.StringReader;
import java.util.Enumeration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.castor.cpa.test.framework.CPATestCase;
import org.castor.cpa.test.framework.xml.types.DatabaseEngineType;
import org.exolab.castor.jdo.Database;
import org.exolab.castor.jdo.OQLQuery;
import org.exolab.castor.jdo.engine.ClobImpl;
/**
* Test on BLOB and CLOB as a field type of data objects.
*/
public final class TestTypeLOB extends CPATestCase {
/** The <a href="http://jakarta.apache.org/commons/logging/">Jakarta
* Commons Logging</a> instance used for all logging. */
private static final Log LOG = LogFactory.getLog(TestTypeLOB.class);
private static final byte[] BLOB_VALUE = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
private static final String BLOB_STRING = new String(BLOB_VALUE);
private static final String CLOB_VALUE = "0123456789";
private static final String DBNAME = "test11";
private static final String MAPPING = "/org/castor/cpa/test/test11/mapping.xml";
private Database _db;
private OQLQuery _oql;
/**
* Constructor
*
* @param category The test suite of these tests
*/
public TestTypeLOB(final String name) {
super(name);
}
// Test are only included/excluded for engines that have been tested with this test suite.
public boolean include(final DatabaseEngineType engine) {
return (engine == DatabaseEngineType.DERBY)
|| (engine == DatabaseEngineType.HSQL)
|| (engine == DatabaseEngineType.MYSQL)
|| (engine == DatabaseEngineType.ORACLE)
|| (engine == DatabaseEngineType.POSTGRESQL)
|| (engine == DatabaseEngineType.SAPDB);
}
public void setUp() throws Exception {
// Open transaction in order to perform JDO operations
_db = getJDOManager(DBNAME, MAPPING).getDatabase();
// Determine if test object exists, if not create it.
// If it exists, set the name to some predefined value
// that this test will later override.
_db.begin();
_oql = _db.getOQLQuery("SELECT types FROM " + TypeLOB.class.getName()
+ " types WHERE id = $(integer)1");
// This one tests that bind performs type conversion
_oql.bind(TypeLOB.DEFAULT_ID);
Enumeration<?> enumeration = _oql.execute();
if (enumeration.hasMoreElements()) {
TypeLOB types = (TypeLOB) enumeration.nextElement();
LOG.debug("Updating object: " + types);
} else {
TypeLOB types = new TypeLOB();
types.setId(TypeLOB.DEFAULT_ID);
LOG.debug("Creating new object: " + types);
_db.create(types);
}
_db.commit();
}
public void testTypeLOB() throws Exception {
char[] cbuf = new char[CLOB_VALUE.length() + 1];
LOG.debug("Testing BLOB and CLOB fields");
_db.begin();
_oql.bind(TypeLOB.DEFAULT_ID);
Enumeration<?> enumeration = _oql.execute();
if (enumeration.hasMoreElements()) {
TypeLOB types = (TypeLOB) enumeration.nextElement();
types.setBlob(BLOB_VALUE);
types.setClob(CLOB_VALUE);
types.setClob2(new ClobImpl(new StringReader(CLOB_VALUE), CLOB_VALUE.length()));
}
_db.commit();
_db.begin();
_oql.bind(TypeLOB.DEFAULT_ID);
enumeration = _oql.execute();
if (enumeration.hasMoreElements()) {
TypeLOB types = (TypeLOB) enumeration.nextElement();
if ((types.getBlob() == null)
|| !BLOB_STRING.equals(new String(types.getBlob()))) {
LOG.error("BLOB value was not set");
fail("BLOB value was not set");
}
if (!CLOB_VALUE.equals(types.getClob())) {
LOG.error("CLOB value was not set");
fail("CLOB value was not set");
}
if (types.getClob2() == null) {
LOG.error("Clob value was not set");
fail("Clob value was not set");
} else {
long clobLen = types.getClob2().length();
int len = types.getClob2().getCharacterStream().read(cbuf);
if ((clobLen != CLOB_VALUE.length())
|| !(new String(cbuf, 0, len)).equals(CLOB_VALUE)) {
LOG.error("Clob value is wrong");
fail("Clob value mismatched!");
}
}
} else {
LOG.error("failed to load object");
fail("failed to load object");
}
_db.commit();
LOG.debug("OK: BLOB and CLOB fields passed");
}
}