Package org.pentaho.reporting.designer.extensions.pentaho.repository.actions

Source Code of org.pentaho.reporting.designer.extensions.pentaho.repository.actions.LoginTask

package org.pentaho.reporting.designer.extensions.pentaho.repository.actions;

import java.awt.Component;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.Window;
import javax.swing.SwingUtilities;

import org.pentaho.reporting.designer.core.ReportDesignerContext;
import org.pentaho.reporting.designer.core.auth.AuthenticationData;
import org.pentaho.reporting.designer.core.auth.AuthenticationStore;
import org.pentaho.reporting.designer.core.editor.ReportRenderContext;
import org.pentaho.reporting.designer.extensions.pentaho.repository.Messages;
import org.pentaho.reporting.designer.extensions.pentaho.repository.dialogs.RepositoryLoginDialog;
import org.pentaho.reporting.designer.extensions.pentaho.repository.util.PublishSettings;
import org.pentaho.reporting.engine.classic.core.modules.gui.commonswing.ExceptionDialog;
import org.pentaho.reporting.engine.classic.core.modules.gui.commonswing.SwingUtil;
import org.pentaho.reporting.libraries.designtime.swing.background.BackgroundCancellableProcessHelper;
import org.pentaho.reporting.libraries.designtime.swing.background.GenericCancelHandler;

/**
* Todo: Document me!
*
* @author Thomas Morgner.
*/
public class LoginTask implements Runnable
{
  private ReportDesignerContext designerContext;
  private Component uiContext;
  private RepositoryLoginDialog loginDialog;
  private AuthenticationData loginData;
  private AuthenticatedServerTask followUpTask;
  private boolean skipFirstShowDialog;

  public LoginTask(final ReportDesignerContext designerContext,
                   final Component uiContext,
                   final AuthenticatedServerTask followUpTask)
  {
    this(designerContext, uiContext, followUpTask, null);
  }

  public LoginTask(final ReportDesignerContext designerContext,
                   final Component uiContext,
                   final AuthenticatedServerTask followUpTask,
                   final AuthenticationData loginData)
  {
    if (designerContext == null)
    {
      throw new NullPointerException();
    }
    if (uiContext == null)
    {
      throw new NullPointerException();
    }
    this.designerContext = designerContext;
    this.uiContext = uiContext;
    this.followUpTask = followUpTask;
    if (loginData != null)
    {
      this.loginData = loginData;
      this.skipFirstShowDialog = true;
    }
    else
    {
      final ReportRenderContext reportRenderContext = designerContext.getActiveContext();
      if (reportRenderContext != null)
      {
        final Object o = reportRenderContext.getProperty("pentaho-login-url");
        if (o != null)
        {
          // prepopulate the dialog with the correct login data, but do not skip login completely.
          this.loginData = RepositoryLoginDialog.getStoredLoginData(String.valueOf(o), designerContext);
        }
      }
      if (this.loginData == null)
      {
        this.loginData = RepositoryLoginDialog.getDefaultData(designerContext);
      }
      this.skipFirstShowDialog = false;
    }
  }


  /**
   * When an object implementing interface <code>Runnable</code> is used
   * to create a thread, starting the thread causes the object's
   * <code>run</code> method to be called in that separately executing
   * thread.
   * <p/>
   * The general contract of the method <code>run</code> is that it may
   * take any action whatsoever.
   *
   * @see Thread#run()
   */
  public void run()
  {
    boolean loginComplete;
    do
    {
      if (loginDialog == null)
      {
        final Window window = SwingUtil.getWindowAncestor(uiContext);
        if (window instanceof Frame)
        {
          loginDialog = new RepositoryLoginDialog((Frame) window);
        }
        else if (window instanceof Dialog)
        {
          loginDialog = new RepositoryLoginDialog((Dialog) window);
        }
        else
        {
          loginDialog = new RepositoryLoginDialog();
        }

        SwingUtil.centerDialogInParent(loginDialog);
      }

      if (skipFirstShowDialog)
      {
        skipFirstShowDialog = false;
      }
      else
      {
        this.loginData = loginDialog.performLogin(designerContext, loginData);
        if (loginData == null)
        {
          return;
        }
      }

      final ValidateLoginTask validateLoginTask = new ValidateLoginTask(this);
      final Thread loginThread = new Thread(validateLoginTask);
      loginThread.setDaemon(true);
      loginThread.setPriority(Thread.MIN_PRIORITY);

      final GenericCancelHandler cancelHandler = new GenericCancelHandler(loginThread);
      BackgroundCancellableProcessHelper.executeProcessWithCancelDialog
          (loginThread, cancelHandler, uiContext, Messages.getInstance().getString("LoginTask.ValidateLoginMessage"));
      if (cancelHandler.isCancelled())
      {
        return;
      }

      if (validateLoginTask.getException() != null)
      {
        final Exception exception = validateLoginTask.getException();
        ExceptionDialog.showExceptionDialog(uiContext,
            Messages.getInstance().getString("LoadReportFromRepositoryAction.LoginError.Title"),
            Messages.getInstance().formatMessage("LoadReportFromRepositoryAction.LoginError.Message",
                exception.getMessage()), exception);
        loginComplete = false;
      }
      else
      {
        loginComplete = validateLoginTask.isLoginComplete();
      }
    }
    while (loginComplete == false);

    if (loginDialog != null && loginDialog.isRememberSettings())
    {
      final ReportRenderContext reportRenderContext = designerContext.getActiveContext();
      if (reportRenderContext != null)
      {
        final AuthenticationStore store = reportRenderContext.getAuthenticationStore();
        store.add(loginData, true);
      }
      else
      {
        designerContext.getGlobalAuthenticationStore().add(loginData, true);
      }
    }

    final boolean storeUpdates;
    if (loginDialog == null)
    {
      storeUpdates = PublishSettings.getInstance().isRememberSettings();
    }
    else
    {
      storeUpdates = loginDialog.isRememberSettings();
    }

    if (followUpTask != null)
    {
      followUpTask.setLoginData(loginData, storeUpdates);
      SwingUtilities.invokeLater(followUpTask);
    }
  }

  public AuthenticationData getLoginData()
  {
    return loginData;
  }
}
TOP

Related Classes of org.pentaho.reporting.designer.extensions.pentaho.repository.actions.LoginTask

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.