<commit_before>/**
 * 
 */
package org.mklab.taskit.client.activity;

import org.mklab.taskit.client.ClientFactory;
import org.mklab.taskit.client.HelpCallWatcher;
import org.mklab.taskit.client.LocalDatabase;
import org.mklab.taskit.client.place.Login;
import org.mklab.taskit.client.ui.HelpCallDisplayable;
import org.mklab.taskit.client.ui.PageLayout;
import org.mklab.taskit.client.ui.TaskitView;
import org.mklab.taskit.shared.UserProxy;
import org.mklab.taskit.shared.UserType;
import org.mklab.taskit.shared.event.HelpCallEvent;

import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Widget;
import com.google.web.bindery.requestfactory.shared.Receiver;
import com.google.web.bindery.requestfactory.shared.ServerFailure;

import de.novanic.eventservice.client.event.Event;
import de.novanic.eventservice.client.event.RemoteEventService;
import de.novanic.eventservice.client.event.listener.RemoteEventListener;


/**
 * 認証完了後のすべてのアクティビティの基底クラスです。
 * <p>
 * ビューの基本的なレイアウト、ユーザーへの情報通知機能を提供します。
 * 
 * @author <NAME>
 * @version $Revision$, Jan 25, 2011
 */
public abstract class TaskitActivity extends AbstractActivity implements PageLayout.Presenter, HelpCallObserver {

  private ClientFactory clientFactory;
  private AcceptsOneWidget container;
  private UserProxy loginUser;
  private TaskitView view;
  private PageLayout layout;

  /**
   * {@link TaskitActivity}オブジェクトを構築します。
   * 
   * @param clientFactory クライアントファクトリ
   */
  public TaskitActivity(ClientFactory clientFactory) {
    if (clientFactory == null) throw new NullPointerException();
    this.clientFactory = clientFactory;
    this.layout = clientFactory.getPageLayout();
    this.layout.setPresenter(this);
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public final void start(AcceptsOneWidget panel, @SuppressWarnings("unused") EventBus eventBus) {
    this.container = panel;
    updateLoginUserInfoAsync();
  }

  /**
   * ログインユーザーを取得します。
   * 
   * @return ログインユーザー
   */
  protected final UserProxy getLoginUser() {
    return this.loginUser;
  }

  /**
   * ログインユーザー情報を非同期で取得し、取得が完了し次第ユーザーに応じたビューを表示します。
   * <p>
   * ユーザー情報はキャッシュされ、アプリケーション実行中はログアウトするか、キャッシュをマニュアルでクリアするまでその情報を利用します。
   */
  private void updateLoginUserInfoAsync() {
    getClientFactory().getLocalDatabase().getCacheOrExecute(LocalDatabase.LOGIN_USER, new Receiver<UserProxy>() {

      @SuppressWarnings("synthetic-access")
      @Override
      public void onSuccess(UserProxy user) {
        if (user == null) {
          logout();
          return;
        }
        initViewWith(user);
      }

      /**
       * {@inheritDoc}
       */
      @Override
      public void onFailure(ServerFailure error) {
        showErrorDialog(error.getMessage());
        logout();
      }
    });
  }

  /**
   * 与えられたユーザー情報を元に、ビューを構築します。
   * 
   * @param user ログインユーザー情報
   */
  private void initViewWith(UserProxy user) {
    if (user == null) throw new NullPointerException();
    this.loginUser = user;

    this.view = createTaskitView(this.clientFactory);
    Widget page = this.layout.layout(this.view, user);
    this.container.setWidget(page);

    final HelpCallWatcher helpCallWatcher = this.clientFactory.getHelpCallWatcher();
    if (user.getType() == UserType.STUDENT) {
      if (this.view instanceof HelpCallDisplayable) {
        ((HelpCallDisplayable)this.view).setHelpCallDisplayEnabled(false);
      }
    } else {
      final RemoteEventService eventService = getClientFactory().getRemoteEventService();
      if (eventService.getActiveDomains().contains(HelpCallEvent.DOMAIN) == false) {
        eventService.addListener(HelpCallEvent.DOMAIN, new RemoteEventListener() {

          @Override
          public void apply(Event anEvent) {
            if (anEvent instanceof HelpCallEvent) {
              helpCallCountChanged(((HelpCallEvent)anEvent).getHelpCallCount());
            }
          }
        });
        helpCallWatcher.updateHelpCallCount();
      }
      helpCallWatcher.setHelpCallObserver(this);

      if (this.view instanceof HelpCallDisplayable) {
        ((HelpCallDisplayable)this.view).setHelpCallDisplayEnabled(true);
        ((HelpCallDisplayable)this.view).showHelpCallCount(helpCallWatcher.getHelpCallCount());
      }
    }

    onViewShown();
  }

  /**
   * ビューを作成します。
   * 
   * @param clientFactory クライアントファクトリ
   * @return ビュー
   */
  protected abstract TaskitView createTaskitView(@SuppressWarnings("hiding") ClientFactory clientFactory);

  /**
   * ビューが表示されたときに呼び出されます。<commit_msg>Fixed bug helpcall sometimes not synced.<commit_after>/**
 * 
 */
package org.mklab.taskit.client.activity;

import org.mklab.taskit.client.ClientFactory;
import org.mklab.taskit.client.HelpCallWatcher;
import org.mklab.taskit.client.LocalDatabase;
import org.mklab.taskit.client.place.Login;
import org.mklab.taskit.client.ui.HelpCallDisplayable;
import org.mklab.taskit.client.ui.PageLayout;
import org.mklab.taskit.client.ui.TaskitView;
import org.mklab.taskit.shared.UserProxy;
import org.mklab.taskit.shared.UserType;
import org.mklab.taskit.shared.event.HelpCallEvent;

import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Widget;
import com.google.web.bindery.requestfactory.shared.Receiver;
import com.google.web.bindery.requestfactory.shared.ServerFailure;

import de.novanic.eventservice.client.event.Event;
import de.novanic.eventservice.client.event.RemoteEventService;
import de.novanic.eventservice.client.event.listener.RemoteEventListener;


/**
 * 認証完了後のすべてのアクティビティの基底クラスです。
 * <p>
 * ビューの基本的なレイアウト、ユーザーへの情報通知機能を提供します。
 * 
 * @author <NAME>
 * @version $Revision$, Jan 25, 2011
 */
public abstract class TaskitActivity extends AbstractActivity implements PageLayout.Presenter, HelpCallObserver {

  private ClientFactory clientFactory;
  private AcceptsOneWidget container;
  private UserProxy loginUser;
  private TaskitView view;
  private PageLayout layout;

  /**
   * {@link TaskitActivity}オブジェクトを構築します。
   * 
   * @param clientFactory クライアントファクトリ
   */
  public TaskitActivity(ClientFactory clientFactory) {
    if (clientFactory == null) throw new NullPointerException();
    this.clientFactory = clientFactory;
    this.layout = clientFactory.getPageLayout();
    this.layout.setPresenter(this);
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public final void start(AcceptsOneWidget panel, @SuppressWarnings("unused") EventBus eventBus) {
    this.container = panel;
    updateLoginUserInfoAsync();
  }

  /**
   * ログインユーザーを取得します。
   * 
   * @return ログインユーザー
   */
  protected final UserProxy getLoginUser() {
    return this.loginUser;
  }

  /**
   * ログインユーザー情報を非同期で取得し、取得が完了し次第ユーザーに応じたビューを表示します。
   * <p>
   * ユーザー情報はキャッシュされ、アプリケーション実行中はログアウトするか、キャッシュをマニュアルでクリアするまでその情報を利用します。
   */
  private void updateLoginUserInfoAsync() {
    getClientFactory().getLocalDatabase().getCacheOrExecute(LocalDatabase.LOGIN_USER, new Receiver<UserProxy>() {

      @SuppressWarnings("synthetic-access")
      @Override
      public void onSuccess(UserProxy user) {
        if (user == null) {
          logout();
          return;
        }
        initViewWith(user);
      }

      /**
       * {@inheritDoc}
       */
      @Override
      public void onFailure(ServerFailure error) {
        showErrorDialog(error.getMessage());
        logout();
      }
    });
  }

  /**
   * 与えられたユーザー情報を元に、ビューを構築します。
   * 
   * @param user ログインユーザー情報
   */
  private void initViewWith(UserProxy user) {
    if (user == null) throw new NullPointerException();
    this.loginUser = user;

    this.view = createTaskitView(this.clientFactory);
    Widget page = this.layout.layout(this.view, user);
    this.container.setWidget(page);

    final HelpCallWatcher helpCallWatcher = this.clientFactory.getHelpCallWatcher();
    if (user.getType() == UserType.STUDENT) {
      if (this.view instanceof HelpCallDisplayable) {
        ((HelpCallDisplayable)this.view).setHelpCallDisplayEnabled(false);
      }
    } else {
      final RemoteEventService eventService = getClientFactory().getRemoteEventService();
      if (eventService.getActiveDomains().contains(HelpCallEvent.DOMAIN) == false) {
        eventService.addListener(HelpCallEvent.DOMAIN, new RemoteEventListener() {

          @Override
          public void apply(Event anEvent) {
            if (anEvent instanceof HelpCallEvent) {
              helpCallWatcher.updateHelpCallCount();
            }
          }
        });
        helpCallWatcher.updateHelpCallCount();
      }
      helpCallWatcher.setHelpCallObserver(this);

      if (this.view instanceof HelpCallDisplayable) {
        ((HelpCallDisplayable)this.view).setHelpCallDisplayEnabled(true);
        ((HelpCallDisplayable)this.view).showHelpCallCount(helpCallWatcher.getHelpCallCount());
      }
    }

    onViewShown();
  }

  /**
   * ビューを作成します。
   * 
   * @param clientFactory クライアントファクトリ
   * @return ビュー
   */
  protected abstract TaskitView createTaskitView(@SuppressWarnings("hiding") ClientFactory clientFactory);

  /**
   * ビューが表示されたときに呼び出されます。
{'fraction_non_alphanumeric': 0.11030894999469158, 'fraction_numerical': 0.0012740205966663128, 'mean_word_length': 3.665676077265973, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5662103', 'n_tokens_mistral': 3317, 'n_tokens_neox': 3264, 'n_words': 458}