Commit 7bc7e0cc authored by Brian Long's avatar Brian Long
Browse files

Merge branch 'develop' into stable

parents 00036df1 62da2b38
Loading
Loading
Loading
Loading
+65 −14
Original line number Diff line number Diff line
@@ -43,8 +43,6 @@
		<maven.compiler.target>8</maven.compiler.target>

		<alfresco.sdk.version>4.8.0</alfresco.sdk.version>
		<alfresco.platform.version>7.4.2</alfresco.platform.version>
		<alfresco.platform.war.version>22.22</alfresco.platform.war.version>
		<aspectj.version>1.9.19</aspectj.version>
		<acs-platform.tomcat.opts>-javaagent:/var/lib/tomcat/dev/lib/aspectjweaver-${aspectj.version}.jar</acs-platform.tomcat.opts>
	</properties>
@@ -75,18 +73,6 @@
			<version>1.0.1</version>
			<type>amp</type>
		</dependency>
		<dependency>
			<groupId>javax.transaction</groupId>
			<artifactId>javax.transaction-api</artifactId>
			<version>1.3</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>jakarta.transaction</groupId>
			<artifactId>jakarta.transaction-api</artifactId>
			<version>2.0.1</version>
			<scope>provided</scope>
		</dependency>
		
		<!-- AMP resources are included in the WAR, not the extension directory; this makes aspectjweaver available to javaagent -->
		<dependency>
@@ -99,6 +85,28 @@

	<build>
		<plugins>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>build-helper-maven-plugin</artifactId>
				<version>3.6.0</version>
				<executions>
					<execution>
						<id>add-source</id>
						<goals><goal>add-source</goal></goals>
						<configuration>
							<sources>
								<source>src/main/${source.tx.path}</source>
							</sources>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					<classifier>${classifier.tx.name}</classifier>
				</configuration>
			</plugin>
			<plugin>
				<groupId>io.repaint.maven</groupId>
				<artifactId>tiles-maven-plugin</artifactId>
@@ -119,6 +127,49 @@
	</build>

	<profiles>
		<profile>
			<id>debug</id>
			<properties>
				<docker.showLogs>true</docker.showLogs>
			</properties>
		</profile>
		<profile>
			<id>javax.transaction</id>
			<activation>
				<activeByDefault>true</activeByDefault>
			</activation>
			<properties>
				<source.tx.path>javax-tx</source.tx.path>
				<classifier.tx.name>javax_tx</classifier.tx.name>
				<alfresco.platform.version>7.4.2</alfresco.platform.version>
				<alfresco.platform.war.version>22.22</alfresco.platform.war.version>
			</properties>
			<dependencies>
				<dependency>
					<groupId>javax.transaction</groupId>
					<artifactId>javax.transaction-api</artifactId>
					<version>1.3</version>
					<scope>provided</scope>
				</dependency>
			</dependencies>
		</profile>
		<profile>
			<id>jakarta.transaction</id>
			<properties>
				<source.tx.path>jakarta-tx</source.tx.path>
				<classifier.tx.name>jakarta_tx</classifier.tx.name>
				<alfresco.platform.version>23.2.1</alfresco.platform.version>
				<alfresco.platform.war.version>23.2.0.60</alfresco.platform.war.version>
			</properties>
			<dependencies>
				<dependency>
					<groupId>jakarta.transaction</groupId>
					<artifactId>jakarta.transaction-api</artifactId>
					<version>2.0.1</version>
					<scope>provided</scope>
				</dependency>
			</dependencies>
		</profile>
		<profile>
			<id>ossrh-release</id>
			<properties>
+96 −0
Original line number Diff line number Diff line
package com.inteligr8.alfresco.annotations.service.impl;

import javax.transaction.xa.XAResource;

import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
import org.alfresco.repo.transaction.TransactionListener;

import jakarta.transaction.HeuristicMixedException;
import jakarta.transaction.HeuristicRollbackException;
import jakarta.transaction.NotSupportedException;
import jakarta.transaction.RollbackException;
import jakarta.transaction.Status;
import jakarta.transaction.Synchronization;
import jakarta.transaction.SystemException;
import jakarta.transaction.Transaction;
import jakarta.transaction.UserTransaction;

public class AlfrescoTransaction implements UserTransaction, Transaction {
	
	private UserTransaction userTx;
	
	public AlfrescoTransaction(UserTransaction userTx) {
		this.userTx = userTx;
	}
	
	@Override
	public void begin() throws NotSupportedException, SystemException {
		this.userTx.begin();
	}
	
	@Override
	public void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException,
			SecurityException, IllegalStateException, SystemException {
		this.userTx.commit();
	}
	
	@Override
	public boolean delistResource(XAResource xaRes, int flag) throws IllegalStateException, SystemException {
		return false;
	}
	
	@Override
	public boolean enlistResource(XAResource xaRes) throws RollbackException, IllegalStateException, SystemException {
		return false;
	}
	
	@Override
	public int getStatus() throws SystemException {
		return this.userTx.getStatus();
	}
	
	@Override
	public void registerSynchronization(Synchronization sync)
			throws RollbackException, IllegalStateException, SystemException {
		AlfrescoTransactionSupport.bindListener(new TransactionListener() {
			@Override
			public void flush() {
			}
			
			@Override
			public void beforeCompletion() {
				sync.beforeCompletion();
			}
			
			@Override
			public void beforeCommit(boolean readOnly) {
			}
			
			@Override
			public void afterRollback() {
				sync.afterCompletion(Status.STATUS_ROLLEDBACK);
			}
			
			@Override
			public void afterCommit() {
				sync.afterCompletion(Status.STATUS_COMMITTED);
			}
		});
	}
	
	@Override
	public void rollback() throws IllegalStateException, SecurityException, SystemException {
		this.userTx.rollback();
	}
	
	@Override
	public void setRollbackOnly() throws IllegalStateException, SystemException {
		this.userTx.setRollbackOnly();
	}
	
	@Override
	public void setTransactionTimeout(int seconds) throws SystemException {
		this.userTx.setTransactionTimeout(seconds);
	}

}
+112 −0
Original line number Diff line number Diff line
package com.inteligr8.alfresco.annotations.service.impl;

import java.util.function.Supplier;

import org.alfresco.service.transaction.TransactionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import jakarta.transaction.HeuristicMixedException;
import jakarta.transaction.HeuristicRollbackException;
import jakarta.transaction.InvalidTransactionException;
import jakarta.transaction.NotSupportedException;
import jakarta.transaction.RollbackException;
import jakarta.transaction.Status;
import jakarta.transaction.SystemException;
import jakarta.transaction.Transaction;
import jakarta.transaction.TransactionManager;
import jakarta.transaction.UserTransaction;

/**
 * This bean implements a standard TransactionManager for ACS. 
 */
@Component
public class AlfrescoTransactionManager implements TransactionManager {
	
	@Autowired
	private TransactionService txService;
	
	private ThreadLocal<AlfrescoTransaction> tx = ThreadLocal.withInitial(new Supplier<AlfrescoTransaction>() {
		@Override
		public AlfrescoTransaction get() {
			return null;
		}
	});
	
	@Override
	public void begin() throws NotSupportedException, SystemException {
		UserTransaction userTx = this.txService.getNonPropagatingUserTransaction();
		AlfrescoTransaction tx = new AlfrescoTransaction(userTx);
		tx.begin();
		this.tx.set(tx);
	}
	
	@Override
	public void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException,
			SecurityException, IllegalStateException, SystemException {
		AlfrescoTransaction tx = this.tx.get();
		if (tx == null)
			throw new IllegalStateException();
		
		tx.commit();
	}
	
	@Override
	public int getStatus() throws SystemException {
		AlfrescoTransaction tx = this.tx.get();
		if (tx == null)
			return Status.STATUS_NO_TRANSACTION;
		
		return tx.getStatus();
	}
	
	@Override
	public Transaction getTransaction() throws SystemException {
		return this.tx.get();
	}
	
	@Override
	public void resume(Transaction tx) throws InvalidTransactionException, IllegalStateException, SystemException {
		if (!(tx instanceof AlfrescoTransaction))
			throw new InvalidTransactionException("An AlfrescoTransaction is expected; received: " + tx.getClass());
		if (this.tx.get() != null)
			throw new IllegalStateException();
		
		this.tx.set((AlfrescoTransaction) tx);
	}
	
	@Override
	public void rollback() throws IllegalStateException, SecurityException, SystemException {
		AlfrescoTransaction tx = this.tx.get();
		if (tx == null)
			throw new IllegalStateException();
		
		tx.rollback();
	}
	
	@Override
	public void setRollbackOnly() throws IllegalStateException, SystemException {
		AlfrescoTransaction tx = this.tx.get();
		if (tx == null)
			throw new IllegalStateException();
		
		tx.setRollbackOnly();
	}
	
	@Override
	public void setTransactionTimeout(int seconds) throws SystemException {
		AlfrescoTransaction tx = this.tx.get();
		if (tx != null)
			tx.setTransactionTimeout(seconds);
	}
	
	@Override
	public Transaction suspend() throws SystemException {
		try {
			return this.tx.get();
		} finally {
			this.tx.set(null);
		}
	}

}
+639 −0

File added.

Preview size limit exceeded, changes collapsed.

+8 −2
Original line number Diff line number Diff line
@@ -5,11 +5,17 @@ import jakarta.transaction.Transactional;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;

public class JakartaTransactionalAnnotationAdapter implements TransactionalAnnotationAdapter {
public class JtaTransactionalAnnotationAdapter implements TransactionalAnnotationAdapter {
	
	public static final String JTA_INTERFACE_NAME = "jakarta.transaction.Transactional";
	
	private final Transactional txl;
	
	public JakartaTransactionalAnnotationAdapter(Transactional txl) {
	public static JtaTransactionalAnnotationAdapter cast(Object obj) {
		return new JtaTransactionalAnnotationAdapter((Transactional) obj);
	}
	
	public JtaTransactionalAnnotationAdapter(Transactional txl) {
		this.txl = txl;
	}

Loading