Skip to content

Commit

Permalink
XADisk is now only initialized when a transaction begins
Browse files Browse the repository at this point in the history
  • Loading branch information
gastaldi committed Feb 25, 2014
1 parent 3bcd808 commit 4d70a9c
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

package org.jboss.forge.addon.resource.transaction.file;

import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
Expand All @@ -31,50 +32,53 @@
import org.jboss.forge.addon.resource.transaction.ResourceTransactionException;
import org.jboss.forge.addon.resource.transaction.ResourceTransactionListener;
import org.jboss.forge.furnace.util.Assert;
import org.jboss.forge.furnace.util.OperatingSystemUtils;
import org.xadisk.additional.XAFileInputStreamWrapper;
import org.xadisk.additional.XAFileOutputStreamWrapper;
import org.xadisk.bridge.proxies.interfaces.Session;
import org.xadisk.bridge.proxies.interfaces.XADiskBasicIOOperations.PermissionType;
import org.xadisk.bridge.proxies.interfaces.XAFileInputStream;
import org.xadisk.bridge.proxies.interfaces.XAFileOutputStream;
import org.xadisk.bridge.proxies.interfaces.XAFileSystem;
import org.xadisk.bridge.proxies.interfaces.XAFileSystemProxy;
import org.xadisk.filesystem.FileSystemStateChangeEvent;
import org.xadisk.filesystem.NativeSession;
import org.xadisk.filesystem.exceptions.DirectoryNotEmptyException;
import org.xadisk.filesystem.exceptions.FileAlreadyExistsException;
import org.xadisk.filesystem.exceptions.FileNotExistsException;
import org.xadisk.filesystem.exceptions.InsufficientPermissionOnFileException;
import org.xadisk.filesystem.exceptions.NoTransactionAssociatedException;
import org.xadisk.filesystem.standalone.StandaloneFileSystemConfiguration;

/**
* Implementation of the {@link ResourceTransaction} interface for files
*
* @author <a href="ggastald@redhat.com">George Gastaldi</a>
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public class FileResourceTransactionImpl implements ResourceTransaction, FileOperations
public class FileResourceTransactionImpl implements ResourceTransaction, FileOperations, Closeable
{
private static final Logger log = Logger.getLogger(FileResourceTransactionImpl.class.getName());

private final FileResourceTransactionManager manager;
private final XAFileSystem fileSystem;
private final ResourceFactory resourceFactory;

private XAFileSystem fileSystem;

private volatile Session session;
private int timeout = 0;

public FileResourceTransactionImpl(FileResourceTransactionManager manager, XAFileSystem fileSystem,
public FileResourceTransactionImpl(FileResourceTransactionManager manager,
ResourceFactory resourceFactory)
{
this.manager = manager;
this.fileSystem = fileSystem;
this.resourceFactory = resourceFactory;
}

@Override
public void begin() throws ResourceTransactionException
{
this.session = fileSystem.createSessionForLocalTransaction();
this.session = getFileSystem().createSessionForLocalTransaction();
if (timeout > 0)
{
this.session.setTransactionTimeout(timeout);
Expand Down Expand Up @@ -464,4 +468,39 @@ private void assertSessionCreated()
{
Assert.notNull(session, "Transaction is not started");
}

private XAFileSystem getFileSystem()
{
if (fileSystem == null)
{
File xaDiskHome = OperatingSystemUtils.createTempDir();
StandaloneFileSystemConfiguration config = new StandaloneFileSystemConfiguration(
xaDiskHome.getAbsolutePath(), "furnace-instance");
config.setTransactionTimeout(600);
// XADISK-95
if (OperatingSystemUtils.isWindows())
{
config.setSynchronizeDirectoryChanges(Boolean.FALSE);
}
this.fileSystem = XAFileSystemProxy.bootNativeXAFileSystem(config);
try
{
this.fileSystem.waitForBootup(10000);
}
catch (InterruptedException e)
{
}
}
return fileSystem;
}

@Override
public void close() throws IOException
{
if (fileSystem != null)
{
fileSystem.shutdown();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

package org.jboss.forge.addon.resource.transaction.file;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
Expand All @@ -21,14 +20,8 @@
import org.jboss.forge.addon.resource.ResourceFactory;
import org.jboss.forge.addon.resource.transaction.ResourceTransactionListener;
import org.jboss.forge.furnace.container.cdi.events.Local;
import org.jboss.forge.furnace.event.PostStartup;
import org.jboss.forge.furnace.event.PreShutdown;
import org.jboss.forge.furnace.spi.ListenerRegistration;
import org.jboss.forge.furnace.util.Assert;
import org.jboss.forge.furnace.util.OperatingSystemUtils;
import org.xadisk.bridge.proxies.interfaces.XAFileSystem;
import org.xadisk.bridge.proxies.interfaces.XAFileSystemProxy;
import org.xadisk.filesystem.standalone.StandaloneFileSystemConfiguration;

/**
*
Expand All @@ -39,33 +32,16 @@ public class FileResourceTransactionManager
{
private final Logger logger = Logger.getLogger(getClass().getName());

private XAFileSystem fileSystem;

private FileResourceTransactionImpl transaction;

private final List<ResourceTransactionListener> listeners = new CopyOnWriteArrayList<>();

public void startup(@Observes @Local PostStartup startup) throws Exception
{
File xaDiskHome = OperatingSystemUtils.createTempDir();
StandaloneFileSystemConfiguration config = new StandaloneFileSystemConfiguration(
xaDiskHome.getAbsolutePath(), "furnace-instance");
config.setTransactionTimeout(600);
// XADISK-95
if (OperatingSystemUtils.isWindows())
{
config.setSynchronizeDirectoryChanges(Boolean.FALSE);
}
this.fileSystem = XAFileSystemProxy.bootNativeXAFileSystem(config);
this.fileSystem.waitForBootup(10000);
}

public void shutdown(@Observes @Local PreShutdown shutdown)
{
if (fileSystem != null)
if (transaction != null)
try
{
fileSystem.shutdown();
transaction.close();
}
catch (IOException e)
{
Expand All @@ -76,10 +52,9 @@ public void shutdown(@Observes @Local PreShutdown shutdown)
@Produces
public FileResourceTransactionImpl getCurrentTransaction(ResourceFactory resourceFactory)
{
Assert.notNull(fileSystem, "FileSystem was not yet initialized. Is the Furnace container running?");
if (transaction == null)
{
transaction = new FileResourceTransactionImpl(this, fileSystem, resourceFactory);
transaction = new FileResourceTransactionImpl(this, resourceFactory);
}
return transaction;
}
Expand Down

0 comments on commit 4d70a9c

Please sign in to comment.