diff --git a/src/main/java/org/olat/resource/_spring/resourceContext.xml b/src/main/java/org/olat/resource/_spring/resourceContext.xml index e2cc09c3ae325409fc4c9f0b4bdb764d33965cd9..405da6ce38bedbf900bfb0722b62f2eacc2dfb80 100644 --- a/src/main/java/org/olat/resource/_spring/resourceContext.xml +++ b/src/main/java/org/olat/resource/_spring/resourceContext.xml @@ -5,12 +5,13 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> -<bean id="resourceManager" class="org.olat.resource.OLATResourceManager"> - <property name="dbInstance" ref="database"/> -</bean> + <bean id="resourceManager" class="org.olat.resource.OLATResourceManager"> + <property name="dbInstance" ref="database"/> + </bean> -<bean id="referenceManager" class="org.olat.resource.references.ReferenceManager"> - <constructor-arg ref="resourceManager" /> -</bean> + <bean id="referenceManager" class="org.olat.resource.references.ReferenceManager"> + <property name="dbInstance" ref="database"/> + <property name="resourceManager" ref="resourceManager"/> + </bean> </beans> \ No newline at end of file diff --git a/src/main/java/org/olat/resource/references/ReferenceManager.java b/src/main/java/org/olat/resource/references/ReferenceManager.java index 6855727aebab27b032cb0300da808f00f7655990..96175413fe30555dd48968da6699e0142128f169 100644 --- a/src/main/java/org/olat/resource/references/ReferenceManager.java +++ b/src/main/java/org/olat/resource/references/ReferenceManager.java @@ -26,14 +26,15 @@ package org.olat.resource.references; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.Locale; -import org.hibernate.type.StandardBasicTypes; +import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.id.OLATResourceable; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; import org.olat.core.manager.BasicManager; import org.olat.core.util.Util; import org.olat.course.CourseFactory; @@ -54,11 +55,14 @@ import org.olat.resource.OLATResourceManager; */ public class ReferenceManager extends BasicManager { + private static final OLog log = Tracing.createLoggerFor(ReferenceManager.class); + private static ReferenceManager INSTANCE; + + private DB dbInstance; private OLATResourceManager olatResourceManager; - private ReferenceManager(OLATResourceManager olatResourceManager) { - this.olatResourceManager = olatResourceManager; + private ReferenceManager() { INSTANCE = this; } @@ -67,6 +71,23 @@ public class ReferenceManager extends BasicManager { */ public static ReferenceManager getInstance() { return INSTANCE; } + + /** + * [used by Spring] + * @param dbInstance + */ + public void setDbInstance(DB dbInstance) { + this.dbInstance = dbInstance; + } + + /** + * [used by Spring] + * @param olatResourceManager + */ + public void setResourceManager(OLATResourceManager olatResourceManager) { + this.olatResourceManager = olatResourceManager; + } + /** * Add a new reference. The meaning of source and target is * such as the source references the target. @@ -80,7 +101,7 @@ public class ReferenceManager extends BasicManager { OLATResourceImpl sourceImpl = (OLATResourceImpl)olatResourceManager.findResourceable(source); OLATResourceImpl targetImpl = (OLATResourceImpl)olatResourceManager.findResourceable(target); ReferenceImpl ref = new ReferenceImpl(sourceImpl, targetImpl, userdata); - DBFactory.getInstance().saveObject(ref); + dbInstance.saveObject(ref); } /** @@ -90,12 +111,15 @@ public class ReferenceManager extends BasicManager { * @return List of renerences. */ public List<ReferenceImpl> getReferences(OLATResourceable source) { - OLATResourceImpl sourceImpl = (OLATResourceImpl)olatResourceManager.findResourceable(source); - if (sourceImpl == null) return new ArrayList<ReferenceImpl>(0); - - return DBFactory.getInstance().find( - "select v from org.olat.resource.references.ReferenceImpl as v where v.source = ?", - sourceImpl.getKey(), StandardBasicTypes.LONG); + Long sourceKey = getResourceKey(source); + if (sourceKey == null) { + return new ArrayList<ReferenceImpl>(0); + } + StringBuilder sb = new StringBuilder(); + sb.append("select v from ").append(ReferenceImpl.class.getName()).append(" as v where v.source.key=:sourceKey"); + return dbInstance.getCurrentEntityManager().createQuery(sb.toString(), ReferenceImpl.class) + .setParameter("sourceKey", sourceKey) + .getResultList(); } /** @@ -104,13 +128,31 @@ public class ReferenceManager extends BasicManager { * @param target * @return List of references. */ - public List getReferencesTo(OLATResourceable target) { - OLATResourceImpl targetImpl = (OLATResourceImpl)olatResourceManager.findResourceable(target); - if (targetImpl == null) return new ArrayList(0); - - return DBFactory.getInstance().find( - "select v from org.olat.resource.references.ReferenceImpl as v where v.target = ?", - targetImpl.getKey(), StandardBasicTypes.LONG); + public List<ReferenceImpl> getReferencesTo(OLATResourceable target) { + Long targetKey = getResourceKey(target); + if (targetKey == null) { + return new ArrayList<ReferenceImpl>(0); + } + StringBuilder sb = new StringBuilder(); + sb.append("select v from ").append(ReferenceImpl.class.getName()).append(" as v where v.target.key=:targetKey"); + return dbInstance.getCurrentEntityManager().createQuery(sb.toString(), ReferenceImpl.class) + .setParameter("targetKey", targetKey) + .getResultList(); + } + + private Long getResourceKey(OLATResourceable resource) { + Long sourceKey; + if(resource instanceof OLATResource) { + sourceKey = ((OLATResource)resource).getKey(); + } else { + OLATResource sourceImpl = olatResourceManager.findResourceable(resource); + if (sourceImpl == null) { + sourceKey = null; + } else { + sourceKey = sourceImpl.getKey(); + } + } + return sourceKey; } /** @@ -131,16 +173,19 @@ public class ReferenceManager extends BasicManager { public String getReferencesToSummary(OLATResourceable target, Locale locale) { Translator translator = Util.createPackageTranslator(this.getClass(), locale); StringBuilder result = new StringBuilder(100); - List refs = getReferencesTo(target); + List<ReferenceImpl> refs = getReferencesTo(target); if (refs.size() == 0) return null; - for (Iterator iter = refs.iterator(); iter.hasNext();) { - ReferenceImpl ref = (ReferenceImpl) iter.next(); + for (ReferenceImpl ref:refs) { OLATResourceImpl source = ref.getSource(); - // special treatment for referenced courses: find out the course title if (source.getResourceableTypeName().equals(CourseModule.getCourseTypeName())) { - ICourse course = CourseFactory.loadCourse(source); - result.append(translator.translate("ref.course", new String[] { course.getCourseTitle() })); + try { + ICourse course = CourseFactory.loadCourse(source); + result.append(translator.translate("ref.course", new String[] { course.getCourseTitle() })); + } catch (Exception e) { + log.error("", e); + result.append(translator.translate("ref.course", new String[] { "<strike>" + source.getKey().toString() + "</strike>" })); + } } else { result.append(translator.translate("ref.generic", new String[] { source.getKey().toString() })); } @@ -161,11 +206,9 @@ public class ReferenceManager extends BasicManager { * @param olatResource an OLAT-Resource */ public void deleteAllReferencesOf(OLATResource olatResource) { - List references = ReferenceManager.getInstance().getReferences(olatResource); - for (Iterator iterator = references.iterator(); iterator.hasNext();) { - ReferenceImpl ref = (ReferenceImpl) iterator.next(); - ReferenceManager.getInstance().delete( ref); + List<ReferenceImpl> references = getReferences(olatResource); + for (ReferenceImpl ref:references) { + delete(ref); } } - } diff --git a/src/test/java/org/olat/resource/references/ReferenceManagerTest.java b/src/test/java/org/olat/resource/references/ReferenceManagerTest.java index 7749c7e7dd2effe4882a4abd928ba0ed8c5f40ab..fde9bb52922ed73b830ccaf4ff8d8cba32568a15 100644 --- a/src/test/java/org/olat/resource/references/ReferenceManagerTest.java +++ b/src/test/java/org/olat/resource/references/ReferenceManagerTest.java @@ -28,17 +28,18 @@ package org.olat.resource.references; import static org.junit.Assert.assertTrue; -import java.util.Iterator; import java.util.List; -import org.apache.log4j.Logger; -import org.junit.After; +import org.junit.Assert; import org.junit.Test; -import org.olat.core.commons.persistence.DBFactory; +import org.olat.core.commons.persistence.DB; +import org.olat.core.id.OLATResourceable; import org.olat.core.util.resource.OresHelper; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; +import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; +import org.springframework.beans.factory.annotation.Autowired; /** @@ -46,107 +47,125 @@ import org.olat.test.OlatTestCase; */ public class ReferenceManagerTest extends OlatTestCase { - private static Logger log = Logger.getLogger(ReferenceManagerTest.class.getName()); - private static Long RESOURCABLE_ID_1 = new Long(123); - private static Long RESOURCABLE_ID_2 = new Long(456); - private static Long RESOURCABLE_ID_3 = new Long(457); - - + @Autowired + private DB dbInstance; + @Autowired + private ReferenceManager referenceManager; + @Autowired + private OLATResourceManager resourceManager; + + // Already tested in BusinessGroupTest : // - getGroupsWithPermissionOnOlatResourceable // - getIdentitiesWithPermissionOnOlatResourceable /** * */ - @Test public void testAddReference() { - OLATResource oressource = OLATResourceManager.getInstance().findOrPersistResourceable(OresHelper.createOLATResourceableInstance("type1", RESOURCABLE_ID_1)); - OLATResource orestarget = OLATResourceManager.getInstance().findOrPersistResourceable(OresHelper.createOLATResourceableInstance("type2targ", RESOURCABLE_ID_2)); + @Test + public void testAddReference() { + OLATResource oressource = JunitTestHelper.createRandomResource(); + OLATResource orestarget = JunitTestHelper.createRandomResource(); String udata = "üserdätä"; // add a reference - ReferenceManager.getInstance().addReference(oressource, orestarget, udata); - DBFactory.getInstance().closeSession(); + referenceManager.addReference(oressource, orestarget, udata); + dbInstance.closeSession(); - OLATResource orestarget2 = OLATResourceManager.getInstance().findOrPersistResourceable(OresHelper.createOLATResourceableInstance("type2targ", RESOURCABLE_ID_2)); - List refs = ReferenceManager.getInstance().getReferencesTo(orestarget2); - for (Iterator it_refs = refs.iterator(); it_refs.hasNext();) { - ReferenceImpl ref = (ReferenceImpl) it_refs.next(); - System.out.println("ref:"+ref); - } - assertTrue("only one reference may exist", refs.size() == 1); + OLATResourceable targetOres = OresHelper.createOLATResourceableInstance(orestarget.getResourceableTypeName(), orestarget.getResourceableId()); + OLATResource orestarget2 = resourceManager.findOrPersistResourceable(targetOres); + List<ReferenceImpl> refs = referenceManager.getReferencesTo(orestarget2); + Assert.assertNotNull(refs); + Assert.assertEquals("only one reference may exist", 1, refs.size()); + Assert.assertEquals(oressource, refs.get(0).getSource()); } - @Test public void testReferencesToAndFrom() { + @Test + public void testReferencesToAndFrom() { // same resouceable id on purpose - OLATResource s1 = OLATResourceManager.getInstance().findOrPersistResourceable(OresHelper.createOLATResourceableInstance("s1rrtype1", RESOURCABLE_ID_1)); - OLATResource s2 = OLATResourceManager.getInstance().findOrPersistResourceable(OresHelper.createOLATResourceableInstance("s2rrtype1", RESOURCABLE_ID_1)); - OLATResource s3 = OLATResourceManager.getInstance().findOrPersistResourceable(OresHelper.createOLATResourceableInstance("s31rrtype1", RESOURCABLE_ID_1)); - OLATResource t1 = OLATResourceManager.getInstance().findOrPersistResourceable(OresHelper.createOLATResourceableInstance("t1rrtype1", RESOURCABLE_ID_1)); - OLATResource t2 = OLATResourceManager.getInstance().findOrPersistResourceable(OresHelper.createOLATResourceableInstance("t2rrtype1", RESOURCABLE_ID_1)); + OLATResource s1 = JunitTestHelper.createRandomResource(); + OLATResource s2 = JunitTestHelper.createRandomResource(); + OLATResource s3 = JunitTestHelper.createRandomResource(); + OLATResource t1 = JunitTestHelper.createRandomResource(); + OLATResource t2 = JunitTestHelper.createRandomResource(); // add references - ReferenceManager.getInstance().addReference(s1,t1,"r11"); - ReferenceManager.getInstance().addReference(s2,t1,"r21"); - ReferenceManager.getInstance().addReference(s2,t2,"r22"); - ReferenceManager.getInstance().addReference(s3,t2,"r32"); + referenceManager.addReference(s1,t1,"r11"); + referenceManager.addReference(s2,t1,"r21"); + referenceManager.addReference(s2,t2,"r22"); + referenceManager.addReference(s3,t2,"r32"); - DBFactory.getInstance().closeSession(); + dbInstance.closeSession(); - // find the refs again - - List s1R = ReferenceManager.getInstance().getReferences(s1); - assertTrue("s1 only has one reference", s1R.size() == 1); + // find the refs again with DB resource + List<ReferenceImpl> s1R =referenceManager.getReferences(s1); + Assert.assertEquals("s1 only has one reference", 1, s1R.size()); ReferenceImpl ref = (ReferenceImpl)s1R.get(0); - assertTrue("source and s1 the same", OresHelper.equals(ref.getSource(), s1)); - assertTrue("target and t1 the same", OresHelper.equals(ref.getTarget(), t1)); + Assert.assertEquals("source and s1 the same", s1, ref.getSource()); + Assert.assertEquals("target and t1 the same", t1, ref.getTarget()); + + // find the same refs again with resourceable + OLATResourceable s1Ores = OresHelper.createOLATResourceableInstance(s1.getResourceableTypeName(), s1.getResourceableId()); + List<ReferenceImpl> s1Rb =referenceManager.getReferences(s1Ores); + Assert.assertEquals("s1 only has one reference", 1, s1Rb.size()); + ReferenceImpl refb = (ReferenceImpl)s1R.get(0); + Assert.assertEquals("source and s1 the same", s1, refb.getSource()); + Assert.assertEquals("target and t1 the same", t1, refb.getTarget()); // two refs from s2 - List s2refs = ReferenceManager.getInstance().getReferences(s2); - assertTrue ("s2 holds two refs (to t1 and t2)", s2refs.size() == 2); + List<ReferenceImpl> s2refs = referenceManager.getReferences(s2); + Assert.assertEquals("s2 holds two refs (to t1 and t2)", 2, s2refs.size()); // two refs to t2 - List t2refs = ReferenceManager.getInstance().getReferencesTo(t2); - assertTrue ("t2 holds two source refs (to s2 and s3)", t2refs.size() == 2); - + List<ReferenceImpl> t2refs = referenceManager.getReferencesTo(t2); + Assert.assertEquals("t2 holds two source refs (to s2 and s3)", 2, t2refs.size()); } - @Test public void testAddAndDeleteReference() { - OLATResource oressource = OLATResourceManager.getInstance().findOrPersistResourceable(OresHelper.createOLATResourceableInstance("type1", RESOURCABLE_ID_1)); - OLATResource orestarget = OLATResourceManager.getInstance().findOrPersistResourceable(OresHelper.createOLATResourceableInstance("type2targ", RESOURCABLE_ID_3)); + @Test + public void testAddAndDeleteReference() { + OLATResource oressource = JunitTestHelper.createRandomResource(); + OLATResource orestarget = JunitTestHelper.createRandomResource(); String udata = "üserdätä"; - // add a reference - ReferenceManager.getInstance().addReference(oressource, orestarget, udata); - DBFactory.getInstance().closeSession(); + referenceManager.addReference(oressource, orestarget, udata); + dbInstance.commitAndCloseSession(); - OLATResource orestarget2 = OLATResourceManager.getInstance().findOrPersistResourceable(OresHelper.createOLATResourceableInstance("type2targ", RESOURCABLE_ID_3)); - List refs = ReferenceManager.getInstance().getReferencesTo(orestarget2); - assertTrue("only one reference may exist", refs.size() == 1); - for (Iterator it_refs = refs.iterator(); it_refs.hasNext();) { - ReferenceImpl ref = (ReferenceImpl) it_refs.next(); - ReferenceManager.getInstance().delete(ref); + OLATResourceable orestarget2 = OresHelper.createOLATResourceableInstance(orestarget.getResourceableTypeName(), orestarget.getResourceableId()); + List<ReferenceImpl> refs = referenceManager.getReferencesTo(orestarget2); + Assert.assertEquals("only one reference may exist", 1, refs.size()); + dbInstance.commitAndCloseSession(); + + for (ReferenceImpl ref : refs) { + referenceManager.delete(ref); } - - DBFactory.getInstance().closeSession(); + dbInstance.commitAndCloseSession(); // now make sure the reference was deleted - OLATResource orestarget3 = OLATResourceManager.getInstance().findOrPersistResourceable(OresHelper.createOLATResourceableInstance("type2targ", RESOURCABLE_ID_3)); - List norefs = ReferenceManager.getInstance().getReferencesTo(orestarget3); - assertTrue("reference should now be deleted", norefs.size() == 0); - + OLATResourceable orestarget3 = OresHelper.createOLATResourceableInstance(orestarget.getResourceableTypeName(), orestarget.getResourceableId()); + List<ReferenceImpl> norefs = referenceManager.getReferencesTo(orestarget3); + assertTrue("reference should now be deleted", norefs.isEmpty()); } + + @Test + public void testAddAndDeleteAllReferences() { + OLATResource oressource = JunitTestHelper.createRandomResource(); + OLATResource orestarget1 = JunitTestHelper.createRandomResource(); + OLATResource orestarget2 = JunitTestHelper.createRandomResource(); + // add the references + referenceManager.addReference(oressource, orestarget1, "üserdätä"); + referenceManager.addReference(oressource, orestarget2, "éserdà tà "); + dbInstance.commitAndCloseSession(); + + List<ReferenceImpl> refs = referenceManager.getReferences(oressource); + Assert.assertEquals("2 references exist", 2, refs.size()); + dbInstance.commitAndCloseSession(); + + referenceManager.deleteAllReferencesOf(oressource); + dbInstance.commitAndCloseSession(); - /* - * (non-Javadoc) - * - * @see junit.framework.TestCase#tearDown() - */ - @After public void tearDown() throws Exception { - try { - //DB.getInstance().delete("select * from o_bookmark"); - DBFactory.getInstance().closeSession(); - } catch (Exception e) { - log.error("tearDown failed: ", e); - } + // now make sure the reference was deleted + + List<ReferenceImpl> norefs = referenceManager.getReferences(oressource); + assertTrue("reference should now be deleted", norefs.isEmpty()); } + } \ No newline at end of file