intra-mart Accel Platform SAStruts+S2JDBC プログラミングガイド 第17版 2020-08-01

プログラミング方法

ここでは、アクセスコンテキストの簡単な利用方法について説明します。
新しいアクセスコンテキストを作成する方法、および、アクセスコンテキストの詳細な利用方法については、「 アクセスコンテキスト 拡張プログラミングガイド 」を参照してください。

アクセスコンテキストの基本的な利用方法

アクセスコンテキストを取得するためには、 Contexts API を利用します。
利用したいアクセスコンテキストの種別の短縮名を確認し、以下の方法で取得してください。
Contexts.get(<コンテキスト種別>)
コンテキスト種別は、利用したいアクセスコンテキストインタフェースのクラスオブジェクトです。
利用したいアクセスコンテキストのインタフェースを確認し、引数に指定して実行します。
以下にアカウントコンテキストを取得する例を示します。
// アカウントコンテキストを取得する。
AccountContext accountContext = Contexts.get(AccountContext.class);

// ユーザコードを取得する。
String userCd = accountContext.getUserCd();

// ユーザコンテキストを取得する。
UserContext userContext = Contexts.get(UserContext.class);

アカウントコンテキストの状態アクセスユーティリティ

よく利用される機能として、アカウントコンテキストの認証状況などを問い合わせることがあります。
そのためには、アカウントコンテキストの情報を問い合わせるためのユーティリティを利用できます。
// 認証状況を問い合わせる
boolean authenticated = ContextStatus.isAuthenticated();

if (authenticated) {
 // 認証済みユーザの処理
} else {
 // 未認証ユーザの処理
}

認証状況を問い合わせる

ログインしているかどうかは、以下のいずれかの方法により確認することができます。
  • アカウントコンテキストの認証状況を問い合わせる。
AccountContext accountContext = Contexts.get(AccountContext.class);
boolean authenticated = accountContext.isAuthenticated();
  • ユーティリティを利用して認証状況を問い合わせる。
boolean authenticated = ContextStatus.isAuthenticated();
intra-mart Accel Platform では、ログインしていないユーザの場合も、ユーザコードが設定されています。
このユーザコードは、ログやデータベースの更新者等、アプリケーションに影響がない範囲で利用されることを想定しています。
ログインしているかどうかは、必ず上記の方法で確認してください。

ユーザ種別を問い合わせる

アクセスしているユーザが、一般ユーザなのか、または、システム管理者なのかは、以下のいずれかの方法により確認することができます。
  • アカウントコンテキストのユーザ種別を取得する。
AccountContext accountContext = Contexts.get(AccountContext.class);
UserType userType= accountContext.getUserType();

// システム管理者かどうか
boolean isAdministrator = UserType.ADMINISTRATOR  == userType;

// 一般ユーザかどうか
boolean isUser = UserType.USER  == userType;
  • ユーティリティを利用してシステム管理者かどうかを問い合わせる。
boolean isAdministrator = ContextStatus.isAdministrator();
未認証ユーザの場合もユーザ種別は一般ユーザです。

定義済みアクセスコンテキストの利用方法

アカウントコンテキストを利用する

以下にアカウントコンテキストからユーザロケールを取得する例を示します。
AccountContext accountContext = Contexts.get(AccountContext.class);
Locale locale = accountContext.getLocale();

// メッセージを取得する。
String message = MessageManager.getInstance().getMessage(locale, "I.IWP.CERTIFICATION.SECURITYLOG.00200");
System.out.println("メッセージ = " + message);
アカウントコンテキストのロケールは、アカウント情報にロケールが設定されていない場合テナントのロケールが取得できます。
個人設定でロケールを変更し、ロケールが変更されることを確認してみてください。
多くのAPIでは、引数を省略することでアカウントコンテキストの情報を参照するようになっています。
上記の例は、以下のコードと同じ結果になります。
// メッセージを取得する。
String message = MessageManager.getInstance().getMessage("I.IWP.CERTIFICATION.SECURITYLOG.00200");

ユーザコンテキストを利用する

以下にユーザコンテキストからプロファイル情報を取得する例を示します。
UserContext userContext = Contexts.get(UserContext.class);

// ユーザ名を取得します。
String userName = userContext.getUserProfile().getUserName();
このコードにより、現在アクセスしているユーザのユーザ名が取得できます。
未認証ユーザの場合は「ゲスト」が取得できます。
また、ユーザコンテキストからカレント組織を取得する例を示します。
UserContext userContext = Contexts.get(UserContext.class);

Department department = userContext.getCurrentDepartment();
if (department != null) {
   String departmentName = department.getDepartmentFullName();
   System.out.println("カレント組織名 = " + departmentName);
}
このコードにより、現在アクセスしている組織のフル名称が取得できます。
複数の所属先を持つユーザの場合、ヘッダのユーザ名をクリックして所属組織を切り替えることで、取得できる名称も変わりますので、確認してみてください。

ユーザコンテキストの所属組織を切り替える

以下にプログラムからユーザコンテキストの所属組織を切り替える例を示します。
Map<String, String> resource = new HashMap<String, String>();
resource.put("currentCompanyCd", companyCd);
resource.put("currentDepartmentSetCd", departmentSetCd);
resource.put("currentDepartmentCd", departmentCd);

Lifecycle lifecycle = LifecycleFactory.getLifecycle();
lifecycle.switchTo(new Resource("platform.current.department.switch", resource));
このコードにより、所属組織の切り替えを行うことができます。
所属組織の切り替えを行う場合は、以下の点に注意してください。
  • リソースIDには「 platform.current.department.switch 」を指定してください。

  • リソース情報(Map)には切り替え先の組織を指定してください。
    また、所属組織の切り替えを行うには、切り替えを行うユーザが所属している組織を指定する必要があります。
  • 切り替え先の組織には、会社コード(currentCompanyCd)、組織セットコード(currentDepartmentSetCd)、組織コード(currentDepartmentCd)の3つを必ず指定してください。

一時的に実行ユーザを変更して処理を実行する

以下に一時的にユーザとカレント組織を変更して処理を実行する例を示します。
// 切り替えるユーザのユーザコードを指定します
String userCd = "aoyagi";
 
// IM-共通マスタの組織ビジネスキーを指定します
DepartmentBizKey departmentBizKey = new DepartmentBizKey();
department.setCompanyCd("comp_sample_01");
department.setDepartmentSetCd("comp_sample_01");
department.setDepartmentCd("dept_sample_21");

// 一時的にユーザを切り替えて処理を実行します。
UserSwitcher.switchTo(userCd, departmentBizKey, new UserSwitchProcedure() {

    public void process() throws UserSwitchException {
        try {

            // ユーザを切替えた場合の処理を記述します
            doSomething();

        } catch (SomethingException e) {
            throw new UserSwitchException(e);
        }
    }

});
このコードにより、ジョブ実行環境で特定のユーザで処理を実行したり、Web実行環境でログインユーザとは別のユーザに切り替えて、処理を実行することができます。
ユーザを切り替えることで、そのユーザの認可情報やライセンス情報に従った処理を実行することが可能です。
ユーザ切替処理の詳細は、 「UserSwitcher クラスの APIドキュメント」を参照してください。