diff --git a/pom.xml b/pom.xml index c2a57720f23c0c9a0062bce9a3f6419f1ba3ed3c..82cd17f25199cfbb0b549c10564c59d600ebe857 100644 --- a/pom.xml +++ b/pom.xml @@ -2229,11 +2229,6 @@ </exclusion> </exclusions> </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-orm</artifactId> - <version>${org.springframework.version}</version> - </dependency> <!-- end Spring dependencies --> <!-- Start Jersey dependency --> <dependency> diff --git a/src/main/java/de/bps/course/nodes/VCCourseNode.java b/src/main/java/de/bps/course/nodes/VCCourseNode.java index 4c2549cfadd191f7317b33769556b4224842154b..86fa2b55b43cbc52c8b978e30a7441772e369bcf 100644 --- a/src/main/java/de/bps/course/nodes/VCCourseNode.java +++ b/src/main/java/de/bps/course/nodes/VCCourseNode.java @@ -143,7 +143,7 @@ public class VCCourseNode extends AbstractAccessableCourseNode { if(roles.isInstitutionalResourceManager() | roles.isAuthor()) { RepositoryManager rm = RepositoryManager.getInstance(); ICourse course = CourseFactory.loadCourse(key); - RepositoryEntry re = rm.lookupRepositoryEntry(course, false); + RepositoryEntry re = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); if (re != null) { moderator = rm.isOwnerOfRepositoryEntry(ureq.getIdentity(), re); if(!moderator) { diff --git a/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java b/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java index 1077de8f0f304552e5715ca5bffd762af5bcc862..4650ac70331b9996057f6b6f6fda2427a3acbdaf 100644 --- a/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java +++ b/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java @@ -96,7 +96,7 @@ public class QuotaManagerImpl extends QuotaManager { public void init() { quotaResource = resourceManager.findOrPersistResourceable(OresHelper.lookupType(Quota.class)); initDefaultQuotas(); // initialize default quotas - DBFactory.getInstance(false).intermediateCommit(); + DBFactory.getInstance().intermediateCommit(); log.info("Successfully initialized Quota Manager"); } diff --git a/src/main/java/org/olat/admin/sysinfo/HibernateStatisticsController.java b/src/main/java/org/olat/admin/sysinfo/HibernateStatisticsController.java index 5703801fa77728cbd0030bde221f919c9dc20660..7f38b5f08fdefe9ece45f5353d77e31164b2a338 100644 --- a/src/main/java/org/olat/admin/sysinfo/HibernateStatisticsController.java +++ b/src/main/java/org/olat/admin/sysinfo/HibernateStatisticsController.java @@ -19,7 +19,8 @@ */ package org.olat.admin.sysinfo; -import org.olat.core.commons.persistence.DBFactory; +import org.hibernate.stat.Statistics; +import org.olat.core.commons.persistence.DB; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.link.Link; @@ -28,6 +29,7 @@ import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -40,6 +42,9 @@ public class HibernateStatisticsController extends BasicController { private Link disableLink; private Link clearLink; private VelocityContainer mainVC; + + @Autowired + private DB dbInstance; public HibernateStatisticsController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl); @@ -54,8 +59,9 @@ public class HibernateStatisticsController extends BasicController { } public void loadModel() { - mainVC.contextPut("isStatisticsEnabled", DBFactory.getInstance(false).getStatistics().isStatisticsEnabled()); - mainVC.contextPut("hibernateStatistics", DBFactory.getInstance(false).getStatistics()); + Statistics statistics = dbInstance.getStatistics(); + mainVC.contextPut("isStatisticsEnabled", statistics.isStatisticsEnabled()); + mainVC.contextPut("hibernateStatistics", statistics); } @Override @@ -65,18 +71,19 @@ public class HibernateStatisticsController extends BasicController { @Override protected void event(UserRequest ureq, Component source, Event event) { + Statistics statistics = dbInstance.getStatistics(); if (source == enableLink){ - DBFactory.getInstance(false).getStatistics().setStatisticsEnabled(true); - mainVC.contextPut("isStatisticsEnabled", DBFactory.getInstance(false).getStatistics().isStatisticsEnabled()); + statistics.setStatisticsEnabled(true); + mainVC.contextPut("isStatisticsEnabled",statistics.isStatisticsEnabled()); getWindowControl().setInfo("Hibernate statistics enabled."); loadModel(); } else if (source == disableLink){ - DBFactory.getInstance(false).getStatistics().setStatisticsEnabled(false); - mainVC.contextPut("isStatisticsEnabled", DBFactory.getInstance(false).getStatistics().isStatisticsEnabled()); + statistics.setStatisticsEnabled(false); + mainVC.contextPut("isStatisticsEnabled", statistics.isStatisticsEnabled()); getWindowControl().setInfo("Hibernate statistics disabled."); loadModel(); } else if (source == clearLink){ - DBFactory.getInstance(false).getStatistics().clear(); + statistics.clear(); getWindowControl().setInfo("Hibernate statistics clear done."); loadModel(); } diff --git a/src/main/java/org/olat/commons/calendar/restapi/UserCalendarWebService.java b/src/main/java/org/olat/commons/calendar/restapi/UserCalendarWebService.java index d84e83d7bcfbdb6c9dc74e9492a906a2ad36b993..5fea001d09a0ab5cf9c8cae4a59558e39f3cc519 100644 --- a/src/main/java/org/olat/commons/calendar/restapi/UserCalendarWebService.java +++ b/src/main/java/org/olat/commons/calendar/restapi/UserCalendarWebService.java @@ -244,7 +244,7 @@ public class UserCalendarWebService { AccessResult result = acManager.isAccessible(entry, retrievedUser, false); if(result.isAccessible()) { try { - final ICourse course = CourseFactory.loadCourse(entry.getOlatResource()); + final ICourse course = CourseFactory.loadCourse(entry); CourseConfig config = course.getCourseEnvironment().getCourseConfig(); UserCourseEnvironment userCourseEnv = new UserCourseEnvironmentImpl(ienv, course.getCourseEnvironment()); diff --git a/src/main/java/org/olat/commons/coordinate/cluster/ClusterSyncer.java b/src/main/java/org/olat/commons/coordinate/cluster/ClusterSyncer.java index e838cd21adfe65127bdb8a7d01e34ca73a5b9d14..bf42ed460ea65b40952de1b983f9a3206910f164 100644 --- a/src/main/java/org/olat/commons/coordinate/cluster/ClusterSyncer.java +++ b/src/main/java/org/olat/commons/coordinate/cluster/ClusterSyncer.java @@ -25,6 +25,7 @@ package org.olat.commons.coordinate.cluster; import org.olat.core.commons.persistence.DB; +import org.olat.core.commons.services.lock.pessimistic.PessimisticLockManager; import org.olat.core.id.OLATResourceable; import org.olat.core.logging.AssertException; import org.olat.core.logging.OLog; @@ -34,7 +35,6 @@ import org.olat.core.util.coordinate.SyncerCallback; import org.olat.core.util.coordinate.SyncerExecutor; import org.olat.core.util.coordinate.util.DerivedStringSyncer; import org.olat.core.util.resource.OresHelper; -import org.olat.resource.lock.pessimistic.PessimisticLockManager; /** * Description:<br> diff --git a/src/main/java/org/olat/commons/coordinate/cluster/_spring/coordinateContext.xml b/src/main/java/org/olat/commons/coordinate/cluster/_spring/coordinateContext.xml index b88f9559b78229794b456a5cf0dca00d3226647a..96b2423896f4f66d92efd82c1bc32b9128847356 100644 --- a/src/main/java/org/olat/commons/coordinate/cluster/_spring/coordinateContext.xml +++ b/src/main/java/org/olat/commons/coordinate/cluster/_spring/coordinateContext.xml @@ -1,9 +1,14 @@ <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd"> + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context.xsd"> + + <context:component-scan base-package="org.olat.commons.coordinate.cluster.lock" /> <bean id="persistentLockManager" class="org.olat.core.util.coordinate.DBPersistentLockManager"/> @@ -27,9 +32,10 @@ <bean id="clusterLocker" class="org.olat.commons.coordinate.cluster.lock.ClusterLocker" init-method="init"> <constructor-arg index="0" ref="clusterLockManager" /> + <property name="pessimisticLockManager" ref="lockManager"/> + <property name="persistentLockManager" ref="persistentLockManager"/> <property name="syncer" ref="org.olat.commons.coordinate.cluster.ClusterSyncer" /> <property name="eventBus" ref="org.olat.commons.coordinate.cluster.jms.ClusterEventBus" /> - <property name="persistentLockManager" ref="persistentLockManager"/> </bean> <bean id="org.olat.commons.coordinate.cluster.ClusterSyncer" class="org.olat.commons.coordinate.cluster.ClusterSyncer" > @@ -48,8 +54,6 @@ <property name="jmsMsgDelayLimit" value="5000" /> </bean> - <bean id="clusterLockManager" class="org.olat.commons.coordinate.cluster.lock.ClusterLockManager"/> - <import resource="classpath:/org/olat/commons/coordinate/cluster/_spring/coordinate_jms_${jms.provider}.xml"/> </beans> \ No newline at end of file diff --git a/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java b/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java index b808331dc1ea06d30917b5ad64b27683f8bd1a4d..51554fafebdff65bcb9d76035754529818817407 100644 --- a/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java +++ b/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java @@ -62,6 +62,7 @@ import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.coordinate.SyncerExecutor; import org.olat.core.util.event.MultiUserEvent; import org.olat.core.util.resource.OresHelper; +import org.springframework.beans.factory.annotation.Autowired; /** * Description:<br> @@ -102,6 +103,9 @@ public class ClusterAdminControllerCluster extends BasicController { private UserSearchController usc; + @Autowired + private ClusterLockManager clusterLockManager; + /** * @param ureq * @param wControl @@ -333,7 +337,7 @@ public class ClusterAdminControllerCluster extends BasicController { // we configured usc to either cancel or to only accept single user selection. SingleIdentityChosenEvent sce = (SingleIdentityChosenEvent)event; Identity ident = sce.getChosenIdentity(); - ClusterLockManager.getInstance().releaseAllLocksFor(ident.getKey()); + clusterLockManager.releaseAllLocksFor(ident.getKey()); showInfo("locks.released", ident.getName()); } } diff --git a/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLockManager.java b/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLockManager.java index 41e07d03020fafc52ca18baebeeeedfa2945e29f..c51a19b46f1ecbf93570f87dcc2c0faecffdae49 100644 --- a/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLockManager.java +++ b/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLockManager.java @@ -30,8 +30,8 @@ import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; -import org.olat.core.manager.BasicManager; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; /** * @@ -42,29 +42,14 @@ import org.springframework.beans.factory.annotation.Autowired; * Initial Date: 10.12.2007 <br> * @author Felix Jost, http://www.goodsolutions.ch */ -public class ClusterLockManager extends BasicManager { - private static ClusterLockManager INSTANCE; - +@Service("clusterLockManager") +public class ClusterLockManager { + private static final OLog log = Tracing.createLoggerFor(ClusterLockManager.class); - + @Autowired private DB dbInstance; - /** - * [spring] - */ - private ClusterLockManager() { - INSTANCE = this; - } - - /** - * to be used only by the cluster package and subpackages - * @return - */ - public static ClusterLockManager getInstance() { - return INSTANCE; - } - LockImpl findLock(String asset) { log.info("findLock: "+asset+" START"); StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLocker.java b/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLocker.java index ef91b62ee60eca1ee89365985256e2501a2c7778..a7ef668ffdc7cb89b3db5a9294be9f3838837901 100644 --- a/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLocker.java +++ b/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLocker.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.List; import org.olat.core.commons.persistence.DBFactory; +import org.olat.core.commons.services.lock.pessimistic.PessimisticLockManager; import org.olat.core.gui.control.Event; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; @@ -47,7 +48,6 @@ import org.olat.core.util.coordinate.SyncerCallback; import org.olat.core.util.event.EventBus; import org.olat.core.util.event.GenericEventListener; import org.olat.core.util.resource.OresHelper; -import org.olat.resource.lock.pessimistic.PessimisticLockManager; /** * Description:<br> @@ -67,6 +67,7 @@ public class ClusterLocker implements Locker, GenericEventListener { private EventBus eventBus; private ClusterLockManager clusterLockManager; private PersistentLockManager persistentLockManager; + private PessimisticLockManager pessimisticLockManager; /** * [used by spring] * @@ -88,7 +89,7 @@ public class ClusterLocker implements Locker, GenericEventListener { //cluster:::::: on init of olat system, clear all locks?? but only the one from node in question? - + @Override public PersistentLockManager getPersistentLockManager() { return persistentLockManager; } @@ -96,6 +97,14 @@ public class ClusterLocker implements Locker, GenericEventListener { public void setPersistentLockManager(PersistentLockManager persistentLockManager) { this.persistentLockManager = persistentLockManager; } + + /** + * [used by Spring] + * @param pessimisticLockManager + */ + public void setPessimisticLockManager(PessimisticLockManager pessimisticLockManager) { + this.pessimisticLockManager = pessimisticLockManager; + } public LockResult acquireLock(final OLATResourceable ores, final Identity requestor, final String locksubkey) { final String asset = OresHelper.createStringRepresenting(ores, locksubkey); @@ -186,7 +195,7 @@ public class ClusterLocker implements Locker, GenericEventListener { // cluster:: change to useage with syncer, but we don't have the olatresourceable yet - PessimisticLockManager.getInstance().findOrPersistPLock(asset); + pessimisticLockManager.findOrPersistPLock(asset); LockImpl li = clusterLockManager.findLock(asset); if (li == null) { diff --git a/src/main/java/org/olat/commons/servlets/RSSServlet.java b/src/main/java/org/olat/commons/servlets/RSSServlet.java index f1b0a4a6397d656da998e14a7e7aa117d58a29b1..ba93d88d7b737962def168e082c48a88c9c6e543 100644 --- a/src/main/java/org/olat/commons/servlets/RSSServlet.java +++ b/src/main/java/org/olat/commons/servlets/RSSServlet.java @@ -150,7 +150,7 @@ public class RSSServlet extends HttpServlet { DispatcherModule.sendNotFound("none", response); } finally { IOUtils.closeQuietly(writer); - DBFactory.getInstance(false).commitAndCloseSession(); + DBFactory.getInstance().commitAndCloseSession(); } } diff --git a/src/main/java/org/olat/core/commons/persistence/DBFactory.java b/src/main/java/org/olat/core/commons/persistence/DBFactory.java index 98cd414b808773f5c8e557c1ec615bf06bf8f2d1..10ca638baa9ba6a6c92d5eec2f78ddb0e17187f2 100644 --- a/src/main/java/org/olat/core/commons/persistence/DBFactory.java +++ b/src/main/java/org/olat/core/commons/persistence/DBFactory.java @@ -39,14 +39,4 @@ public class DBFactory { public static DB getInstance() { return DBImpl.getInstance(); } - - public static DB getInstance(boolean initialize) { - return DBImpl.getInstance(); - } - - public static DB getInstanceForClosing() { - return DBImpl.getInstance(); - } - - } diff --git a/src/main/java/org/olat/core/commons/persistence/DBImpl.java b/src/main/java/org/olat/core/commons/persistence/DBImpl.java index 2c2b2003a898626a21c068d342a4cf3b86986988..fc1dc5fbd627f1f86a3309ac0af158e1660df22c 100644 --- a/src/main/java/org/olat/core/commons/persistence/DBImpl.java +++ b/src/main/java/org/olat/core/commons/persistence/DBImpl.java @@ -31,12 +31,13 @@ import java.sql.DriverManager; import java.sql.SQLException; import java.util.Enumeration; import java.util.List; -import java.util.Map; +import java.util.Properties; import javax.persistence.Cache; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; +import javax.persistence.Persistence; import javax.persistence.RollbackException; import org.hibernate.HibernateException; @@ -53,12 +54,7 @@ import org.olat.core.logging.AssertException; import org.olat.core.logging.DBRuntimeException; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; -import org.springframework.orm.jpa.EntityManagerFactoryUtils; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.TransactionStatus; -import org.springframework.transaction.support.DefaultTransactionDefinition; -import org.springframework.transaction.support.TransactionSynchronizationManager; + /** * A <b>DB </b> is a central place to get a Entity Managers. It acts as a @@ -74,8 +70,7 @@ public class DBImpl implements DB, Destroyable { private static DBImpl INSTANCE; private String dbVendor; - private EntityManagerFactory emf; - private PlatformTransactionManager txManager; + private static EntityManagerFactory emf; private final ThreadLocal<ThreadLocalData> data = new ThreadLocal<ThreadLocalData>(); // Max value for commit-counter, values over this limit will be logged. @@ -84,8 +79,16 @@ public class DBImpl implements DB, Destroyable { /** * [used by spring] */ - private DBImpl() { - INSTANCE = this; + public DBImpl(Properties databaseProperties) { + if(INSTANCE == null) { + INSTANCE = this; + try { + emf = Persistence.createEntityManagerFactory("default", databaseProperties); + } catch (Exception e) { + log.error("", e); + throw e; + } + } } protected static DBImpl getInstance() { @@ -118,14 +121,6 @@ public class DBImpl implements DB, Destroyable { public void setDbVendor(String dbVendor) { this.dbVendor = dbVendor; } - - public void setEntityManagerFactory(EntityManagerFactory emf) { - this.emf = emf; - } - - public void setTxManager(PlatformTransactionManager txManager) { - this.txManager = txManager; - } /** * A <b>ThreadLocalData</b> is used as a central place to store data on a per @@ -134,7 +129,7 @@ public class DBImpl implements DB, Destroyable { * @author Andreas CH. Kapp * @author Christian Guretzki */ - protected static class ThreadLocalData { + protected class ThreadLocalData { private boolean error; private Exception lastError; @@ -145,9 +140,42 @@ public class DBImpl implements DB, Destroyable { // count number of commit in db-session, used to log warn 'Call more than one commit in a db-session' private int commitCounter = 0; + private EntityManager em; + private ThreadLocalData() { // don't let any other class instantiate ThreadLocalData. } + + public EntityManager getEntityManager(boolean createIfNecessary) { + if(em == null && createIfNecessary) { + em = emf.createEntityManager(); + } + return em; + } + + public EntityManager renewEntityManager() { + if(em != null && !em.isOpen()) { + try { + em.close(); + } catch (Exception e) { + log.error("", e); + } + em = null; + } + return getEntityManager(true); + } + + public void removeEntityManager() { + em = null; + } + + public boolean hasTransaction() { + if(em != null && em.isOpen()) { + EntityTransaction trx = em.getTransaction(); + return trx != null && trx.isActive(); + } + return false; + } /** * @return true if initialized. @@ -161,6 +189,12 @@ public class DBImpl implements DB, Destroyable { } public boolean isError() { + if(em != null && em.isOpen()) { + EntityTransaction trx = em.getTransaction(); + if (trx != null && trx.isActive()) { + return trx.getRollbackOnly(); + } + } return error; } @@ -218,7 +252,7 @@ public class DBImpl implements DB, Destroyable { @Override public EntityManager getCurrentEntityManager() { //if spring has already an entity manager in this thread bounded, return it - EntityManager threadBoundedEm = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); + EntityManager threadBoundedEm = getData().getEntityManager(true); if(threadBoundedEm != null && threadBoundedEm.isOpen()) { EntityTransaction trx = threadBoundedEm.getTransaction(); //if not active begin a new one (possibly manual committed) @@ -227,10 +261,17 @@ public class DBImpl implements DB, Destroyable { } updateDataStatistics("entityManager"); return threadBoundedEm; + } else if(threadBoundedEm == null || !threadBoundedEm.isOpen()) { + threadBoundedEm = getData().renewEntityManager(); + } + + EntityTransaction trx = threadBoundedEm.getTransaction(); + //if not active begin a new one (possibly manual committed) + if(!trx.isActive()) { + trx.begin(); } - EntityManager em = getEntityManager(); updateDataStatistics("entityManager"); - return em; + return threadBoundedEm; } private Session getSession(EntityManager em) { @@ -241,61 +282,14 @@ public class DBImpl implements DB, Destroyable { return trx == null || !trx.isActive() || trx.getRollbackOnly(); } - private EntityManager getEntityManager() { - EntityManager txEm = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); - if(txEm == null) { - if(txManager != null) { - DefaultTransactionDefinition def = new DefaultTransactionDefinition(); - txManager.getTransaction(def); - txEm = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); - } else { - txEm = emf.createEntityManager(); - } - } else if(!txEm.isOpen()) { - DefaultTransactionDefinition def = new DefaultTransactionDefinition(); - def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); - txManager.getTransaction(def); - txEm = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); + private void updateDataStatistics(Object logObject) { + if (getData().getAccessCounter() > MAX_DB_ACCESS_COUNT) { + log.warn("beginTransaction bulk-change, too many db access for one transaction, could be a performance problem (add closeSession/createSession in loop) logObject=" + logObject, null); + getData().resetAccessCounter(); } else { - EntityTransaction trx = txEm.getTransaction(); - //if not active begin a new one (possibly manual committed) - if(!trx.isActive()) { - trx.begin(); - } - } - return txEm; - } - - private void updateDataStatistics(Object logObject) { - /* - //OLAT-3621: paranoia check for error state: we need to catch errors at the earliest point possible. OLAT-3621 has a suspected situation - // where an earlier transaction failed and didn't clean up nicely. To check this, we introduce error checking in getInstance here - - if (transaction != null && transaction.isActive() && transaction.getRollbackOnly() - && !Thread.currentThread().getName().equals("TaskExecutorThread")) { - INSTANCE.logWarn("beginTransaction: Transaction (still?) in Error state: "+transaction, new Exception("DBImpl begin transaction)")); - } - */ - - // increment only non-cachable query - if (logObject instanceof String ) { - String query = (String) logObject; - query = query.trim(); - if ( !query.startsWith("select count(poi) from org.olat.basesecurity.SecurityGroupMembershipImpl as sgmsi, org.olat.basesecurity.PolicyImpl as poi,") - && !query.startsWith("select count(grp) from org.olat.group.BusinessGroupImpl as grp") - && !query.startsWith("select count(sgmsi) from org.olat.basesecurity.SecurityGroupMembershipImpl as sgmsi") ) { - // it is no of cached queries - getData().incrementAccessCounter(); - } - } else { - getData().incrementAccessCounter(); - } - - if (getData().getAccessCounter() > MAX_DB_ACCESS_COUNT) { - log.warn("beginTransaction bulk-change, too many db access for one transaction, could be a performance problem (add closeSession/createSession in loop) logObject=" + logObject, null); - getData().resetAccessCounter(); + getData().incrementAccessCounter(); + } } - } /** * Close the database session. @@ -313,7 +307,7 @@ public class DBImpl implements DB, Destroyable { //commit //getCurrentEntityManager(); - EntityManager s = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); + EntityManager s = getData().getEntityManager(false); if(s != null) { EntityTransaction trx = s.getTransaction(); if(trx.isActive()) { @@ -327,13 +321,7 @@ public class DBImpl implements DB, Destroyable { trx.rollback(); } } - - TransactionSynchronizationManager.clear(); - EntityManagerFactoryUtils.closeEntityManager(s); - Map<Object,Object> map = TransactionSynchronizationManager.getResourceMap(); - if(map.containsKey(emf)) { - TransactionSynchronizationManager.unbindResource(emf); - } + s.close(); } data.remove(); } @@ -600,24 +588,11 @@ public class DBImpl implements DB, Destroyable { */ @Override public boolean isError() { - //EntityTransaction trx = getCurrentEntityManager().getTransaction(); - EntityManager em = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); - if(em != null && em.isOpen()) { - EntityTransaction trx = em.getTransaction(); - if (trx != null && trx.isActive()) { - return trx.getRollbackOnly(); - } - } - return getData() == null ? false : getData().isError(); + return getData().isError(); } private boolean hasTransaction() { - EntityManager em = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); - if(em != null && em.isOpen()) { - EntityTransaction trx = em.getTransaction(); - return trx != null && trx.isActive(); - } - return false; + return getData().hasTransaction(); } /** @@ -756,9 +731,6 @@ public class DBImpl implements DB, Destroyable { // Error when trying to commit try { if (hasTransaction()) { - TransactionStatus status = txManager.getTransaction(null); - txManager.rollback(status); - EntityTransaction trx = getCurrentEntityManager().getTransaction(); if(trx != null && trx.isActive()) { if(trx.getRollbackOnly()) { @@ -792,10 +764,6 @@ public class DBImpl implements DB, Destroyable { try { // see closeSession() and OLAT-4318: more robustness with commit/rollback/close, therefore // we check if the connection is open at this stage at all - - TransactionStatus status = txManager.getTransaction(null); - txManager.rollback(status); - EntityTransaction trx = getCurrentEntityManager().getTransaction(); if(trx != null && trx.isActive()) { if(trx.getRollbackOnly()) { diff --git a/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml b/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml index c37251cb4d057e5d2e28a3557e5b1c7dbbbbed36..40a3f75e3bfccd73ba687e5f0ea9979fbbcbae60 100644 --- a/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml +++ b/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml @@ -3,38 +3,12 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> + http://www.springframework.org/schema/beans/spring-beans.xsd"> - <!-- Persistence unit manager --> - <bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager" depends-on="databaseUpgrader"> - <property name="persistenceXmlLocations"> - <list> - <value>classpath:/org/olat/core/commons/persistence/_spring/core_persistence.xml</value> - </list> - </property> - <!-- - <property name="defaultDataSource" ref="${db.vendor}PooledDataSource"/> - --> - </bean> - - <!-- EntityManagerFactory --> - <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> - <property name="persistenceUnitManager" ref="pum"/> - <property name="jpaProperties" ref="${db.vendor}_${db.source}_HibernateProperties"/> - </bean> - <bean id="AuditInterceptor" class="org.olat.core.commons.persistence.AuditInterceptor" /> - - <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> - <property name="jpaDialect" ref="jpaDialect" /> - <property name="entityManagerFactory" ref="emf"/> - </bean> - - <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> <bean id="database" class="org.olat.core.commons.persistence.DBImpl" destroy-method="destroy"> - <property name="txManager" ref="txManager"/> - <property name="entityManagerFactory" ref="emf"/> + <constructor-arg index="0" ref="${db.vendor}_${db.source}_HibernateProperties"/> <property name="dbVendor" value="${db.vendor}" /> </bean> diff --git a/src/main/java/org/olat/resource/lock/pessimistic/PLock.java b/src/main/java/org/olat/core/commons/services/lock/pessimistic/PLock.java similarity index 94% rename from src/main/java/org/olat/resource/lock/pessimistic/PLock.java rename to src/main/java/org/olat/core/commons/services/lock/pessimistic/PLock.java index 3231b9e134bbe1cdd2301cdaf7cb5cba361787f8..05eedb0c9b37cf2d1ea5ce1a8942347f59539cd1 100644 --- a/src/main/java/org/olat/resource/lock/pessimistic/PLock.java +++ b/src/main/java/org/olat/core/commons/services/lock/pessimistic/PLock.java @@ -22,7 +22,7 @@ * This file has been modified by the OpenOLAT community. Changes are licensed * under the Apache 2.0 license as the original file. */ -package org.olat.resource.lock.pessimistic; +package org.olat.core.commons.services.lock.pessimistic; public interface PLock { diff --git a/src/main/java/org/olat/core/commons/services/lock/pessimistic/PLockImpl.java b/src/main/java/org/olat/core/commons/services/lock/pessimistic/PLockImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..218185930480e9cbd4eddfffaebd33770116bc11 --- /dev/null +++ b/src/main/java/org/olat/core/commons/services/lock/pessimistic/PLockImpl.java @@ -0,0 +1,128 @@ +/** +* OLAT - Online Learning and Training<br> +* http://www.olat.org +* <p> +* Licensed under the Apache License, Version 2.0 (the "License"); <br> +* you may not use this file except in compliance with the License.<br> +* You may obtain a copy of the License at +* <p> +* http://www.apache.org/licenses/LICENSE-2.0 +* <p> +* Unless required by applicable law or agreed to in writing,<br> +* software distributed under the License is distributed on an "AS IS" BASIS, <br> +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> +* See the License for the specific language governing permissions and <br> +* limitations under the License. +* <p> +* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> +* University of Zurich, Switzerland. +* <hr> +* <a href="http://www.openolat.org"> +* OpenOLAT - Online Learning and Training</a><br> +* This file has been modified by the OpenOLAT community. Changes are licensed +* under the Apache 2.0 license as the original file. +*/ + +package org.olat.core.commons.services.lock.pessimistic; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Version; + +import org.hibernate.annotations.GenericGenerator; +import org.olat.core.id.CreateInfo; +import org.olat.core.id.Persistable; + +/** + * A <b>OLATResourceImpl</b> is + * + * @author Andreas + * + */ +@Entity(name="plock") +@Table(name="o_plock") +@NamedQueries({ + @NamedQuery(name="loadByPLockByAsset", query="select lock from plock as lock where lock.asset=:asset") +}) +public class PLockImpl implements PLock, CreateInfo, Persistable { + + private static final long serialVersionUID = 1954725655490667921L; + + @Id + @GeneratedValue(generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "hilo") + @Column(name="plock_id", nullable=false, unique=true, insertable=true, updatable=false) + private Long key; + @Version + private int version = 0; + @Temporal(TemporalType.TIMESTAMP) + @Column(name="creationdate", nullable=false, insertable=true, updatable=false) + private Date creationDate; + + @Column(name="asset", nullable=false, insertable=true, updatable=false, unique=true) + private String asset; + + /** + * Constructor needed for Hibernate. + */ + public PLockImpl() { + // singleton + } + + public PLockImpl(String asset) { + this.asset = asset; + } + + @Override + public Long getKey() { + return key; + } + + @Override + public Date getCreationDate() { + return creationDate; + } + + public void setCreationDate(Date creationDate) { + this.creationDate = creationDate; + } + + public String getAsset() { + return asset; + } + + public void setAsset(String asset) { + this.asset = asset; + } + + @Override + public int hashCode() { + return key == null ? 2396928 : key.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(obj == this) { + return true; + } + if(obj instanceof PLockImpl) { + PLockImpl plock = (PLockImpl)obj; + return key != null && key.equals(plock.getKey()); + } + return false; + } + + @Override + public boolean equalsByPersistableKey(Persistable persistable) { + return equals(persistable); + } +} diff --git a/src/main/java/org/olat/resource/lock/pessimistic/PessimisticLockManager.java b/src/main/java/org/olat/core/commons/services/lock/pessimistic/PessimisticLockManager.java similarity index 80% rename from src/main/java/org/olat/resource/lock/pessimistic/PessimisticLockManager.java rename to src/main/java/org/olat/core/commons/services/lock/pessimistic/PessimisticLockManager.java index f13f58eebb802ed34661d5436fe02821668e0214..24245045d1f6237946f901991655f9206763bb0d 100644 --- a/src/main/java/org/olat/resource/lock/pessimistic/PessimisticLockManager.java +++ b/src/main/java/org/olat/core/commons/services/lock/pessimistic/PessimisticLockManager.java @@ -22,19 +22,20 @@ * This file has been modified by the OpenOLAT community. Changes are licensed * under the Apache 2.0 license as the original file. */ -package org.olat.resource.lock.pessimistic; +package org.olat.core.commons.services.lock.pessimistic; -import java.util.HashMap; +import java.util.Date; import java.util.List; -import java.util.Map; -import org.hibernate.LockMode; -import org.olat.core.commons.persistence.DBFactory; -import org.olat.core.commons.persistence.DBQuery; -import org.olat.core.configuration.Initializable; +import javax.persistence.LockModeType; + +import org.olat.core.commons.persistence.DB; import org.olat.core.logging.AssertException; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; /** @@ -47,26 +48,24 @@ import org.olat.core.logging.Tracing; * Initial Date: 25.10.2007 <br> * @author Felix Jost, http://www.goodsolutions.ch */ -public class PessimisticLockManager implements Initializable { +@Service("lockManager") +public class PessimisticLockManager implements InitializingBean { private static final OLog log = Tracing.createLoggerFor(PessimisticLockManager.class); - private static PessimisticLockManager INSTANCE; + private final String ASSET_INSERT_LOCK = "SYS_plock_global"; private boolean initDone = false; - /** - * [used by spring] - */ - private PessimisticLockManager() { - INSTANCE = this; - } + private final DB dbInstance; - public static PessimisticLockManager getInstance() { - return INSTANCE; + @Autowired + private PessimisticLockManager(DB dbInstance) { + this.dbInstance = dbInstance; } - public void init() { + @Override + public void afterPropertiesSet() throws Exception { // make sure that the resource (= row in our table) to lock the creation of new assets exists PLock gLock = findPLock(ASSET_INSERT_LOCK); if (gLock == null) { @@ -74,32 +73,34 @@ public class PessimisticLockManager implements Initializable { gLock = createPLock(ASSET_INSERT_LOCK); savePLock(gLock); } - DBFactory.getInstance().intermediateCommit(); + dbInstance.intermediateCommit(); initDone = true; } private PLock findPLock(String asset) { - DBQuery q = DBFactory.getInstance().createQuery("select plock from org.olat.resource.lock.pessimistic.PLockImpl as plock where plock.asset = :asset"); - q.setParameter("asset", asset); - q.setLockMode("plock", LockMode.PESSIMISTIC_WRITE); - - Map<String,Object> props = new HashMap<String, Object>(); - props.put("javax.persistence.lock.timeout", new Integer(30000)); - q.setProperties(props); - List res = q.list(); + List<PLock> res = dbInstance.getCurrentEntityManager() + .createNamedQuery("loadByPLockByAsset", PLock.class) + .setParameter("asset", asset) + .setLockMode(LockModeType.PESSIMISTIC_WRITE) + .setHint("javax.persistence.lock.timeout", new Integer(30000)) + .getResultList(); + if (res.size() == 0) { return null; } else { - return (PLock) res.get(0); + return res.get(0); } } private PLock createPLock(String asset) { - return new PLockImpl(asset); + PLockImpl lock = new PLockImpl(); + lock.setAsset(asset); + lock.setCreationDate(new Date()); + return lock; } private void savePLock(PLock plock) { - DBFactory.getInstance().saveObject(plock); + dbInstance.saveObject(plock); } /** diff --git a/src/main/java/org/olat/core/gui/components/table/DefaultXlsTableExporter.java b/src/main/java/org/olat/core/gui/components/table/DefaultXlsTableExporter.java index dca25e41bb303fb8e3b8a0a6e2b2f08707477ceb..39cd23d17bd475ace33ea36cfad1936c43fb3308 100644 --- a/src/main/java/org/olat/core/gui/components/table/DefaultXlsTableExporter.java +++ b/src/main/java/org/olat/core/gui/components/table/DefaultXlsTableExporter.java @@ -43,6 +43,7 @@ import org.olat.core.gui.render.StringOutput; import org.olat.core.gui.translator.Translator; import org.olat.core.logging.AssertException; import org.olat.core.util.CodeHelper; +import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; import org.olat.core.util.WebappHelper; import org.olat.core.util.filter.FilterFactory; @@ -114,6 +115,9 @@ public class DefaultXlsTableExporter implements TableExporter { cellValue = FilterFactory.getHtmlTagsFilter().filter(cellValue); if(StringHelper.containsNonWhitespace(cellValue)) { cellValue = StringEscapeUtils.unescapeHtml(cellValue); + if(cellValue.length() >= 32767) { + cellValue = Formatter.truncate(cellValue, 32760); + } } Cell cell = dataRow.createCell(c); cell.setCellValue(cellValue); diff --git a/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java b/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java index 1fe3a82f29e6669d7ed92f68633a59349a0de190..3b5695aedf44c629b8ad6fabc42f2b333b797928 100644 --- a/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java +++ b/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java @@ -833,7 +833,7 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { logObj.setUserProperties(tmpUserProperties); // and store it - DB db = DBFactory.getInstanceForClosing(); + DB db = DBFactory.getInstance(); if (db!=null && db.isError()) { // then we would run into an ERROR when we'd do more with this DB // hence we just issue a log.info here with the details diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java index b093e15444435507648cd695e5d5d281e434bac5..f5d967e4756c53d182775e42b4f55f1654152295 100644 --- a/src/main/java/org/olat/course/CourseFactory.java +++ b/src/main/java/org/olat/course/CourseFactory.java @@ -442,7 +442,7 @@ public class CourseFactory extends BasicManager { File fTargetCourseBasePath = targetCourse.getCourseBaseContainer().getBasefile(); //close connection before file copy - DBFactory.getInstance(false).commitAndCloseSession(); + DBFactory.getInstance().commitAndCloseSession(); synchronized (sourceCourse) { // o_clusterNOK - cannot be solved with doInSync since could take too long (leads to error: "Lock wait timeout exceeded") // copy configuration @@ -474,7 +474,7 @@ public class CourseFactory extends BasicManager { for (Reference ref: refs) { referenceManager.addReference(targetCourse, ref.getTarget(), ref.getUserdata()); if(count % 20 == 0) { - DBFactory.getInstance(false).intermediateCommit(); + DBFactory.getInstance().intermediateCommit(); } } @@ -723,7 +723,7 @@ public class CourseFactory extends BasicManager { // cause db connection timeout to be triggered //@TODO transactions/backgroundjob: // rework when backgroundjob infrastructure exists - DBFactory.getInstance(false).intermediateCommit(); + DBFactory.getInstance().intermediateCommit(); AsyncExportManager.getInstance().asyncArchiveCourseLogFiles(archiveOnBehalfOf, new Runnable() { public void run() { // that's fine, I dont need to do anything here diff --git a/src/main/java/org/olat/course/CourseModule.java b/src/main/java/org/olat/course/CourseModule.java index 655082193e5a44683db7651374c1253f865a3807..1bcb4acee2c6dae66fdd41c746f4cc45cadb6625 100644 --- a/src/main/java/org/olat/course/CourseModule.java +++ b/src/main/java/org/olat/course/CourseModule.java @@ -109,7 +109,7 @@ public class CourseModule extends AbstractOLATModule { deployCoursesFromCourseExportFiles(); } //also in startup event processing intermediateCommit - DBFactory.getInstance(false).intermediateCommit(); + DBFactory.getInstance().intermediateCommit(); } @@ -140,14 +140,7 @@ public class CourseModule extends AbstractOLATModule { */ @Override public void init() { - // skip all the expensive course demo setup and deployment when we are in junit mode. - if (Settings.isJUnitTest()) return; - - logInfo("Initializing the OpenOLAT course system"); - - // Cleanup, otherwise this subjects will have problems in normal OLAT - // operation - DBFactory.getInstance(false).intermediateCommit(); + // } private void deployCoursesFromCourseExportFiles( ) { diff --git a/src/main/java/org/olat/course/assessment/AssessmentMainController.java b/src/main/java/org/olat/course/assessment/AssessmentMainController.java index 5a9117b593b31e5038f39245cf90ccf9bcd26e07..e7c5652f42bc64eed3da62272fa750e03c7a78f6 100644 --- a/src/main/java/org/olat/course/assessment/AssessmentMainController.java +++ b/src/main/java/org/olat/course/assessment/AssessmentMainController.java @@ -1414,11 +1414,11 @@ public class AssessmentMainController extends MainLayoutBasicController implemen + "ms"); } // finished in this thread, close database session of this thread! - DBFactory.getInstance(false).commitAndCloseSession(); + DBFactory.getInstance().commitAndCloseSession(); success = true; } finally { if (!success) { - DBFactory.getInstance(false).rollbackAndCloseSession(); + DBFactory.getInstance().rollbackAndCloseSession(); } } } diff --git a/src/main/java/org/olat/course/assessment/manager/UpdateEfficiencyStatementsWorker.java b/src/main/java/org/olat/course/assessment/manager/UpdateEfficiencyStatementsWorker.java index 14587334c1fea6deda5557c4a24b823f255fb554..eb043f38c2f00d99c80ce3ec6877f4bc7c2f7342 100644 --- a/src/main/java/org/olat/course/assessment/manager/UpdateEfficiencyStatementsWorker.java +++ b/src/main/java/org/olat/course/assessment/manager/UpdateEfficiencyStatementsWorker.java @@ -68,7 +68,7 @@ public class UpdateEfficiencyStatementsWorker implements Runnable { List<Identity> identities = esm.findIdentitiesWithEfficiencyStatements(re.getKey()); esm.updateEfficiencyStatements(ores, identities); // close db session in this thread - DBFactory.getInstance(false).commitAndCloseSession(); + DBFactory.getInstance().commitAndCloseSession(); success = true; EfficiencyStatementEvent finishedEvent = new EfficiencyStatementEvent(EfficiencyStatementEvent.CMD_FINISHED, ores.getResourceableId()); @@ -78,7 +78,7 @@ public class UpdateEfficiencyStatementsWorker implements Runnable { } finally { // close db session in this thread if (!success) { - DBFactory.getInstance(false).rollbackAndCloseSession(); + DBFactory.getInstance().rollbackAndCloseSession(); } } } diff --git a/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java b/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java index 35505c5ef28e8846ea6e142262b32e6674b355e9..efab2721dca25f101c6182def77aae166444dc73 100644 --- a/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java +++ b/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java @@ -28,8 +28,6 @@ import java.text.SimpleDateFormat; import java.util.Date; import org.olat.core.id.Identity; -import org.olat.core.id.OLATResourceable; -import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.nodes.CourseNode; import org.olat.course.properties.CoursePropertyManager; @@ -53,10 +51,10 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager { protected static final String LOG_PREFIX_REMOVED_OLD_LOG_ENTRIES = "Removed old log entires because of limited log size\n"; private static final SimpleDateFormat sdb = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - private final OLATResourceable ores; + private final CoursePropertyManager cpm; public UserNodeAuditManagerImpl(ICourse course) { - ores = course; + cpm = course.getCourseEnvironment().getCoursePropertyManager(); } /** @@ -66,9 +64,6 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager { */ @Override public void appendToUserNodeLog(CourseNode courseNode, Identity identity, Identity assessedIdentity, String logText) { - ICourse course = CourseFactory.loadCourse(ores); - CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); - String text = formatMessage(identity, logText) ; Property logProperty = cpm.findCourseNodeProperty(courseNode, assessedIdentity, null, LOG_IDENTIFYER); @@ -85,9 +80,6 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager { @Override public void appendToUserNodeLog(CourseNode courseNode, Identity identity, BusinessGroup assessedGroup, String logText) { - ICourse course = CourseFactory.loadCourse(ores); - CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); - String text = formatMessage(identity, logText) ; Property logProperty = cpm.findCourseNodeProperty(courseNode, null, assessedGroup, LOG_IDENTIFYER); @@ -135,8 +127,6 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager { */ @Override public boolean hasUserNodeLogs(CourseNode node) { - ICourse course = CourseFactory.loadCourse(ores); - CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); int numOfProperties = cpm.countCourseNodeProperties(node, null, null, LOG_IDENTIFYER); return numOfProperties > 0; } @@ -147,16 +137,12 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager { */ @Override public String getUserNodeLog(CourseNode courseNode, Identity identity) { - ICourse course = CourseFactory.loadCourse(ores); - CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); Property property = cpm.findCourseNodeProperty(courseNode, identity, null, LOG_IDENTIFYER); return property == null ? null : property.getTextValue(); } @Override public String getUserNodeLog(CourseNode courseNode, BusinessGroup businessGroup) { - ICourse course = CourseFactory.loadCourse(ores); - CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); Property property = cpm.findCourseNodeProperty(courseNode, businessGroup, LOG_IDENTIFYER); return property == null ? null : property.getTextValue(); } diff --git a/src/main/java/org/olat/course/config/CourseConfig.java b/src/main/java/org/olat/course/config/CourseConfig.java index 5e95df63c05f791604be4029aa2327b8e328e78f..02d9688c3978f1f02e23fb8ef7dd292bc52090d6 100644 --- a/src/main/java/org/olat/course/config/CourseConfig.java +++ b/src/main/java/org/olat/course/config/CourseConfig.java @@ -72,7 +72,7 @@ public class CourseConfig implements Serializable, Cloneable { /** * current config file version */ - transient private final static int CURRENTVERSION = 9; + transient private final static int CURRENTVERSION = 10; /** * Log levels */ @@ -238,7 +238,7 @@ public class CourseConfig implements Serializable, Cloneable { if (!configuration.containsKey(CERTIFICATE_MANUAL_ENABLED)) configuration.put(CERTIFICATE_MANUAL_ENABLED, Boolean.FALSE); if (!configuration.containsKey(CERTIFICATE_TEMPLATE)) configuration.put(CERTIFICATE_TEMPLATE, ""); if (!configuration.containsKey(RECERTIFICATION_ENABLED)) configuration.put(RECERTIFICATION_ENABLED, Boolean.FALSE); - if (!configuration.containsKey(RECERTIFICATION_TIMELAPSE)) configuration.put(RECERTIFICATION_TIMELAPSE, ""); + if (!configuration.containsKey(RECERTIFICATION_TIMELAPSE)) configuration.put(RECERTIFICATION_TIMELAPSE, new Integer(0)); this.version = 10; } @@ -426,30 +426,6 @@ public class CourseConfig implements Serializable, Cloneable { public void setManualCertificationEnabled(boolean enabled) { configuration.put(CERTIFICATE_MANUAL_ENABLED, new Boolean(enabled)); } - - - - /* - public PDFCertificatesOptions getPdfCertificateOption2() { - PDFCertificatesOptions option; - String opt = (String)configuration.get(CERTIFICATE_ENABLED); - if(StringHelper.containsNonWhitespace(opt)) { - try { - option = PDFCertificatesOptions.valueOf(opt); - } catch (Exception e) { - log.error("", e); - option = PDFCertificatesOptions.none; - } - } else { - option = PDFCertificatesOptions.none; - } - - return option; - } - - public void setPdfCertificateOption(PDFCertificatesOptions option) { - configuration.put(PDF_CERTIFICATE_ENABLED, option.name()); - }*/ /** * @return true if the efficency statement is enabled @@ -467,8 +443,11 @@ public class CourseConfig implements Serializable, Cloneable { } public int getRecertificationTimelapse() { - Integer timelapse = (Integer)configuration.get(RECERTIFICATION_TIMELAPSE); - return timelapse == null ? 0 : timelapse.intValue(); + Object timelapse = configuration.get(RECERTIFICATION_TIMELAPSE); + if(timelapse instanceof Integer) { + return ((Integer)timelapse).intValue(); + } + return 0; } public void setRecertificationTimelapse(int timelapse) { diff --git a/src/main/java/org/olat/course/member/MemberListController.java b/src/main/java/org/olat/course/member/MemberListController.java index 7226d139f1bafec31965f802326402eff2782e1f..c8ab5bc8febad658138f0d154ad0b36d11a4740f 100644 --- a/src/main/java/org/olat/course/member/MemberListController.java +++ b/src/main/java/org/olat/course/member/MemberListController.java @@ -57,7 +57,7 @@ public class MemberListController extends AbstractMemberListController { removeAsListenerAndDispose(identityAssessmentController); Identity assessedIdentity = securityManager.loadIdentityByKey(member.getIdentityKey()); - ICourse course = CourseFactory.loadCourse(repoEntry.getOlatResource()); + ICourse course = CourseFactory.loadCourse(repoEntry); identityAssessmentController = new IdentityAssessmentEditController(getWindowControl(),ureq, toolbarPanel, assessedIdentity, course, true, false, true); diff --git a/src/main/java/org/olat/course/member/MemberListWithOriginFilterController.java b/src/main/java/org/olat/course/member/MemberListWithOriginFilterController.java index 092fd7925b35389eb1b06ff90700bc91e7154fb8..4a3f52ec856fcbca49b9fca2d0232ae8217736cf 100644 --- a/src/main/java/org/olat/course/member/MemberListWithOriginFilterController.java +++ b/src/main/java/org/olat/course/member/MemberListWithOriginFilterController.java @@ -98,7 +98,7 @@ public class MemberListWithOriginFilterController extends AbstractMemberListCont removeAsListenerAndDispose(identityAssessmentController); Identity assessedIdentity = securityManager.loadIdentityByKey(member.getIdentityKey()); - ICourse course = CourseFactory.loadCourse(repoEntry.getOlatResource()); + ICourse course = CourseFactory.loadCourse(repoEntry); identityAssessmentController = new IdentityAssessmentEditController(getWindowControl(),ureq, toolbarPanel, assessedIdentity, course, true, false, true); diff --git a/src/main/java/org/olat/course/member/MemberSearchController.java b/src/main/java/org/olat/course/member/MemberSearchController.java index 59308eb7c189363525ea459cc4b71af1c63060da..6efaf39a076d8c6e6f8165cabc7be1522c487158 100644 --- a/src/main/java/org/olat/course/member/MemberSearchController.java +++ b/src/main/java/org/olat/course/member/MemberSearchController.java @@ -83,7 +83,7 @@ public class MemberSearchController extends AbstractMemberListController { removeAsListenerAndDispose(identityAssessmentController); Identity assessedIdentity = securityManager.loadIdentityByKey(member.getIdentityKey()); - ICourse course = CourseFactory.loadCourse(repoEntry.getOlatResource()); + ICourse course = CourseFactory.loadCourse(repoEntry); identityAssessmentController = new IdentityAssessmentEditController(getWindowControl(),ureq, toolbarPanel, assessedIdentity, course, true, false, true); diff --git a/src/main/java/org/olat/course/member/MembersManagementMainController.java b/src/main/java/org/olat/course/member/MembersManagementMainController.java index 62022cae1b5b5d37cad4396db19e87e621c063ed..accd3453c73851780caa717f19fc7f1f0dfd6766 100644 --- a/src/main/java/org/olat/course/member/MembersManagementMainController.java +++ b/src/main/java/org/olat/course/member/MembersManagementMainController.java @@ -100,7 +100,7 @@ public class MembersManagementMainController extends MainLayoutBasicController //logging getUserActivityLogger().setStickyActionType(ActionType.admin); - ICourse course = CourseFactory.loadCourse(re.getOlatResource()); + ICourse course = CourseFactory.loadCourse(re); addLoggingResourceable(LoggingResourceable.wrap(course)); //ui stuff diff --git a/src/main/java/org/olat/course/nodes/GTACourseNode.java b/src/main/java/org/olat/course/nodes/GTACourseNode.java index 43669f423a5c1fb37d59c9adbdaf54a842bdbb52..9a3421889664b95fdf59dca975fe3378377b4d6e 100644 --- a/src/main/java/org/olat/course/nodes/GTACourseNode.java +++ b/src/main/java/org/olat/course/nodes/GTACourseNode.java @@ -88,7 +88,6 @@ import org.olat.group.BusinessGroup; import org.olat.modules.ModuleConfiguration; import org.olat.modules.assessment.AssessmentEntry; import org.olat.repository.RepositoryEntry; -import org.olat.resource.OLATResource; import org.olat.user.UserManager; /** @@ -270,8 +269,8 @@ public class GTACourseNode extends AbstractAccessableCourseNode implements Asses if(cev != null) { //check assignment GTAManager gtaManager = CoreSpringFactory.getImpl(GTAManager.class); - OLATResource courseOres = cev.getCourseGroupManager().getCourseResource(); - ICourse course = CourseFactory.loadCourse(courseOres); + RepositoryEntry courseRe = cev.getCourseGroupManager().getCourseEntry(); + ICourse course = CourseFactory.loadCourse(courseRe); if(config.getBooleanSafe(GTACourseNode.GTASK_ASSIGNMENT)) { File taskDirectory = gtaManager.getTasksDirectory(course.getCourseEnvironment(), this); if(!TaskHelper.hasDocuments(taskDirectory)) { diff --git a/src/main/java/org/olat/course/nodes/ViteroCourseNode.java b/src/main/java/org/olat/course/nodes/ViteroCourseNode.java index 4ec6fab587b0224fadd4ed830e2a5b5ccf18ce05..ce6c7ef7634652a88165b60189bf78bf5b7f4648 100644 --- a/src/main/java/org/olat/course/nodes/ViteroCourseNode.java +++ b/src/main/java/org/olat/course/nodes/ViteroCourseNode.java @@ -110,7 +110,7 @@ public class ViteroCourseNode extends AbstractAccessableCourseNode { if(roles.isInstitutionalResourceManager() | roles.isAuthor()) { RepositoryManager rm = RepositoryManager.getInstance(); ICourse course = CourseFactory.loadCourse(key); - RepositoryEntry re = rm.lookupRepositoryEntry(course, false); + RepositoryEntry re = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); if (re != null) { moderator = rm.isOwnerOfRepositoryEntry(ureq.getIdentity(), re); if(!moderator) { diff --git a/src/main/java/org/olat/course/nodes/iq/IQRunController.java b/src/main/java/org/olat/course/nodes/iq/IQRunController.java index da4f11928584c0bdac03abe64c3cd2ae599c3e7f..ddca53a0de8f382d9b4477642fd0cfdbadfa7855 100644 --- a/src/main/java/org/olat/course/nodes/iq/IQRunController.java +++ b/src/main/java/org/olat/course/nodes/iq/IQRunController.java @@ -91,7 +91,6 @@ import org.olat.modules.iq.IQManager; import org.olat.modules.iq.IQSecurityCallback; import org.olat.modules.iq.IQSubmittedEvent; import org.olat.repository.RepositoryEntry; -import org.olat.repository.RepositoryManager; import org.olat.util.logging.activity.LoggingResourceable; import org.springframework.beans.factory.annotation.Autowired; @@ -412,11 +411,10 @@ public class IQRunController extends BasicController implements GenericEventList displayContainerController = new LayoutMain3ColsController(ureq, getWindowControl(), displayController); listenTo(displayContainerController); // autodispose - //need to wrap a course restart controller again, because IQDisplay //runs on top of GUIStack ICourse course = CourseFactory.loadCourse(courseResId); - RepositoryEntry courseRepositoryEntry = RepositoryManager.getInstance().lookupRepositoryEntry(course, true); + RepositoryEntry courseRepositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); Panel empty = new Panel("empty");//empty panel set as "menu" and "tool" Controller courseCloser = new DisposedCourseRestartController(ureq, getWindowControl(), courseRepositoryEntry); Controller disposedRestartController = new LayoutMain3ColsController(ureq, getWindowControl(), empty, courseCloser.getInitialComponent(), "disposed course whily in iqRun" + courseResId); diff --git a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java index dc5cc44a5dd97f8bd96c67352978a85a2eabe61a..537a69ce1ae257534c8868be20ff2e1953814bde 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java +++ b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java @@ -41,6 +41,7 @@ import org.olat.core.util.coordinate.SyncerCallback; import org.olat.core.util.event.MultiUserEvent; import org.olat.course.CourseFactory; import org.olat.course.ICourse; +import org.olat.course.groupsandrights.CourseGroupManager; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.ProjectBrokerCourseNode; import org.olat.course.nodes.projectbroker.datamodel.Project; @@ -178,8 +179,9 @@ public class ProjectGroupManagerImpl extends BasicManager implements ProjectGrou // PROJECT GROUP MANAGEMENT //////////////////////////// public BusinessGroup createProjectGroupFor(Long projectBrokerId, Identity identity, String groupName, String groupDescription, Long courseId) { - OLATResource resource = CourseFactory.loadCourse(courseId).getCourseEnvironment().getCourseGroupManager().getCourseResource(); - RepositoryEntry re = repositoryManager.lookupRepositoryEntry(resource, false); + CourseGroupManager cgm = CourseFactory.loadCourse(courseId).getCourseEnvironment().getCourseGroupManager(); + OLATResource resource = cgm.getCourseResource(); + RepositoryEntry re = cgm.getCourseEntry(); logDebug("createProjectGroupFor groupName=" + groupName); BusinessGroup projectGroup = businessGroupService.createBusinessGroup(identity, groupName, groupDescription, -1, -1, false, false, re); @@ -283,7 +285,7 @@ public class ProjectGroupManagerImpl extends BasicManager implements ProjectGrou @Override public void sendGroupChangeEvent(Project project, Long courseResourceableId, Identity identity) { ICourse course = CourseFactory.loadCourse(courseResourceableId); - RepositoryEntry ores = repositoryManager.lookupRepositoryEntry(course, true); + RepositoryEntry ores = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); MultiUserEvent modifiedEvent = new BusinessGroupModifiedEvent(BusinessGroupModifiedEvent.IDENTITY_ADDED_EVENT, project.getProjectGroup(), identity); CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(modifiedEvent, ores); } diff --git a/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java b/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java index 8ff2a49428423295c807e188dfe6792152806900..08f9f11930e54f18b26b38eac23e1d766010d14d 100644 --- a/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java +++ b/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java @@ -35,7 +35,6 @@ import org.olat.core.CoreSpringFactory; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.logging.AssertException; -import org.olat.core.manager.BasicManager; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.nodes.CourseNode; @@ -56,7 +55,7 @@ import org.olat.resource.OLATResourceManager; * manager), only view controllers use the course property manager * directly. */ -public class PersistingCoursePropertyManager extends BasicManager implements CoursePropertyManager { +public class PersistingCoursePropertyManager implements CoursePropertyManager { private NarrowedPropertyManager pm; private Map<String,String> anonymizerMap; diff --git a/src/main/java/org/olat/course/reminder/rule/InitialAttemptsRuleSPI.java b/src/main/java/org/olat/course/reminder/rule/InitialAttemptsRuleSPI.java index 2fee1ec95040a5738ac5525ec8a08989dea42dab..54dd22bf9409ca37a6e8f303c807dfdc1b74197a 100644 --- a/src/main/java/org/olat/course/reminder/rule/InitialAttemptsRuleSPI.java +++ b/src/main/java/org/olat/course/reminder/rule/InitialAttemptsRuleSPI.java @@ -76,8 +76,7 @@ public class InitialAttemptsRuleSPI extends AbstractLaunchDateRuleSPI { ReminderRuleImpl r = (ReminderRuleImpl)rule; String nodeIdent = r.getLeftOperand(); - Long courseResourceId = entry.getOlatResource().getResourceableId(); - ICourse course = CourseFactory.loadCourse(courseResourceId); + ICourse course = CourseFactory.loadCourse(entry); CourseNode courseNode = course.getRunStructure().getNode(nodeIdent); return helperDao.getInitialAttemptDates(entry, courseNode, identities); diff --git a/src/main/java/org/olat/course/reminder/rule/PassedRuleSPI.java b/src/main/java/org/olat/course/reminder/rule/PassedRuleSPI.java index 20363103622faf520423e21ac146cb2190b8f197..15c0a4820a7e597f0b3094c8dac9cefa6002622d 100644 --- a/src/main/java/org/olat/course/reminder/rule/PassedRuleSPI.java +++ b/src/main/java/org/olat/course/reminder/rule/PassedRuleSPI.java @@ -77,7 +77,7 @@ public class PassedRuleSPI implements FilterRuleSPI { String nodeIdent = r.getLeftOperand(); String status = r.getRightOperand(); - ICourse course = CourseFactory.loadCourse(entry.getOlatResource()); + ICourse course = CourseFactory.loadCourse(entry); CourseNode courseNode = course.getRunStructure().getNode(nodeIdent); Map<Long, Boolean> passeds = helperDao.getPassed(entry, courseNode, identities); diff --git a/src/main/java/org/olat/course/reminder/rule/ScoreRuleSPI.java b/src/main/java/org/olat/course/reminder/rule/ScoreRuleSPI.java index 4280160e7888004193e078993d8c14b98bdf1093..215212333342b13f232b0a8c9092483df718c13f 100644 --- a/src/main/java/org/olat/course/reminder/rule/ScoreRuleSPI.java +++ b/src/main/java/org/olat/course/reminder/rule/ScoreRuleSPI.java @@ -80,7 +80,7 @@ public class ScoreRuleSPI implements FilterRuleSPI { String operator = r.getOperator(); float value = Float.parseFloat(r.getRightOperand()); - ICourse course = CourseFactory.loadCourse(entry.getOlatResource()); + ICourse course = CourseFactory.loadCourse(entry); CourseNode courseNode = course.getRunStructure().getNode(nodeIdent); Map<Long, Float> scores = helperDao.getScores(entry, courseNode, identities); diff --git a/src/main/java/org/olat/course/reminder/ui/InitialAttemptsRuleEditor.java b/src/main/java/org/olat/course/reminder/ui/InitialAttemptsRuleEditor.java index 5cd929f46eb45b5cc1b2f37ea59f283600b64c08..42078729ee6b831bbb2b8558ab1030c2789c33a0 100644 --- a/src/main/java/org/olat/course/reminder/ui/InitialAttemptsRuleEditor.java +++ b/src/main/java/org/olat/course/reminder/ui/InitialAttemptsRuleEditor.java @@ -80,7 +80,7 @@ public class InitialAttemptsRuleEditor extends RuleEditorFragment { formLayout.add(ruleCont); ruleCont.getFormItemComponent().contextPut("id", id); - ICourse course = CourseFactory.loadCourse(entry.getOlatResource()); + ICourse course = CourseFactory.loadCourse(entry); String currentValue = null; diff --git a/src/main/java/org/olat/course/reminder/ui/PassedRuleEditor.java b/src/main/java/org/olat/course/reminder/ui/PassedRuleEditor.java index 8a06ddfda35d23bbb472d7059a545fcb32bf2d53..5d2a5c35ab326fd24942ee29ffe76493e3f2c37d 100644 --- a/src/main/java/org/olat/course/reminder/ui/PassedRuleEditor.java +++ b/src/main/java/org/olat/course/reminder/ui/PassedRuleEditor.java @@ -74,7 +74,7 @@ public class PassedRuleEditor extends RuleEditorFragment { formLayout.add(ruleCont); ruleCont.getFormItemComponent().contextPut("id", id); - ICourse course = CourseFactory.loadCourse(entry.getOlatResource()); + ICourse course = CourseFactory.loadCourse(entry); String currentStatus = null; String currentCourseNode = null; diff --git a/src/main/java/org/olat/course/reminder/ui/ScoreRuleEditor.java b/src/main/java/org/olat/course/reminder/ui/ScoreRuleEditor.java index 54b1c2b1afd1a6d8c31e68b354df7a8a38aff59c..28cd57593555182816b73a7676be5bb76fbebc0c 100644 --- a/src/main/java/org/olat/course/reminder/ui/ScoreRuleEditor.java +++ b/src/main/java/org/olat/course/reminder/ui/ScoreRuleEditor.java @@ -74,7 +74,7 @@ public class ScoreRuleEditor extends RuleEditorFragment { formLayout.add(ruleCont); ruleCont.getFormItemComponent().contextPut("id", id); - ICourse course = CourseFactory.loadCourse(entry.getOlatResource()); + ICourse course = CourseFactory.loadCourse(entry); String currentValue = null; diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java index 3e62b03235e00d6a8b60fca310b292c840f89a55..e85e146edc7dd54c9dd642fac20fc57d01875df6 100644 --- a/src/main/java/org/olat/course/run/CourseRuntimeController.java +++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java @@ -202,7 +202,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im super(ureq, wControl, re, reSecurity, runtimeControllerCreator, offerBookmark, showCourseConfigLink); if(!corrupted) { - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); addLoggingResourceable(LoggingResourceable.wrap(course)); coordinatorManager.getCoordinator().getEventBus().registerFor(this, getIdentity(), getOlatResourceable()); @@ -238,7 +238,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im super.loadRights(security); if(corrupted) return; - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager(); // 3) all other rights are defined in the groupmanagement using the learning // group rights @@ -320,7 +320,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im } private void addCustomCSS(UserRequest ureq) { - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); CustomCSS customCSS = CourseFactory.getCustomCourseCss(ureq.getUserSession(), course.getCourseEnvironment()); ChiefController cc = getWindowControl().getWindowBackOffice().getChiefController(); if (cc != null) { @@ -1073,7 +1073,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im if(delayedClose == Delayed.options || requestForClose(ureq)) { if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_COURSEEDITOR)) { removeCustomCSS(); - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); CourseConfig courseConfig = course.getCourseEnvironment().getCourseConfig().clone(); CourseOptionsController ctrl = new CourseOptionsController(ureq, getWindowControl(), getRepositoryEntry(), courseConfig, true); optionsToolCtr = pushController(ureq, translate("command.options"), ctrl); @@ -1104,7 +1104,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im if(delayedClose == Delayed.certificates || requestForClose(ureq)) { if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_COURSEEDITOR)) { removeCustomCSS(); - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); CourseConfig courseConfig = course.getCourseEnvironment().getCourseConfig().clone(); WindowControl bwControl = getSubWindowControl("CertificationSettings"); CertificatesOptionsController ctrl = new CertificatesOptionsController(ureq, addToHistory(ureq, bwControl), @@ -1137,7 +1137,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im if(delayedClose == Delayed.archive || requestForClose(ureq)) { if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_ARCHIVING)) { removeCustomCSS(); - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); ArchiverMainController ctrl = new ArchiverMainController(ureq, getWindowControl(), course, new FullAccessArchiverCallback()); listenTo(ctrl); archiverCtrl = pushController(ureq, translate("command.openarchiver"), ctrl); @@ -1153,7 +1153,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im if(delayedClose == Delayed.courseFolder || requestForClose(ureq)) { removeCustomCSS(); // Folder for course with custom link model to jump to course nodes - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); VFSContainer namedCourseFolder = new NamedContainerImpl(translate("command.coursefolder"), course.getCourseFolderContainer()); CustomLinkTreeModel customLinkTreeModel = new CourseInternalLinkTreeModel(course.getEditorTreeModel()); @@ -1171,7 +1171,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im private void doCourseAreas(UserRequest ureq) { if(delayedClose == Delayed.courseAreas || requestForClose(ureq)) { removeCustomCSS(); - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); CourseAreasController ctrl = new CourseAreasController(ureq, getWindowControl(), getRepositoryEntry().getOlatResource()); ctrl.addLoggingResourceable(LoggingResourceable.wrap(course)); areasCtrl = pushController(ureq, translate("command.courseareas"), ctrl); @@ -1186,7 +1186,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im if(delayedClose == Delayed.databases || requestForClose(ureq)) { if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_DB)) { removeCustomCSS(); - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); CustomDBMainController ctrl = new CustomDBMainController(ureq, getWindowControl(), course); listenTo(ctrl); databasesCtrl = pushController(ureq, translate("command.opendb"), ctrl); @@ -1202,7 +1202,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im if(delayedClose == Delayed.courseStatistics || requestForClose(ureq)) { if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_STATISTICS)) { removeCustomCSS(); - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); StatisticMainController ctrl = new StatisticMainController(ureq, getWindowControl(), course); listenTo(ctrl); statisticsCtrl = pushController(ureq, translate("command.openstatistic"), ctrl); @@ -1457,7 +1457,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im private void launchGlossary(UserRequest ureq) { // start glossary in window - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); final CourseConfig cc = course.getCourseConfig(); // do not cache cc, not save final boolean allowGlossaryEditing = reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_GLOSSARY); @@ -1500,7 +1500,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im switch(event.getType()) { case calendar: { if(calendarLink != null) { - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); CourseConfig cc = course.getCourseEnvironment().getCourseConfig(); calendarLink.setVisible(cc.isCalendarEnabled() && calendarModule.isEnabled() && calendarModule.isEnableCourseToolCalendar()); toolbarPanel.setDirty(true); @@ -1509,7 +1509,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im } case chat: { if(chatLink != null) { - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); CourseConfig cc = course.getCourseEnvironment().getCourseConfig(); chatLink.setVisible(cc.isChatEnabled()); toolbarPanel.setDirty(true); @@ -1518,7 +1518,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im } case efficiencyStatement: { if(efficiencyStatementsLink != null) { - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); CourseConfig cc = course.getCourseEnvironment().getCourseConfig(); efficiencyStatementsLink.setVisible(cc.isEfficencyStatementEnabled() || cc.isCertificateEnabled()); if(cc.isEfficencyStatementEnabled() || cc.isCertificateEnabled()) { @@ -1532,7 +1532,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im } case glossary: { if(glossary != null) { - ICourse course = CourseFactory.loadCourse(getOlatResourceable()); + ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); CourseConfig cc = course.getCourseEnvironment().getCourseConfig(); glossary.setVisible(cc.hasGlossary()); toolbarPanel.setDirty(true); diff --git a/src/main/java/org/olat/course/site/CourseSite.java b/src/main/java/org/olat/course/site/CourseSite.java index e434476e30a5ea6a1f8bed000bb712854ba3e61f..1b6607e4f7774bd80af5b149fe66232c7c592091 100644 --- a/src/main/java/org/olat/course/site/CourseSite.java +++ b/src/main/java/org/olat/course/site/CourseSite.java @@ -105,7 +105,7 @@ public class CourseSite extends AbstractSiteInstance { } MainLayoutController c; - ICourse course = CourseFactory.loadCourse(entry.getOlatResource()); + ICourse course = CourseFactory.loadCourse(entry); // course-launch-state depending course-settings RepositoryEntrySecurity reSecurity = rm.isAllowed(ureq, entry); @@ -138,7 +138,7 @@ public class CourseSite extends AbstractSiteInstance { public Controller create(UserRequest uureq, WindowControl wwControl, TooledStackedPanel toolbarPanel, RepositoryEntry re, RepositoryEntrySecurity security, AssessmentMode assessmentMode) { return new RunMainController(uureq, wwControl, toolbarPanel, - CourseFactory.loadCourse(re.getOlatResource()), re, security, assessmentMode); + CourseFactory.loadCourse(re), re, security, assessmentMode); } }, false, true); diff --git a/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java b/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java index 4e65699e293c03c6c1416052f7bf4afc6afe5350..5df55094855752809baf9fc3ff590a5f37bf7469 100644 --- a/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java +++ b/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java @@ -94,7 +94,7 @@ public class EfficiencyStatementDetailsController extends BasicController implem mainVC.put("segmentCmp", statementCtrl.getInitialComponent()); } else { try { - ICourse course = CourseFactory.loadCourse(entry.getOlatResource()); + ICourse course = CourseFactory.loadCourse(entry); assessmentCtrl = new IdentityAssessmentEditController(wControl, ureq, null, assessedIdentity, course, true, false, false); listenTo(assessmentCtrl); diff --git a/src/main/java/org/olat/modules/dialog/DialogElement.java b/src/main/java/org/olat/modules/dialog/DialogElement.java index 53a053d9c83103c8b8ee3fa855c0b36e12e91098..96fe65da58913977df379fd1d72d77d60db1a114 100644 --- a/src/main/java/org/olat/modules/dialog/DialogElement.java +++ b/src/main/java/org/olat/modules/dialog/DialogElement.java @@ -78,10 +78,10 @@ public class DialogElement { } catch (NumberFormatException nEx) { return author; } catch (ObjectNotFoundException oEx) { - DBFactory.getInstanceForClosing().rollbackAndCloseSession(); + DBFactory.getInstance().rollbackAndCloseSession(); return author; } catch (Throwable th) { - DBFactory.getInstanceForClosing().rollbackAndCloseSession(); + DBFactory.getInstance().rollbackAndCloseSession(); return author; } } diff --git a/src/main/java/org/olat/resource/_spring/resourceContext.xml b/src/main/java/org/olat/resource/_spring/resourceContext.xml index 6cd7b00c74c10c9b1f53436001eb66bbeee46276..e3fbc29a4aa89a1f01ee68f99802b51f7bdc869d 100644 --- a/src/main/java/org/olat/resource/_spring/resourceContext.xml +++ b/src/main/java/org/olat/resource/_spring/resourceContext.xml @@ -16,6 +16,5 @@ <import resource="classpath:/org/olat/resource/accesscontrol/_spring/acContext.xml"/> <import resource="classpath:/org/olat/resource/accesscontrol/provider/paypal/_spring/paypalContext.xml"/> - <import resource="classpath:/org/olat/resource/lock/pessimistic/_spring/lockContext.xml"/> </beans> \ No newline at end of file diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/paypal/PaypalIPNFilter.java b/src/main/java/org/olat/resource/accesscontrol/provider/paypal/PaypalIPNFilter.java index 4b1b0700c5e50f1efb34dd1cb9a68072c3575700..1d2bbc241c9eec64423fe295f5afac3337f74f6c 100644 --- a/src/main/java/org/olat/resource/accesscontrol/provider/paypal/PaypalIPNFilter.java +++ b/src/main/java/org/olat/resource/accesscontrol/provider/paypal/PaypalIPNFilter.java @@ -75,7 +75,7 @@ public class PaypalIPNFilter implements Filter { //we must log all errors, it's critical for this part of the payment log.error("Paypal IPN unexpected error", t); } finally { - DBFactory.getInstanceForClosing().closeSession(); + DBFactory.getInstance().closeSession(); } } diff --git a/src/main/java/org/olat/resource/lock/pessimistic/PLockImpl.hbm.xml b/src/main/java/org/olat/resource/lock/pessimistic/PLockImpl.hbm.xml deleted file mode 100644 index 4112c57cc87ccae9a78d9bbc4187011b9b705329..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/resource/lock/pessimistic/PLockImpl.hbm.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE hibernate-mapping PUBLIC - "-//Hibernate/Hibernate Mapping DTD//EN" - "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> -<hibernate-mapping default-lazy="false"> - <class name="org.olat.resource.lock.pessimistic.PLockImpl" table="o_plock"> - - <id name="key" type="long" column="plock_id" unsaved-value="null"> - <generator class="hilo"/> - </id> - - <version name="version" access="field" column="version" type="int"/> - <property name="creationDate" column="creationdate" type="timestamp" /> - - <property name="asset" type="string" > - <column name="asset" not-null="true" length="255" unique="true" index="asset_idx"/> - </property> - - </class> -</hibernate-mapping> \ No newline at end of file diff --git a/src/main/java/org/olat/resource/lock/pessimistic/PLockImpl.java b/src/main/java/org/olat/resource/lock/pessimistic/PLockImpl.java deleted file mode 100644 index 28c91aaad7f2e75001a90f2f7bd5c9569afae7b5..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/resource/lock/pessimistic/PLockImpl.java +++ /dev/null @@ -1,64 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ - -package org.olat.resource.lock.pessimistic; - -import org.olat.core.commons.persistence.PersistentObject; - -/** - * A <b>OLATResourceImpl</b> is - * - * @author Andreas - * - */ -public class PLockImpl extends PersistentObject implements PLock { - - private String asset; - - /** - * Constructor needed for Hibernate. - */ - PLockImpl() { - // singleton - } - - PLockImpl(String asset) { - this.asset = asset; - } - - - public String getAsset() { - return asset; - } - - /** - * [for hibernate] - * @param asset - */ - void setAsset(String asset) { - this.asset = asset; - } - -} diff --git a/src/main/java/org/olat/resource/lock/pessimistic/_spring/lockContext.xml b/src/main/java/org/olat/resource/lock/pessimistic/_spring/lockContext.xml deleted file mode 100644 index a9cd7230571a222031db6ba6122a7a5d0f37a41b..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/resource/lock/pessimistic/_spring/lockContext.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation=" - http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> - -<bean id="lockManager" class="org.olat.resource.lock.pessimistic.PessimisticLockManager" init-method="init" depends-on="database"/> - -</beans> diff --git a/src/main/java/org/olat/restapi/repository/course/CoursesInfosWebService.java b/src/main/java/org/olat/restapi/repository/course/CoursesInfosWebService.java index bf636c6502bad8f008d427063fbfa444db9b49b1..63dac84fddfa2ae08871270c1e488cc0aa7d3900 100644 --- a/src/main/java/org/olat/restapi/repository/course/CoursesInfosWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CoursesInfosWebService.java @@ -207,7 +207,7 @@ public class CoursesInfosWebService { AccessResult result = acManager.isAccessible(entry, identity, false); if(result.isAccessible()) { try { - final ICourse course = CourseFactory.loadCourse(entry.getOlatResource()); + final ICourse course = CourseFactory.loadCourse(entry); final List<FolderVO> folders = new ArrayList<FolderVO>(); final List<ForumVO> forums = new ArrayList<ForumVO>(); final IdentityEnvironment ienv = new IdentityEnvironment(identity, roles); diff --git a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java index 6e546dd560e9df98839fd044337ec1ee839e47dd..edb1e5b4c55dfb92d65510d06df4765ac4ebc5a8 100644 --- a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java @@ -376,7 +376,7 @@ public class CoursesWebService { //publish log.info("REST Publish course " + displayName + " START"); - ICourse course = CourseFactory.loadCourse(re.getOlatResource()); + ICourse course = CourseFactory.loadCourse(re); CourseFactory.publishCourse(course, RepositoryEntry.ACC_USERS, false, identity, ureq.getLocale()); log.info("REST Publish course " + displayName + " END"); return course; diff --git a/src/main/java/org/olat/search/service/indexer/group/GroupIndexer.java b/src/main/java/org/olat/search/service/indexer/group/GroupIndexer.java index efe7ba3203e3b1c1d8861bded9f22448793fb695..752bdedd116c4df4d5eaa77fb93dc2c28e772dce 100644 --- a/src/main/java/org/olat/search/service/indexer/group/GroupIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/group/GroupIndexer.java @@ -89,10 +89,10 @@ public class GroupIndexer extends AbstractHierarchicalIndexer { super.doIndex(searchResourceContext, businessGroup, indexWriter); } catch(Exception ex) { logError("Exception indexing group=" + businessGroup, ex); - DBFactory.getInstance(false).rollbackAndCloseSession(); + DBFactory.getInstance().rollbackAndCloseSession(); } catch (Error err) { logError("Error indexing group=" + businessGroup, err); - DBFactory.getInstance(false).rollbackAndCloseSession(); + DBFactory.getInstance().rollbackAndCloseSession(); } } long indexTime = System.currentTimeMillis() - startTime; diff --git a/src/main/java/org/olat/search/service/indexer/identity/IdentityIndexer.java b/src/main/java/org/olat/search/service/indexer/identity/IdentityIndexer.java index 6349ddc886cf52da1bc8e61f4032e98ae49a472d..259a99e783b621a933c47c64551304b00ced0365 100644 --- a/src/main/java/org/olat/search/service/indexer/identity/IdentityIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/identity/IdentityIndexer.java @@ -85,7 +85,7 @@ public class IdentityIndexer extends AbstractHierarchicalIndexer { counter++; } catch (Exception ex) { logWarn("Exception while indexing identity::" + identityKey + ". Skipping this user, try next one.", ex); - DBFactory.getInstance(false).rollbackAndCloseSession(); + DBFactory.getInstance().rollbackAndCloseSession(); } } if (isLogDebugEnabled()) logDebug("IdentityIndexer finished with counter::" + counter); diff --git a/src/main/java/org/olat/search/service/indexer/repository/CourseIndexer.java b/src/main/java/org/olat/search/service/indexer/repository/CourseIndexer.java index b6c1d1f2cc680845b13139b1b2dd4188c04a14a7..d7c0e224ed6f9b4cd83b09d8b2d3b65afc60e8c0 100644 --- a/src/main/java/org/olat/search/service/indexer/repository/CourseIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/repository/CourseIndexer.java @@ -91,7 +91,7 @@ public class CourseIndexer extends AbstractHierarchicalIndexer { return; } - ICourse course = CourseFactory.loadCourse(repositoryEntry.getOlatResource()); + ICourse course = CourseFactory.loadCourse(repositoryEntry); // course.getCourseTitle(); // do not index title => index root-node parentResourceContext.setParentContextType(TYPE); parentResourceContext.setParentContextName(course.getCourseTitle()); diff --git a/src/main/java/org/olat/search/ui/SearchControllerFactory.java b/src/main/java/org/olat/search/ui/SearchControllerFactory.java index c626531874435f7d0985ddc305cbd808f827f01c..3cc811143d76cfda024be4deef1458efd8331dbb 100644 --- a/src/main/java/org/olat/search/ui/SearchControllerFactory.java +++ b/src/main/java/org/olat/search/ui/SearchControllerFactory.java @@ -125,7 +125,7 @@ public class SearchControllerFactory implements SearchServiceUIFactory { String repoKey = allTokens.get(0).split("[:]")[1]; RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(Long.parseLong(repoKey)); if(re != null) { - ICourse course = CourseFactory.loadCourse(re.getOlatResource()); + ICourse course = CourseFactory.loadCourse(re); CourseNode courseNode = course.getRunStructure().getNode(tokenKey); return courseNode.getShortTitle(); } diff --git a/src/main/java/org/olat/upgrade/UpgradeManagerImpl.java b/src/main/java/org/olat/upgrade/UpgradeManagerImpl.java index c4641b6cbd8889cd243e178e67e6041d1e71d53d..7485c4ab0d3d53167e2891f64a8c87ec56a7c9af 100644 --- a/src/main/java/org/olat/upgrade/UpgradeManagerImpl.java +++ b/src/main/java/org/olat/upgrade/UpgradeManagerImpl.java @@ -78,10 +78,10 @@ public class UpgradeManagerImpl extends UpgradeManager { if (upgrade.doPostSystemInitUpgrade(this)) logAudit("Successfully installed PostSystemInitUpgrade::" + upgrade.getVersion()); //just in case a doPostSystemInitUpgrade did forget it. - DBFactory.getInstance(false).commitAndCloseSession(); + DBFactory.getInstance().commitAndCloseSession(); } } catch (Throwable e) { - DBFactory.getInstance(false).rollbackAndCloseSession(); + DBFactory.getInstance().rollbackAndCloseSession(); logWarn("Error upgrading PostSystemInitUpgrade::" + upgrade.getVersion(), e); abort(e); } diff --git a/src/main/java/org/olat/core/commons/persistence/_spring/core_persistence.xml b/src/main/resources/META-INF/persistence.xml similarity index 99% rename from src/main/java/org/olat/core/commons/persistence/_spring/core_persistence.xml rename to src/main/resources/META-INF/persistence.xml index 60dc0f8955c3c4539edcfcfba8788bf7a3fc0b1c..52fa4b88507d7cee5cfdb5991184813a5c2258ca 100644 --- a/src/main/java/org/olat/core/commons/persistence/_spring/core_persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -21,7 +21,6 @@ <mapping-file>org/olat/group/area/BGtoAreaRelationImpl.hbm.xml</mapping-file> <mapping-file>org/olat/group/BusinessGroupImpl.hbm.xml</mapping-file> <mapping-file>org/olat/group/model/BusinessGroupViewImpl.hbm.xml</mapping-file> - <mapping-file>org/olat/resource/lock/pessimistic/PLockImpl.hbm.xml</mapping-file> <mapping-file>org/olat/resource/OLATResourceImpl.hbm.xml</mapping-file> <mapping-file>org/olat/resource/accesscontrol/model/Offer.hbm.xml</mapping-file> <mapping-file>org/olat/resource/accesscontrol/model/AccessMethod.hbm.xml</mapping-file> @@ -95,6 +94,7 @@ <class>org.olat.commons.calendar.model.ImportedCalendar</class> <class>org.olat.commons.calendar.model.ImportedToCalendar</class> <class>org.olat.commons.calendar.model.CalendarUserConfiguration</class> + <class>org.olat.core.commons.services.lock.pessimistic.PLockImpl</class> <class>org.olat.core.commons.services.notifications.model.SubscriberImpl</class> <class>org.olat.core.commons.services.notifications.model.PublisherImpl</class> <class>org.olat.core.commons.services.taskexecutor.model.PersistentTask</class> diff --git a/src/test/java/org/olat/commons/coordinate/cluster/lock/LockTest.java b/src/test/java/org/olat/commons/coordinate/cluster/lock/LockTest.java index c3b09e6c18a6d7eb34e9a5960017ed731cc75809..6b7ee934eb2c175758d678ea60bee9d5d72e1bb2 100644 --- a/src/test/java/org/olat/commons/coordinate/cluster/lock/LockTest.java +++ b/src/test/java/org/olat/commons/coordinate/cluster/lock/LockTest.java @@ -40,9 +40,9 @@ import java.util.UUID; import org.junit.Assert; import org.junit.Test; import org.olat.basesecurity.BaseSecurity; +import org.olat.basesecurity.model.GroupImpl; import org.olat.commons.coordinate.cluster.ClusterCoordinator; import org.olat.core.commons.persistence.DB; -import org.olat.core.commons.persistence.TestTable; import org.olat.core.gui.control.Event; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; @@ -172,30 +172,29 @@ public class LockTest extends OlatTestCase { @Test public void testSaveEvent() { - BaseSecurity baseSecurityManager = applicationContext.getBean(BaseSecurity.class); - Identity identity = baseSecurityManager.createAndPersistIdentity("lock-save-event-" + UUID.randomUUID().toString(), null, null, null, null); - dbInstance.closeSession(); - log.info("Created identity=" + identity); - // - TestTable entry = new TestTable(); - entry.setField1("bar"); - entry.setField2(2221234354566776L); + Identity identity = securityManager.createAndPersistIdentity("lock-save-event-" + UUID.randomUUID().toString(), null, null, null, null); + dbInstance.closeSession(); + log.info("Created identity=" + identity); + + //The group has no creation date -> commit will fail + GroupImpl entry = new GroupImpl(); + entry.setName("bar"); try { dbInstance.saveObject(entry); dbInstance.commit(); - fail("Should generate an error"); + fail("Should generate an error"); } catch (DBRuntimeException dre) { log.info("DB connection is in error-state"); } + // DB transaction must be in error state for this test try { - Locker locker = clusterCoordinator.getLocker(); assertTrue(locker instanceof ClusterLocker); log.info("ClusterLocker created"); - Event event = new SignOnOffEvent(identity, false); - log.info("START locker.event(event)"); - ((ClusterLocker)locker).event(event); + Event event = new SignOnOffEvent(identity, false); + log.info("START locker.event(event)"); + ((ClusterLocker)locker).event(event); log.info("DONE locker.event(event)"); } catch(Exception ex) { log.error("", ex); diff --git a/src/test/java/org/olat/core/commons/persistence/DBTest.java b/src/test/java/org/olat/core/commons/persistence/DBTest.java index 435a0d0c5d2405f58a632eeece2e7380e1399063..19ab9c1649cb69fb17eb9d6b243813be02deee8a 100644 --- a/src/test/java/org/olat/core/commons/persistence/DBTest.java +++ b/src/test/java/org/olat/core/commons/persistence/DBTest.java @@ -32,31 +32,24 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.Date; import java.util.UUID; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.EntityTransaction; import org.junit.Assert; import org.junit.Test; +import org.olat.basesecurity.model.GroupImpl; import org.olat.core.logging.DBRuntimeException; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.properties.Property; import org.olat.properties.PropertyManager; import org.olat.repository.RepositoryManager; -import org.olat.repository.model.RepositoryEntryShortImpl; import org.olat.test.OlatTestCase; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.orm.jpa.EntityManagerFactoryUtils; -import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationManager; /** @@ -70,62 +63,21 @@ public class DBTest extends OlatTestCase { private static final OLog log = Tracing.createLoggerFor(DBTest.class); @Autowired - private RepositoryManager repositoryManager; + private DBImpl dbInstance; @Autowired - private EntityManagerFactory emf; + private RepositoryManager repositoryManager; /** * testCloseOfUninitializedSession */ @Test public void testCloseOfUninitializedSession() { - // first get a initialized db - DB db = DBImpl.getInstance(); //close it - db.closeSession(); - //then get a uninitialized db - db = DBImpl.getInstance(); + dbInstance.closeSession(); // and close it. - db.closeSession(); + dbInstance.closeSession(); } - @Test - public void testMergeEntityManager() { - EntityManager em1 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); - Assert.assertNull(em1); - List<RepositoryEntryShortImpl> res = repositoryManager.loadRepositoryEntryShortsByResource(Collections.singletonList(27l), "CourseModule"); - Assert.assertNotNull(res); - EntityManager em2 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); - Assert.assertNotNull(em2); - - EntityTransaction trx = em2.getTransaction(); - Assert.assertTrue(trx.isActive()); - trx.commit(); - - EntityManagerFactoryUtils.closeEntityManager(em2); - - EntityManager em3 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); - Assert.assertNotNull(em3); - - //search in the thread local used by Spring - List<TransactionSynchronization> syncs = TransactionSynchronizationManager.getSynchronizations(); - Assert.assertNotNull(syncs); - TransactionSynchronizationManager.clear(); - Map<Object,Object> map = TransactionSynchronizationManager.getResourceMap(); - Assert.assertNotNull(map); - EntityManager em4 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); - Assert.assertNotNull(em4); - - //unbind the entity manager - if(map.containsKey(emf)) { - TransactionSynchronizationManager.unbindResource(emf); - } - - //no entity manager anymore - EntityManager em5 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); - Assert.assertNull(em5); - } - @Test public void testMergeEntityManager_transactional() { CountDownLatch latch = new CountDownLatch(1); @@ -157,10 +109,10 @@ public class DBTest extends OlatTestCase { public void run() { try { - EntityManager em1 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); + EntityManager em1 = dbInstance.getCurrentEntityManager(); Assert.assertNull(em1); repoManager.lookupRepositoryEntry(27l, false); - EntityManager em2 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); + EntityManager em2 = dbInstance.getCurrentEntityManager(); //Transactional annotation must clean-up the entity manager Assert.assertNull(em2); } catch (Exception e) { @@ -177,37 +129,28 @@ public class DBTest extends OlatTestCase { */ @Test public void testErrorHandling() { - TestTable entry = new TestTable(); - entry.setField1("foo"); - entry.setField2(1234354566776L); - DBImpl db = DBImpl.getInstance(); + GroupImpl entry = new GroupImpl(); + entry.setName("foo"); try { - db.saveObject(entry); + dbInstance.saveObject(entry); fail("Should generate an error"); } catch (DBRuntimeException dre) { - assertTrue(db.isError()); - assertNotNull(db.getError()); - } - - db.closeSession(); - // in a transaction - db = DBImpl.getInstance(); - TestTable entryTwo = new TestTable(); - entryTwo.setField1("bar"); - entryTwo.setField2(2221234354566776L); - try { - db.saveObject(entryTwo); - db.closeSession(); - fail("Should generate an error"); - } catch (DBRuntimeException dre) { - assertTrue(db.isError()); - assertNotNull(db.getError()); + assertTrue(dbInstance.isError()); + Assert.assertNotNull(dbInstance.getError()); } + //the close must clear the transaction + dbInstance.closeSession(); + + //a second try must work + GroupImpl entryTwo = new GroupImpl(); + entryTwo.setName("bar"); + entryTwo.setCreationDate(new Date()); + dbInstance.saveObject(entryTwo); + dbInstance.commitAndCloseSession(); } @Test public void testRollback() { - DB db = DBFactory.getInstance(); String propertyKey = "testRollback-1"; String testValue = "testRollback-1"; try { @@ -218,13 +161,12 @@ public class DBTest extends OlatTestCase { // name is null => generated DB error => rollback Property p2 = pm.createPropertyInstance(null, null, null, null, null, null, null, testValue2, null); pm.saveProperty(p2); - db.commit(); + dbInstance.commit(); fail("Should generate error for rollback."); } catch (Exception ex) { - db.closeSession(); + dbInstance.closeSession(); } // check if p1 is rollbacked - db = DBFactory.getInstance(); PropertyManager pm = PropertyManager.getInstance(); Property p =pm.findProperty(null, null, null, null, propertyKey); assertNull("Property.save is NOT rollbacked", p); @@ -232,7 +174,6 @@ public class DBTest extends OlatTestCase { @Test public void testMixedNonTransactional_Transactional() { - DB db = DBFactory.getInstance(); String propertyKey1 = "testMixed-1"; String testValue1 = "testMixed-1"; String propertyKey2 = "testMixed-2"; @@ -249,11 +190,11 @@ public class DBTest extends OlatTestCase { // name is null => generated DB error => rollback Property p3 = pm.createPropertyInstance(null, null, null, null, null, null, null, testValue3, null); pm.saveProperty(p3); - db.commit(); + dbInstance.commit(); fail("Should generate error for rollback."); - db.closeSession(); + dbInstance.closeSession(); } catch (Exception ex) { - db.closeSession(); + dbInstance.closeSession(); } // check if p1&p2 is rollbacked PropertyManager pm = PropertyManager.getInstance(); @@ -265,7 +206,6 @@ public class DBTest extends OlatTestCase { @Test public void testRollbackNonTransactional() { - DB db = DBFactory.getInstance(); String propertyKey1 = "testNonTransactional-1"; String testValue1 = "testNonTransactional-1"; String propertyKey2 = "testNonTransactional-2"; @@ -280,11 +220,11 @@ public class DBTest extends OlatTestCase { // name is null => generated DB error => rollback ? Property p3 = pm.createPropertyInstance(null, null, null, null, null, null, null, testValue3, null); pm.saveProperty(p3); - db.commit(); + dbInstance.commit(); fail("Should generate error for rollback."); - db.closeSession(); + dbInstance.closeSession(); } catch (Exception ex) { - db.closeSession(); + dbInstance.closeSession(); } // check if p1 & p2 is NOT rollbacked PropertyManager pm = PropertyManager.getInstance(); @@ -303,13 +243,12 @@ public class DBTest extends OlatTestCase { long startTime = System.currentTimeMillis(); for (int loopCounter=0; loopCounter<loops; loopCounter++) { String propertyKey = "testDbPerfKey-" + loopCounter; - DB db = DBFactory.getInstance(); PropertyManager pm = PropertyManager.getInstance(); String testValue = "testDbPerfValue-" + loopCounter; Property p = pm.createPropertyInstance(null, null, null, null, propertyKey, null, null, testValue, null); pm.saveProperty(p); // forget session cache etc. - db.closeSession(); + dbInstance.closeSession(); pm.deleteProperty(p); } long endTime = System.currentTimeMillis(); @@ -323,14 +262,12 @@ public class DBTest extends OlatTestCase { long startTime = System.currentTimeMillis(); for (int loopCounter=0; loopCounter<loops; loopCounter++) { String propertyKey = "testDbPerfKey-" + loopCounter; - DB db = DBFactory.getInstance(); PropertyManager pm = PropertyManager.getInstance(); String testValue = "testDbPerfValue-" + loopCounter; Property p = pm.createPropertyInstance(null, null, null, null, propertyKey, null, null, testValue, null); pm.saveProperty(p); // forget session cache etc. - db.closeSession(); - db = DBFactory.getInstance(); + dbInstance.closeSession(); pm.deleteProperty(p); } long endTime = System.currentTimeMillis(); @@ -344,16 +281,15 @@ public class DBTest extends OlatTestCase { @Test public void testDBUTF8capable() { - DB db = DBFactory.getInstance(); PropertyManager pm = PropertyManager.getInstance(); - String name = UUID.randomUUID().toString(); + String uuid = UUID.randomUUID().toString(); String unicodetest = "a-greek a\u03E2a\u03EAa\u03E8 arab \u0630a\u0631 chinese:\u3150a\u3151a\u3152a\u3153a\u3173a\u3110-z"; - Property p = pm.createPropertyInstance(null, null, null, null, name, null, null, unicodetest, null); + Property p = pm.createPropertyInstance(null, null, null, null, uuid, null, null, unicodetest, null); pm.saveProperty(p); // forget session cache etc. - db.closeSession(); + dbInstance.closeSession(); - Property p2 = pm.findProperty(null, null, null, null, name); + Property p2 = pm.findProperty(null, null, null, null, uuid); String lStr = p2.getStringValue(); assertEquals(unicodetest, lStr); } @@ -365,13 +301,13 @@ public class DBTest extends OlatTestCase { PropertyManager.getInstance().saveProperty(p); long propertyKey = p.getKey(); // forget session cache etc. - DBFactory.getInstance().closeSession(); + dbInstance.closeSession(); // 2. try to find object - Object testObject = DBFactory.getInstance().findObject(Property.class, propertyKey); + Object testObject = dbInstance.findObject(Property.class, propertyKey); assertNotNull(testObject); // 3. Delete object PropertyManager.getInstance().deleteProperty( (Property)testObject ); - DBFactory.getInstance().closeSession(); + dbInstance.closeSession(); // 4. try again to find object, now no-one should be found, must return null testObject = DBFactory.getInstance().findObject(Property.class, propertyKey); assertNull(testObject); @@ -427,21 +363,19 @@ public class DBTest extends OlatTestCase { while (loopCounter++ < numberOfLoops ) { String propertyKey = UUID.randomUUID().toString(); - DB db = DBFactory.getInstance(); PropertyManager pm = PropertyManager.getInstance(); String testValue = "DbWorkerValue-" + workerId + "-" + loopCounter; Property p = pm.createPropertyInstance(null, null, null, null, propertyKey, null, null, testValue, null); pm.saveProperty(p); // forget session cache etc. - db.closeSession(); + dbInstance.closeSession(); - db = DBFactory.getInstance(); Property p2 = pm.findProperty(null, null, null, null, propertyKey); String lStr = p2.getStringValue(); if (!testValue.equals(lStr)) { errorCounter++; } - db.closeSession(); + dbInstance.closeSession(); } } catch (Exception ex) { log.error("", ex); diff --git a/src/test/java/org/olat/core/commons/persistence/TestTable.hbm.xml b/src/test/java/org/olat/core/commons/persistence/TestTable.hbm.xml deleted file mode 100644 index e4e2ab16b737b037ce656f5bc072e027bb7c0256..0000000000000000000000000000000000000000 --- a/src/test/java/org/olat/core/commons/persistence/TestTable.hbm.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE hibernate-mapping PUBLIC - "-//Hibernate/Hibernate Mapping DTD//EN" - "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> - -<hibernate-mapping default-lazy="false"> - <class name="org.olat.core.commons.persistence.TestTable" table="o_tst_testtable"> - - <id name="key" column="id" type="long" unsaved-value="null"> - <generator class="hilo"/> - </id> - - <version name="version" access="field" column="version" type="int"/> - <property name="creationDate" column="creationdate" type="timestamp" /> - - <property name="field1" unique="false" not-null="true" length="255"/> - - <property name="field2" type="long" not-null="false"/> - - <!-- The following property produces a runtime error when saving the object for testing purposes. --> - <property name="field3" unique="false" not-null="true" length="255"/> - - </class> -</hibernate-mapping> - diff --git a/src/test/java/org/olat/core/commons/persistence/TestTable.java b/src/test/java/org/olat/core/commons/persistence/TestTable.java deleted file mode 100644 index be99ba887417b634eaf84837f2ac6a71ebadbda7..0000000000000000000000000000000000000000 --- a/src/test/java/org/olat/core/commons/persistence/TestTable.java +++ /dev/null @@ -1,130 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -* <p> -*/ - -package org.olat.core.commons.persistence; - -import java.util.Date; - -/** - * A <b>TestTable</b> is used to test the persistence package. - * - * @author Andreas Ch. Kapp - * - */ -public class TestTable { - - Long key; - int version; - String field1; - long field2; - String field3; - Date creationDate; - - /** - * @return field1 - */ - public String getField1() { - return field1; - } - - /** - * @return field2 - */ - public long getField2() { - return field2; - } - - /** - * @return field3 - */ - public String getField3() { - return field3; - } - - /** - * @return key - */ - public Long getKey() { - return key; - } - - /** - * @param string - */ - public void setField1(String string) { - field1 = string; - } - - /** - * @param l - */ - public void setField2(long l) { - field2 = l; - } - - /** - * @param string - */ - public void setField3(String string) { - field3 = string; - } - - /** - * @param long1 - */ - public void setKey(Long long1) { - key = long1; - } - - /** - * @return creationDate - */ - public Date getCreationDate() { - return creationDate; - } - - /** - * @return lastModified - */ - public Integer getVersion() { - return version; - } - - /** - * @param date - */ - public void setCreationDate(Date date) { - creationDate = date; - } - - /** - * @param date - */ - public void setVersion(int version) { - this.version = version; - } - -} diff --git a/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java b/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java index 8e7e9e5015175b518cacac9be28a4ff166f2ef3d..611583147225376da22c35ac572bc2e85e0a3374 100644 --- a/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java +++ b/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java @@ -1042,7 +1042,7 @@ public class ReminderRuleEngineTest extends OlatTestCase { private String assessmentData(Identity tutor, Identity student, ScoreEvaluation scoreEval, RepositoryEntry re) { //create user course infos - ICourse course = CourseFactory.loadCourse(re.getOlatResource()); + ICourse course = CourseFactory.loadCourse(re); List<CourseNode> assessableNodeList = AssessmentHelper.getAssessableNodes(course.getEditorTreeModel(), null); AssessableCourseNode testNode = null; for(CourseNode currentNode: assessableNodeList) { diff --git a/src/test/java/org/olat/resource/lock/pessimistic/PLockTest.java b/src/test/java/org/olat/resource/lock/pessimistic/PLockTest.java index 43953939b71eafe00c7fdfc0ef8e9be9f9e15b47..23a8cfc5f07d66104baa79869998e19616a36633 100644 --- a/src/test/java/org/olat/resource/lock/pessimistic/PLockTest.java +++ b/src/test/java/org/olat/resource/lock/pessimistic/PLockTest.java @@ -43,6 +43,8 @@ import org.junit.Test; import org.olat.basesecurity.BaseSecurityManager; import org.olat.basesecurity.SecurityGroup; import org.olat.core.commons.persistence.DB; +import org.olat.core.commons.services.lock.pessimistic.PLock; +import org.olat.core.commons.services.lock.pessimistic.PessimisticLockManager; import org.olat.core.id.Identity; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; diff --git a/src/test/java/org/olat/restapi/UserFoldersTest.java b/src/test/java/org/olat/restapi/UserFoldersTest.java index 8a58d925febecaae008f219791b5542259ab867b..a7ce1b69516ca0517b65b672e13c0c7058dbea59 100644 --- a/src/test/java/org/olat/restapi/UserFoldersTest.java +++ b/src/test/java/org/olat/restapi/UserFoldersTest.java @@ -90,7 +90,7 @@ public class UserFoldersTest extends OlatJerseyTestCase { File courseWithForums = new File(courseWithForumsUrl.toURI()); myCourseRe = CourseFactory.deployCourseFromZIP(courseWithForums, UUID.randomUUID().toString(), 4); Assert.assertNotNull(myCourseRe); - myCourse = CourseFactory.loadCourse(myCourseRe.getOlatResource().getResourceableId()); + myCourse = CourseFactory.loadCourse(myCourseRe); setup = true; } diff --git a/src/test/java/org/olat/restapi/UserMgmtTest.java b/src/test/java/org/olat/restapi/UserMgmtTest.java index 765002eed69e131c31c2892454fe7fd340897823..367ceb0b347d073416d424f4cf3e58f81b13b093 100644 --- a/src/test/java/org/olat/restapi/UserMgmtTest.java +++ b/src/test/java/org/olat/restapi/UserMgmtTest.java @@ -247,7 +247,7 @@ public class UserMgmtTest extends OlatJerseyTestCase { repositoryService.addRole(id1, entry, GroupRoles.participant.name()); } - demoCourse = CourseFactory.loadCourse(entry.getOlatResource()); + demoCourse = CourseFactory.loadCourse(entry); TreeVisitor visitor = new TreeVisitor(new Visitor() { @Override public void visit(INode node) { diff --git a/src/test/java/org/olat/test/JunitTestHelper.java b/src/test/java/org/olat/test/JunitTestHelper.java index d28fa5f461ba799f12b4018ba8cfdc84dfc398dc..1d3d4dfc53eb47bc89de99a3ced6865ba5f3e537 100644 --- a/src/test/java/org/olat/test/JunitTestHelper.java +++ b/src/test/java/org/olat/test/JunitTestHelper.java @@ -212,7 +212,7 @@ public class JunitTestHelper { .getRepositoryHandler(CourseModule.getCourseTypeName()); re = courseHandler.importResource(initialAuthor, null, displayname, description, true, Locale.ENGLISH, courseFile, null); - ICourse course = CourseFactory.loadCourse(re.getOlatResource()); + ICourse course = CourseFactory.loadCourse(re); CourseFactory.publishCourse(course, RepositoryEntry.ACC_USERS, false, initialAuthor, Locale.ENGLISH); } catch (Exception e) { log.error("", e); @@ -238,7 +238,7 @@ public class JunitTestHelper { .getRepositoryHandler(CourseModule.getCourseTypeName()); re = courseHandler.importResource(initialAuthor, null, displayname, description, true, Locale.ENGLISH, courseFile, null); - ICourse course = CourseFactory.loadCourse(re.getOlatResource()); + ICourse course = CourseFactory.loadCourse(re); CourseFactory.publishCourse(course, RepositoryEntry.ACC_USERS, false, initialAuthor, Locale.ENGLISH); } catch (Exception e) { log.error("", e);