001/* 002 * Copyright (c) 2006-2013 Nuxeo SA (http://nuxeo.com/) and others. 003 * 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the Eclipse Public License v1.0 006 * which accompanies this distribution, and is available at 007 * http://www.eclipse.org/legal/epl-v10.html 008 * 009 * Contributors: 010 * Florent Guillaume 011 */ 012 013package org.nuxeo.ecm.core.storage.sql; 014 015import java.sql.Connection; 016import java.sql.DriverManager; 017import java.sql.ResultSet; 018import java.sql.Statement; 019import java.util.ArrayList; 020import java.util.HashMap; 021import java.util.List; 022import java.util.Map; 023 024import org.apache.commons.logging.Log; 025import org.apache.commons.logging.LogFactory; 026import org.nuxeo.runtime.api.Framework; 027 028public class DatabaseDB2 extends DatabaseHelper { 029 030 private static final Log log = LogFactory.getLog(DatabaseDB2.class); 031 032 public static DatabaseHelper INSTANCE = new DatabaseDB2(); 033 034 private static final String DEF_SERVER = "localhost"; 035 036 private static final String DEF_PORT = "3700"; 037 038 // 8 chars max 039 private static final String DEFAULT_DATABASE_NAME = "nuxeotst"; 040 041 private static final String DEF_USER = "db2inst1"; 042 043 private static final String DEF_PASSWORD = "db2inst1pw99"; 044 045 private static final String CONTRIB_XML = "OSGI-INF/test-repo-repository-db2-contrib.xml"; 046 047 private static final String DRIVER = "com.ibm.db2.jcc.DB2Driver"; 048 049 private static final String XA_DATASOURCE = "com.ibm.db2.jcc.DB2XADataSource"; 050 051 protected void setProperties() { 052 databaseName = DEFAULT_DATABASE_NAME; 053 Framework.getProperties().setProperty(REPOSITORY_PROPERTY, repositoryName); 054 setProperty(DATABASE_PROPERTY, databaseName); 055 setProperty(SERVER_PROPERTY, DEF_SERVER); 056 setProperty(PORT_PROPERTY, DEF_PORT); 057 setProperty(USER_PROPERTY, DEF_USER); 058 setProperty(PASSWORD_PROPERTY, DEF_PASSWORD); 059 // for sql directory tests 060 setProperty(DRIVER_PROPERTY, DRIVER); 061 String url = String.format("jdbc:db2://%s:%s/%s", Framework.getProperty(SERVER_PROPERTY), 062 Framework.getProperty(PORT_PROPERTY), Framework.getProperty(DATABASE_PROPERTY)); 063 setProperty(URL_PROPERTY, url); 064 } 065 066 @Override 067 public void setUp() throws Exception { 068 super.setUp(); 069 Class.forName(DRIVER); 070 setProperties(); 071 Connection connection = DriverManager.getConnection(Framework.getProperty(URL_PROPERTY), 072 Framework.getProperty(USER_PROPERTY), Framework.getProperty(PASSWORD_PROPERTY)); 073 doOnAllTables(connection, null, Framework.getProperty(USER_PROPERTY).toUpperCase(), "DROP TABLE \"%s\""); 074 dropSequences(connection); 075 connection.close(); 076 } 077 078 public void dropSequences(Connection connection) throws Exception { 079 List<String> sequenceNames = new ArrayList<String>(); 080 Statement st = connection.createStatement(); 081 ResultSet rs = st.executeQuery("SELECT SEQUENCE_NAME FROM USER_SEQUENCES"); 082 while (rs.next()) { 083 String sequenceName = rs.getString(1); 084 if (sequenceName.indexOf('$') != -1) { 085 continue; 086 } 087 sequenceNames.add(sequenceName); 088 } 089 rs.close(); 090 for (String sequenceName : sequenceNames) { 091 String sql = String.format("DROP SEQUENCE \"%s\"", sequenceName); 092 log.trace("SQL: " + sql); 093 st.execute(sql); 094 } 095 st.close(); 096 } 097 098 @Override 099 public String getDeploymentContrib() { 100 return CONTRIB_XML; 101 } 102 103 @Override 104 public RepositoryDescriptor getRepositoryDescriptor() { 105 RepositoryDescriptor descriptor = new RepositoryDescriptor(); 106 descriptor.xaDataSourceName = XA_DATASOURCE; 107 Map<String, String> properties = new HashMap<String, String>(); 108 properties.put("URL", Framework.getProperty(URL_PROPERTY)); 109 properties.put("User", Framework.getProperty(USER_PROPERTY)); 110 properties.put("Password", Framework.getProperty(PASSWORD_PROPERTY)); 111 descriptor.properties = properties; 112 return descriptor; 113 } 114 115 @Override 116 public boolean supportsClustering() { 117 return true; 118 } 119 120}