/** * <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.admin.extensions; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.olat.admin.SystemAdminMainController; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.services.notifications.NotificationsHandler; import org.olat.core.extensions.Extension; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.panel.SimpleStackedPanel; 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.olat.core.gui.control.generic.portal.Portlet; import org.olat.core.gui.control.navigation.SiteDefinition; 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.nodes.CourseNodeConfiguration; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.ConstructorArgumentValues; import org.springframework.beans.factory.config.ConstructorArgumentValues.ValueHolder; import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import org.springframework.web.context.support.XmlWebApplicationContext; /** * * @author Christian Guretzki */ public class ExtensionsAdminController extends BasicController { private static OLog log = Tracing.createLoggerFor(ExtensionsAdminController.class); private VelocityContainer content; private SimpleStackedPanel mainPanel; public ExtensionsAdminController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl); mainPanel = new SimpleStackedPanel("extensionsPanel"); // use combined translator from system admin main setTranslator(Util.createPackageTranslator(SystemAdminMainController.class, ureq.getLocale(), getTranslator())); content = createVelocityContainer("extensionsAdmin"); Map<ExtensionKey,Map<String, GenericBeanDefinition>> extensionList = new HashMap<>(); extensionList.put(new ExtensionKey("Extension", "ext"), getBeanDefListFor(Extension.class)); extensionList.put(new ExtensionKey("Sites definitions", "sitesdefs"), getBeanDefListFor(SiteDefinition.class)); extensionList.put(new ExtensionKey("Managers", "managers"), getBeanDefListFor(BasicManager.class)); extensionList.put(new ExtensionKey("Portlets", "portles"), getBeanDefListFor(Portlet.class)); extensionList.put(new ExtensionKey("Notification's handlers", "notifications"), getBeanDefListFor(NotificationsHandler.class)); extensionList.put(new ExtensionKey("Course node configuration", "nodeconfig"), getBeanDefListFor(CourseNodeConfiguration.class)); content.contextPut("extensionList", extensionList); mainPanel.setContent(content); putInitialPanel(mainPanel); } private Map<String, GenericBeanDefinition> getBeanDefListFor(Class<?> clazz) { boolean debug = log.isDebug(); ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(CoreSpringFactory.servletContext); XmlWebApplicationContext context = (XmlWebApplicationContext)applicationContext; ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); Map<String, GenericBeanDefinition> beanDefinitionList = new HashMap<String, GenericBeanDefinition>(); String[] beanNames = beanFactory.getBeanNamesForType(clazz); for (int i = 0; i < beanNames.length; i++) { try { if(debug) log.debug(">>> beanNames=" + beanNames[i]); GenericBeanDefinition beanDef = (GenericBeanDefinition)beanFactory.getBeanDefinition(beanNames[i]); ConstructorArgumentValues args = beanDef.getConstructorArgumentValues(); List<ValueHolder> values = args.getGenericArgumentValues(); for (Iterator<ValueHolder> iterator = values.iterator(); iterator.hasNext();) { ValueHolder valueHolder = iterator.next(); if(debug) { log.debug("valueHolder=" + valueHolder); log.debug("valueHolder.getType()=" + valueHolder.getType()); log.debug("valueHolder.getName()=" + valueHolder.getName()); log.debug("valueHolder.getValue()=" + valueHolder.getValue()); } } beanDefinitionList.put(beanNames[i], beanDef); } catch (NoSuchBeanDefinitionException e) { log.warn("Error while trying to analyze bean with name: "+ beanNames[i] +" :"+e); } catch (Exception e) { log.warn("Error while trying to analyze bean with name: "+ beanNames[i] +" :"+e); } } return beanDefinitionList; } @Override protected void doDispose() { // } @Override protected void event(UserRequest ureq, Component source, Event event) { // } public static class ExtensionKey { private final String name; private final String key; public ExtensionKey(String name, String key) { this.name = name; this.key = key; } public String getName() { return name; } public String getKey() { return key; } @Override public int hashCode() { return name.hashCode(); } @Override public boolean equals(Object obj) { if(obj == this) { return true; } if(obj instanceof ExtensionKey) { ExtensionKey extensionKey = (ExtensionKey)obj; return name != null && name.equals(extensionKey.getName()); } return false; } } }