Skip to content

Commit

Permalink
Implemented FORGE-1439 - Track changes mode to display verbose File C…
Browse files Browse the repository at this point in the history
…hange Output
  • Loading branch information
lincolnthree committed Jan 17, 2014
1 parent c18b699 commit 77d432d
Show file tree
Hide file tree
Showing 32 changed files with 748 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import org.jboss.forge.addon.resource.ResourceFilter;
import org.jboss.forge.addon.resource.monitor.ResourceMonitor;
import org.jboss.forge.addon.resource.transaction.ResourceTransaction;
import org.jboss.forge.addon.resource.transaction.ResourceTransactionListener;
import org.jboss.forge.furnace.spi.ListenerRegistration;

/**
* Simple {@link ResourceFactory} for working outside of a container environment.
Expand Down Expand Up @@ -87,4 +89,10 @@ public FileOperations getFileOperations()
{
return DefaultFileOperations.INSTANCE;
}

@Override
public ListenerRegistration<ResourceTransactionListener> addTransactionListener(ResourceTransactionListener listener)
{
throw new UnsupportedOperationException();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

import org.jboss.forge.addon.resource.monitor.ResourceMonitor;
import org.jboss.forge.addon.resource.transaction.ResourceTransaction;
import org.jboss.forge.addon.resource.transaction.ResourceTransactionListener;
import org.jboss.forge.furnace.spi.ListenerRegistration;

/**
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
Expand Down Expand Up @@ -64,4 +66,9 @@ public interface ResourceFactory
* The default implementation invokes the {@link File} methods where applicable
*/
FileOperations getFileOperations();

/**
* Add a {@link ResourceTransactionListener} to be notified when {@link ResourceTransaction} events occur.
*/
ListenerRegistration<ResourceTransactionListener> addTransactionListener(ResourceTransactionListener listener);
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,24 @@ public interface ResourceTransaction
public boolean isStarted();

/**
* Modify the timeout value that is associated with transactions started by subsequent invocations of the begin
* method.
* Set the the duration in seconds after which this {@link ResourceTransaction} will time out and be automatically
* rolled back. (Timeout starts when {@link #begin()} is called.)
*
* If an application has not called this method, the transaction service uses some default value for the transaction
* If an application has not called this method, the transaction service uses a default value for the transaction
* timeout.
*
* @param seconds The value of the timeout in seconds. If the value is zero, the transaction service restores the
* default value. If the value is negative a {@link ResourceTransactionException} is thrown.
*/
public void setTransactionTimeout(int seconds);

/**
* Get the the duration in seconds after which this {@link ResourceTransaction} will time out and be automatically
* rolled back. If the value returned is zero, the system is using a default timeout value. (Timeout starts when
* {@link #begin()} is called.)
*/
public int getTransactionTimeout();

/**
* The changes associated with this transaction.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.addon.resource.transaction;

import java.util.Set;

import org.jboss.forge.addon.resource.Resource;
import org.jboss.forge.addon.resource.events.ResourceEvent;

/**
* Listener for observing events of the {@link ResourceTransaction} lifecycle.
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public interface ResourceTransactionListener
{
/**
* Triggered {@link ResourceTransaction#begin()} is called successfully.
*/
void transactionStarted(ResourceTransaction transaction);

/**
* Triggered {@link ResourceTransaction#commit()} is called successfully, passing the {@link Set} of {@link Resource}
* instances changed during the transaction.
*/
void transactionCommitted(ResourceTransaction transaction, Set<ResourceEvent> changeSet);

/**
* Triggered {@link ResourceTransaction#rollback()} is called successfully.
*/
void transactionRolledBack(ResourceTransaction transaction);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@
import org.jboss.forge.addon.resource.DirectoryResource;
import org.jboss.forge.addon.resource.Resource;
import org.jboss.forge.addon.resource.ResourceFilter;
import org.jboss.forge.furnace.util.Assert;

/**
* A set of utilities to work with the resources API.
*
*
* @author Mike Brock
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
* @author Vineet Reynolds
Expand All @@ -26,7 +27,7 @@ public class ResourceUtil
{
/**
* A simple utility method to locate the outermost contextual File reference for the specified resource.
*
*
* @param r resource instance.
* @return outermost relevant file context.
*/
Expand Down Expand Up @@ -77,7 +78,7 @@ public static boolean isChildOf(final Resource<?> parent, final Resource<?> isCh
@SuppressWarnings("unchecked")
public static <E extends Resource<?>, R extends Collection<E>> R filter(ResourceFilter filter, Collection<E> list)
{
List<E> result = new ArrayList<E>();
List<E> result = new ArrayList<>();
for (E resource : list)
{
if (filter.accept(resource))
Expand All @@ -104,4 +105,18 @@ public boolean accept(Resource<?> resource)
return (R) filter(filter, list);
}

public static boolean isParentOf(Resource<?> parent, Resource<?> child)
{
Assert.notNull(parent, "Parent resource must not be null.");
Assert.notNull(child, "Child resource must not be null.");

while (child.getParent() != null)
{
if (parent == child.getParent() || parent.equals(child.getParent()))
return true;

child = child.getParent();
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@

import org.jboss.forge.addon.resource.monitor.FileMonitor;
import org.jboss.forge.addon.resource.monitor.ResourceMonitor;
import org.jboss.forge.addon.resource.transaction.ResourceTransactionListener;
import org.jboss.forge.addon.resource.transaction.file.FileResourceTransactionImpl;
import org.jboss.forge.addon.resource.transaction.file.FileResourceTransactionManager;
import org.jboss.forge.addon.resource.util.RelatedClassComparator;
import org.jboss.forge.furnace.addons.AddonRegistry;
import org.jboss.forge.furnace.services.Imported;
import org.jboss.forge.furnace.spi.ListenerRegistration;
import org.jboss.forge.furnace.util.Assert;

/**
Expand Down Expand Up @@ -121,4 +123,10 @@ public FileOperations getFileOperations()
return DefaultFileOperations.INSTANCE;
}
}

@Override
public ListenerRegistration<ResourceTransactionListener> addTransactionListener(ResourceTransactionListener listener)
{
return transactionManager.addTransactionListener(listener);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.jboss.forge.addon.resource.FileOperations;
import org.jboss.forge.addon.resource.Resource;
Expand All @@ -27,6 +29,7 @@
import org.jboss.forge.addon.resource.events.ResourceModified;
import org.jboss.forge.addon.resource.transaction.ResourceTransaction;
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.xadisk.additional.XAFileInputStreamWrapper;
import org.xadisk.additional.XAFileOutputStreamWrapper;
Expand All @@ -47,17 +50,23 @@
* 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
{
private static final Logger log = Logger.getLogger(FileResourceTransactionImpl.class.getName());

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

private volatile Session session;
private int timeout;
private int timeout = 0;

public FileResourceTransactionImpl(XAFileSystem fileSystem, ResourceFactory resourceFactory)
public FileResourceTransactionImpl(FileResourceTransactionManager manager, XAFileSystem fileSystem,
ResourceFactory resourceFactory)
{
this.manager = manager;
this.fileSystem = fileSystem;
this.resourceFactory = resourceFactory;
}
Expand All @@ -66,10 +75,23 @@ public FileResourceTransactionImpl(XAFileSystem fileSystem, ResourceFactory reso
public void begin() throws ResourceTransactionException
{
this.session = fileSystem.createSessionForLocalTransaction();
if (timeout != 0)
if (timeout > 0)
{
this.session.setTransactionTimeout(timeout);
}

for (ResourceTransactionListener listener : manager.getTransactionListeners())
{
try
{
listener.transactionStarted(this);
}
catch (Exception e)
{
log.log(Level.SEVERE, "Error encountered while notifying ResourceTransactionListener: ["
+ listener + "]", e);
}
}
}

@Override
Expand All @@ -78,7 +100,21 @@ public void commit() throws ResourceTransactionException
assertSessionCreated();
try
{
Set<ResourceEvent> changeSet = getChangeSet();
session.commit();

for (ResourceTransactionListener listener : manager.getTransactionListeners())
{
try
{
listener.transactionCommitted(this, changeSet);
}
catch (Exception e)
{
log.log(Level.SEVERE, "Error encountered while notifying ResourceTransactionListener: ["
+ listener + "]", e);
}
}
}
catch (NoTransactionAssociatedException e)
{
Expand All @@ -97,6 +133,19 @@ public void rollback() throws ResourceTransactionException
try
{
session.rollback();

for (ResourceTransactionListener listener : manager.getTransactionListeners())
{
try
{
listener.transactionRolledBack(this);
}
catch (Exception e)
{
log.log(Level.SEVERE, "Error encountered while notifying ResourceTransactionListener: ["
+ listener + "]", e);
}
}
}
catch (NoTransactionAssociatedException e)
{
Expand Down Expand Up @@ -399,6 +448,12 @@ public void setTransactionTimeout(int seconds)
this.timeout = seconds;
}

@Override
public int getTransactionTimeout()
{
return this.session == null ? timeout : this.session.getTransactionTimeout();
}

@Override
public void deleteFileOnExit(File file)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

Expand All @@ -17,9 +19,11 @@
import javax.inject.Singleton;

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;
Expand All @@ -33,12 +37,14 @@
@Singleton
public class FileResourceTransactionManager
{
private Logger logger = Logger.getLogger(getClass().getName());
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();
Expand Down Expand Up @@ -73,9 +79,29 @@ public FileResourceTransactionImpl getCurrentTransaction(ResourceFactory resourc
Assert.notNull(fileSystem, "FileSystem was not yet initialized. Is the Furnace container running?");
if (transaction == null)
{
transaction = new FileResourceTransactionImpl(fileSystem, resourceFactory);
transaction = new FileResourceTransactionImpl(this, fileSystem, resourceFactory);
}
return transaction;
}

public ListenerRegistration<ResourceTransactionListener> addTransactionListener(
final ResourceTransactionListener listener)
{
listeners.add(listener);
return new ListenerRegistration<ResourceTransactionListener>()
{
@Override
public ResourceTransactionListener removeListener()
{
listeners.remove(listener);
return listener;
}
};
}

public List<ResourceTransactionListener> getTransactionListeners()
{
return listeners;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public final boolean isEnabled(UIContext context)
return (context instanceof ShellContext) && isEnabled((ShellContext) context);
}

// This method is meant to be overriden
// This method is meant to be overridden
public boolean isEnabled(ShellContext context)
{
return true;
Expand All @@ -49,7 +49,7 @@ protected ProjectFactory getProjectFactory()
{
return projectFactory;
}

@Override
protected boolean isProjectRequired()
{
Expand Down

0 comments on commit 77d432d

Please sign in to comment.