You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2006/04/15 06:25:57 UTC
svn commit: r394253 - in /incubator/servicemix/trunk:
servicemix-core/src/main/java/org/apache/servicemix/store/
servicemix-core/src/main/java/org/apache/servicemix/store/jdbc/
servicemix-core/src/main/java/org/apache/servicemix/store/memory/
servicemi...
Author: gnodet
Date: Fri Apr 14 21:25:52 2006
New Revision: 394253
URL: http://svn.apache.org/viewcvs?rev=394253&view=rev
Log:
Add a JDBC based Store implementation
Added:
incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/jdbc/
incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/jdbc/JdbcStore.java
incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/jdbc/JdbcStoreFactory.java
incubator/servicemix/trunk/servicemix-core/src/test/java/org/apache/servicemix/store/
incubator/servicemix/trunk/servicemix-core/src/test/java/org/apache/servicemix/store/jdbc/
incubator/servicemix/trunk/servicemix-core/src/test/java/org/apache/servicemix/store/jdbc/JdbcStoreTest.java
Modified:
incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/Store.java
incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/StoreFactory.java
incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/memory/MemoryStore.java
incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/memory/MemoryStoreFactory.java
incubator/servicemix/trunk/servicemix-eip/src/main/java/org/apache/servicemix/eip/EIPEndpoint.java
incubator/servicemix/trunk/servicemix-eip/src/main/java/org/apache/servicemix/eip/support/XPathPredicate.java
Modified: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/Store.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/Store.java?rev=394253&r1=394252&r2=394253&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/Store.java (original)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/Store.java Fri Apr 14 21:25:52 2006
@@ -17,20 +17,60 @@
import java.io.IOException;
+/**
+ * A Store is an interface representing a storage where objects can be
+ * put and retrieved. A store can support different features, mainly
+ * persistence, clustered or transactional.
+ *
+ * A store is not designed to be a thread-safe map. If a user tries to
+ * store an object with an existing id, the behavior is undefined.
+ *
+ * @author gnodet
+ */
public interface Store {
String PERSISTENT = "Persistent";
String CLUSTERED = "Clustered";
+ String TRANSACTIONAL = "Transactional";
+
+ /**
+ * Returns true if the store implementation supports the given feature.
+ * @param name the feature to check
+ * @return <code>true</code> if the feature is supported
+ */
public boolean hasFeature(String name);
+ /**
+ * Put an object in the store under the given id.
+ * This method must be used with caution and the behavior is
+ * unspecified if an object already exist for the same id.
+ *
+ * @param id the id of the object to store
+ * @param data the object to store
+ * @throws IOException if an error occurs
+ */
public void store(String id, Object data) throws IOException;
+ /**
+ * Put an object into the store and return the unique id that
+ * may be used at a later time to retrieve the object.
+ *
+ * @param data the object to store
+ * @return the id of the object stored
+ * @throws IOException if an error occurs
+ */
public String store(Object data) throws IOException;
+ /**
+ * Loads an object that has been previously stored under the specified key.
+ * The object is removed from the store.
+ *
+ * @param id the id of the object
+ * @return the object, or <code>null></code> if the object could not be found
+ * @throws IOException if an error occurs
+ */
public Object load(String id) throws IOException;
-
- public void remove(String id) throws IOException;
}
Modified: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/StoreFactory.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/StoreFactory.java?rev=394253&r1=394252&r2=394253&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/StoreFactory.java (original)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/StoreFactory.java Fri Apr 14 21:25:52 2006
@@ -19,8 +19,8 @@
public interface StoreFactory {
- public Store get(String name) throws IOException;
+ public Store open(String name) throws IOException;
- public void release(Store store) throws IOException;
+ public void close(Store store) throws IOException;
}
Added: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/jdbc/JdbcStore.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/jdbc/JdbcStore.java?rev=394253&view=auto
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/jdbc/JdbcStore.java (added)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/jdbc/JdbcStore.java Fri Apr 14 21:25:52 2006
@@ -0,0 +1,98 @@
+package org.apache.servicemix.store.jdbc;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.store.Store;
+
+public class JdbcStore implements Store {
+
+ private static final Log log = LogFactory.getLog(JdbcStore.class);
+
+ private JdbcStoreFactory factory;
+ private String name;
+
+ public JdbcStore(JdbcStoreFactory factory, String name) {
+ this.factory = factory;
+ this.name = name;
+ }
+
+ public boolean hasFeature(String name) {
+ return PERSISTENT.equals(name) ||
+ (CLUSTERED.equals(name) && factory.isClustered()) ||
+ (TRANSACTIONAL.equals(name) && factory.isTransactional());
+ }
+
+ public void store(String id, Object data) throws IOException {
+ log.debug("Storing object with id: " + id);
+ Connection connection = null;
+ try {
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ ObjectOutputStream out = new ObjectOutputStream(buffer);
+ out.writeObject(data);
+ out.close();
+ connection = factory.getDataSource().getConnection();
+ PreparedStatement ps = connection.prepareStatement("INSERT INTO " + factory.getTableName() + " (ID, DATA) VALUES (?, ?)");
+ ps.setString(1, name + ":" + id);
+ ps.setBytes(2, buffer.toByteArray());
+ ps.execute();
+ } catch (Exception e) {
+ throw (IOException) new IOException("Error storing object").initCause(e);
+ } finally {
+ if (connection != null) {
+ try {
+ connection.close();
+ } catch (Exception e) {
+ throw (IOException) new IOException("Error closing connection").initCause(e);
+ }
+ }
+ }
+ }
+
+ public String store(Object data) throws IOException {
+ String id = factory.getIdGenerator().generateId();
+ store(id, data);
+ return id;
+ }
+
+ public Object load(String id) throws IOException {
+ log.debug("Loading object with id: " + id);
+ Connection connection = null;
+ try {
+ connection = factory.getDataSource().getConnection();
+ PreparedStatement ps = connection.prepareStatement("SELECT DATA FROM " + factory.getTableName() + " WHERE ID = ?");
+ ps.setString(1, name + ":" + id);
+ ResultSet rs = ps.executeQuery();
+ if (rs.next()) {
+ byte[] data = rs.getBytes(1);
+ ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
+ Object result = ois.readObject();
+ ps = connection.prepareStatement("DELETE FROM " + factory.getTableName() + " WHERE ID = ?");
+ ps.setString(1, name + ":" + id);
+ ps.execute();
+ return result;
+ } else {
+ return null;
+ }
+ } catch (Exception e) {
+ throw (IOException) new IOException("Error storing object").initCause(e);
+ } finally {
+ if (connection != null) {
+ try {
+ connection.close();
+ } catch (Exception e) {
+ throw (IOException) new IOException("Error closing connection").initCause(e);
+ }
+ }
+ }
+ }
+
+}
Added: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/jdbc/JdbcStoreFactory.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/jdbc/JdbcStoreFactory.java?rev=394253&view=auto
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/jdbc/JdbcStoreFactory.java (added)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/jdbc/JdbcStoreFactory.java Fri Apr 14 21:25:52 2006
@@ -0,0 +1,162 @@
+package org.apache.servicemix.store.jdbc;
+
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.sql.DataSource;
+
+import org.apache.activemq.util.IdGenerator;
+import org.apache.ddlutils.Platform;
+import org.apache.ddlutils.PlatformFactory;
+import org.apache.ddlutils.model.Column;
+import org.apache.ddlutils.model.Database;
+import org.apache.ddlutils.model.Table;
+import org.apache.servicemix.store.Store;
+import org.apache.servicemix.store.StoreFactory;
+
+public class JdbcStoreFactory implements StoreFactory {
+
+ private boolean transactional;
+ private boolean clustered;
+ private DataSource dataSource;
+ private IdGenerator idGenerator = new IdGenerator();
+ private Map stores = new HashMap();
+ private String tableName = "SM_STORE";
+ private boolean createDataBase = true;
+ private boolean firstStore = true;
+
+ /* (non-Javadoc)
+ * @see org.apache.servicemix.store.ExchangeStoreFactory#get(java.lang.String)
+ */
+ public synchronized Store open(String name) throws IOException {
+ if (firstStore && createDataBase) {
+ firstStore = false;
+ try {
+ createDataBase();
+ } catch (Exception e) {
+ throw (IOException) new IOException("Exception while creating database").initCause(e);
+ }
+ }
+ JdbcStore store = (JdbcStore) stores.get(name);
+ if (store == null) {
+ store = new JdbcStore(this, name);
+ stores.put(name, store);
+ }
+ return store;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.servicemix.store.ExchangeStoreFactory#release(org.apache.servicemix.store.ExchangeStore)
+ */
+ public synchronized void close(Store store) throws IOException {
+ stores.remove(store);
+ }
+
+ /**
+ * @return Returns the dataSource.
+ */
+ public DataSource getDataSource() {
+ return dataSource;
+ }
+
+ /**
+ * @param dataSource The dataSource to set.
+ */
+ public void setDataSource(DataSource dataSource) {
+ this.dataSource = dataSource;
+ }
+
+ /**
+ * @return Returns the clustered.
+ */
+ public boolean isClustered() {
+ return clustered;
+ }
+
+ /**
+ * @param clustered The clustered to set.
+ */
+ public void setClustered(boolean clustered) {
+ this.clustered = clustered;
+ }
+
+ /**
+ * @return Returns the transactional.
+ */
+ public boolean isTransactional() {
+ return transactional;
+ }
+
+ /**
+ * @param transactional The transactional to set.
+ */
+ public void setTransactional(boolean transactional) {
+ this.transactional = transactional;
+ }
+
+ /**
+ * @return Returns the idGenerator.
+ */
+ public IdGenerator getIdGenerator() {
+ return idGenerator;
+ }
+
+ /**
+ * @param idGenerator The idGenerator to set.
+ */
+ public void setIdGenerator(IdGenerator idGenerator) {
+ this.idGenerator = idGenerator;
+ }
+
+ /**
+ * @return Returns the tableName.
+ */
+ public String getTableName() {
+ return tableName;
+ }
+
+ /**
+ * @param tableName The tableName to set.
+ */
+ public void setTableName(String tableName) {
+ this.tableName = tableName;
+ }
+
+ /**
+ * @return Returns the createDataBase.
+ */
+ public boolean isCreateDataBase() {
+ return createDataBase;
+ }
+
+ /**
+ * @param createDataBase The createDataBase to set.
+ */
+ public void setCreateDataBase(boolean createDataBase) {
+ this.createDataBase = createDataBase;
+ }
+
+ public void createDataBase() throws SQLException {
+ Database db = new Database();
+ db.setName("JdbcStore");
+ Table table = new Table();
+ table.setName(tableName);
+ Column id = new Column();
+ id.setName("ID");
+ id.setType("VARCHAR");
+ id.setPrimaryKey(true);
+ id.setRequired(true);
+ table.addColumn(id);
+ Column exchange = new Column();
+ exchange.setName("DATA");
+ exchange.setType("BLOB");
+ table.addColumn(exchange);
+ db.addTable(table);
+
+ Platform platform = PlatformFactory.createNewPlatformInstance(dataSource);
+ platform.createTables(db, false, true);
+ }
+
+}
Modified: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/memory/MemoryStore.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/memory/MemoryStore.java?rev=394253&r1=394252&r2=394253&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/memory/MemoryStore.java (original)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/memory/MemoryStore.java Fri Apr 14 21:25:52 2006
@@ -25,6 +25,12 @@
import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap;
+/**
+ * A simple memory store implementation based on a simple map.
+ * This store is neither clusterable, nor persistent, nor transactional.
+ *
+ * @author gnodet
+ */
public class MemoryStore implements Store {
private static final Log log = LogFactory.getLog(MemoryStore.class);
@@ -47,7 +53,7 @@
public String store(Object data) throws IOException {
String id = idGenerator.generateId();
- datas.put(id, data);
+ store(id, data);
return id;
}
@@ -55,10 +61,5 @@
log.debug("Loading object with id: " + id);
return datas.get(id);
}
-
- public void remove(String id) throws IOException {
- datas.remove(id);
- }
-
}
Modified: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/memory/MemoryStoreFactory.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/memory/MemoryStoreFactory.java?rev=394253&r1=394252&r2=394253&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/memory/MemoryStoreFactory.java (original)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/store/memory/MemoryStoreFactory.java Fri Apr 14 21:25:52 2006
@@ -31,7 +31,7 @@
/* (non-Javadoc)
* @see org.apache.servicemix.store.ExchangeStoreFactory#get(java.lang.String)
*/
- public synchronized Store get(String name) throws IOException {
+ public synchronized Store open(String name) throws IOException {
MemoryStore store = (MemoryStore) stores.get(name);
if (store == null) {
store = new MemoryStore(idGenerator);
@@ -43,9 +43,8 @@
/* (non-Javadoc)
* @see org.apache.servicemix.store.ExchangeStoreFactory#release(org.apache.servicemix.store.ExchangeStore)
*/
- public synchronized void release(Store store) throws IOException {
+ public synchronized void close(Store store) throws IOException {
stores.remove(store);
}
-
}
Added: incubator/servicemix/trunk/servicemix-core/src/test/java/org/apache/servicemix/store/jdbc/JdbcStoreTest.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/test/java/org/apache/servicemix/store/jdbc/JdbcStoreTest.java?rev=394253&view=auto
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/test/java/org/apache/servicemix/store/jdbc/JdbcStoreTest.java (added)
+++ incubator/servicemix/trunk/servicemix-core/src/test/java/org/apache/servicemix/store/jdbc/JdbcStoreTest.java Fri Apr 14 21:25:52 2006
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * 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.apache.servicemix.store.jdbc;
+
+import java.sql.Connection;
+
+import javax.sql.DataSource;
+
+import junit.framework.TestCase;
+
+import org.apache.servicemix.store.Store;
+import org.apache.servicemix.store.StoreFactory;
+import org.hsqldb.jdbc.jdbcDataSource;
+
+public class JdbcStoreTest extends TestCase {
+
+ private DataSource dataSource;
+ private Connection connection;
+ private StoreFactory factory;
+
+ protected void setUp() throws Exception {
+ jdbcDataSource ds = new jdbcDataSource();
+ ds.setDatabase("jdbc:hsqldb:mem:aname");
+ ds.setUser("sa");
+ dataSource = ds;
+ connection = dataSource.getConnection();
+ JdbcStoreFactory f = new JdbcStoreFactory();
+ f.setDataSource(dataSource);
+ factory = f;
+ }
+
+ protected void tearDown() throws Exception {
+ if (connection != null) {
+ connection.close();
+ }
+ }
+
+ public void testStoreLoad() throws Exception {
+ Store store = factory.open("store");
+ String id = store.store(new Integer(10));
+ Integer i = (Integer) store.load(id);
+ assertEquals(10, i.intValue());
+ assertNull(store.load("a"));
+ }
+}
Modified: incubator/servicemix/trunk/servicemix-eip/src/main/java/org/apache/servicemix/eip/EIPEndpoint.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-eip/src/main/java/org/apache/servicemix/eip/EIPEndpoint.java?rev=394253&r1=394252&r2=394253&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-eip/src/main/java/org/apache/servicemix/eip/EIPEndpoint.java (original)
+++ incubator/servicemix/trunk/servicemix-eip/src/main/java/org/apache/servicemix/eip/EIPEndpoint.java Fri Apr 14 21:25:52 2006
@@ -108,7 +108,7 @@
if (storeFactory == null) {
storeFactory = new MemoryStoreFactory();
}
- store = storeFactory.get(getService().toString() + getEndpoint());
+ store = storeFactory.open(getService().toString() + getEndpoint());
}
start();
}
Modified: incubator/servicemix/trunk/servicemix-eip/src/main/java/org/apache/servicemix/eip/support/XPathPredicate.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-eip/src/main/java/org/apache/servicemix/eip/support/XPathPredicate.java?rev=394253&r1=394252&r2=394253&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-eip/src/main/java/org/apache/servicemix/eip/support/XPathPredicate.java (original)
+++ incubator/servicemix/trunk/servicemix-eip/src/main/java/org/apache/servicemix/eip/support/XPathPredicate.java Fri Apr 14 21:25:52 2006
@@ -6,8 +6,6 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.servicemix.expression.JAXPBooleanXPathExpression;
-import org.apache.servicemix.jbi.jaxp.SourceTransformer;
-import org.w3c.dom.Node;
/**
* @author gnodet