package org.jboss.as.test.manualmode.weld.extension;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.BeforeShutdown;
import javax.enterprise.inject.spi.Extension;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.transaction.TransactionSynchronizationRegistry;
import javax.transaction.UserTransaction;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author Ryan Emerson
*/
public class BeforeShutdownExtension implements Extension {
private UserTransaction userTx = null;
private TransactionSynchronizationRegistry txSynchRegistry = null;
void lookupBeforeShutdown(@Observes final BeforeShutdown beforeShutdown) throws Exception {
try {
userTx = lookup("java:jboss/UserTransaction");
userTx.getStatus();
txSynchRegistry = lookup("java:jboss/TransactionSynchronizationRegistry");
txSynchRegistry.getTransactionStatus();
} catch (Exception e) {
writeOutput(e);
throw e;
}
writeOutput(null);
}
private <T> T lookup(String jndiName) {
try {
InitialContext initialContext = new InitialContext();
return (T) initialContext.lookup(jndiName);
} catch (NamingException e) {
throw new IllegalArgumentException(e);
}
}
// Necessary so that BeforeShutdownJNDILookupTestCase can see the outcome of the BeforeShutdown JNDI lookups.
private void writeOutput(Exception exception) throws Exception {
List<String> output = new ArrayList<>();
if (exception != null) {
output.add("Exception");
output.add(exception + "," + Arrays.toString(exception.getStackTrace()));
} else {
output.add("UserTransaction");
output.add(userTx.toString());
output.add("TransactionSynchronizationRegistry");
output.add(txSynchRegistry.toString());
}
File parent = new File(BeforeShutdownJNDILookupTestCase.TEST_URL).getParentFile();
if (!parent.exists())
parent.mkdirs();
Files.write(Paths.get("", BeforeShutdownJNDILookupTestCase.TEST_URL), output, StandardOpenOption.CREATE, StandardOpenOption.WRITE);
}
}