SAP Cloud Platform からオンプレシステムにアクセスしてみる - JAVAアプリ編

# 1. はじめに
SAP Cloud Platform のアプリケーションからオンプレにあるシステムへのアクセスを試してみました。

機能確認のために簡単なJAVA アプリケーションを作成し、SAP Cloud PlatformからオンプレのABAPシステムへアクセスしてみます。

# 2. 今回作るアプリケーション
簡単にアプリケーションの動作を紹介します。

## 2.1．認証画面
SAP Cloud Platform の認証画面です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/208873/ac269cef-78bd-2034-9355-c0eece316d04.png)

## 2.2. 第一画面
任意のテキストを入力し、送信ボタンを押下すると汎用モジュール`STFC_CONNECTION`が呼び出されます。
呼び出す際のパラメータ`REQUTEXT`にInput Textへ入力した文字列が渡されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/208873/a87159e3-1e50-ed68-8c8b-844ac340e3c0.png)

## 2.3. 第二画面
汎用モジュール`STFC_CONNECTION`から返された値が表示されます。
`RESPTEXT`にSAP Netweaver のリリースや現在の日時、アクセスに利用したユーザの情報が表示されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/208873/8794a25f-23e5-1f37-814f-7be69fb9feb1.png)


# 3. ABAPへのアクセス方法
JCoで接続するには、SAP Cloud Platform で設定した宛先名を`JCoDestinationManager#getDestination`の引数に渡し`JCoDestination`オブジェクトを取得します。このオブジェクトからSAP Cloud Connectorを経由してオンプレのABAPサーバに接続できます。

以下は`p.getProperty(JCO_DESTINATION)` でSAP Cloud Platform に設定した宛先名が取得できる場合の例です。

```java
  return JCoDestinationManager.getDestination(p.getProperty(JCO_DESTINATION));
```

具体的には以下のような形で実装しました。
実際にはInterfaceを作成し継承させるなどしたほうが使いやすいクラスになるはずですが、、お試しなので割愛。

```java:StfcConnection.java
public class StfcConnection {
	public static final String PRAM_REQUTEXT = "REQUTEXT";
	public static final String PRAM_ECHOTEXT = "ECHOTEXT";
	public static final String PRAM_RESPTEXT = "RESPTEXT";
	private static final String FUNCTION_NAME = "STFC_CONNECTION";
	private static final String JCO_DESTINATION = "jco.destination";
	private static final String JCO_PROPERTIES = "jco.properties";

	private String propFilePath;
	private String requText;
	private String echoText;
	private String respText;


	public StfcConnection(String propDirPath, String requText) {
		this.propFilePath = Paths.get(propDirPath, JCO_PROPERTIES).toString();

		this.requText = requText;
	}

	public void execute() throws JCoException, FileNotFoundException, IOException {
		JCoDestination d = getDestiation();
		JCoFunction f = d.getRepository().getFunction(FUNCTION_NAME);

		// 汎用モジュールの呼出パラメータ設定
		f.getImportParameterList().setValue(PRAM_REQUTEXT, requText);

		// 汎用モジュール実行
		f.execute(d);

		// 汎用モジュール実行結果の取得
		JCoParameterList exports = f.getExportParameterList();
		echoText = exports.getString(PRAM_ECHOTEXT);
		respText = exports.getString(PRAM_RESPTEXT);
	}


	private JCoDestination getDestiation() throws FileNotFoundException, IOException, JCoException {

		InputStream is = new FileInputStream(propFilePath);
		Properties p = new Properties();

		// load jco destination name
		p.load(is);
		is.close();

		return JCoDestinationManager.getDestination(p.getProperty(JCO_DESTINATION));
	}

	public String getEchoText() {
		return echoText;
	}

	public String getRespText() {
		return respText;
	}
}
```

# 4. まとめ
SAP Cloud Platform からSAP Cloud Connector を経由して、無事、オンプレのABAPシステムへアクセスすることができました。
認証まで含めて、JAVA側の実装は簡単にできるようになっていると感じました。

# 余談：認証

以下のヘルプページを参考にプログラマティック認証を実装しました。
※認証伝送の機能確認もしたかったので、、、
[SAP Cloud Platform - 認証 - プログラマティック認証](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/ja-JP/e637f62abb571014857cb0232adc43a7.html#loio778d8987e7714376977c190f6df379ad)

実装にあたっては専用のクラスを用意し、各サーブレットから呼び出すようにしました。

```java:Authenication.java
public class Authenication {

  private final static Logger logger = LoggerFactory.getLogger(Authenication.class);

  protected static void login(String user) throws LoginException {
    if (user == null) {

      logger.debug("User is not logged in.");

      //authenticate the User
      LoginContext loginContext = LoginContextFactory.createLoginContext("FORM");
      loginContext.login();
    }
  }

  protected static void logout(String user) throws LoginException {
    if (user != null) {

      logger.debug("User is logged in.");

      //logout
      LoginContext loginContext = LoginContextFactory.createLoginContext("FORM");
      loginContext.logout();
    }
  }

  protected static boolean isLoggedin(HttpServletRequest request) {
    if (request.getRemoteUser() == null) {
      return false;
    } else {
      return true;
    }
  }
}
```

ソースコードはGitHubにアップロードしてあります。ご参考まで。
[GitHub - ScpJcoTest1](https://github.com/mato533/SAP-Cloud-Platform-Jco-Sample/tree/master/ScpJcoTest1)