removed AbstractGraphDatabase as RestDB superclass, introduced appropriate check at GDC.transactionIsRunning, added neo4j-1.3 dependencies

This commit is contained in:
Michael Hunger
2011-04-09 06:28:59 +02:00
parent a342a477cd
commit 7e25cf480c
16 changed files with 227 additions and 217 deletions

View File

@@ -219,7 +219,7 @@
<!-- Neo4J -->
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-community</artifactId>
<artifactId>neo4j</artifactId>
<version>${neo4j.version}</version>
</dependency>
<dependency>

View File

@@ -52,7 +52,7 @@
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-community</artifactId>
<artifactId>neo4j</artifactId>
</dependency>
<dependency>
<groupId>org.neo4j.app</groupId>

View File

@@ -1,146 +0,0 @@
/**
* Copyright 2011 the original author or authors.
*
* 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.neo4j.kernel;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.kernel.impl.core.*;
import org.neo4j.kernel.impl.nioneo.store.FileSystemAbstraction;
import org.neo4j.kernel.impl.nioneo.store.StoreId;
import org.neo4j.kernel.impl.transaction.LockManager;
import org.neo4j.kernel.impl.transaction.TxModule;
import org.neo4j.kernel.impl.transaction.xaframework.LogBufferFactory;
import org.neo4j.kernel.impl.transaction.xaframework.TxIdGenerator;
import javax.transaction.*;
import javax.transaction.xa.XAResource;
import java.util.Collections;
import java.util.Map;
/**
* @author mh
* @since 23.02.11
*/
public class RestConfig extends Config {
public RestConfig(GraphDatabaseService graphDb, String storeDir, StoreId storeId,
Map<String, String> inputParams, KernelPanicEventGenerator kpe,
TxModule txModule, LockManager lockManager, LockReleaser lockReleaser,
IdGeneratorFactory idGeneratorFactory,
TxEventSyncHookFactory txSyncHookFactory, RelationshipTypeCreator relTypeCreator,
TxIdGenerator txIdGenerator, LastCommittedTxIdSetter lastCommittedTxIdSetter,
FileSystemAbstraction fileSystem, LogBufferFactory logBufferFactory) {
super(graphDb, storeDir, storeId,
inputParams, kpe, txModule, lockManager, lockReleaser, idGeneratorFactory, txSyncHookFactory, relTypeCreator, txIdGenerator, lastCommittedTxIdSetter, fileSystem);
}
public RestConfig(AbstractGraphDatabase restGraphDatabase) {
super(restGraphDatabase, restGraphDatabase.getStoreDir(), null,
Collections.<String,String>emptyMap(),null,
new TxModule(true,null){
@Override
public TransactionManager getTxManager() {
return new NullTransactionManager();
}
},
null,null,
null,null,null,null,null,
null);
}
private static class NullTransactionManager implements TransactionManager {
private static final Transaction NULL_JAVA_TRANSACTION = new Transaction() {
@Override
public void commit() throws HeuristicMixedException, HeuristicRollbackException, RollbackException, SecurityException, SystemException {
}
@Override
public boolean delistResource(XAResource xaResource, int i) throws IllegalStateException, SystemException {
return false;
}
@Override
public boolean enlistResource(XAResource xaResource) throws IllegalStateException, RollbackException, SystemException {
return false;
}
@Override
public int getStatus() throws SystemException {
return Status.STATUS_NO_TRANSACTION;
}
@Override
public void registerSynchronization(Synchronization synchronization) throws IllegalStateException, RollbackException, SystemException {
}
@Override
public void rollback() throws IllegalStateException, SystemException {
}
@Override
public void setRollbackOnly() throws IllegalStateException, SystemException {
}
};
@Override
public void begin() throws NotSupportedException, SystemException {
}
@Override
public void commit() throws HeuristicMixedException, HeuristicRollbackException, IllegalStateException, RollbackException, SecurityException, SystemException {
}
@Override
public int getStatus() throws SystemException {
return 0;
}
@Override
public Transaction getTransaction() throws SystemException {
return NULL_JAVA_TRANSACTION;
}
@Override
public void resume(Transaction transaction) throws IllegalStateException, InvalidTransactionException, SystemException {
}
@Override
public void rollback() throws IllegalStateException, SecurityException, SystemException {
}
@Override
public void setRollbackOnly() throws IllegalStateException, SystemException {
}
@Override
public void setTransactionTimeout(int i) throws SystemException {
}
@Override
public Transaction suspend() throws SystemException {
return NULL_JAVA_TRANSACTION;
}
}
}

View File

@@ -168,6 +168,7 @@ public class RestEntity implements PropertyContainer {
@Override
public boolean equals( Object o ) {
if (o == null) return false;
if (o == this) return true;
return getClass().equals( o.getClass() ) && getId() == ( (RestEntity) o ).getId();
}

View File

@@ -22,19 +22,15 @@ import org.neo4j.graphdb.event.KernelEventHandler;
import org.neo4j.graphdb.event.TransactionEventHandler;
import org.neo4j.graphdb.index.Index;
import org.neo4j.graphdb.traversal.TraversalDescription;
import org.neo4j.kernel.AbstractGraphDatabase;
import org.neo4j.kernel.Config;
import org.neo4j.kernel.RestConfig;
import org.springframework.data.graph.neo4j.rest.support.index.RestIndexManager;
import org.springframework.data.graph.core.GraphDatabase;
import org.springframework.data.graph.core.Property;
import org.springframework.data.graph.neo4j.rest.support.index.RestIndexManager;
import javax.ws.rs.core.Response.Status;
import java.io.Serializable;
import java.net.URI;
import java.util.Map;
public class RestGraphDatabase extends AbstractGraphDatabase implements GraphDatabase {
public class RestGraphDatabase implements GraphDatabaseService, GraphDatabase {
private RestRequest restRequest;
private long propertyRefetchTimeInMillis = 1000;
@@ -170,24 +166,4 @@ public class RestGraphDatabase extends AbstractGraphDatabase implements GraphDat
public KernelEventHandler unregisterKernelEventHandler(KernelEventHandler handler) {
return handler;
}
@Override
public String getStoreDir() {
return getRestRequest().getUri().toString();
}
@Override
public Config getConfig() {
return new RestConfig(this);
}
@Override
public <T> T getManagementBean(Class<T> type) {
return null;
}
@Override
public boolean isReadOnly() {
return false;
}
}

View File

@@ -16,6 +16,7 @@
package org.springframework.data.graph.neo4j.rest.support;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.kernel.AbstractGraphDatabase;
import org.neo4j.kernel.ImpermanentGraphDatabase;
import org.neo4j.server.AddressResolver;
@@ -114,7 +115,7 @@ public class LocalTestServer {
cleaner.cleanDb();
}
public AbstractGraphDatabase getGraphDatabase() {
public GraphDatabaseService getGraphDatabase() {
return getDatabase().graph;
}
}

View File

@@ -16,12 +16,8 @@
package org.springframework.data.graph.neo4j.rest.support;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.index.IndexManager;
import org.neo4j.kernel.AbstractGraphDatabase;
import java.util.Arrays;
import java.util.HashMap;
@@ -32,9 +28,9 @@ import java.util.Map;
* @since 02.03.11
*/
public class Neo4jDatabaseCleaner {
private AbstractGraphDatabase graph;
private GraphDatabaseService graph;
public Neo4jDatabaseCleaner(AbstractGraphDatabase graph) {
public Neo4jDatabaseCleaner(GraphDatabaseService graph) {
this.graph = graph;
}

View File

@@ -120,7 +120,7 @@
<!-- Neo4J -->
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-community</artifactId>
<artifactId>neo4j</artifactId>
</dependency>
<dependency>

View File

@@ -19,6 +19,7 @@ package org.springframework.data.graph.neo4j.config;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.neo4j.kernel.AbstractGraphDatabase;
import org.neo4j.kernel.impl.transaction.SpringTransactionManager;
import org.neo4j.kernel.impl.transaction.UserTransactionImpl;
import org.springframework.beans.factory.annotation.Autowired;
@@ -31,9 +32,9 @@ import org.springframework.data.graph.core.NodeBacked;
import org.springframework.data.graph.core.RelationshipBacked;
import org.springframework.data.graph.neo4j.fieldaccess.Neo4jConversionServiceFactoryBean;
import org.springframework.data.graph.neo4j.fieldaccess.NodeDelegatingFieldAccessorFactory;
import org.springframework.data.graph.neo4j.repository.DirectGraphRepositoryFactory;
import org.springframework.data.graph.neo4j.state.NodeEntityStateFactory;
import org.springframework.data.graph.neo4j.state.RelationshipEntityStateFactory;
import org.springframework.data.graph.neo4j.repository.DirectGraphRepositoryFactory;
import org.springframework.data.graph.neo4j.support.GraphDatabaseContext;
import org.springframework.data.graph.neo4j.support.TypeRepresentationStrategyFactory;
import org.springframework.data.graph.neo4j.support.node.Neo4jNodeBacking;
@@ -47,6 +48,7 @@ import org.springframework.data.persistence.EntityInstantiator;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.jta.JtaTransactionManager;
import org.springframework.transaction.jta.UserTransactionAdapter;
import javax.persistence.EntityManagerFactory;
import javax.validation.Validator;
@@ -177,19 +179,28 @@ public class Neo4jConfiguration {
public PlatformTransactionManager transactionManager() {
if (isUsingCrossStorePersistence()) {
JpaTransactionManager jpaTm = new JpaTransactionManager(getEntityManagerFactory());
JtaTransactionManager jtaTm = new JtaTransactionManager();
jtaTm.setTransactionManager(new SpringTransactionManager(getGraphDatabaseService()));
jtaTm.setUserTransaction(new UserTransactionImpl(getGraphDatabaseService()));
JtaTransactionManager jtaTm = createJtaTransactionManager();
return new ChainedTransactionManager(jpaTm, jtaTm);
}
else {
PlatformTransactionManager transactionManager = new JtaTransactionManager();
((JtaTransactionManager)transactionManager).setTransactionManager(new SpringTransactionManager(getGraphDatabaseService()));
((JtaTransactionManager)transactionManager).setUserTransaction(new UserTransactionImpl(getGraphDatabaseService()));
return transactionManager;
return createJtaTransactionManager();
}
}
private JtaTransactionManager createJtaTransactionManager() {
JtaTransactionManager jtaTm = new JtaTransactionManager();
final GraphDatabaseService gds = getGraphDatabaseService();
if (gds instanceof AbstractGraphDatabase) {
jtaTm.setTransactionManager(new SpringTransactionManager(gds));
jtaTm.setUserTransaction(new UserTransactionImpl(gds));
} else {
final NullTransactionManager tm = new NullTransactionManager();
jtaTm.setTransactionManager(tm);
jtaTm.setUserTransaction(new UserTransactionAdapter(tm));
}
return jtaTm;
}
@Bean
public ConfigurationCheck configurationCheck() throws Exception {
return new ConfigurationCheck(graphDatabaseContext(),transactionManager());

View File

@@ -0,0 +1,108 @@
/**
* Copyright 2011 the original author or authors.
*
* 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.springframework.data.graph.neo4j.config;
import javax.transaction.*;
import javax.transaction.xa.XAResource;
/**
* @author mh
* @since 09.04.11
*/
class NullTransactionManager implements TransactionManager {
private static final Transaction NULL_JAVA_TRANSACTION = new Transaction() {
@Override
public void commit() throws HeuristicMixedException, HeuristicRollbackException, RollbackException, SecurityException, SystemException {
}
@Override
public boolean delistResource(XAResource xaResource, int i) throws IllegalStateException, SystemException {
return false;
}
@Override
public boolean enlistResource(XAResource xaResource) throws IllegalStateException, RollbackException, SystemException {
return false;
}
@Override
public int getStatus() throws SystemException {
return Status.STATUS_NO_TRANSACTION;
}
@Override
public void registerSynchronization(Synchronization synchronization) throws IllegalStateException, RollbackException, SystemException {
}
@Override
public void rollback() throws IllegalStateException, SystemException {
}
@Override
public void setRollbackOnly() throws IllegalStateException, SystemException {
}
};
@Override
public void begin() throws NotSupportedException, SystemException {
}
@Override
public void commit() throws HeuristicMixedException, HeuristicRollbackException, IllegalStateException, RollbackException, SecurityException, SystemException {
}
@Override
public int getStatus() throws SystemException {
return 0;
}
@Override
public Transaction getTransaction() throws SystemException {
return NULL_JAVA_TRANSACTION;
}
@Override
public void resume(Transaction transaction) throws IllegalStateException, InvalidTransactionException, SystemException {
}
@Override
public void rollback() throws IllegalStateException, SecurityException, SystemException {
}
@Override
public void setRollbackOnly() throws IllegalStateException, SystemException {
}
@Override
public void setTransactionTimeout(int i) throws SystemException {
}
@Override
public Transaction suspend() throws SystemException {
return NULL_JAVA_TRANSACTION;
}
}

View File

@@ -16,15 +16,11 @@
package org.springframework.data.graph.neo4j.support;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.PropertyContainer;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.index.Index;
import org.neo4j.graphdb.index.IndexManager;
import org.neo4j.graphdb.traversal.TraversalDescription;
import org.neo4j.index.impl.lucene.LuceneIndexImplementation;
import org.neo4j.kernel.AbstractGraphDatabase;
import org.neo4j.kernel.Traversal;
import org.springframework.data.graph.core.GraphDatabase;
import org.springframework.data.graph.core.Property;
@@ -37,9 +33,9 @@ import java.util.Map;
*/
public class DelegatingGraphDatabase implements GraphDatabase {
protected AbstractGraphDatabase delegate;
protected GraphDatabaseService delegate;
public DelegatingGraphDatabase(final AbstractGraphDatabase delegate) {
public DelegatingGraphDatabase(final GraphDatabaseService delegate) {
this.delegate = delegate;
}

View File

@@ -80,8 +80,12 @@ public class GraphDatabaseContext {
* @return true if a transaction manager is available and a transaction is currently running
*/
public boolean transactionIsRunning() {
if (!(graphDatabaseService instanceof AbstractGraphDatabase)) {
return true; // assume always running tx (e.g. for REST or other remotes)
}
try {
return getTxManager().getStatus() != Status.STATUS_NO_TRANSACTION;
final TransactionManager txManager = ((AbstractGraphDatabase) graphDatabaseService).getConfig().getTxModule().getTxManager();
return txManager.getStatus() != Status.STATUS_NO_TRANSACTION;
} catch (SystemException e) {
log.error("Error accessing TransactionManager", e);
return false;
@@ -194,14 +198,6 @@ public class GraphDatabaseContext {
}
/**
* @return Neo4j Transaction manager
*/
public TransactionManager getTxManager() {
return ((AbstractGraphDatabase) graphDatabaseService).getConfig().getTxModule().getTxManager();
}
/**
* Delegates to {@link GraphDatabaseService}
*/

View File

@@ -0,0 +1,72 @@
/**
* Copyright 2011 the original author or authors.
*
* 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.springframework.data.graph.neo4j.config;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.kernel.AbstractGraphDatabase;
import org.neo4j.kernel.impl.transaction.SpringTransactionManager;
import org.neo4j.kernel.impl.transaction.UserTransactionImpl;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.transaction.jta.JtaTransactionManager;
import org.springframework.transaction.jta.UserTransactionAdapter;
/**
* @author mh
* @since 09.04.11
*/
public class TestTransactionManagerFactoryBean implements FactoryBean<JtaTransactionManager> {
private GraphDatabaseService graphDatabaseService;
private JtaTransactionManager transactionManager;
@Override
public JtaTransactionManager getObject() throws Exception {
return transactionManager;
}
@Override
public Class<?> getObjectType() {
return JtaTransactionManager.class;
}
@Override
public boolean isSingleton() {
return true;
}
private JtaTransactionManager createJtaTransactionManager(GraphDatabaseService gds) {
JtaTransactionManager jtaTm = new JtaTransactionManager();
if (gds instanceof AbstractGraphDatabase) {
jtaTm.setTransactionManager(new SpringTransactionManager(gds));
jtaTm.setUserTransaction(new UserTransactionImpl(gds));
} else {
final NullTransactionManager tm = new NullTransactionManager();
jtaTm.setTransactionManager(tm);
jtaTm.setUserTransaction(new UserTransactionAdapter(tm));
}
return jtaTm;
}
public GraphDatabaseService getGraphDatabaseService() {
return graphDatabaseService;
}
public void setGraphDatabaseService(GraphDatabaseService graphDatabaseService) {
this.graphDatabaseService = graphDatabaseService;
transactionManager = createJtaTransactionManager(graphDatabaseService);
}
}

View File

@@ -22,13 +22,8 @@ import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.DynamicRelationshipType;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Path;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.index.Index;
import org.neo4j.kernel.AbstractGraphDatabase;
import org.neo4j.kernel.ImpermanentGraphDatabase;
import org.neo4j.kernel.Traversal;
import org.neo4j.kernel.impl.transaction.SpringTransactionManager;
@@ -59,7 +54,7 @@ public class Neo4jTemplateApiTest {
private Relationship relationship1;
private Node node1;
private static PlatformTransactionManager transactionManager;
private static AbstractGraphDatabase graphDatabaseService;
private static GraphDatabaseService graphDatabaseService;

View File

@@ -18,7 +18,7 @@ package org.springframework.data.graph.neo4j.template;
import org.junit.After;
import org.junit.Before;
import org.neo4j.kernel.AbstractGraphDatabase;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.kernel.ImpermanentGraphDatabase;
import org.neo4j.kernel.impl.transaction.SpringTransactionManager;
import org.springframework.data.graph.core.GraphDatabase;
@@ -30,7 +30,7 @@ public abstract class NeoApiTest {
protected GraphDatabase graph;
protected Neo4jTemplate template;
protected PlatformTransactionManager transactionManager;
private AbstractGraphDatabase graphDatabaseService;
private GraphDatabaseService graphDatabaseService;
@Before

View File

@@ -129,7 +129,7 @@
<constructor-arg ref="graphDatabaseContext" />
</bean>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<!--bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<bean class="org.neo4j.kernel.impl.transaction.SpringTransactionManager">
<constructor-arg ref="graphDatabaseService"/>
@@ -140,6 +140,10 @@
<constructor-arg ref="graphDatabaseService"/>
</bean>
</property>
</bean-->
<bean id="transactionManager" class="org.springframework.data.graph.neo4j.config.TestTransactionManagerFactoryBean">
<property name="graphDatabaseService" ref="graphDatabaseService"/>
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>