From d62db7ce5ff1244c8012f8cdefcd338ee57112c6 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 17 Mar 2014 15:14:21 +0100
Subject: [PATCH] OO-981: move administration module of catalog to the
 repository module, update the "administration" features...

---
 .../java/org/olat/catalog/CatalogModule.java  | 103 ------------------
 .../olat/catalog/_spring/catalogContext.xml   |  45 +-------
 .../gui/control/_spring/portalContext.xml     |   2 +-
 .../gui/control/_spring/sitedefContext.xml    |   2 +-
 .../generic/portal/PortletFactory.java        |  10 ++
 .../org/olat/course/editor/PublishStep01.java |  21 +++-
 .../CatalogContextEntryControllerCreator.java |  15 ++-
 .../org/olat/repository/RepositoryModule.java |  54 ++++++++-
 .../org/olat/repository/_chelp/cat-admin.html |   1 +
 .../_i18n/LocalStrings_de.properties          |   3 +
 .../repository/_spring/repositoryContext.xml  |  47 +++++---
 .../RepositoryDetailsController.java          |  22 ++--
 .../controllers/RepositoryMainController.java |  13 +--
 .../olat/repository/handlers/BlogHandler.java |   1 -
 .../repository/handlers/CourseHandler.java    |   4 +-
 .../olat/repository/handlers/FileHandler.java |  10 +-
 .../repository/handlers/GlossaryHandler.java  |   5 +-
 .../repository/handlers/PodcastHandler.java   |   1 -
 .../site/CatalogSite.java                     |   2 +-
 .../site/CatalogSiteDef.java                  |  14 ++-
 .../ui/admin}/CatalogAdminController.java     |  52 +++++----
 .../repository/ui/admin/_content/admin.html   |   4 +
 .../ui/admin/_i18n/LocalStrings_de.properties |   8 ++
 .../ui/admin/_i18n/LocalStrings_en.properties |   7 ++
 .../ui/admin/_i18n/LocalStrings_fr.properties |   4 +
 .../admin/_i18n/i18nBundleMetadata.properties |   2 +
 .../OverviewRepositoryListController.java     |  79 +++++++++++---
 .../list/RepositoryEntryListController.java   |  10 +-
 .../resources/serviceconfig/olat.properties   |  11 +-
 29 files changed, 301 insertions(+), 251 deletions(-)
 delete mode 100644 src/main/java/org/olat/catalog/CatalogModule.java
 create mode 100644 src/main/java/org/olat/repository/_chelp/cat-admin.html
 rename src/main/java/org/olat/{catalog => repository}/site/CatalogSite.java (99%)
 rename src/main/java/org/olat/{catalog => repository}/site/CatalogSiteDef.java (76%)
 rename src/main/java/org/olat/{catalog/ui => repository/ui/admin}/CatalogAdminController.java (57%)
 create mode 100644 src/main/java/org/olat/repository/ui/admin/_content/admin.html
 create mode 100644 src/main/java/org/olat/repository/ui/admin/_i18n/LocalStrings_de.properties
 create mode 100644 src/main/java/org/olat/repository/ui/admin/_i18n/LocalStrings_en.properties
 create mode 100644 src/main/java/org/olat/repository/ui/admin/_i18n/LocalStrings_fr.properties
 create mode 100644 src/main/java/org/olat/repository/ui/admin/_i18n/i18nBundleMetadata.properties

diff --git a/src/main/java/org/olat/catalog/CatalogModule.java b/src/main/java/org/olat/catalog/CatalogModule.java
deleted file mode 100644
index c6828fce1d1..00000000000
--- a/src/main/java/org/olat/catalog/CatalogModule.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * <a href="http://www.openolat.org">
- * OpenOLAT - Online Learning and Training</a><br>
- * <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 the
- * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
- * <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>
- * Initial code contributed and copyrighted by<br>
- * frentix GmbH, http://www.frentix.com
- * <p>
- */
-package org.olat.catalog;
-
-import org.olat.core.configuration.AbstractOLATModule;
-import org.olat.core.configuration.PersistedProperties;
-import org.olat.core.util.StringHelper;
-
-/**
- * 
- * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
- */
-public class CatalogModule extends AbstractOLATModule {
-	
-	private static final String CATALOG_SITE_ENABLED = "site.catalog.enable";
-	private static final String CATALOG_REPO_ENABLED = "repo.catalog.enable";
-	private static final String MY_COURSES_ENABLED = "my.courses.enable";
-	
-	private boolean catalogSiteEnabled;
-	private boolean catalogRepoEnabled;
-	private boolean myCoursesEnabled;
-
-	@Override
-	public void init() {
-		String catalogSite = getStringPropertyValue(CATALOG_SITE_ENABLED, true);
-		if(StringHelper.containsNonWhitespace(catalogSite)) {
-			catalogSiteEnabled = "true".equals(catalogSite);
-		}
-		
-		String catalogRepo = getStringPropertyValue(CATALOG_REPO_ENABLED, true);
-		if(StringHelper.containsNonWhitespace(catalogRepo)) {
-			catalogRepoEnabled = "true".equals(catalogRepo);
-		}
-		
-		String myCourses = getStringPropertyValue(MY_COURSES_ENABLED, true);
-		if(StringHelper.containsNonWhitespace(myCourses)) {
-			myCoursesEnabled = "true".equals(myCourses);
-		}
-	}
-	
-	@Override
-	protected void initDefaultProperties() {
-		catalogSiteEnabled = getBooleanConfigParameter(CATALOG_SITE_ENABLED, true);
-		catalogRepoEnabled = getBooleanConfigParameter(CATALOG_REPO_ENABLED, true);
-		myCoursesEnabled = getBooleanConfigParameter(MY_COURSES_ENABLED, true);
-	}
-
-	@Override
-	protected void initFromChangedProperties() {
-		init();
-	}
-
-	@Override
-	public void setPersistedProperties(PersistedProperties persistedProperties) {
-		moduleConfigProperties = persistedProperties;
-	}
-
-	public boolean isCatalogSiteEnabled() {
-		return catalogSiteEnabled;
-	}
-
-	public void setCatalogSiteEnabled(boolean enabled) {
-		setStringProperty(CATALOG_SITE_ENABLED, Boolean.toString(enabled), true);
-	}
-
-	public boolean isCatalogRepoEnabled() {
-		return catalogRepoEnabled;
-	}
-
-	public void setCatalogRepoEnabled(boolean enabled) {
-		setStringProperty(CATALOG_REPO_ENABLED, Boolean.toString(enabled), true);
-	}
-
-	public boolean isMyCoursesEnabled() {
-		return myCoursesEnabled;
-	}
-
-	public void setMyCoursesEnabled(boolean enabled) {
-		setStringProperty(MY_COURSES_ENABLED, Boolean.toString(enabled), true);
-	}
-
-
-	
-	
-
-}
diff --git a/src/main/java/org/olat/catalog/_spring/catalogContext.xml b/src/main/java/org/olat/catalog/_spring/catalogContext.xml
index b2059bd84bb..59e961e30cb 100644
--- a/src/main/java/org/olat/catalog/_spring/catalogContext.xml
+++ b/src/main/java/org/olat/catalog/_spring/catalogContext.xml
@@ -7,48 +7,5 @@
 
 	<bean id="catalogManager" class="org.olat.catalog.CatalogManager" depends-on="courseModule" init-method="init"/>
 	
-	<!-- Business group admin. panel -->
-<!-- Not enabled in 8.4 release. Work in progress, will be finished in a later release
-	<bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints">
-		<property name="order" value="8209" />
-		<property name="actionController">	
-			<bean class="org.olat.core.gui.control.creator.AutoCreator" scope="prototype">
-				<property name="className" value="org.olat.catalog.ui.CatalogAdminController"/>
-			</bean>
-		</property>
-		<property name="navigationKey" value="catalog" />
-		<property name="i18nActionKey" value="admin.menu.title"/>
-		<property name="i18nDescriptionKey" value="admin.menu.title.alt"/>
-		<property name="translationPackage" value="org.olat.catalog.ui"/>
-		<property name="parentTreeNodeIdentifier" value="modulesParent" /> 
-		<property name="extensionPoints">
-			<list>	
-				<value>org.olat.admin.SystemAdminMainController</value>		
-			</list>
-		</property>
-	</bean>
- -->	
-	
-	<bean id="catalogModule" class="org.olat.catalog.CatalogModule" init-method="init">
-		<property name="persistedProperties">
-	  		<bean class="org.olat.core.configuration.PersistedProperties" scope="prototype" init-method="init" destroy-method="destroy" 
-	  				depends-on="coordinatorManager,org.olat.core.util.WebappHelper">
-	    		<constructor-arg index="0" ref="coordinatorManager"/>
-	    		<constructor-arg index="1" ref="catalogModule" />
-	  		</bean>
-		</property>
-	</bean>
-	
-	<!-- default configuration -->
-	<bean  class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
-		<property name="targetObject" ref="catalogModule" />
-		<property name="targetMethod" value="init" />
-		<property name="arguments">
-			<value>
-				site.catalog.enable=${site.catalog.enable}
-				repo.catalog.enable=${repo.catalog.enable}
-				my.courses.enable=${my.courses.enable}
-			</value>
-		</property>
-	</bean>
+
 </beans>
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/gui/control/_spring/portalContext.xml b/src/main/java/org/olat/core/gui/control/_spring/portalContext.xml
index a233f7759cb..c255a77d641 100644
--- a/src/main/java/org/olat/core/gui/control/_spring/portalContext.xml
+++ b/src/main/java/org/olat/core/gui/control/_spring/portalContext.xml
@@ -12,7 +12,7 @@
 	 -->
 	
 	<!-- Portlet factory -->
-	<bean id="portletfactory" class="org.olat.core.gui.control.generic.portal.PortletFactory" />
+	<bean id="portletfactory" class="org.olat.core.gui.control.generic.portal.PortletFactory" init-method="init"/>
 	
 	<!-- Portlets  -->
 	<bean id="SystemEvents" class="org.olat.core.commons.portlets.iframe.IframePortlet" scope="prototype">
diff --git a/src/main/java/org/olat/core/gui/control/_spring/sitedefContext.xml b/src/main/java/org/olat/core/gui/control/_spring/sitedefContext.xml
index b5c09373a41..518b54140ce 100644
--- a/src/main/java/org/olat/core/gui/control/_spring/sitedefContext.xml
+++ b/src/main/java/org/olat/core/gui/control/_spring/sitedefContext.xml
@@ -36,7 +36,7 @@
 	
 	<bean id="coursesite_infos_2" class="org.olat.course.site.CourseSiteDef2"/>
 	
-	<bean id="olatsites_catalog" class="org.olat.catalog.site.CatalogSiteDef">
+	<bean id="olatsites_catalog" class="org.olat.repository.site.CatalogSiteDef">
 	   <property name="order" value="5" />
 	   <property name="enabled" value="${site.catalog.enable}"/>
 	</bean>
diff --git a/src/main/java/org/olat/core/gui/control/generic/portal/PortletFactory.java b/src/main/java/org/olat/core/gui/control/generic/portal/PortletFactory.java
index e49761165e4..23469e2c364 100644
--- a/src/main/java/org/olat/core/gui/control/generic/portal/PortletFactory.java
+++ b/src/main/java/org/olat/core/gui/control/generic/portal/PortletFactory.java
@@ -30,9 +30,11 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.olat.NewControllerFactory;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.core.id.context.SiteContextEntryControllerCreator;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 
@@ -57,6 +59,14 @@ public class PortletFactory {
 		// singleton
 	}
 	
+	/**
+	 * [used by Spring]
+	 */
+	public void init() {
+		NewControllerFactory.getInstance().addContextEntryControllerCreator("Portal",
+				new SiteContextEntryControllerCreator(PortalSite.class));
+	}
+	
 	public static Map<String, Portlet> getPortlets() {
 		if (portlets == null) {
 			synchronized(lockObject) {
diff --git a/src/main/java/org/olat/course/editor/PublishStep01.java b/src/main/java/org/olat/course/editor/PublishStep01.java
index 301f79a63a9..a173e4ebe08 100644
--- a/src/main/java/org/olat/course/editor/PublishStep01.java
+++ b/src/main/java/org/olat/course/editor/PublishStep01.java
@@ -27,6 +27,7 @@ package org.olat.course.editor;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
@@ -36,6 +37,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.wizard.BasicStep;
 import org.olat.core.gui.control.generic.wizard.PrevNextFinishConfig;
+import org.olat.core.gui.control.generic.wizard.Step;
 import org.olat.core.gui.control.generic.wizard.StepFormBasicController;
 import org.olat.core.gui.control.generic.wizard.StepFormController;
 import org.olat.core.gui.control.generic.wizard.StepsEvent;
@@ -46,6 +48,7 @@ import org.olat.course.ICourse;
 import org.olat.login.LoginModule;
 import org.olat.repository.PropPupForm;
 import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryModule;
 
 /**
  * Description:<br>
@@ -66,11 +69,21 @@ class PublishStep01 extends BasicStep {
 		
 		//VCRP-3: add catalog entry in publish wizard
 		this.hasPublishableChanges = hasPublishableChanges;
-		setNextStep(new PublishStepCatalog(ureq, course, hasPublishableChanges));
-		if(hasCatalog){
+		
+		RepositoryModule repositoryModule = CoreSpringFactory.getImpl(RepositoryModule.class);
+		if(repositoryModule.isCatalogEnabled()) {
+			setNextStep(new PublishStepCatalog(ureq, course, hasPublishableChanges));
+			if(hasCatalog) {
+				prevNextConfig = PrevNextFinishConfig.BACK_NEXT_FINISH;
+			} else {
+				prevNextConfig = PrevNextFinishConfig.BACK_NEXT;
+			}
+		} else if(hasPublishableChanges) {
+			setNextStep(new PublishStep00a(ureq));
 			prevNextConfig = PrevNextFinishConfig.BACK_NEXT_FINISH;
-		}else{
-			prevNextConfig = PrevNextFinishConfig.BACK_NEXT;
+		} else {
+			setNextStep(Step.NOSTEP);
+			prevNextConfig = PrevNextFinishConfig.BACK_FINISH;
 		}
 	}
 
diff --git a/src/main/java/org/olat/repository/CatalogContextEntryControllerCreator.java b/src/main/java/org/olat/repository/CatalogContextEntryControllerCreator.java
index 9edd9520848..b4a65e94890 100644
--- a/src/main/java/org/olat/repository/CatalogContextEntryControllerCreator.java
+++ b/src/main/java/org/olat/repository/CatalogContextEntryControllerCreator.java
@@ -26,6 +26,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.ContextEntryControllerCreator;
 import org.olat.core.id.context.DefaultContextEntryControllerCreator;
+import org.olat.repository.site.CatalogSite;
 import org.olat.repository.site.RepositorySite;
 
 /**
@@ -36,6 +37,12 @@ import org.olat.repository.site.RepositorySite;
  * @author srosse, stephane.rosse@frentix.com
  */
 public class CatalogContextEntryControllerCreator extends DefaultContextEntryControllerCreator {
+	
+	private final RepositoryModule repositoryModule;
+	
+	public CatalogContextEntryControllerCreator(RepositoryModule repositoryModule) {
+		this.repositoryModule = repositoryModule;
+	}
 
 	@Override
 	public ContextEntryControllerCreator clone() {
@@ -49,7 +56,11 @@ public class CatalogContextEntryControllerCreator extends DefaultContextEntryCon
 
 	@Override
 	public String getSiteClassName(ContextEntry ce, UserRequest ureq) {
-		return RepositorySite.class.getName();
+		if(repositoryModule.isCatalogSiteEnabled()) {
+			return CatalogSite.class.getName();
+		} else {
+			return RepositorySite.class.getName();
+		}
 	}
 
 	@Override
@@ -59,7 +70,7 @@ public class CatalogContextEntryControllerCreator extends DefaultContextEntryCon
 
 	@Override
 	public boolean validateContextEntryAndShowError(ContextEntry ce, UserRequest ureq, WindowControl wControl) {
-		return true;
+		return repositoryModule.isCatalogEnabled();
 	}
 
 }
diff --git a/src/main/java/org/olat/repository/RepositoryModule.java b/src/main/java/org/olat/repository/RepositoryModule.java
index cd25c49b606..5837b45f303 100644
--- a/src/main/java/org/olat/repository/RepositoryModule.java
+++ b/src/main/java/org/olat/repository/RepositoryModule.java
@@ -43,10 +43,15 @@ public class RepositoryModule extends AbstractOLATModule {
 	private static final String MANAGED_REPOENTRY_ENABLED = "managedRepositoryEntries";
 	private static final String LIST_ALL_COURSES = "listallcourse";
 	private static final String LIST_ALL_RESOURCETYPES = "listallresourcetypes";
-
+	private static final String CATALOG_SITE_ENABLED = "site.catalog.enable";
+	private static final String CATALOG_ENABLED = "catalog.enable";
+	private static final String CATALOG_BROWSING_ENABLED = "catalog.brwosing.enable";
+	
+	private boolean catalogSiteEnabled;
+	private boolean catalogEnabled;
+	private boolean catalogBrowsingEnabled;
 	private boolean listAllCourses;
 	private boolean listAllResourceTypes;
-	
 	private boolean managedRepositoryEntries;
 	
 	private BusinessGroupModule groupModule;
@@ -61,7 +66,7 @@ public class RepositoryModule extends AbstractOLATModule {
 				new RepositoryContextEntryControllerCreator());
 		
 		NewControllerFactory.getInstance().addContextEntryControllerCreator(CatalogEntry.class.getSimpleName(),
-				new CatalogContextEntryControllerCreator());
+				new CatalogContextEntryControllerCreator(this));
 		
 		NewControllerFactory.getInstance().addContextEntryControllerCreator(RepositorySite.class.getSimpleName(),
 				new SiteContextEntryControllerCreator(RepositorySite.class));
@@ -88,6 +93,10 @@ public class RepositoryModule extends AbstractOLATModule {
 		listAllResourceTypes = "true".equals(listAllResourceTypesStr);
 		
 		managedRepositoryEntries = getBooleanConfigParameter(MANAGED_REPOENTRY_ENABLED, false);
+
+		catalogSiteEnabled = getBooleanConfigParameter(CATALOG_SITE_ENABLED, true);
+		catalogEnabled = getBooleanConfigParameter(CATALOG_ENABLED, true);
+		catalogBrowsingEnabled = getBooleanConfigParameter(CATALOG_BROWSING_ENABLED, true);
 	}
 
 	private void updateProperties() {
@@ -104,6 +113,21 @@ public class RepositoryModule extends AbstractOLATModule {
 		if(StringHelper.containsNonWhitespace(managedRepo)) {
 			managedRepositoryEntries = "true".equals(managedRepo);
 		}
+		
+		String catalogSite = getStringPropertyValue(CATALOG_SITE_ENABLED, true);
+		if(StringHelper.containsNonWhitespace(catalogSite)) {
+			catalogSiteEnabled = "true".equals(catalogSite);
+		}
+		
+		String catalogRepo = getStringPropertyValue(CATALOG_ENABLED, true);
+		if(StringHelper.containsNonWhitespace(catalogRepo)) {
+			catalogEnabled = "true".equals(catalogRepo);
+		}
+		
+		String myCourses = getStringPropertyValue(CATALOG_BROWSING_ENABLED, true);
+		if(StringHelper.containsNonWhitespace(myCourses)) {
+			catalogBrowsingEnabled = "true".equals(myCourses);
+		}
 	}
 
 	/**
@@ -150,4 +174,28 @@ public class RepositoryModule extends AbstractOLATModule {
 	public void setManagedRepositoryEntries(boolean enabled) {
 		setStringProperty(MANAGED_REPOENTRY_ENABLED, Boolean.toString(enabled), true);
 	}
+	
+	public boolean isCatalogSiteEnabled() {
+		return catalogSiteEnabled;
+	}
+
+	public void setCatalogSiteEnabled(boolean enabled) {
+		setStringProperty(CATALOG_SITE_ENABLED, Boolean.toString(enabled), true);
+	}
+
+	public boolean isCatalogEnabled() {
+		return catalogEnabled;
+	}
+
+	public void setCatalogEnabled(boolean enabled) {
+		setStringProperty(CATALOG_ENABLED, Boolean.toString(enabled), true);
+	}
+
+	public boolean isCatalogBrowsingEnabled() {
+		return catalogBrowsingEnabled;
+	}
+
+	public void setCatalogBrowsingEnabled(boolean enabled) {
+		setStringProperty(CATALOG_BROWSING_ENABLED, Boolean.toString(enabled), true);
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/repository/_chelp/cat-admin.html b/src/main/java/org/olat/repository/_chelp/cat-admin.html
new file mode 100644
index 00000000000..005f5a11f9c
--- /dev/null
+++ b/src/main/java/org/olat/repository/_chelp/cat-admin.html
@@ -0,0 +1 @@
+<p>$r.translate("chelp.cat01")</p>
\ No newline at end of file
diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
index 0f0d11cbe95..f9f40f33e1f 100644
--- a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
@@ -58,6 +58,7 @@ cap.launch=Die Lernressource wird geladen. Bitte warten...
 chelp.anim=<i>$org.olat.repository\:FileResource.ANIM</i>
 chelp.assOwn=<i>$org.olat.repository\:details.groups</i>
 chelp.auth=<b>$org.olat.repository\:cif.author\:</b>
+chelp.cat01=Hilfe zur Katalog Administrator [placeholder]
 chelp.chanSet=<i>$org.olat.repository\:details.chprop</i>
 chelp.cour=<i>$org.olat.repository\:CourseModule</i>
 chelp.cp=<i>$org.olat.repository\:FileResource.IMSCP</i>
@@ -85,6 +86,7 @@ chelp.oaug=<i>&laquo;$org.olat.repository\:cif.access.users_guests&raquo;</i>\:
 chelp.pdf=<i>$org.olat.repository\:FileResource.PDF</i>
 chelp.pp=<i>$org.olat.repository\:FileResource.PPT</i>
 chelp.ref=<b>$org.olat.repository\:cif.resourcename\:</b>
+chelp.cat-admin.title=Katalog\: Administration
 chelp.rep-meta-desc.title=Lernressource\: Metadaten hinzuf\u00FCgen
 chelp.rep-meta-guest.title=Lernressource\: Informationen zum Eintrag (G\u00E4ste)
 chelp.rep-meta-info-owner.title=Lernressource\: Besitzerinformationen
@@ -329,6 +331,7 @@ help.hover.meta.info.owner=Hilfe zu den Besitzern
 help.hover.rep.detail=Hilfe zu den Informationen in der Lernressourcen-Detailansicht
 help.hover.rep.picture=Hilfe zum Hochladen eines Bildes zur Lernressource
 help.hover.lifecycle=Hilfe zur Durchf\u00FChrungszeitraum
+help.hover.catalog.admin=Hilfe zur Administration von katalog
 index.header=Lernressourcen
 index.header.alt=Suchen Sie nach Lernressourcen
 info.could.not.delete.entry=Der Eintrag konnte nicht gel\u00F6scht werden.
diff --git a/src/main/java/org/olat/repository/_spring/repositoryContext.xml b/src/main/java/org/olat/repository/_spring/repositoryContext.xml
index e4bdede3c67..d53f1f7a161 100644
--- a/src/main/java/org/olat/repository/_spring/repositoryContext.xml
+++ b/src/main/java/org/olat/repository/_spring/repositoryContext.xml
@@ -10,15 +10,15 @@
 
 	<context:component-scan base-package="org.olat.repository.manager" />
 
-<bean id="repositoryModule" class="org.olat.repository.RepositoryModule" depends-on="userModule">
-	<property name="groupModule" ref="businessGroupModule"/>
-	<property name="persistedProperties">
-	  <bean class="org.olat.core.configuration.PersistedProperties" scope="prototype" init-method="init" destroy-method="destroy">
-	    <constructor-arg index="0" ref="coordinatorManager"/>
-	    <constructor-arg index="1" ref="repositoryModule" />
-	  </bean>
-	</property>
-</bean>
+	<bean id="repositoryModule" class="org.olat.repository.RepositoryModule" depends-on="userModule">
+		<property name="groupModule" ref="businessGroupModule"/>
+		<property name="persistedProperties">
+		  <bean class="org.olat.core.configuration.PersistedProperties" scope="prototype" init-method="init" destroy-method="destroy">
+		    <constructor-arg index="0" ref="coordinatorManager"/>
+		    <constructor-arg index="1" ref="repositoryModule" />
+		  </bean>
+		</property>
+	</bean>
 
 	<bean  class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
 		<property name="targetObject" ref="repositoryModule" />
@@ -28,12 +28,14 @@
 				listallcourse=${repo.listallcourses.enabled}
 				listallresourcetypes=${repo.listallresourcetypes.enabled}
 				managedRepositoryEntries=${repo.managed}
+				site.catalog.enable=${site.catalog.enable}
+				repo.catalog.enable=${repo.catalog.enable}
+				repo.catalog.browsing.enable=${repo.catalog.browsing.enable}
 			</value>
 		</property>
 	</bean>
 	
 	<bean id="repositoryManager" class="org.olat.repository.RepositoryManager"/>
-	
 		<bean id="deletionModule" class="org.olat.repository.delete.service.DeletionModule">
 		<property name="baseSecurityManager" ref="baseSecurityManager" />
 		<property name="persistedProperties">
@@ -45,8 +47,7 @@
 		</property>
 	</bean>
 
-	<bean
-		class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
+	<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
 		<property name="targetObject" ref="deletionModule" />
 		<property name="targetMethod" value="init" />
 		<property name="arguments">
@@ -64,7 +65,7 @@
 		<property name="mailManager" ref="mailManager" />
 	</bean>
 	
-	<!-- vitero admin. panel -->
+	<!-- life cycle admin. panel -->
 	<bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints">
 		<property name="order" value="7216" />
 		<property name="actionController">	
@@ -84,5 +85,25 @@
 			</list>
 		</property>
 	</bean>
+	
+	<!-- Catalog admin. panel -->
+	<bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints">
+		<property name="order" value="8209" />
+		<property name="actionController">	
+			<bean class="org.olat.core.gui.control.creator.AutoCreator" scope="prototype">
+				<property name="className" value="org.olat.repository.ui.admin.CatalogAdminController"/>
+			</bean>
+		</property>
+		<property name="navigationKey" value="catalog" />
+		<property name="i18nActionKey" value="admin.menu.title"/>
+		<property name="i18nDescriptionKey" value="admin.menu.title.alt"/>
+		<property name="translationPackage" value="org.olat.repository.ui.admin"/>
+		<property name="parentTreeNodeIdentifier" value="modulesParent" /> 
+		<property name="extensionPoints">
+			<list>	
+				<value>org.olat.admin.SystemAdminMainController</value>		
+			</list>
+		</property>
+	</bean>
 
 </beans>
\ No newline at end of file
diff --git a/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java b/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java
index 3915216a9ce..f0b18845a4d 100644
--- a/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java
+++ b/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java
@@ -98,6 +98,7 @@ import org.olat.repository.RepositoryEntryIconRenderer;
 import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryEntryStatus;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryModule;
 import org.olat.repository.RepositoryService;
 import org.olat.repository.handlers.CourseHandler;
 import org.olat.repository.handlers.RepositoryHandler;
@@ -194,6 +195,7 @@ public class RepositoryDetailsController extends BasicController implements Gene
 	private final BaseSecurity securityManager;
 	private final UserManager userManager;
 	private final MarkManager markManager;
+	private final RepositoryModule repositoryModule;
 	private final RepositoryService repositoryService;
 
 	/**
@@ -211,6 +213,7 @@ public class RepositoryDetailsController extends BasicController implements Gene
 		userManager = CoreSpringFactory.getImpl(UserManager.class);
 		markManager = CoreSpringFactory.getImpl(MarkManager.class);
 		acService = CoreSpringFactory.getImpl(ACService.class);
+		repositoryModule = CoreSpringFactory.getImpl(RepositoryModule.class);
 		repositoryService = CoreSpringFactory.getImpl(RepositoryService.class);
 		
 		if (log.isDebug()){
@@ -559,8 +562,9 @@ public class RepositoryDetailsController extends BasicController implements Gene
 						detailsToolC.addLink(ACTION_EDITDESC, translate("details.chdesc"), TOOL_CHDESC, null, "o_sel_repo_edit_descritpion", false);
 						detailsToolC.addLink(ACTION_EDITPROP, translate("details.chprop"), TOOL_CHPROP, null, "o_sel_repor_edit_properties", false);
 					}
-					detailsToolC.addLink(ACTION_ADD_CATALOG, translate("details.catadd"), TOOL_CATALOG, null, "o_sel_repo_add_to_catalog", false);
-					
+					if(repositoryModule.isCatalogEnabled()) {
+						detailsToolC.addLink(ACTION_ADD_CATALOG, translate("details.catadd"), TOOL_CATALOG, null, "o_sel_repo_add_to_catalog", false);
+					}
 					detailsToolC.addHeader(translate("table.action"));
 
 					boolean closeManaged = RepositoryEntryManagedFlag.isManaged(repositoryEntry, RepositoryEntryManagedFlag.close);
@@ -574,10 +578,12 @@ public class RepositoryDetailsController extends BasicController implements Gene
 					}
 				}
 				// update catalog link
-				boolean addCatalogEnabled = !corrupted &&
-						(repositoryEntry.getAccess() >= RepositoryEntry.ACC_USERS ||
-						repositoryEntry.isMembersOnly());
-				detailsToolC.setEnabled(TOOL_CATALOG, addCatalogEnabled);
+				if(repositoryModule.isCatalogEnabled()) {
+					boolean addCatalogEnabled = !corrupted &&
+							(repositoryEntry.getAccess() >= RepositoryEntry.ACC_USERS ||
+							repositoryEntry.isMembersOnly());
+					detailsToolC.setEnabled(TOOL_CATALOG, addCatalogEnabled);
+				}
 			}
 			if (isNewController) {
 				if(isAuthor) {
@@ -971,7 +977,9 @@ public class RepositoryDetailsController extends BasicController implements Gene
 				doEditSettings(ureq, repositoryEditDescriptionController, title);
 				return;
 			} else if (cmd.equals(ACTION_ADD_CATALOG)) { // start add to catalog workflow
-				doAddCatalog(ureq);
+				if(repositoryModule.isCatalogEnabled()) {
+					doAddCatalog(ureq);
+				}
 				return;
 			} else if (cmd.equals(ACTION_EDITPROP)) { // change properties
 				removeAsListenerAndDispose(repositoryEditPropertiesController);
diff --git a/src/main/java/org/olat/repository/controllers/RepositoryMainController.java b/src/main/java/org/olat/repository/controllers/RepositoryMainController.java
index 84d9b501381..3c27214f52e 100644
--- a/src/main/java/org/olat/repository/controllers/RepositoryMainController.java
+++ b/src/main/java/org/olat/repository/controllers/RepositoryMainController.java
@@ -29,7 +29,6 @@ import java.util.List;
 
 import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.catalog.CatalogEntry;
-import org.olat.catalog.CatalogModule;
 import org.olat.catalog.ui.CatalogController;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
@@ -149,7 +148,6 @@ public class RepositoryMainController extends MainLayoutBasicController implemen
 	private RepositoryAddChooseStepsController chooseStepsController;
 	private Controller creationWizardController;
 	private final PortfolioModule portfolioModule;
-	private final CatalogModule catalogModule;
 	private final RepositoryModule repositoryModule;
 	private final RepositoryManager repositoryManager;
 	private final BaseSecurityModule securityModule;
@@ -168,7 +166,6 @@ public class RepositoryMainController extends MainLayoutBasicController implemen
 			log.debug("Constructing ReposityMainController for user::" + ureq.getIdentity());
 		}
 		portfolioModule = CoreSpringFactory.getImpl(PortfolioModule.class);
-		catalogModule = CoreSpringFactory.getImpl(CatalogModule.class);
 		repositoryModule = CoreSpringFactory.getImpl(RepositoryModule.class);
 		repositoryManager = CoreSpringFactory.getImpl(RepositoryManager.class);
 		securityModule = CoreSpringFactory.getImpl(BaseSecurityModule.class);
@@ -217,7 +214,7 @@ public class RepositoryMainController extends MainLayoutBasicController implemen
 			activateContent(ureq, "search.my", null, null);
 			TreeNode activatedNode = TreeHelper.findNodeByUserObject("search.my", rootNode);
 			menuTree.setSelectedNode(activatedNode);
-		} else if(catalogModule.isCatalogRepoEnabled()) {
+		} else if(repositoryModule.isCatalogEnabled()) {
 			activateContent(ureq, "search.catalog", null, null);
 			TreeNode activatedNode = TreeHelper.findNodeByUserObject("search.catalog", rootNode);
 			menuTree.setSelectedNode(activatedNode);
@@ -283,7 +280,7 @@ public class RepositoryMainController extends MainLayoutBasicController implemen
 		gtm.setRootNode(rootNode);
 
 		GenericTreeNode node;
-		if(catalogModule.isCatalogRepoEnabled()) {
+		if(repositoryModule.isCatalogEnabled()) {
 			node= new GenericTreeNode(translate("search.catalog"), "search.catalog");
 			node.setCssClass("o_sel_repo_catalog");
 			rootNode.addChild(node);
@@ -511,7 +508,7 @@ public class RepositoryMainController extends MainLayoutBasicController implemen
 	}
 
 	private void activateCatalogController(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
-		if(!catalogModule.isCatalogRepoEnabled()) return;
+		if(!repositoryModule.isCatalogEnabled()) return;
 		
 		// create new catalog controller with given node if none exists
 		// create also new catalog controller when the user clicked twice on the
@@ -889,7 +886,7 @@ public class RepositoryMainController extends MainLayoutBasicController implemen
 		String type = entry.getOLATResourceable().getResourceableTypeName();
 		//activate the catalog
 		if(CatalogEntry.class.getSimpleName().equals(type)) {
-			if(catalogModule.isCatalogRepoEnabled()) {
+			if(repositoryModule.isCatalogEnabled()) {
 				TreeNode rootNode = menuTree.getTreeModel().getRootNode();
 				TreeNode activatedNode = TreeHelper.findNodeByUserObject("search.catalog", rootNode);
 				if (activatedNode != null) {
@@ -920,7 +917,7 @@ public class RepositoryMainController extends MainLayoutBasicController implemen
 						searchController.activate(ureq, subEntries, nextEntry.getTransientState());
 						detailsController.activate(ureq, subEntries.subList(1, subEntries.size()), nextEntry.getTransientState());
 					} else if(CatalogEntry.class.getSimpleName().equals(subType)
-							&& catalogModule.isCatalogRepoEnabled()) {
+							&& repositoryModule.isCatalogEnabled()) {
 						catalogCtrl.activate(ureq, subEntries, entry.getTransientState());
 					}
 				}
diff --git a/src/main/java/org/olat/repository/handlers/BlogHandler.java b/src/main/java/org/olat/repository/handlers/BlogHandler.java
index 0e302939a47..c5280cc1b1d 100644
--- a/src/main/java/org/olat/repository/handlers/BlogHandler.java
+++ b/src/main/java/org/olat/repository/handlers/BlogHandler.java
@@ -61,7 +61,6 @@ import org.olat.resource.references.ReferenceManager;
  * @author Gregor Wassmann
  */
 // Loads of parameters are unused
-@SuppressWarnings("unused")
 public class BlogHandler implements RepositoryHandler {
 	public static final String PROCESS_CREATENEW = "create_new";
 	public static final String PROCESS_UPLOAD = "upload";
diff --git a/src/main/java/org/olat/repository/handlers/CourseHandler.java b/src/main/java/org/olat/repository/handlers/CourseHandler.java
index 9de204e7013..c541fa671f4 100644
--- a/src/main/java/org/olat/repository/handlers/CourseHandler.java
+++ b/src/main/java/org/olat/repository/handlers/CourseHandler.java
@@ -39,7 +39,6 @@ import org.olat.core.gui.control.generic.wizard.StepsMainRunController;
 import org.olat.core.gui.control.generic.wizard.StepsRunContext;
 import org.olat.core.gui.media.CleanupAfterDeliveryFileMediaResource;
 import org.olat.core.gui.media.MediaResource;
-import org.olat.core.gui.translator.PackageTranslator;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.helpers.Settings;
 import org.olat.core.id.Identity;
@@ -104,7 +103,6 @@ public class CourseHandler implements RepositoryHandler {
 	 */
 	public static final String PROCESS_CREATENEW = "new";
 	
-	private static final String PACKAGE = Util.getPackageName(RepositoryManager.class);
 	private static final boolean LAUNCHEABLE = true;
 	private static final boolean DOWNLOADEABLE = true;
 	private static final boolean EDITABLE = true;
@@ -236,7 +234,7 @@ public class CourseHandler implements RepositoryHandler {
 		ReferenceManager refM = ReferenceManager.getInstance();
 		String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale());
 		if (referencesSummary != null) {
-			Translator translator = new PackageTranslator(PACKAGE, ureq.getLocale());
+			Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
 			wControl.setError(translator.translate("details.delete.error.references",
 					new String[] { referencesSummary }));
 			return false;
diff --git a/src/main/java/org/olat/repository/handlers/FileHandler.java b/src/main/java/org/olat/repository/handlers/FileHandler.java
index d80a2658d51..9125f147b89 100644
--- a/src/main/java/org/olat/repository/handlers/FileHandler.java
+++ b/src/main/java/org/olat/repository/handlers/FileHandler.java
@@ -32,7 +32,6 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.media.MediaResource;
-import org.olat.core.gui.translator.PackageTranslator;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
@@ -55,15 +54,10 @@ import org.olat.resource.references.ReferenceManager;
  */
 public abstract class FileHandler {
 
-	private static final String PACKAGE = Util.getPackageName(RepositoryManager.class);
-	
-	/**
-	 * 
-	 */
 	public FileHandler() {
+		//
 	}
 
-
 	/**
 	 * @see org.olat.repository.handlers.RepositoryHandler#getAsMediaResource(org.olat.core.id.OLATResourceable
 	 */
@@ -99,7 +93,7 @@ public abstract class FileHandler {
 	public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) {
 		String referencesSummary = ReferenceManager.getInstance().getReferencesToSummary(res, ureq.getLocale());
 		if (referencesSummary != null) {
-			Translator translator = new PackageTranslator(PACKAGE, ureq.getLocale());
+			Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
 			wControl.setError(translator.translate("details.delete.error.references",
 					new String[] { referencesSummary }));
 			return false;
diff --git a/src/main/java/org/olat/repository/handlers/GlossaryHandler.java b/src/main/java/org/olat/repository/handlers/GlossaryHandler.java
index c21d3ce4697..f6c60c4f280 100644
--- a/src/main/java/org/olat/repository/handlers/GlossaryHandler.java
+++ b/src/main/java/org/olat/repository/handlers/GlossaryHandler.java
@@ -41,7 +41,6 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.layout.MainLayoutController;
 import org.olat.core.gui.media.MediaResource;
-import org.olat.core.gui.translator.PackageTranslator;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
@@ -75,8 +74,6 @@ import org.olat.resource.references.ReferenceManager;
  */
 public class GlossaryHandler implements RepositoryHandler {
 
-	private static final String PACKAGE = Util.getPackageName(RepositoryManager.class);
-
 	private static final boolean LAUNCHEABLE = true;
 	private static final boolean DOWNLOADEABLE = true;
 	private static final boolean EDITABLE = true;
@@ -243,7 +240,7 @@ public class GlossaryHandler implements RepositoryHandler {
 		ReferenceManager refM = ReferenceManager.getInstance();
 		String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale());
 		if (referencesSummary != null) {
-			Translator translator = new PackageTranslator(PACKAGE, ureq.getLocale());
+			Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
 			wControl.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary }));
 			return false;
 		}
diff --git a/src/main/java/org/olat/repository/handlers/PodcastHandler.java b/src/main/java/org/olat/repository/handlers/PodcastHandler.java
index 2d947201bfc..071912ed460 100644
--- a/src/main/java/org/olat/repository/handlers/PodcastHandler.java
+++ b/src/main/java/org/olat/repository/handlers/PodcastHandler.java
@@ -61,7 +61,6 @@ import org.olat.resource.references.ReferenceManager;
  * @author Gregor Wassmann
  */
 // Loads of parameters are unused
-@SuppressWarnings("unused")
 public class PodcastHandler implements RepositoryHandler {
 	public static final String PROCESS_CREATENEW = "create_new";
 	public static final String PROCESS_UPLOAD = "upload";
diff --git a/src/main/java/org/olat/catalog/site/CatalogSite.java b/src/main/java/org/olat/repository/site/CatalogSite.java
similarity index 99%
rename from src/main/java/org/olat/catalog/site/CatalogSite.java
rename to src/main/java/org/olat/repository/site/CatalogSite.java
index 49fe0446638..6ad1f6ea112 100644
--- a/src/main/java/org/olat/catalog/site/CatalogSite.java
+++ b/src/main/java/org/olat/repository/site/CatalogSite.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.catalog.site;
+package org.olat.repository.site;
 
 import java.util.Locale;
 
diff --git a/src/main/java/org/olat/catalog/site/CatalogSiteDef.java b/src/main/java/org/olat/repository/site/CatalogSiteDef.java
similarity index 76%
rename from src/main/java/org/olat/catalog/site/CatalogSiteDef.java
rename to src/main/java/org/olat/repository/site/CatalogSiteDef.java
index 2889d4fffbc..6592865259a 100644
--- a/src/main/java/org/olat/catalog/site/CatalogSiteDef.java
+++ b/src/main/java/org/olat/repository/site/CatalogSiteDef.java
@@ -17,9 +17,8 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.catalog.site;
+package org.olat.repository.site;
 
-import org.olat.catalog.CatalogModule;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.WindowControl;
@@ -27,6 +26,7 @@ import org.olat.core.gui.control.navigation.AbstractSiteDefinition;
 import org.olat.core.gui.control.navigation.SiteConfiguration;
 import org.olat.core.gui.control.navigation.SiteDefinition;
 import org.olat.core.gui.control.navigation.SiteInstance;
+import org.olat.repository.RepositoryModule;
 
 /**
  * 
@@ -37,11 +37,17 @@ public class CatalogSiteDef extends AbstractSiteDefinition implements SiteDefini
 
 	@Override
 	public SiteInstance createSite(UserRequest ureq, WindowControl wControl, SiteConfiguration config) {
-		CatalogModule catModule = CoreSpringFactory.getImpl(CatalogModule.class);
-		if(catModule.isCatalogSiteEnabled()) {
+		RepositoryModule repositoryModule = CoreSpringFactory.getImpl(RepositoryModule.class);
+		if(repositoryModule.isCatalogEnabled() && repositoryModule.isCatalogSiteEnabled()) {
 			SiteInstance si = new CatalogSite(this, ureq.getLocale());
 			return si;
 		}
 		return null;
 	}
+
+	@Override
+	public boolean isEnabled() {
+		RepositoryModule repositoryModule = CoreSpringFactory.getImpl(RepositoryModule.class);
+		return repositoryModule.isCatalogEnabled() && repositoryModule.isCatalogSiteEnabled() && super.isEnabled();
+	}
 }
diff --git a/src/main/java/org/olat/catalog/ui/CatalogAdminController.java b/src/main/java/org/olat/repository/ui/admin/CatalogAdminController.java
similarity index 57%
rename from src/main/java/org/olat/catalog/ui/CatalogAdminController.java
rename to src/main/java/org/olat/repository/ui/admin/CatalogAdminController.java
index d78af50aab4..43cfa2e06cf 100644
--- a/src/main/java/org/olat/catalog/ui/CatalogAdminController.java
+++ b/src/main/java/org/olat/repository/ui/admin/CatalogAdminController.java
@@ -17,9 +17,8 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.catalog.ui;
+package org.olat.repository.ui.admin;
 
-import org.olat.catalog.CatalogModule;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
@@ -30,19 +29,22 @@ import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.core.util.Util;
+import org.olat.repository.RepositoryModule;
+import org.olat.repository.RepositoryService;
 
 /**
  * 
+ * Initial date: 17.03.2014<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
 public class CatalogAdminController extends FormBasicController {
 
-	private MultipleSelectionElement myCoursesEl;
-	private MultipleSelectionElement siteEl;
-	private MultipleSelectionElement repoEl;
+	private MultipleSelectionElement enableEl, enableBrowsingEl, siteEl;
 	
-	private final CatalogModule catalogModule;
+	
+	private final RepositoryModule repositoryModule;
 	
 	/**
 	 * @param ureq
@@ -51,7 +53,8 @@ public class CatalogAdminController extends FormBasicController {
 	public CatalogAdminController(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl, "admin");
 		
-		catalogModule = CoreSpringFactory.getImpl(CatalogModule.class);
+		repositoryModule = CoreSpringFactory.getImpl(RepositoryModule.class);
+		setTranslator(Util.createPackageTranslator(RepositoryService.class, getLocale(), getTranslator()));
 
 		initForm(ureq);
 	}
@@ -60,20 +63,24 @@ public class CatalogAdminController extends FormBasicController {
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		//server informations
 		FormLayoutContainer serverCont = FormLayoutContainer.createDefaultFormLayout("functions", getTranslator());
+		serverCont.setFormContextHelp("org.olat.repository", "cat-admin.html", "help.hover.catalog.admin");
 		formLayout.add(serverCont);
 		formLayout.add("functions", serverCont);
 
-		myCoursesEl = uifactory.addCheckboxesHorizontal("my.courses", "catalog.courses", serverCont, new String[]{"xx"}, new String[]{""}, null);
-		myCoursesEl.select("xx", catalogModule.isMyCoursesEnabled());
-		myCoursesEl.addActionListener(FormEvent.ONCLICK);
+		boolean enabled = repositoryModule.isCatalogEnabled();
+		enableEl = uifactory.addCheckboxesHorizontal("catalog.enable", "catalog.enable", serverCont, new String[]{"xx"}, new String[]{""}, null);
+		enableEl.select("xx", enabled);
+		enableEl.addActionListener(FormEvent.ONCLICK);
 		
-		siteEl = uifactory.addCheckboxesHorizontal("catalog.new", "catalog.new", serverCont, new String[]{"xx"}, new String[]{""}, null);
-		siteEl.select("xx", catalogModule.isCatalogSiteEnabled());
+		enableBrowsingEl = uifactory.addCheckboxesHorizontal("catalog.browsing", "catalog.browsing", serverCont, new String[]{"xx"}, new String[]{""}, null);
+		enableBrowsingEl.select("xx", repositoryModule.isCatalogBrowsingEnabled());
+		enableBrowsingEl.setEnabled(enabled);
+		enableBrowsingEl.addActionListener(FormEvent.ONCLICK);
+
+		siteEl = uifactory.addCheckboxesHorizontal("catalog.site", "catalog.site", serverCont, new String[]{"xx"}, new String[]{""}, null);
+		siteEl.select("xx", repositoryModule.isCatalogSiteEnabled());
+		siteEl.setEnabled(enabled);
 		siteEl.addActionListener(FormEvent.ONCLICK);
-		
-		repoEl = uifactory.addCheckboxesHorizontal("catalog.classic", "catalog.classic", serverCont, new String[]{"xx"}, new String[]{""}, null);
-		repoEl.select("xx", catalogModule.isCatalogRepoEnabled());
-		repoEl.addActionListener(FormEvent.ONCLICK);
 	}
 	
 	protected void doDispose() {
@@ -82,12 +89,15 @@ public class CatalogAdminController extends FormBasicController {
 
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
-		if(source == myCoursesEl) {
-			catalogModule.setMyCoursesEnabled(myCoursesEl.isSelected(0));
+		if(source == enableEl) {
+			boolean enabled = enableEl.isSelected(0);
+			repositoryModule.setCatalogEnabled(enabled);
+			siteEl.setEnabled(enabled);
+			enableBrowsingEl.setEnabled(enabled);
 		} else if(source == siteEl) {
-			catalogModule.setCatalogSiteEnabled(siteEl.isSelected(0));
-		} else if(source == repoEl) {
-			catalogModule.setCatalogRepoEnabled(repoEl.isSelected(0));
+			repositoryModule.setCatalogSiteEnabled(siteEl.isSelected(0));
+		} else if(source == enableBrowsingEl) {
+			repositoryModule.setCatalogBrowsingEnabled(enableBrowsingEl.isSelected(0));
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
diff --git a/src/main/java/org/olat/repository/ui/admin/_content/admin.html b/src/main/java/org/olat/repository/ui/admin/_content/admin.html
new file mode 100644
index 00000000000..7658447ed9a
--- /dev/null
+++ b/src/main/java/org/olat/repository/ui/admin/_content/admin.html
@@ -0,0 +1,4 @@
+<fieldset><legend>$r.translate("admin.catalog.settings")</legend>
+$r.render("functions")
+</fieldset>
+
diff --git a/src/main/java/org/olat/repository/ui/admin/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/repository/ui/admin/_i18n/LocalStrings_de.properties
new file mode 100644
index 00000000000..c968b7ce145
--- /dev/null
+++ b/src/main/java/org/olat/repository/ui/admin/_i18n/LocalStrings_de.properties
@@ -0,0 +1,8 @@
+#Mon Mar 02 09:54:04 CET 2009
+admin.menu.title=Katalog
+admin.menu.title.alt=Katalog
+admin.catalog.settings=Katalog settings
+catalog.enable=Katalog einschalten
+catalog.browsing=Katalog überfliegen
+catalog.site=Katalog in eigenes Site
+
diff --git a/src/main/java/org/olat/repository/ui/admin/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/repository/ui/admin/_i18n/LocalStrings_en.properties
new file mode 100644
index 00000000000..7ee286dd24a
--- /dev/null
+++ b/src/main/java/org/olat/repository/ui/admin/_i18n/LocalStrings_en.properties
@@ -0,0 +1,7 @@
+#Wed Aug 28 21:50:26 CEST 2013
+admin.catalog.settings=Catalog settings
+admin.menu.title=Catalog
+admin.menu.title.alt=Catalog
+catalog.enable=Enable catalog
+catalog.browsing=Catalog browsing
+catalog.site=Catalog in its own site
\ No newline at end of file
diff --git a/src/main/java/org/olat/repository/ui/admin/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/repository/ui/admin/_i18n/LocalStrings_fr.properties
new file mode 100644
index 00000000000..fa8cb53a65b
--- /dev/null
+++ b/src/main/java/org/olat/repository/ui/admin/_i18n/LocalStrings_fr.properties
@@ -0,0 +1,4 @@
+#Tue Oct 29 21:29:29 CET 2013
+admin.catalog.settings=Configuration du catalogue
+admin.menu.title=Catalogue
+admin.menu.title.alt=Catalogue
\ No newline at end of file
diff --git a/src/main/java/org/olat/repository/ui/admin/_i18n/i18nBundleMetadata.properties b/src/main/java/org/olat/repository/ui/admin/_i18n/i18nBundleMetadata.properties
new file mode 100644
index 00000000000..5dc111f2e19
--- /dev/null
+++ b/src/main/java/org/olat/repository/ui/admin/_i18n/i18nBundleMetadata.properties
@@ -0,0 +1,2 @@
+#Wed Jan 14 11:40:12 CET 2009
+bundle.priority=500
diff --git a/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java b/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java
index d2d340652d4..9236ad67764 100644
--- a/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java
+++ b/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java
@@ -39,11 +39,17 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
+import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
+import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
 import org.olat.core.util.Util;
+import org.olat.core.util.resource.OresHelper;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryModule;
 import org.olat.repository.SearchMyRepositoryEntryViewParams;
+import org.olat.util.logging.activity.LoggingResourceable;
 
 /**
  * 
@@ -56,26 +62,29 @@ public class OverviewRepositoryListController extends BasicController implements
 	private MainPanel mainPanel;
 	private final VelocityContainer mainVC;
 	private final SegmentViewComponent segmentView;
-	private final Link favoriteLink, myCourseLink, catalogLink;
+	private final Link favoriteLink, myCourseLink;
+	private Link catalogLink;
 	
 	private RepositoryEntryListController markedCtrl;
 	private RepositoryEntryListController myCoursesCtrl;
 	private CatalogNodeController catalogCtrl;
 	private StackedController stackPanel;
 	
-	private CatalogManager catalogManager;
+	private final CatalogManager catalogManager;
+	private final RepositoryModule repositoryModule;
 	
 	public OverviewRepositoryListController(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl);
 		setTranslator(Util.createPackageTranslator(RepositoryManager.class, getLocale(), getTranslator()));
 		
 		catalogManager = CoreSpringFactory.getImpl(CatalogManager.class);
+		repositoryModule = CoreSpringFactory.getImpl(RepositoryModule.class);
 
 		mainPanel = new MainPanel("myCoursesMainPanel");
 		mainVC = createVelocityContainer("overview");
 		mainPanel.setContent(mainVC);
 		
-		boolean hasMarkedEntries = doOpenMark(ureq);
+		boolean hasMarkedEntries = doOpenMark(ureq).isEmpty();
 		if(!hasMarkedEntries) {
 			doOpenMyCourses(ureq);
 		}
@@ -84,8 +93,11 @@ public class OverviewRepositoryListController extends BasicController implements
 		segmentView.addSegment(favoriteLink, hasMarkedEntries);
 		myCourseLink = LinkFactory.createLink("search.mycourses.student", mainVC, this);
 		segmentView.addSegment(myCourseLink, !hasMarkedEntries);
-		catalogLink = LinkFactory.createLink("search.catalog", mainVC, this);
-		segmentView.addSegment(catalogLink, false);
+		
+		if(repositoryModule.isCatalogEnabled() && repositoryModule.isCatalogBrowsingEnabled()) {
+			catalogLink = LinkFactory.createLink("search.catalog", mainVC, this);
+			segmentView.addSegment(catalogLink, false);
+		}
 		
 		putInitialPanel(mainPanel);
 	}
@@ -97,7 +109,24 @@ public class OverviewRepositoryListController extends BasicController implements
 	
 	@Override
 	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
-		//
+		if(entries == null || entries.isEmpty()) return;
+		
+		ContextEntry entry = entries.get(0);
+		String segment = entry.getOLATResourceable().getResourceableTypeName();
+		List<ContextEntry> subEntries = entries.subList(1, entries.size());
+		if("Favorits".equals(segment)) {
+			doOpenMark(ureq).activate(ureq, subEntries, entry.getTransientState());
+			segmentView.select(favoriteLink);
+		} else if("My".equals(segment)) {
+			doOpenMyCourses(ureq).activate(ureq, subEntries, entry.getTransientState());
+			segmentView.select(myCourseLink);
+		} else if("Catalog".equals(segment)) {
+			CatalogNodeController ctrl = doOpenCatalog(ureq);
+			if(ctrl != null) {
+				ctrl.activate(ureq, subEntries, entry.getTransientState());
+				segmentView.select(catalogLink);
+			}
+		}
 	}
 
 	@Override
@@ -123,42 +152,62 @@ public class OverviewRepositoryListController extends BasicController implements
 		}
 	}
 	
-	private boolean doOpenMark(UserRequest ureq) {
-		boolean hasMarkedEntries = true;
+	private RepositoryEntryListController doOpenMark(UserRequest ureq) {
 		if(markedCtrl == null) {
 			SearchMyRepositoryEntryViewParams searchParams
 				= new SearchMyRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles(), "CourseModule");
 			searchParams.setMarked(Boolean.TRUE);
-			markedCtrl = new RepositoryEntryListController(ureq, getWindowControl(), searchParams);
-			hasMarkedEntries = !markedCtrl.isEmpty();
+
+			OLATResourceable ores = OresHelper.createOLATResourceableInstance("Favorits", 0l);
+			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+			markedCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams);
 			listenTo(markedCtrl);
 		}
+
+		addToHistory(ureq, markedCtrl);
 		mainVC.put("segmentCmp", markedCtrl.getInitialComponent());
-		return hasMarkedEntries;
+		return markedCtrl;
 	}
 	
-	private void doOpenMyCourses(UserRequest ureq) {
+	private RepositoryEntryListController doOpenMyCourses(UserRequest ureq) {
 		if(myCoursesCtrl == null) {
 			SearchMyRepositoryEntryViewParams searchParams
 				= new SearchMyRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles(), "CourseModule");
 			searchParams.setMembershipMandatory(true);
-			myCoursesCtrl = new RepositoryEntryListController(ureq, getWindowControl(), searchParams);
+
+			OLATResourceable ores = OresHelper.createOLATResourceableInstance("My", 0l);
+			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+			myCoursesCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams);
 			listenTo(myCoursesCtrl);
 		}
+		
+		addToHistory(ureq, myCoursesCtrl);
 		mainVC.put("segmentCmp", myCoursesCtrl.getInitialComponent());
+		return myCoursesCtrl;
 	}
 	
-	private void doOpenCatalog(UserRequest ureq) {
+	private CatalogNodeController doOpenCatalog(UserRequest ureq) {
+		if(!repositoryModule.isCatalogEnabled() || !repositoryModule.isCatalogBrowsingEnabled()) return null;
+		
 		if(catalogCtrl == null) {
 			List<CatalogEntry> entries = catalogManager.getRootCatalogEntries();
 			CatalogEntry rootEntry = null;
 			if(entries.size() > 0) {
 				rootEntry = entries.get(0);
 			}
-			catalogCtrl = new CatalogNodeController(ureq, getWindowControl(), rootEntry);
+			
+			OLATResourceable ores = OresHelper.createOLATResourceableInstance("Catalog", 0l);
+			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+			catalogCtrl = new CatalogNodeController(ureq, bwControl, rootEntry);
 			catalogCtrl.setStackedController(stackPanel);
 			listenTo(catalogCtrl);
 		}
+
+		addToHistory(ureq, catalogCtrl);
 		mainVC.put("segmentCmp", catalogCtrl.getInitialComponent());
+		return catalogCtrl;
 	}
 }
diff --git a/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java b/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java
index 39b0e4c1e77..f98aae8e596 100644
--- a/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java
+++ b/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java
@@ -52,7 +52,10 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowController;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
+import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.context.ContextEntry;
+import org.olat.core.id.context.StateEntry;
 import org.olat.core.util.Util;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.repository.RepositoryManager;
@@ -68,7 +71,7 @@ import org.olat.repository.ui.list.RepositoryEntryDataModel.Cols;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
 public class RepositoryEntryListController extends FormBasicController
-	implements RepositoryEntryDataSourceUIFactory, FlexiTableComponentDelegate {
+	implements Activateable2, RepositoryEntryDataSourceUIFactory, FlexiTableComponentDelegate {
 	
 	private FormLink listLink, tableLink, filterLink, sortLink;
 	private FlexiTableElement tableEl;
@@ -140,6 +143,11 @@ public class RepositoryEntryListController extends FormBasicController
 		//
 	}
 
+	@Override
+	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
+		//
+	}
+
 	@Override
 	protected void formOK(UserRequest ureq) {
 		//
diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties
index 943989f027f..7f8ddec0694 100644
--- a/src/main/resources/serviceconfig/olat.properties
+++ b/src/main/resources/serviceconfig/olat.properties
@@ -393,14 +393,13 @@ site.repository.enable=true
 site.groups.enable=true
 site.questionpool.enable=true
 
-## Alpha code: enable catalog a separate site, my courses view in home. 
-## Do not change this for production, this will be released in a later released
-###
+#Enable/disable the catalog in its own tab
 site.catalog.enable=false
-repo.catalog.enable=true
-my.courses.enable=false
-###
 
+# Enable/disable the whole catalog feature
+repo.catalog.enable=true
+# Enabl/disable the browsing of catalog in the course site
+repo.catalog.browsing.enable=true
 # When repo.listallcourses.enabled=true, the list of all courses are show as it is today.
 # When false, the menu item does not show up.
 repo.listallcourses.enabled=true
-- 
GitLab