blob: 36eb94907c5bf8eef545238a75565bf34e182a8c [file] [log] [blame]
/*
* Copyright (c) 2009-2013 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Stefan Winkler - initial API and implementation
* Eike Stepper - maintenance
*/
package org.eclipse.emf.cdo.tests.db;
import org.eclipse.emf.cdo.common.model.EMFUtil;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.tests.model1.Model1Factory;
import org.eclipse.emf.cdo.tests.model1.PurchaseOrder;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.util.CommitException;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.net4j.db.DBUtil;
import org.eclipse.net4j.db.jdbc.DelegatingConnection;
import org.eclipse.net4j.util.WrappedException;
import org.eclipse.net4j.util.security.IUserAware;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.util.EcoreUtil;
import java.sql.Connection;
import java.util.GregorianCalendar;
import java.util.List;
import oracle.jdbc.pool.OracleDataSource;
/**
* @author Stefan Winkler
*/
public class DBStoreTest extends AbstractCDOTest
{
public static void main(String[] args) throws Exception
{
Connection connection = null;
try
{
final String userName = "test_repo1";
OracleDataSource dataSource = OracleConfig.createDataSourceForUser(userName);
class UserConnection extends DelegatingConnection.Default implements IUserAware
{
public UserConnection(Connection delegate)
{
super(delegate);
}
public String getUserID()
{
return userName;
}
}
connection = new UserConnection(dataSource.getConnection());
List<String> names = DBUtil.getAllTableNames(connection, null);
System.out.println(names);
}
finally
{
DBUtil.close(connection);
}
}
// Bug 256462
public void testInsertNull() throws Exception
{
CDOSession s = openSession();
CDOTransaction t = s.openTransaction();
CDOResource r = t.createResource(getResourcePath("/dbStoreTest"));
Company c = Model1Factory.eINSTANCE.createCompany();
c.setName(null);
r.getContents().add(c);
t.commit();
}
public void testStoreStringTrailingBackslash()
{
storeRetrieve("foobar\\");
}
public void testStoreStringContainingBackslash()
{
storeRetrieve("foo\\bar");
}
public void testStoreStringTrailingSingleQuote()
{
storeRetrieve("foobar'");
}
public void testStoreStringContainingSingleQuote()
{
storeRetrieve("foo'bar");
}
public void testStoreStringTrailingDoubleQuote()
{
storeRetrieve("foobar\"");
}
public void testStoreStringContainingDoubleQuote()
{
storeRetrieve("foo\"bar");
}
public void testStoreStringTrailingTwoSingleQuote()
{
storeRetrieve("foobar''");
}
public void testStoreStringContainingTwoSingleQuote()
{
storeRetrieve("foo''bar");
}
// Bug 217255
public void testStoreDate() throws CommitException
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.getOrCreateResource(getResourcePath("/test"));
PurchaseOrder o = Model1Factory.eINSTANCE.createPurchaseOrder();
o.setDate(new GregorianCalendar(2008, 11, 24, 12, 34, 56).getTime());
resource.getContents().add(o);
transaction.commit();
transaction.close();
session.close();
clearCache(getRepository().getRevisionManager());
session = openSession();
CDOView view = session.openView();
resource = view.getResource(getResourcePath("/test"));
assertEquals(1, resource.getContents().size());
o = (PurchaseOrder)resource.getContents().get(0);
assertEquals(new GregorianCalendar(2008, 11, 24, 12, 34, 56).getTime(), o.getDate());
}
public void testStoreCustom() throws CommitException
{
EPackage pkg = createUniquePackage();
EDataType dt = EcoreFactory.eINSTANCE.createEDataType();
dt.setName("custom");
dt.setInstanceClass(Custom.class);
pkg.getEClassifiers().add(dt);
EClass clz = EMFUtil.createEClass(pkg, "customClass", false, false);
EAttribute att = EMFUtil.createEAttribute(clz, "customAtt", dt);
Custom cust1 = new Custom(2, 5);
Custom cust1ref = new Custom(2, 5);
Custom cust2 = new Custom(5, 2);
Custom cust2ref = new Custom(5, 2);
assertEquals(cust1ref, cust1);
assertEquals(cust2ref, cust2);
if (!isConfig(LEGACY))
{
CDOUtil.prepareDynamicEPackage(pkg);
}
{
EObject obj1 = EcoreUtil.create(clz);
EObject obj2 = EcoreUtil.create(clz);
obj1.eSet(att, cust1);
obj2.eSet(att, cust2);
CDOSession session = openSession();
session.getPackageRegistry().putEPackage(pkg);
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/test"));
resource.getContents().add(obj1);
resource.getContents().add(obj2);
transaction.commit();
transaction.close();
session.close();
}
clearCache(getRepository().getRevisionManager());
{
CDOSession session = openSession();
session.getPackageRegistry().putEPackage(pkg);
CDOView view = session.openView();
CDOResource resource = view.getResource(getResourcePath("/test"));
assertEquals(2, resource.getContents().size());
EObject obj1 = resource.getContents().get(0);
EObject obj2 = resource.getContents().get(1);
assertEquals(cust1ref, obj1.eGet(att));
assertEquals(cust2ref, obj2.eGet(att));
view.close();
session.close();
}
}
public static class Custom
{
private int first;
private int second;
public Custom(String emfString)
{
int sep = emfString.indexOf('!');
first = Integer.parseInt(emfString.substring(0, sep));
second = Integer.parseInt(emfString.substring(sep + 1));
}
public Custom(int first, int second)
{
this.first = first;
this.second = second;
}
public int getFirst()
{
return first;
}
public int getSecond()
{
return second;
}
@Override
public boolean equals(Object other)
{
if (other instanceof Custom)
{
return first == ((Custom)other).first && second == ((Custom)other).second;
}
return false;
}
@Override
public int hashCode()
{
return (first + 3 * second) % 65536;
}
// -------------------------------------------
// - EMF String serialization
@Override
public String toString()
{
return Integer.valueOf(first) + "!" + Integer.valueOf(second);
}
public static Custom valueOf(String s)
{
return new Custom(s);
}
}
private void storeRetrieve(String s)
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.getOrCreateResource(getResourcePath("/test"));
Company e = Model1Factory.eINSTANCE.createCompany();
e.setName(s);
// this escapes only the string!
// resulting string only contains one backslash
resource.getContents().add(e);
try
{
transaction.commit();
}
catch (CommitException ex)
{
throw WrappedException.wrap(ex);
}
transaction.close();
session.close();
clearCache(getRepository().getRevisionManager());
session = openSession();
CDOView view = session.openView();
resource = view.getResource(getResourcePath("/test"));
assertEquals(1, resource.getContents().size());
e = (Company)resource.getContents().get(0);
assertEquals(s, e.getName());
}
public void testUnderscoreFeature() throws Exception
{
EPackage pkg = createUniquePackage();
EClass cls = EMFUtil.createEClass(pkg, "foo", false, false);
EAttribute att = EMFUtil.createEAttribute(cls, "_bar", EcorePackage.eINSTANCE.getEString());
if (!isConfig(LEGACY))
{
CDOUtil.prepareDynamicEPackage(pkg);
}
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/test"));
EObject foo = EcoreUtil.create(cls);
foo.eSet(att, "foobar");
resource.getContents().add(foo);
transaction.commit();
session.close();
}
public void testUnderscoreClass() throws Exception
{
EPackage pkg = createUniquePackage();
EClass cls = EMFUtil.createEClass(pkg, "foo", false, false);
EAttribute att = EMFUtil.createEAttribute(cls, "_bar", EcorePackage.eINSTANCE.getEString());
if (!isConfig(LEGACY))
{
CDOUtil.prepareDynamicEPackage(pkg);
}
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/test"));
EObject foo = EcoreUtil.create(cls);
foo.eSet(att, "foobar");
resource.getContents().add(foo);
transaction.commit();
session.close();
}
}