Package org.olat

Source Code of org.olat.NewControllerFactory

/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <p>
* This software is protected by the OLAT software license.<br>
* Use is subject to license terms.<br>
* See LICENSE.TXT in this distribution for details.
* <p>
* Copyright (c) JGS goodsolutions GmbH, Zurich, Switzerland.
* http://www.goodsolutions.ch <br>
* All rights reserved.
* <p>
*/
package org.olat;

import java.util.HashMap;
import java.util.Map;

import org.olat.core.gui.UserRequest;
import org.olat.core.gui.Windows;
import org.olat.core.gui.components.Window;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.dtabs.DTab;
import org.olat.core.gui.control.generic.dtabs.DTabs;
import org.olat.core.id.OLATResourceable;
import org.olat.core.id.context.BusinessControl;
import org.olat.core.id.context.BusinessControlFactory;
import org.olat.core.id.context.ContextEntry;
import org.olat.core.id.context.ContextEntryControllerCreator;
import org.olat.core.logging.AssertException;
import org.olat.core.logging.LogDelegator;
import org.olat.core.util.resource.OresHelper;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryManager;

/**
* Description:<br>
* input: e.g. [repoentry:123] or [repoentry:123][CourseNode:456] or ...
*
*
* <P>
* Initial Date: 16.06.2006 <br>
*
* @author Felix Jost
*/
public class NewControllerFactory extends LogDelegator {
  private static NewControllerFactory INSTANCE = new NewControllerFactory();
  // map of controller creators, setted by Spring configuration
  private Map<String, ContextEntryControllerCreator> contextEntryControllerCreators = new HashMap<String, ContextEntryControllerCreator>();

  /**
   * Get an instance of the new controller factory
   *
   * @return
   */
  public static NewControllerFactory getInstance() {
    return INSTANCE;
  }

  /**
   * Singleton constructor
   */
  private NewControllerFactory() {
  //
  }

  /**
   * Add a context entry controller creator for a specific key. This is used to
   * add new creators at runtime, e.g. from a self contained module. It is
   * allowed to overwrite existing ContextEntryControllerCreator. Use the
   * canLaunch() method to check if for a certain key something is already
   * defined.
   *
   * @param key
   * @param controllerCreator
   */
  public synchronized void addContextEntryControllerCreator(String key, ContextEntryControllerCreator controllerCreator) {
    ContextEntryControllerCreator oldCreator = contextEntryControllerCreators.get(key);
    contextEntryControllerCreators.put(key, controllerCreator);
    // Add config logging to console
    logInfo("Adding context entry controller creator for key::" + key + " and value::" + controllerCreator.getClass().getCanonicalName()
        + (oldCreator == null ? "" : " replaceing existing controller creator ::" + oldCreator.getClass().getCanonicalName()), null);
  }

  /**
   * Check if a context entry controller creator is available for the given key
   *
   * @param key
   * @return true: key is known; false: key can not be used
   */
  public boolean canLaunch(String key) {
    return contextEntryControllerCreators.containsKey(key);
  }

  /**
   * Launch a controller in a tab or site in the given window from a user
   * request url
   *
   * @param ureq
   * @param wControl
   */
  public void launch(UserRequest ureq, WindowControl wControl) {
    BusinessControl bc = wControl.getBusinessControl();
    ContextEntry mainCe = bc.popLauncherContextEntry();
    OLATResourceable ores = mainCe.getOLATResourceable();

    // Check for RepositoryEntry resource
    boolean ceConsumed = false;
    if (ores.getResourceableTypeName().equals(OresHelper.calculateTypeName(RepositoryEntry.class))) {
      // It is a repository-entry => get OLATResourceable from RepositoryEntry
      RepositoryManager repom = RepositoryManager.getInstance();
      RepositoryEntry re = repom.lookupRepositoryEntry(ores.getResourceableId());
      ores = re.getOlatResource();
      ceConsumed = true;
    }

    // was brasato:: DTabs dts = wControl.getDTabs();
    Window window = Windows.getWindows(ureq.getUserSession()).getWindow(ureq);

    if (window == null) {
      logDebug("Found no window for jumpin => take WindowBackOffice", null);
      window = wControl.getWindowBackOffice().getWindow();
    }
    DTabs dts = (DTabs) window.getAttribute("DTabs");
    DTab dt = dts.getDTab(ores);
    if (dt != null) {
      // tab already open => close it
      dts.removeDTab(dt);// disposes also dt and controllers
    }

    String firstType = mainCe.getOLATResourceable().getResourceableTypeName();
    // String firstTypeId = ClassToId.getInstance().lookup() BusinessGroup
    ContextEntryControllerCreator typeHandler = contextEntryControllerCreators.get(firstType);
    if (typeHandler == null) throw new AssertException("Unable to get a handler for the type: " + firstType);

    String siteClassName = typeHandler.getSiteClassName(mainCe);
    // open in existing site
    if (siteClassName != null) {
      // use special activation key to trigger the activate method
      String viewIdentifyer = null;
      if (bc.hasContextEntry()) {
        ContextEntry subContext = bc.popLauncherContextEntry();
        if (subContext != null) {
          OLATResourceable subResource = subContext.getOLATResourceable();
          if (subResource != null) {
            viewIdentifyer = subResource.getResourceableTypeName();
            if (subResource.getResourceableId() != null) {
              // add resource instance id if available. The ':' is a common
              // separator in the activatable interface
              viewIdentifyer = viewIdentifyer + ":" + subResource.getResourceableId();
            }
          }
        }
      } else if (!ceConsumed) {
        //the olatresourceable is not in a dynamic tab but in a fix one
        if(ores != null) {
          viewIdentifyer = ores.getResourceableTypeName();
          if (ores.getResourceableId() != null) {
            // add resource instance id if available. The ':' is a common
            // separator in the activatable interface
            viewIdentifyer = viewIdentifyer + ":" + ores.getResourceableId();
          }
        }
      }
      dts.activateStatic(ureq, siteClassName, viewIdentifyer);
    } else {
      // or create new tab
      String tabName = typeHandler.getTabName(mainCe);
      // create and add Tab
      dt = dts.createDTab(ores, tabName);
      if (dt == null) {
        // tabs are full: TODO
        // user error message is generated in BaseFullWebappController, nothing
        // to do here
      } else {

        WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(bc, dt.getWindowControl());
        Controller launchC = typeHandler.createController(mainCe, ureq, bwControl);

        dt.setController(launchC);
        dts.addDTab(dt);
      }

      dts.activate(ureq, dt, null); // null: do not activate to a certain view
    }
  }

}
TOP

Related Classes of org.olat.NewControllerFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.