You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ay...@apache.org on 2012/04/19 17:13:30 UTC
svn commit: r1327984 - in /cxf/trunk/rt/ws/rm/src:
main/java/org/apache/cxf/ws/rm/persistence/jdbc/
main/resources/schemas/configuration/
test/java/org/apache/cxf/ws/rm/persistence/jdbc/
Author: ay
Date: Thu Apr 19 15:13:29 2012
New Revision: 1327984
URL: http://svn.apache.org/viewvc?rev=1327984&view=rev
Log:
[CXF-4249] Make RMTxStore's current schema name to be configurable
Added:
cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStoreTwoSchemasTest.java (with props)
Modified:
cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStore.java
cxf/trunk/rt/ws/rm/src/main/resources/schemas/configuration/wsrm-manager.xsd
cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStoreConfigurationTest.java
Modified: cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStore.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStore.java?rev=1327984&r1=1327983&r2=1327984&view=diff
==============================================================================
--- cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStore.java (original)
+++ cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStore.java Thu Apr 19 15:13:29 2012
@@ -41,6 +41,7 @@ import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;
+import java.util.regex.Pattern;
import javax.annotation.PostConstruct;
@@ -136,6 +137,9 @@ public class RMTxStore implements RMStor
"SELECT MSG_NO, SEND_TO, CONTENT FROM {0} WHERE SEQ_ID = ?";
private static final String ALTER_TABLE_STMT_STR =
"ALTER TABLE {0} ADD {1} {2}";
+ private static final String CREATE_SCHEMA_STMT_STR = "CREATE SCHEMA {0}";
+ private static final String SET_CURRENT_SCHEMA_STMT_STR = "SET CURRENT SCHEMA {0}";
+
private static final String DERBY_TABLE_EXISTS_STATE = "X0Y32";
private static final int ORACLE_TABLE_EXISTS_CODE = 955;
@@ -165,6 +169,7 @@ public class RMTxStore implements RMStor
private String url = MessageFormat.format("jdbc:derby:{0};create=true", DEFAULT_DATABASE_NAME);
private String userName;
private String password;
+ private String schemaName;
private String tableExistsState = DERBY_TABLE_EXISTS_STATE;
private int tableExistsCode = ORACLE_TABLE_EXISTS_CODE;
@@ -203,6 +208,18 @@ public class RMTxStore implements RMStor
return userName;
}
+ public String getSchemaName() {
+ return schemaName;
+ }
+
+ public void setSchemaName(String sn) {
+ if (sn == null || Pattern.matches("[a-zA-Z\\d]{1,32}", sn)) {
+ schemaName = sn;
+ } else {
+ throw new IllegalArgumentException("Invalid schema name: " + sn);
+ }
+ }
+
public String getTableExistsState() {
return tableExistsState;
}
@@ -736,6 +753,30 @@ public class RMTxStore implements RMStor
}
}
}
+
+ protected void setCurrentSchema() throws SQLException {
+ if (schemaName == null || connection == null) {
+ return;
+ }
+
+ Statement stmt = connection.createStatement();
+ // schemaName has been verified at setSchemaName(String)
+ try {
+ stmt.executeUpdate(MessageFormat.format(CREATE_SCHEMA_STMT_STR,
+ schemaName));
+ } catch (SQLException ex) {
+ // pass through to assume it is already created
+ }
+ stmt.close();
+ stmt = connection.createStatement();
+ try {
+ stmt.executeUpdate(MessageFormat.format(SET_CURRENT_SCHEMA_STMT_STR,
+ schemaName));
+ } catch (SQLException ex) {
+ throw ex;
+ }
+ stmt.close();
+ }
@PostConstruct
public synchronized void init() {
@@ -755,7 +796,6 @@ public class RMTxStore implements RMStor
try {
LOG.log(Level.FINE, "Using url: " + url);
connection = DriverManager.getConnection(url, userName, password);
-
} catch (SQLException ex) {
LogUtils.log(LOG, Level.SEVERE, "CONNECT_EXC", ex);
return;
@@ -764,6 +804,7 @@ public class RMTxStore implements RMStor
try {
connection.setAutoCommit(true);
+ setCurrentSchema();
createTables();
} catch (SQLException ex) {
LogUtils.log(LOG, Level.SEVERE, "CONNECT_EXC", ex);
Modified: cxf/trunk/rt/ws/rm/src/main/resources/schemas/configuration/wsrm-manager.xsd
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/ws/rm/src/main/resources/schemas/configuration/wsrm-manager.xsd?rev=1327984&r1=1327983&r2=1327984&view=diff
==============================================================================
--- cxf/trunk/rt/ws/rm/src/main/resources/schemas/configuration/wsrm-manager.xsd (original)
+++ cxf/trunk/rt/ws/rm/src/main/resources/schemas/configuration/wsrm-manager.xsd Thu Apr 19 15:13:29 2012
@@ -168,6 +168,13 @@
</xs:documentation>
</xs:annotation>
</xs:attribute>
+ <xs:attribute name="schemaName" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ The default schema name.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
</xs:extension>
</xs:complexContent>
</xs:complexType>
Modified: cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStoreConfigurationTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStoreConfigurationTest.java?rev=1327984&r1=1327983&r2=1327984&view=diff
==============================================================================
--- cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStoreConfigurationTest.java (original)
+++ cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStoreConfigurationTest.java Thu Apr 19 15:13:29 2012
@@ -46,6 +46,7 @@ public class RMTxStoreConfigurationTest
assertEquals("scott", store.getUserName());
assertEquals("tiger", store.getPassword());
assertEquals("jdbc:derby://localhost:1527/rmdb;create=true", store.getUrl());
+ assertNull("schema should be unset", store.getSchemaName());
}
@Test
Added: cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStoreTwoSchemasTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStoreTwoSchemasTest.java?rev=1327984&view=auto
==============================================================================
--- cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStoreTwoSchemasTest.java (added)
+++ cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStoreTwoSchemasTest.java Thu Apr 19 15:13:29 2012
@@ -0,0 +1,138 @@
+/**
+ * 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.cxf.ws.rm.persistence.jdbc;
+
+import java.text.MessageFormat;
+
+import org.apache.cxf.ws.rm.ProtocolVariation;
+import org.apache.cxf.ws.rm.SourceSequence;
+import org.apache.cxf.ws.rm.v200702.Identifier;
+import org.easymock.EasyMock;
+import org.easymock.IMocksControl;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class RMTxStoreTwoSchemasTest extends Assert {
+ private static final String TEST_DB_NAME = "rmdb3";
+
+ private static final String CLIENT_ENDPOINT_ID =
+ "{http://apache.org/greeter_control}GreeterService/GreeterPort";
+
+ private static RMTxStore store1;
+ private static RMTxStore store2;
+
+ private IMocksControl control;
+
+ @BeforeClass
+ public static void setUpOnce() {
+ RMTxStore.deleteDatabaseFiles(TEST_DB_NAME, true);
+
+ store1 = createStore("ONE");
+ store2 = createStore("TWO");
+ }
+
+ @AfterClass
+ public static void tearDownOnce() {
+ RMTxStore.deleteDatabaseFiles(TEST_DB_NAME, false);
+ }
+
+ private static RMTxStore createStore(String sn) {
+ RMTxStore store = new RMTxStore();
+ store.setDriverClassName("org.apache.derby.jdbc.EmbeddedDriver");
+
+ // workaround for the db file deletion problem during the tests
+ store.setUrl(MessageFormat.format("jdbc:derby:{0};create=true", TEST_DB_NAME));
+
+ // use the specified schema
+ store.setSchemaName(sn);
+ store.init();
+
+ return store;
+ }
+
+ @Before
+ public void setUp() {
+ control = EasyMock.createNiceControl();
+ }
+
+ @Test
+ public void testSetCurrentSchema() throws Exception {
+ // schema should have been set during initialisation
+ // but verify the operation is idempotent
+ store1.setCurrentSchema();
+ }
+
+ @Test
+ public void testStoreIsolation() throws Exception {
+ SourceSequence seq = control.createMock(SourceSequence.class);
+ Identifier sid1 = new Identifier();
+ sid1.setValue("sequence1");
+ EasyMock.expect(seq.getIdentifier()).andReturn(sid1);
+ EasyMock.expect(seq.getExpires()).andReturn(null);
+ EasyMock.expect(seq.getOfferingSequenceIdentifier()).andReturn(null);
+ EasyMock.expect(seq.getEndpointIdentifier()).andReturn(CLIENT_ENDPOINT_ID);
+ EasyMock.expect(seq.getProtocol()).andReturn(ProtocolVariation.RM10WSA200408);
+
+ control.replay();
+ store1.createSourceSequence(seq);
+ control.verify();
+
+ SourceSequence rseq = store1.getSourceSequence(sid1);
+ assertNotNull(rseq);
+
+ rseq = store2.getSourceSequence(sid1);
+ assertNull(rseq);
+
+ control.reset();
+ EasyMock.expect(seq.getIdentifier()).andReturn(sid1);
+ EasyMock.expect(seq.getExpires()).andReturn(null);
+ EasyMock.expect(seq.getOfferingSequenceIdentifier()).andReturn(null);
+ EasyMock.expect(seq.getEndpointIdentifier()).andReturn(CLIENT_ENDPOINT_ID);
+ EasyMock.expect(seq.getProtocol()).andReturn(ProtocolVariation.RM10WSA200408);
+
+ control.replay();
+ store2.createSourceSequence(seq);
+ control.verify();
+
+ rseq = store2.getSourceSequence(sid1);
+ assertNotNull(rseq);
+
+ // create another store
+ RMTxStore store3 = createStore(null);
+ store3.init();
+
+ rseq = store3.getSourceSequence(sid1);
+ assertNull(rseq);
+
+ // switch to the store1's schema
+ store3.setSchemaName(store1.getSchemaName());
+ store3.init();
+
+ rseq = store3.getSourceSequence(sid1);
+ assertNotNull(rseq);
+ }
+}
\ No newline at end of file
Propchange: cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/persistence/jdbc/RMTxStoreTwoSchemasTest.java
------------------------------------------------------------------------------
svn:executable = *