intra-mart accel platform — office 365 連携プログラミングガイド … · 「sharepoint...

48
Copyright © 2015 NTT DATA INTRAMART CORPORATION Top intra-mart Accel Platform — Office 365 連携プログラミングガイド 32017-08-01 1

Upload: others

Post on 02-Sep-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

Copyright © 2015 NTT DATA INTRAMART CORPORATION

↑Top

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

1

Page 2: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

目次

1. 改訂情報2. はじめに

2.1. 本書の目的2.2. 対象読者2.3. サンプルコードについて2.4. 本書の構成

3. Office 365 連携 プログラミング概要3.1. Office 365 連携 の流れ

4. SharePoint Online のファイラを作成する (JavaEE開発モデル)4.1. SharePoint Online 上にディレクトリを新規作成する4.2. SharePoint Online 上にファイルをアップロードする4.3. SharePoint Online 上のファイルをダウンロードする4.4. SharePoint Online 上のファイルの詳細情報を表示する4.5. SharePoint Online 上のファイルを削除する4.6. SharePoint Online 上のドキュメントをiframeで表示する4.7. SharePoint Online のファイラを作成する

5. SharePoint Online のファイラを作成する (スクリプト開発モデル)5.1. SharePoint Online 上にディレクトリを新規作成する5.2. SharePoint Online 上にファイルをアップロードする5.3. SharePoint Online 上のファイルをダウンロードする5.4. SharePoint Online 上のファイルの詳細情報を表示する5.5. SharePoint Online 上のファイルを削除する5.6. SharePoint Online 上のドキュメントをiframeで表示する5.7. SharePoint Online のファイラを作成する5.8. ルーティングテーブルを作成する

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

2

Page 3: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

改訂情報

変更年月日変更年月日 変更内容変更内容

2015-08-01 初版

2015-12-01 第2版 下記を追加・変更しました

「SharePoint Online のファイラを作成する (スクリプト開発モデル) 」を追加

2017-08-01 第3版 下記を変更しました。

「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365 連携の低レベルAPIを新たに提供されたOneDrive APIに変更

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

3

Page 4: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

はじめに

本書の目的

本書では intra-mart Accel Platform における Office 365 連携機能 を用いたプログラミング方法について説明します。

対象読者

次の開発者を対象としています。

intra-mart Accel Platform で Office 365 上のリソースを利用したアプリケーションを作成したい開発者

サンプルコードについて

本書に掲載されているサンプルコードは可読性を重視しており、性能面や保守性といった観点において必ずしも適切な実装では

ありません。

サンプルコードを参考に開発する場合は、上記について十分に注意してください。

なお、ドキュメントの流れに合わせてサンプルを実装し、実際に動作確認を行う場合の前提条件は以下の通りです。

Office 365 連携 セットアップガイド を参考に Office 365 連携 の環境を作成してください。

本書の構成

本書は以下のような構成です。

Office 365 連携 プログラミング概要

SharePoint Online のファイラを作成する (JavaEE開発モデル)

SharePoint Online のファイラを作成する (スクリプト開発モデル)

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

4

Page 5: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

Office 365 連携 プログラミング概要

Office 365 連携 の流れ

Office 365 連携機能のAPIは、Office 365 のWebAPIをラップする形で提供しています。Office 365 のWebAPIの実行に必要なアクセストークンは、 intra-mart Accel Platform (Office 365 連携)が OAuth2.0 の仕様に則って、自動的に取得・更新します。

これにより開発者は OAuth2.0 関連の実装が不要となり、Office 365 連携機能の APIを利用したビジネスロジックの実装に集中できます。

開発者は以下の図の 7 と 10 に 必要な処理や画面を実装することで、Office 365 連携機能を利用したプログラムを作成できます。

Office 365 連携のフロー図連携のフロー図

1. ユーザが「個人設定」-「外部連携アプリケーション」画面で Office 365 連携 のプロバイダ を「許可」します。

2. intra-mart Accel Platform (Office 365 連携)は ユーザを Microsoft Azure Active Directory (以降、MicrosoftAzure AD とする)にリダイレクトさせます。

3. ユーザは Microsoft Azure AD にサインインを行い認証し、必要な場合は許諾を行います。

4. Microsoft Azure AD は intra-mart Accel Platform (Office 365 連携)の リダイレクトURI に認可コードを返します。

5. intra-mart Accel Platform (Office 365 連携API) は、Microsoft Azure AD に認可コードを提示し、アクセストークンを要求します。

6. Microsoft Azure AD は、アクセストークンとリフレッシュトークンを返却します。(アクセストークンの有効期限が切れた場合、リフレッシュトークンを利用し新しいアクセストークンに更新します。)

7. ユーザが SharePoint Online のファイル操作などの Office 365 連携機能のAPIを利用した画面をリクエストします。

8. intra-mart Accel Platform (Office 365 連携API)は、アクセストークンを利用し Office 365 の Web API を実行します。

9. Office 365 の Web API はリクエストされたデータを返します。

10. intra-mart Accel Platform (Office 365 連携)は、データを利用しユーザのリクエストに応答します。

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

5

Page 6: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

コラム

Microsoft Azure AD のアクセストークンの取得フローについての詳細は以下のページを参照してください。

https://msdn.microsoft.com/en-US/library/azure/dn645542.aspx (English)

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

6

Page 7: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

SharePoint Online のファイラを作成する (JavaEE開発モデル)

Office 365 連携機能 では、Office 365 の SharePoint Online のドキュメントにアクセスするための以下の API を提供します。

Office 365 のOneDrive REST APIをラップした低レベルAPI

jp.co.intra_mart.foundation.office365.api.v2_0.onedrive.operation.OneDriveOperation

intra-mart Accel Platform の Storageインタフェースを継承した高レベルAPI

jp.co.intra_mart.foundation.office365.service.storage.SharePointStorage

ここでは、 Office 365 連携機能 の SharePointStorage APIを利用して実際にプログラムを作成する過程を説明します。

本項では、例として JavaEE開発モデル を利用しています。また、サンプルコードは可読性を重視しているため、JSP内で全ての処理を行っています。

本項に記載のサンプルを組み合わせると 以下のような SharePoint Online のファイラが完成します。

SharePoint Online のファイラの完成イメージのファイラの完成イメージ

項目SharePoint Online 上にディレクトリを新規作成するSharePoint Online 上にファイルをアップロードするSharePoint Online 上のファイルをダウンロードするSharePoint Online 上のファイルの詳細情報を表示するSharePoint Online 上のファイルを削除するSharePoint Online 上のドキュメントをiframeで表示するSharePoint Online のファイラを作成する

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

7

Page 8: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

注意

Office 365 連携 のAPIの詳細については以下を参照してください。

「 APIドキュメント - SharePointStorage 」

「 APIドキュメント - OneDriveOperation 」

Office 365 連携 のタグライブラリの詳細については以下を参照してください。

「 タグライブラリ - im-office365:excel 」

「 タグライブラリ - im-office365:powerPoint 」

「 タグライブラリ - im-office365:word 」

SharePoint Online 上にディレクトリを新規作成する

SharePoint Online 上にディレクトリを新規作成する実装のサンプルです。リクエストパラメータとして受け取った プロバイダID、ターゲットのディレクトリパス、ディレクトリの名称 を元に新規ディレクトリを作成します。

実装例実装例

SharePointStorage#makeDirectories() を利用します。

%CONTEXT_PATH%/sample/office365/filer/create_dir.jsp

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

8

Page 9: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

9

Page 10: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %><%@ taglib prefix="imui" uri="http://www.intra-mart.co.jp/taglib/imui" %>

<%@ page import="java.io.IOException" %>

<%@ page import="jp.co.intra_mart.common.platform.log.Logger" %><%@ page import="jp.co.intra_mart.foundation.context.Contexts" %><%@ page import="jp.co.intra_mart.foundation.context.model.AccountContext" %><%@ page import="jp.co.intra_mart.foundation.office365.service.storage.SharePointStorage"%>

<% String userCd = Contexts.get(AccountContext.class).getUserCd(); String providerId = request.getParameter("providerId"); String currentDirPath = request.getParameter("targetDirPath") != null ? request.getParameter("targetDirPath") : "/"; String createDirName = request.getParameter("createDirName") != null ? request.getParameter("createDirName") : null; String dirPath = currentDirPath + createDirName;

String successMsg = null; String errorMsg = null;

if (createDirName == null) { errorMsg = "ディレクトリ名が指定されていません。"; } else { SharePointStorage storage = new SharePointStorage(userCd, providerId, dirPath); try { //ディレクトリの作成 boolean result = storage.makeDirectories(); if (result) { successMsg = "ディレクトリを作成しました。<br/><br/>" + dirPath; } else { errorMsg = "ディレクトリを作成できませんでした。<br/><br/>" + dirPath; } } catch (IOException e) { errorMsg = buildErrorMessage("ディレクトリ作成時にエラーが発生しました。", e); } }%><imui:head><title>Office365 - SharePointStorage API サンプル - ディレクトリ作成</title>

<script type="text/javascript">$(document).ready(function() { if(<%=successMsg != null%>){ imuiShowSuccessMessage('<%=successMsg%>'); } if(<%=errorMsg != null%>){ imuiShowErrorMessage('<%=errorMsg%>'); }});

</script></imui:head>

<div class="imui-title"> <h1><%=dirPath%></h1></div>

<div class="imui-toolbar-wrap"> <div class="imui-toolbar-inner"> <ul class="imui-list-toolbar"> <li> <a href="javascript:$('#backToIndex').submit();" class="imui-toolbar-icon" title="一覧に戻る"> <span class="im-ui-icon-common-16-back"></span>一覧に戻る

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

10

Page 11: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

6667686970717273747576777879808182

<span class="im-ui-icon-common-16-back"></span>一覧に戻る </a> </li> </ul> </div></div>

<form method="post" action="sample/office365/filer/index.jsp" id="backToIndex"> <input type="hidden" name="targetDirPath" value="<%=currentDirPath%>"/></form><%! private static Logger logger = Logger.getLogger("sample.office365.filer.create_dir"); private String buildErrorMessage(String errorMessage, Exception errorDetail) { logger.error(errorDetail.getMessage(), errorDetail); return errorMessage + "<br/><br/>" + errorDetail.getMessage(); }%>

注意

Microsoft社が提供する Office 365 のWebAPIの動作仕様に起因し以下の制限があります。SharePointStorage#makeDirectories() および OneDriveOperation#createFolderByPath() を利用しディレクトリを作成する場合、ルートディレクトリ直下に存在するディレクトリ名と同名のディレクトリを任意のディレ

クトリ配下に作成することはできません。

SharePoint Online 上にファイルをアップロードする

SharePoint Online 上にファイルをアップロードする実装のサンプルです。マルチパートフォームデータとして受け取った プロバイダID、ターゲットのディレクトリパス、ファイルを元にファイルをアップロードします。

実装例実装例

SharePointStorage#create() を利用します。

%CONTEXT_PATH%/sample/office365/filer/upload.jsp

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

11

Page 12: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>

<%@ page import="java.io.InputStream" %><%@ page import="java.io.OutputStream" %>

<%@ page import="jp.co.intra_mart.foundation.context.Contexts" %><%@ page import="jp.co.intra_mart.foundation.context.model.AccountContext" %><%@ page import="jp.co.intra_mart.common.aid.javaee.http.MultipartFormData" %><%@ page import="jp.co.intra_mart.common.aid.javaee.http.MultipartFormData.Entity" %><%@ page import="jp.co.intra_mart.foundation.office365.service.storage.SharePointStorage"%><%@ page import="jp.co.intra_mart.common.aid.jdk.java.io.IOUtil" %>

<% String userCd = Contexts.get(AccountContext.class).getUserCd();

//Web Application Server によってはレスポンスにテーマが含まれてしまうため notheme を指定 request.setAttribute("imui-theme-builder-module", "notheme"); response.setContentType("json");

MultipartFormData data = new MultipartFormData(request); String providerId = data.getEntity("providerId").getContent(); String targetDirPath = new String(data.getEntity("targetDirPath").getBytes(), "utf-8"); Entity localFileEntity = data.getEntity("local_file"); String fileName = localFileEntity.getFileName(); SharePointStorage storage = new SharePointStorage(userCd, providerId, targetDirPath + "/" + fileName);

try (OutputStream outputStream = storage.create(); InputStream inputStream = localFileEntity.getInputStream() ){ IOUtil.transfer(inputStream, outputStream); }

response.setContentType("json");%>[{ "name":"<%= localFileEntity.getFileName() %>", "size":<%= localFileEntity.getContentLength() %>, "error":""}]

SharePoint Online 上のファイルをダウンロードする

SharePoint Online 上のファイルをダウンロードする実装のサンプルです。リクエストパラメータとして受け取った プロバイダID、ターゲットのファイルパス、ファイルの名称を元にファイルをダウンロードします。

実装例実装例

SharePointStorage#open() を利用します。

%CONTEXT_PATH%/sample/office365/filer/download.jsp

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

12

Page 13: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %><%@ page import="java.io.InputStream" %><%@ page import="java.io.OutputStream" %><%@ page import="javax.activation.FileTypeMap" %>

<%@ page import="jp.co.intra_mart.common.aid.jdk.java.io.IOUtil" %><%@ page import="jp.co.intra_mart.foundation.context.Contexts" %><%@ page import="jp.co.intra_mart.foundation.context.model.AccountContext" %><%@ page import="jp.co.intra_mart.foundation.office365.service.storage.SharePointStorage" %><%@ page import="jp.co.intra_mart.foundation.http.ResponseUtil" %>

<% String userCd = Contexts.get(AccountContext.class).getUserCd(); String providerId = request.getParameter("providerId"); String targetFilePath = request.getParameter("targetFilePath"); String targetFileName = request.getParameter("targetFileName");

response.resetBuffer();

response.setCharacterEncoding(null); String mimeType = FileTypeMap.getDefaultFileTypeMap().getContentType(targetFileName); response.setContentType(mimeType);

String encodedFileName = ResponseUtil.encodeFileName(request, "UTF-8", targetFileName); response.setHeader("Content-Disposition", "attachment; " + encodedFileName);

SharePointStorage sharePointStorage = new SharePointStorage(userCd, providerId, targetFilePath); try (InputStream inputStream = sharePointStorage.open(); OutputStream outputStream = response.getOutputStream(); ) { IOUtil.transfer(inputStream, outputStream); }%>

SharePoint Online 上のファイルの詳細情報を表示する

SharePoint Online 上のファイルの詳細情報を表示する実装のサンプルです。リクエストパラメータとして受け取った プロバイダID、ターゲットのファイルパスをファイルの詳細情報を表示します。

実装例実装例

%CONTEXT_PATH%/sample/office365/filer/show_detail.jsp

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

13

Page 14: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

14

Page 15: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %><%@ taglib prefix="imui" uri="http://www.intra-mart.co.jp/taglib/imui" %><%@ taglib prefix="imtag" uri="http://www.intra-mart.co.jp/taglib/core/standard" %><%@ taglib prefix="i18n" uri="http://www.intra-mart.co.jp/taglib/im-i18n" %>

<%@ page import="jp.co.intra_mart.foundation.context.Contexts" %><%@ page import="jp.co.intra_mart.foundation.context.model.AccountContext" %><%@ page import="jp.co.intra_mart.foundation.office365.service.storage.SharePointStorage"%>

<% String userCd = Contexts.get(AccountContext.class).getUserCd(); String providerId = request.getParameter("providerId"); String targetPathForShowDetail = request.getParameter("targetPathForShowDetail");

String errorMsg = ""; if(targetPathForShowDetail == null){ errorMsg = "ファイル、または、ディレクトリが指定されていません。"; }

SharePointStorage storage = new SharePointStorage(userCd, providerId, targetPathForShowDetail);%><imui:head><title>Office365 - SharePointStorage API サンプル - 詳細表示</title>

<script type="text/javascript"> $(document).ready(function() { if(<%= errorMsg != null %>){ imuiShowErrorMessage('<%= errorMsg %>'); } });</script></imui:head>

<div class="imui-title"> <imtag:condition validity="<%= Boolean.toString(errorMsg.isEmpty()) %>"> <h1><%=storage.getCanonicalPath()%></h1> </imtag:condition></div>

<div class="imui-form-container-narrow"> <div class="imui-chapter-title"> <h2>詳細情報</h2> </div> <imtag:condition validity="<%= Boolean.toString(errorMsg.isEmpty()) %>"> <table class="imui-table"> <tr> <th class="wd-335px">正規化したパス</th> <td><%=storage.getCanonicalPath()%></td> </tr> <tr> <th>コンテンツをブラウザ上で確認可能なWeb URL</th> <td> <a href="<%=storage.getWebUrl()%>"><%=java.net.URLDecoder.decode(storage.getWebUrl(), "UTF-8")%></a> </td> </tr> <tr> <th>作成時刻</th> <td><i18n:dateTime value="<%=new java.util.Date(storage.created())%>" pattern="yyyy/MM/dd hh:mm:ss"/></td> </tr> <tr> <th>作成ユーザID</th> <td><%=storage.createdUserId()%></td> </tr> <tr>

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

15

Page 16: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

666768697071727374757677787980818283848586

<tr> <th>作成ユーザ名</th> <td><%=storage.createdUserName()%></td> </tr> <tr> <th>最終更新時刻</th> <td><i18n:dateTime value="<%=new java.util.Date(storage.lastModified())%>" pattern="yyyy/MM/dd hh:mm:ss"/></td> </tr> <tr> <th>最終更新ユーザID</th> <td><%=storage.lastModifiedUserId()%></td> </tr> <tr> <th>最終更新ユーザ名</th> <td><%=storage.lastModifiedUserName()%></td> </tr> <tr> <th>ファイルサイズ</th> <td><%=storage.length()%>バイト</td> </tr> </table> </imtag:condition></div>

SharePoint Online 上のファイルを削除する

SharePoint Online 上のファイルを削除する実装のサンプルです。リクエストパラメータとして受け取った プロバイダID、ターゲットのファイルパスを元にファイルを削除します。

実装例実装例

SharePointStorage#remove() を利用します。

%CONTEXT_PATH%/sample/office365/filer/remove.jsp

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

16

Page 17: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

17

Page 18: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %><%@ taglib prefix="imui" uri="http://www.intra-mart.co.jp/taglib/imui" %>

<%@ page import="java.io.IOException" %>

<%@ page import="jp.co.intra_mart.common.platform.log.Logger" %><%@ page import="jp.co.intra_mart.foundation.context.Contexts" %><%@ page import="jp.co.intra_mart.foundation.context.model.AccountContext" %><%@ page import="jp.co.intra_mart.foundation.office365.service.storage.SharePointStorage"%>

<% String userCd = Contexts.get(AccountContext.class).getUserCd(); String providerId = request.getParameter("providerId"); String targetPath = request.getParameter("targetPathForRemove"); String currentDirPath = request.getParameter("targetDirPath") != null ? request.getParameter("targetDirPath") : "/";

String successMsg = null; String errorMsg = null;

if (targetPath == null) { errorMsg = "ファイル、または、ディレクトリが指定されていません。"; } else { SharePointStorage storage = new SharePointStorage(userCd, providerId, targetPath); try { //ファイルまたはディレクトリの削除 boolean result = storage.remove(true); if (result) { successMsg = "「" + targetPath + "」を削除しました。"; } else { errorMsg = "「" + targetPath + "」を削除できませんでした。"; } } catch (IOException e) { errorMsg = buildErrorMessage("削除時にエラーが発生しました。", e); } }%><imui:head><title>Office365 - SharePointStorage API サンプル - 削除</title>

<script type="text/javascript"> $(document).ready(function() { if(<%=successMsg != null%>){ imuiShowSuccessMessage('<%=successMsg%>'); } if(<%=errorMsg != null%>){ imuiShowErrorMessage('<%=errorMsg%>'); } });</script></imui:head>

<div class="imui-title"> <h1><%=targetPath%></h1></div>

<div class="imui-toolbar-wrap"> <div class="imui-toolbar-inner"> <ul class="imui-list-toolbar"> <li> <a href="javascript:$('#backToIndex').submit();" class="imui-toolbar-icon" title="一覧に戻る"> <span class="im-ui-icon-common-16-back"></span>一覧に戻る </a> </li> </ul> </div>

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

18

Page 19: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

6667686970717273747576777879

</div></div>

<form method="post" action="sample/office365/filer/index.jsp" id="backToIndex"> <input type="hidden" name="targetDirPath" value="<%=currentDirPath%>"/></form>

<%! private static Logger logger = Logger.getLogger("sample.office365.filer.remove"); private String buildErrorMessage(String errorMessage, Exception errorDetail) { logger.error(errorDetail.getMessage(), errorDetail); return errorMessage + "<br/><br/>" + errorDetail.getMessage(); }%>

SharePoint Online 上のドキュメントをiframeで表示する

SharePoint Online 上のドキュメントをiframeで表示する実装のサンプルです。リクエストパラメータとして受け取った プロバイダID、ターゲットのファイルパスを元にドキュメントをiframeで表示します。

実装例実装例

im-office365 タグを利用します。

%CONTEXT_PATH%/sample/office365/filer/show_iframe.jsp

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

19

Page 20: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

20

Page 21: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><%@ taglib prefix="imtag" uri="http://www.intra-mart.co.jp/taglib/core/standard" %><%@ taglib prefix="im-office365" uri="http://www.intra-mart.co.jp/taglib/im-office365"%>

<% String width = "640"; String height = "480"; String providerId = request.getParameter("providerId"); String targetPath = request.getParameter("targetPathForShowIframe");

String errorMsg = null; if (targetPath == null) { errorMsg = "ファイルが指定されていません。"; }%><imui:head><title>Office365 - iframe 表示</title>

<script type="text/javascript"> $(document).ready(function() { if(<%=errorMsg != null%>){ imuiShowErrorMessage('<%=errorMsg%>'); } });</script></imui:head>

<div class="imui-title"> <h1><%=targetPath%></h1></div>

<div id="imui-container-inner"> <imtag:condition validity="<%=isWord(targetPath)%>"> <im-office365:word providerId="<%=providerId%>" path="<%=targetPath%>" width="<%=width%>" height="<%=height%>" /> </imtag:condition> <imtag:condition validity="<%=isExcel(targetPath)%>"> <im-office365:excel providerId="<%=providerId%>" path="<%=targetPath%>" width="<%=width%>" height="<%=height%>" /> </imtag:condition> <imtag:condition validity="<%=isPowerPoint(targetPath)%>"> <im-office365:powerPoint providerId="<%=providerId%>" path="<%=targetPath%>" width="<%=width%>" height="<%=height%>" /> </imtag:condition></div>

<%! private String isWord(final String fileName) { return ".docx".equals(getExtension(fileName)) ? "true" : "false"; }

private String isExcel(final String fileName) { return ".xlsx".equals(getExtension(fileName)) ? "true" : "false"; }

private String isPowerPoint(final String fileName) { return ".pptx".equals(getExtension(fileName)) ? "true" : "false"; }

private String getExtension(String fileName) { final int indexOfLastDot = fileName.lastIndexOf("."); if (indexOfLastDot == -1) { return null; } return fileName.substring(indexOfLastDot);

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

21

Page 22: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

666768

return fileName.substring(indexOfLastDot); }%>

注意

ドキュメントを表示するにはユーザが Office 365 - SharePoint Online にログインしている必要があります。

SharePoint Online のファイラを作成する

前述の実装例を組み合わて SharePoint Online のファイラを作成します。

providerId は「 Office 365 連携 セットアップガイド 」で環境構築の際に設定した <im_office365_files_api.xml> のプロバイダIDを指定してください。

実装例実装例

SharePointStorage#directoriesStorages()、SharePointStorage#filesStorages() を利用します。

%CONTEXT_PATH%/sample/office365/filer/index.jsp

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

22

Page 23: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

23

Page 24: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %><%@ taglib prefix="imui" uri="http://www.intra-mart.co.jp/taglib/imui" %><%@ taglib prefix="imtag" uri="http://www.intra-mart.co.jp/taglib/core/standard" %>

<%@ page import="java.io.InputStream" %><%@ page import="java.io.IOException" %><%@ page import="java.io.OutputStream" %><%@ page import="java.util.ArrayList" %><%@ page import="java.util.Collection" %>

<%@ page import="jp.co.intra_mart.common.platform.log.Logger" %><%@ page import="jp.co.intra_mart.foundation.context.Contexts" %><%@ page import="jp.co.intra_mart.foundation.context.model.AccountContext" %><%@ page import="jp.co.intra_mart.foundation.oauth.client.service.OAuthPreconditionException" %>

<%@ page import="jp.co.intra_mart.foundation.office365.service.storage.SharePointStorage"%>

<% String providerId = "Please_input_your_ID"; String userCd = Contexts.get(AccountContext.class).getUserCd(); String currentDirPath = request.getParameter("targetDirPath") != null ? addSlashToTheEnd(request.getParameter("targetDirPath")) : "/";

String errorMsg = null; SharePointStorage storage = new SharePointStorage(userCd, providerId, currentDirPath);

// 一覧取得 Collection<SharePointStorage> directoriesStorages = new ArrayList<SharePointStorage>(); Collection<SharePointStorage> filesStorages = new ArrayList<SharePointStorage>(); try { directoriesStorages = storage.directoriesStorages(false); filesStorages = storage.filesStorages(false); } catch (IOException e) { errorMsg = buildErrorMessage("ディレクトリ、または、ファイル一覧の取得時にエラーが発生しました。", e); }

// 親ディレクトリの存在チェック String parentDir = storage.getParent(); String existsParentDir = parentDir != null ? "true" : "false";%><imui:head><title>Office365 - SharePointStorage API サンプル</title><script src="csjs/im_window.js"></script><script type="text/javascript"> function moveDir(targetDirPath){ $('#targetDirPath').val('<%= currentDirPath %>' + targetDirPath); $('#moveDirForm').submit(); }

function downloadFile(targetFilePath){ $('#targetFilePath').val('<%= currentDirPath %>' + targetFilePath); $('#targetFileName').val(targetFilePath); $('#downloadFileForm').submit(); }

function removeFileOrDir(targetPath){ $('#targetPathForRemove').val('<%= currentDirPath %>' + targetPath); $('#removeFileOrDirForm').submit(); }

function showDetail(targetPath){ openNewWindow("office365_show_detail").focus(); $('#targetPathForShowDetail').val('<%= currentDirPath %>' + targetPath); $('#showDetailForm').submit(); }

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

24

Page 25: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

}

function showIframe(targetPath){ openNewWindow("office365_show_iframe").focus(); $('#targetPathForShowIframe').val('<%= currentDirPath %>' + targetPath); $('#showIframeForm').submit(); }

$(document).ready(function() { if(<%= errorMsg != null %>){ imuiShowErrorMessage('<%= errorMsg %>'); }

$('#toParent').click(function() { $('#targetDirPath').val('/' + '<%= parentDir %>'); $('#moveDirForm').submit(); });

});</script></imui:head><div class="imui-container"> <div class="imui-title"> <h1><%= currentDirPath %></h1> </div> <div class="imui-form-container-narrow"> <div class="imui-chapter-title"> <h2>ファイル一覧</h2> </div> <form method="post" action="sample/office365/filer/index.jsp"> <input type="text" name="targetDirPath" value="<%= currentDirPath %>" size="70" /> <input type="submit" value="移動" class="imui-small-button" /> </form> <br /> <table class="imui-table"> <tr> <th>名前</th> <th>詳細</th> <th>削除</th> <th>iframe表示</th> </tr> <imtag:condition validity="<%= existsParentDir %>"> <tr> <td><a href="javascript:void(0)" id="toParent">親ディレクトリへ移動</a></td> <td></td> <td></td> <td></td> </tr> </imtag:condition>

<!-- ディレクトリ一覧 --> <imtag:repeat list="<%= directoriesStorages %>" type="SharePointStorage" item="dirStorage" index="idx"> <tr> <td> <span class="im-ui-icon-common-16-folder"></span> <a href="javascript:void(0)" onclick="moveDir('<%= dirStorage.getName() %>');"><%= dirStorage.getName() %></a> </td> <td align="center"> <a href="javascript:void(0)" onclick="showDetail('<%= dirStorage.getName() %>');"> <span class="im-ui-icon-common-16-information"></span> </a> </td> <td align="center"> <a href="javascript:void(0)" onclick="removeFileOrDir('<%= dirStorage.getName() %>');">

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

25

Page 26: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199

<span class="im-ui-icon-common-16-trashbox"></span> </a> </td> <td></td> </tr> </imtag:repeat> <!-- ファイル一覧 --> <imtag:repeat list="<%= filesStorages %>" type="SharePointStorage" item="fileStorage" index="idx"> <tr> <td> <span class="im-ui-icon-common-16-document"></span> <a href="javascript:void(0)" onclick="downloadFile('<%= fileStorage.getName() %>');"><%= fileStorage.getName() %></a> </td> <td align="center"> <a href="javascript:void(0)" onclick="showDetail('<%= fileStorage.getName() %>');"> <span class="im-ui-icon-common-16-information"></span> </a> <td align="center"> <a href="javascript:void(0)" onclick="removeFileOrDir('<%= fileStorage.getName() %>');"> <span class="im-ui-icon-common-16-trashbox"></span> </a> </td> <td align="center"> <imtag:condition validity="<%= isWordExcelPowerPointFile(fileStorage.getName()) %>"> <a href="javascript:void(0)" onclick="showIframe('<%= fileStorage.getName() %>');"> <span class="im-ui-icon-common-16-preview"></span> </a> </imtag:condition> </td> </tr> </imtag:repeat>

</table>

<br/> <div class="imui-chapter-title"> <h2>ファイルアップロード</h2> </div> <form id="uploadForm" action="sample/office365/filer/upload.jsp" enctype="multipart/form-data"> <imui:fileUpload outerFormId="uploadForm"/> <input type="hidden" name="targetDirPath" value="<%= currentDirPath %>" /> <input type="hidden" name="providerId" value="<%= providerId %>" /> </form> <div class="imui-chapter-title"> <h2>ディレクトリ新規作成</h2> </div> <form method="POST" name="createDir" id="createDir" action="sample/office365/filer/create_dir.jsp"> <input type="text" name="createDirName" /> <input type="hidden" name="targetDirPath" value="<%= currentDirPath %>" /> <input type="hidden" name="providerId" value="<%= providerId %>" /> <input type="submit" value="作成" class="imui-small-button" /> </form> <form method="POST" name="moveDirForm" id="moveDirForm" action="sample/office365/filer/index.jsp"> <input type="hidden" name="targetDirPath" id="targetDirPath" /> <input type="hidden" name="providerId" value="<%= providerId %>" /> </form> <form method="POST" name="downloadFileForm" id="downloadFileForm" action="sample/office365/filer/download.jsp">

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

26

Page 27: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259

action="sample/office365/filer/download.jsp"> <input type="hidden" name="targetFilePath" id="targetFilePath" /> <input type="hidden" name="targetFileName" id="targetFileName" /> <input type="hidden" name="providerId" value="<%= providerId %>" /> </form> <form method="POST" name="removeFileOrDirForm" id="removeFileOrDirForm" action="sample/office365/filer/remove.jsp"> <input type="hidden" name="targetPathForRemove" id="targetPathForRemove" /> <input type="hidden" name="targetDirPath" id="targetDirPath" value="<%=currentDirPath%>"/> <input type="hidden" name="providerId" value="<%= providerId %>" /> </form> <form method="POST" name="showDetailForm" id="showDetailForm" action="sample/office365/filer/show_detail.jsp" target="office365_show_detail"> <input type="hidden" name="targetPathForShowDetail" id="targetPathForShowDetail" /> <input type="hidden" name="targetDirPath" id="targetDirPath" value="<%=currentDirPath%>"/> <input type="hidden" name="providerId" value="<%= providerId %>" /> </form> <form method="POST" name="showIframeForm" id="showIframeForm" action="sample/office365/filer/show_iframe.jsp" target="office365_show_iframe"> <input type="hidden" name="targetPathForShowIframe" id="targetPathForShowIframe" /> <input type="hidden" name="targetDirPath" id="targetDirPath" value="<%=currentDirPath%>"/> <input type="hidden" name="providerId" value="<%= providerId %>" /> </form> </div></div>

<%! private static Logger logger = Logger.getLogger("sample.office365.filer.index");

private String buildErrorMessage(final String errorMessage, final Exception errorDetail){ logger.error(errorDetail.getMessage(), errorDetail); if(errorDetail instanceof OAuthPreconditionException){ return "「外部連携アプリケーション」画面でアプリケーションを許可してください。"; } else { return errorMessage + "<br/><br/>" + errorDetail.getMessage(); } }

private String isWordExcelPowerPointFile(final String fileName) { final int indexOfLastDot = fileName.lastIndexOf("."); if (indexOfLastDot == -1) { return "false"; }

final String extension = fileName.substring(indexOfLastDot); if (".docx".equals(extension) || ".xlsx".equals(extension) || ".pptx".equals(extension)) { return "true"; } else { return "false"; } } private String addSlashToTheEnd(final String s) { final int indexOfLastSlash = s.lastIndexOf("/"); if((indexOfLastSlash == -1) || (indexOfLastSlash == s.length() - "/".length())){ return s; } else { return s + "/"; } }%>

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

27

Page 28: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

SharePoint Online のファイラを作成する (スクリプト開発モデル)

ここでは、 Office 365 連携機能 の SharePointStorage APIを利用して実際にプログラムを作成する過程を説明します。

本項では、例として スクリプト開発モデル を利用しています。

本項に記載のサンプルを組み合わせると 以下のような SharePoint Online のファイラが完成します。

SharePoint Online のファイラの完成イメージのファイラの完成イメージ

項目SharePoint Online 上にディレクトリを新規作成するSharePoint Online 上にファイルをアップロードするSharePoint Online 上のファイルをダウンロードするSharePoint Online 上のファイルの詳細情報を表示するSharePoint Online 上のファイルを削除するSharePoint Online 上のドキュメントをiframeで表示するSharePoint Online のファイラを作成するルーティングテーブルを作成する

注意

Office 365 連携 のAPIの詳細については以下を参照してください。

「 APIドキュメント - SharePointStorage 」

Office 365 連携 のタグライブラリの詳細については以下を参照してください。

「 タグライブラリ - imOffice365Excel 」

「 タグライブラリ - imOffice365PowerPoint 」

「 タグライブラリ - imOffice365Word 」

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

28

Page 29: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

SharePoint Online 上にディレクトリを新規作成する

SharePoint Online 上にディレクトリを新規作成する実装のサンプルです。リクエストパラメータとして受け取った プロバイダID、ターゲットのディレクトリパス、ディレクトリの名称 を元に新規ディレクトリを作成します。

実装例実装例

SharePointStorage#makeDirectories() を利用します。

%CONTEXT_PATH%/WEB-INF/jssp/src/sample/office365/filer/create_dir.js

1 2 3 4 5 6 7 8 9101112131415161718192021222324252627

var $currentDirPath;var $successMsg;var $errorMsg;var $dirPath;

function init(request) { var userCd = Contexts.getAccountContext().userCd; var providerId = request.providerId; $currentDirPath = request.targetDirPath != null ? request.targetDirPath : '/'; var createDirName = request.createDirName != null ? request.createDirName : null; $dirPath = $currentDirPath + createDirName; if (createDirName == null) { $errorMsg = 'ディレクトリ名が指定されていません。'; } else { try{ var storage = new SharePointStorage(userCd, providerId, $dirPath); var result = storage.makeDirectories(); if(result){ $successMsg = 'ディレクトリを作成しました。<br><br>' + $dirPath; }else{ $errorMsg = 'ディレクトリを作成できませんでした。<br><br>' + $dirPath; } }catch(e){ $errorMsg = 'ディレクトリ作成時にエラーが発生しました。' + '<br><br>' + e.errorMessage; } }}

%CONTEXT_PATH%/WEB-INF/jssp/src/sample/office365/filer/create_dir.html

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

29

Page 30: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637

<script type="text/javascript"> $(document).ready(function() { var successMsg = '<imart type="string" value=$successMsg />'; var errorMsg = '<imart type="string" value=$errorMsg />'; if (successMsg != '') { imuiShowSuccessMessage(successMsg); } else if (errorMsg != '') { imuiShowErrorMessage(errorMsg); } });</script>

<imart type="head"> <title>Office365 - SharePointStorage API サンプル - ディレクトリ作成</title></imart>

<div class="imui-title"> <h1> <imart type="string" value=$dirPath /> </h1></div>

<div class="imui-toolbar-wrap"> <div class="imui-toolbar-inner"> <ul class="imui-list-toolbar"> <li> <a href="javascript:$('#backToIndex').submit();" class="imui-toolbar-icon" title="一覧に戻る"> <span class="im-ui-icon-common-16-back"></span> 一覧に戻る </a> </li> </ul> </div></div>

<form id="backToIndex" method="post" action="sample/office365/filer"> <imart type="hidden" targetDirPath=$currentDirPath /></form>

注意

Microsoft社が提供する Office 365 のWebAPIの動作仕様に起因し以下の制限があります。SharePointStorage#makeDirectories() を利用しディレクトリを作成する場合、ルートディレクトリ直下に存在するディレクトリ名と同名のディレクトリを任意のディレクトリ配下に作成することはできません。

SharePoint Online 上にファイルをアップロードする

SharePoint Online 上にファイルをアップロードする実装のサンプルです。マルチパートフォームデータとして受け取った プロバイダID、ターゲットのディレクトリパス、ファイルを元にファイルをアップロードします。

実装例実装例

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

30

Page 31: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

SharePointStorage#createAsBinary() を利用します。画面遷移を伴わないため、プレゼンテーションページは不要です。

%CONTEXT_PATH%/WEB-INF/jssp/src/sample/office365/filer/upload.js

1 2 3 4 5 6 7 8 910111213141516171819202122

function init(request) { var userCd = Contexts.getAccountContext().userCd; var upfile = request.getParameter('local_file'); var providerId = request.providerId; var currentDirPath = request.targetDirPath; var response = Web.getHTTPResponse(); response.setContentType('json'); request.setAttribute('imui-theme-builder-module', 'notheme'); var targetFilePath = currentDirPath + upfile.getFileName(); upfile.openValueAsBinary(function(reader) { var storage = new SharePointStorage(userCd, providerId, targetFilePath); storage.createAsBinary(function(writer) { reader.transferTo(writer); response.sendMessageBodyString(ImJson.toJSONString([{ 'name':upfile.getFileName(), 'size':upfile.getLength() }])); }); });}

SharePoint Online 上のファイルをダウンロードする

SharePoint Online 上のファイルをダウンロードする実装のサンプルです。リクエストパラメータとして受け取った プロバイダID、ターゲットのファイルパス、ファイルの名称を元にファイルをダウンロードします。

実装例実装例

Module.download.send() を利用します。画面遷移を伴わないため、プレゼンテーションページは不要です。

%CONTEXT_PATH%/WEB-INF/jssp/src/sample/office365/filer/download.js

1234567

function init(request) { var userCd = Contexts.getAccountContext().userCd; var providerId = request.providerId; var targetFilePath = request.targetFilePath; var storage = new SharePointStorage(userCd, providerId, targetFilePath); Module.download.send(storage, storage.getName());}

SharePoint Online 上のファイルの詳細情報を表示する

SharePoint Online 上のファイルの詳細情報を表示する実装のサンプルです。リクエストパラメータとして受け取った プロバイダID、ターゲットのファイルパスをファイルの詳細情報を表示します。

実装例実装例

%CONTEXT_PATH%/WEB-INF/jssp/src/sample/office365/filer/show_detail.js

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

31

Page 32: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 91011121314151617181920212223242526

var $errorMsg;var $targetDirPathForShowDetail;var $detail ={};

function init(request) { var userCd = Contexts.getAccountContext().userCd; var providerId = request.providerId; $targetDirPathForShowDetail = request.targetDirPathForShowDetail; if ($targetDirPathForShowDetail == null) { $errorMsg = 'ファイル、または、ディレクトリが指定されていません。'; } else { var storage = new SharePointStorage(userCd, providerId, $targetDirPathForShowDetail); $detail.canonicalPath = storage.getCanonicalPath(); $detail.webUrl = storage.getWebUrl(); $detail.decodedWebUrl = decodeURIComponent(storage.getWebUrl()); $detail.created = new Date(storage.created()); $detail.createdUserId = storage.createdUserId(); $detail.createdUserName = storage.createdUserName(); $detail.lastModified = new Date(storage.lastModified()); $detail.lastModifiedUserId = storage.lastModifiedUserId(); $detail.lastModifiedUserName = storage.lastModifiedUserName(); $detail.length = storage.length(); }}

%CONTEXT_PATH%/WEB-INF/jssp/src/sample/office365/filer/show_detail.html

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

32

Page 33: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

33

Page 34: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

<script type="text/javascript"> $(document).ready(function() { var errorMsg = '<imart type="string" value=$errorMsg />'; if (errorMsg != '') { imuiShowErrorMessage(errorMsg); } });</script>

<imart type="head"><title>Office365 - SharePointStorage API サンプル - 詳細表示</title></imart>

<div class="imui-title"> <h1> <imart type="string" value=$targetDirPathForShowDetail /> </h1></div>

<div class="imui-form-container-narrow"> <div class="imui-chapter-title"> <h2>詳細情報</h2> </div>

<table class="imui-table"> <tr> <th>正規化したパス</th> <td> <imart type="string" value=$detail.canonicalPath /> </td> </tr> <tr> <th>コンテンツをブラウザ上で確認可能なWeb URL</th> <td> <imart type="tag" tagname="a" href=$detail.webUrl> <imart type="string" value=$detail.decodedWebUrl /></imart> </td> </tr> <tr> <th>作成時刻</th> <td> <imart type="dateTime" value=$detail.created pattern="yyyy/MM/dd hh:mm:ss" /> </td> </tr> <tr> <th>作成ユーザID</th> <td> <imart type="string" value=$detail.createdUserId /> </td> </tr> <tr> <th>作成ユーザ名</th> <td> <imart type="string" value=$detail.createdUserName /> </td> </tr> <tr> <th>最終更新時刻</th> <td> <imart type="dateTime" value=$detail.lastModified pattern="yyyy/MM/dd hh:mm:ss" /> </td> </tr> <tr> <th>最終更新ユーザID</th> <td> <imart type="string" value=$detail.lastModifiedUserId />

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

34

Page 35: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

6667686970717273747576777879808182

<imart type="string" value=$detail.lastModifiedUserId /> </td> </tr> <tr> <th>最終更新ユーザ名</th> <td> <imart type="string" value=$detail.lastModifiedUserName /> </td> </tr> <tr> <th>ファイルサイズ</th> <td> <imart type="string" value=$detail.length /> バイト </td> </tr> </table></div>

SharePoint Online 上のファイルを削除する

SharePoint Online 上のファイルを削除する実装のサンプルです。リクエストパラメータとして受け取った プロバイダID、ターゲットのファイルパスを元にファイルを削除します。

実装例実装例

SharePointStorage#remove() を利用します。

%CONTEXT_PATH%/WEB-INF/jssp/src/sample/office365/filer/remove.js

1 2 3 4 5 6 7 8 91011121314151617181920212223242526

var $successMsg;var $errorMsg;var $targetPath;var $currentDirPath;

function init(request) { var userCd = Contexts.getAccountContext().userCd; var providerId = request.providerId; $currentDirPath = request.targetDirPath != null ? request.targetDirPath : '/'; $targetPath = request.targetPathForRemove != null ? request.targetPathForRemove : null; if ($targetPath == null) { $errorMsg = 'ファイル、または、ディレクトリが指定されていません。'; } else { try { var storage = new SharePointStorage(userCd, providerId, $targetPath); var result = storage.remove(true); if (result) { $successMsg = '「' + $targetPath + '」を削除しました。'; } else { $errorMsg = '「' + $targetPath + '」を削除できませんでした。'; } } catch (e) { $errorMsg = '削除時にエラーが発生しました。' + '<br><br>' + e.errorMessage; } }}

%CONTEXT_PATH%/WEB-INF/jssp/src/sample/office365/filer/remove.html

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

35

Page 36: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637

<script type="text/javascript"> $(document).ready(function() { var successMsg = '<imart type="string" value=$successMsg />'; var errorMsg = '<imart type="string" value=$errorMsg />'; if (successMsg != '') { imuiShowSuccessMessage(successMsg); } else if (errorMsg != '') { imuiShowErrorMessage(errorMsg); } });</script>

<imart type="head"><title>Office365 - SharePointStorage API サンプル - 削除</title></imart>

<div class="imui-title"> <h1> <imart type="string" value=$targetPath /> </h1></div>

<div class="imui-toolbar-wrap"> <div class="imui-toolbar-inner"> <ul class="imui-list-toolbar"> <li> <a href="javascript:$('#backToIndex').submit();" class="imui-toolbar-icon" title="一覧に戻る"> <span class="im-ui-icon-common-16-back"></span> 一覧に戻る </a> </li> </ul> </div></div>

<form method="post" action="sample/office365/filer" id="backToIndex"> <imart type="hidden" targetDirPath=$currentDirPath /></form>

SharePoint Online 上のドキュメントをiframeで表示する

SharePoint Online 上のドキュメントをiframeで表示する実装のサンプルです。リクエストパラメータとして受け取った プロバイダID、ターゲットのファイルパスを元にドキュメントをiframeで表示します。

実装例実装例

imOffice365 タグを利用します。

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

36

Page 37: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

%CONTEXT_PATH%/WEB-INF/jssp/src/sample/office365/filer/show_iframe.js

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

37

Page 38: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940

var $errorMsg;var $targetPathForShowIframe;var $isWordFile;var $isExcelFile;var $isPowerPointFile;var $providerId

function init(request) { var userCd = Contexts.getAccountContext().userCd; $providerId = request.providerId; $targetPathForShowIframe = request.targetPathForShowIframe; if ($targetPathForShowIframe == null) { $errorMsg = 'ファイルが指定されていません。'; } else { var storage = new SharePointStorage(userCd, $providerId, $targetPathForShowIframe); $isWordFile = isWord(storage.getName()); $isExcelFile = isExcel(storage.getName()); $isPowerPointFile = isPowerPoint(storage.getName()); }}

function isWord(fileName) { return getExtension(fileName) == '.docx' ? true : false;}

function isExcel(fileName) { return getExtension(fileName) == '.xlsx' ? true : false;}

function isPowerPoint(fileName) { return getExtension(fileName) == '.pptx' ? true : false;}

function getExtension(fileName) { var indexOfLastDot = fileName.lastIndexOf('.'); if (indexOfLastDot == -1) { return null; } return fileName.substring(indexOfLastDot);}

%CONTEXT_PATH%/WEB-INF/jssp/src/sample/office365/filer/show_iframe.html

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

38

Page 39: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

39

Page 40: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233

<script type="text/javascript"> $(document).ready(function() { var errorMsg = '<imart type="string" value=$errorMsg />'; if(errorMsg != ''){ imuiShowErrorMessage(errorMsg); } });</script>

<imart type="head"><title>Office365 - iframe 表示</title></imart>

<div class="imui-title"> <h1> <imart type="string" value=$targetPathForShowIframe /> </h1></div>

<div id="imui-container-inner"> <imart type="condition" validity=$isWordFile> <imart type="imOffice365Word" providerId=$providerId path=$targetPathForShowIframe width="640" height="480" /> </imart> <imart type="condition" validity=$isExcelFile> <imart type="imOffice365Excel" providerId=$providerId path=$targetPathForShowIframe width="640" height="480" /> </imart> <imart type="condition" validity=$isPowerPointFile> <imart type="imOffice365PowerPoint" providerId=$providerId path=$targetPathForShowIframe width="640" height="480" /> </imart></div>

注意

ドキュメントを表示するにはユーザが Office 365 - SharePoint Online にログインしている必要があります。

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

40

Page 41: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

SharePoint Online のファイラを作成する

前述の実装例を組み合わて SharePoint Online のファイラを作成します。

providerId は「 Office 365 連携 セットアップガイド 」で環境構築の際に設定した <im_office365_files_api.xml> のプロバイダIDを指定してください。

実装例実装例

SharePointStorage#directoriesStorages()、SharePointStorage#filesStorages() を利用します。

%CONTEXT_PATH%/WEB-INF/jssp/src/sample/office365/filer/index.js

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

41

Page 42: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

42

Page 43: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758

var $providerId = 'dhimart_1st.onmicrosoft.com';var $userCd = Contexts.getAccountContext().userCd;var $directoriesStorages;var $filesDetails=[];var $currentDirPath;var $errorMsg;var $parentDir;var $existsParentDir;

function init(request){ $currentDirPath = request.targetDirPath != null ? addSlashToTheEnd(request.targetDirPath) : '/'; try{ var storage = new SharePointStorage($userCd, $providerId, $currentDirPath); $directoriesStorages = storage.directoriesStorages(false); var filesStorages = storage.filesStorages(false); for (var i = 0 ; i<filesStorages.length ; i++){ var fileDetail = { fileName : filesStorages[i].getName() , filePath : filesStorages[i].getPath() , isWordExcelPowerPointFile:isWordExcelPowerPointFile(filesStorages[i].getName()) }; $filesDetails[i] = fileDetail; } $parentDir = storage.getParent(); if($parentDir == null){ $existsParentDir = false; }else{ $existsParentDir = true; } }catch(e if e.errorCode == 'oauth.precondition'){ $errorMsg = '「外部連携アプリケーション」画面でアプリケーションを許可してください。'; }catch(e){ $errorMsg = 'ディレクトリ、または、ファイル一覧の取得時にエラーが発生しました。' + '<br><br>' + e.errorMessage; }}

function isWordExcelPowerPointFile(fileName){ var indexOfLastDot = fileName.lastIndexOf('.'); if (indexOfLastDot == -1) { return false; } var extension = fileName.substring(indexOfLastDot); if (extension == '.docx' || extension == '.xlsx' || extension == '.pptx') { return true; } else { return false; } }

function addSlashToTheEnd(s) { var indexOfLastSlash = s.lastIndexOf('/'); if((indexOfLastSlash == -1) || s.substr((s.length - 1)) =='/'){ return s; } else { return s + '/'; }}

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

43

Page 44: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

%CONTEXT_PATH%/WEB-INF/jssp/src/sample/office365/filer/index.html

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

44

Page 45: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

<script type="text/javascript"> function moveDir(targetDirPath) { $('#targetDirPathForMove').val('/' + targetDirPath); $('#moveDirForm').submit(); }

function downloadFile(targetFilePath) { $('#targetFilePath').val(targetFilePath); $('#downloadFileForm').submit(); }

function removeFileOrDir(targetPath) { $('#targetPathForRemove').val(targetPath); $('#removeFileOrDirForm').submit(); }

function showDetail(targetDirPath) { $('#targetDirPathForShowDetail').val(targetDirPath); $('#showDetailForm').submit(); }

function showIframe(targetFilePath) { $('#targetPathForShowIframe').val(targetFilePath); $('#showIframeForm').submit(); }

$(document).ready(function() { var errorMsg = '<imart type="string" value=$errorMsg />'; if(errorMsg != ''){ imuiShowErrorMessage(errorMsg); } });

$(function($) { $('#toParent').click(function() { $('#targetDirPathForMove').val( '/' + '<imart type="string" value=$parentDir />'); $('#moveDirForm').submit(); }); });

</script>

<imart type="head"><title>Office365 - SharePointStorage API サンプル</title></imart>

<div class="imui-title"> <h1> <imart type="string" value=$currentDirPath /> </h1></div>

<div class="imui-form-container-narrow">

<div class="imui-chapter-title"> <h2>ファイル一覧</h2> </div>

<form method="post" action="sample/office365/filer"> <imart type="imuiTextbox" name="targetDirPath" value=$currentDirPath size="70" /> <input type="submit" value="移動" class="imui-small-button" /> </form>

<br>

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

45

Page 46: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

<table class="imui-table"> <tr> <th>名前</th> <th>詳細</th> <th>削除</th> <th>iframe表示</th> </tr> <imart type="condition" validity=$existsParentDir> <tr> <td> <a href="javascript:void(0)" id="toParent">親ディレクトリへ移動</a> </td> <td></td> <td></td> <td></td> </tr> </imart> <!-- ディレクトリ一覧 --> <imart type="repeat" list=$directoriesStorages item="dirStorage" index="idx"> <tr> <td> <span class="im-ui-icon-common-16-folder"></span> <a href="javascript:void(0)" onclick='moveDir("<imart type="string" value=dirStorage.getPath/>");'> <imart type="string" value=dirStorage.getName /> </a> </td>

<td align="center"> <a href="javascript:void(0)" onclick='showDetail("<imart type="string" value=dirStorage.getPath/>");'> <span class="im-ui-icon-common-16-information"></span> </a> </td>

<td align="center"> <a href="javascript:void(0)" onclick='removeFileOrDir("<imart type="string" value=dirStorage.getPath/>");'> <span class="im-ui-icon-common-16-trashbox"></span> </a> </td> <td></td> </tr> </imart>

<!-- ファイル一覧 --> <imart type="repeat" list=$filesDetails item="fileStorage" index="idx"> <tr> <td> <span class="im-ui-icon-common-16-document"></span> <a href="javascript:void(0)" onclick='downloadFile("<imart type="string" value=fileStorage.filePath/>");'> <imart type="string" value=fileStorage.fileName /> </a> </td>

<td align="center"> <a href="javascript:void(0)" onclick='showDetail("<imart type="string" value=fileStorage.filePath/>");'> <span class="im-ui-icon-common-16-information"></span> </a> </td>

<td align="center"> <a href="javascript:void(0)" onclick='removeFileOrDir("<imart type="string" value=fileStorage.filePath/>");'>

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

46

Page 47: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199

<span class="im-ui-icon-common-16-trashbox"></span> </a> </td>

<td align="center"> <imart type="condition" validity=fileStorage.isWordExcelPowerPointFile> <a href="javascript:void(0)" onclick='showIframe("<imart type="string" value=fileStorage.filePath/>");'> <span class="im-ui-icon-common-16-preview"></span> </a> </imart> </td> </tr> </imart>

</table>

<br>

<div class="imui-chapter-title"> <h2>ファイルアップロード</h2> </div>

<form id="uploadForm" action="sample/office365/filer/upload" enctype="multipart/form-data"> <imart type="imuiFileUpload" outerFormId="uploadForm" /> <imart type="input" style="hidden" value=$currentDirPath id="targetDirPath" name="targetDirPath" /> <imart type="hidden" providerId=$providerId /> </form>

<div class="imui-chapter-title"> <h2>ディレクトリ新規作成</h2> </div>

<form method="POST" name="createDir" id="createDir" action="sample/office365/filer/create_dir"> <imart type="imuiTextbox" name="createDirName" /> <imart type="hidden" targetDirPath=$currentDirPath providerId=$providerId /> <input type="submit" value="作成" class="imui-small-button" /> </form>

<form id="moveDirForm" name="moveDirForm" method="POST" action="sample/office365/filer"> <imart type="input" style="hidden" name="targetDirPath" id="targetDirPathForMove" /> <imart type="hidden" providerId=$providerId /> </form>

<form id="showDetailForm" name="showDetailForm" method="POST" action="sample/office365/filer/show_detail" target="office365_show_detail"> <imart type="input" style="hidden" name="targetDirPathForShowDetail" id="targetDirPathForShowDetail" /> <imart type="hidden" providerId=$providerId /> </form>

<form name="removeFileOrDirForm" id="removeFileOrDirForm" method="POST" action="sample/office365/filer/remove"> <imart type="input" style="hidden" id="targetPathForRemove" name="targetPathForRemove" /> <imart type="hidden" targetDirPath=$currentDirPath providerId=$providerId /> </form>

<form name="downloadFileForm" id="downloadFileForm" method="POST" action="sample/office365/filer/download"> <imart type="input" style="hidden" name="targetFilePath" id="targetFilePath" /> <imart type="hidden" providerId=$providerId /> </form>

<form method="POST" name="showIframeForm" id="showIframeForm" action="sample/office365/filer/show_iframe" target="office365_show_iframe">

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

47

Page 48: intra-mart Accel Platform — Office 365 連携プログラミングガイド … · 「SharePoint Online のファイラを作成する (JavaEE開発モデル) 」にOffice 365

199200201202

action="sample/office365/filer/show_iframe" target="office365_show_iframe"> <imart type="input" style="hidden" name="targetPathForShowIframe" id="targetPathForShowIframe" /> <imart type="hidden" providerId=$providerId /> </form></div>

ルーティングテーブルを作成する

「スクリプト開発モデル用ルーティングテーブル」を利用してURLに対して スクリプト開発モデル のプログラムの割り当てを行います。

詳しくは「スクリプト開発モデル プログラミングガイド 」-「ルーティング 」を参照してください。

実装例実装例

%CONTEXT_PATH%/WEB-INF/conf/routing-jssp-config/office365.xml

1 2 3 4 5 6 7 8 910111213141516

<?xml version="1.0" encoding="UTF-8"?><routing-jssp-config xmlns="http://www.intra-mart.jp/router/routing-jssp-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.intra-mart.jp/router/routing-jssp-config routing-jssp-config.xsd ">

<authz-default mapper="welcome-all" ></authz-default>

<file-mapping path="/sample/office365/filer" page="sample/office365/filer/index" /> <file-mapping path="/sample/office365/filer/remove" page="sample/office365/filer/remove"/> <file-mapping path="/sample/office365/filer/download" page="sample/office365/filer/download" /> <file-mapping path="/sample/office365/filer/upload" page="sample/office365/filer/upload" /> <file-mapping path="/sample/office365/filer/create_dir" page="sample/office365/filer/create_dir" /> <file-mapping path="/sample/office365/filer/show_detail" page="sample/office365/filer/show_detail" /> <file-mapping path="/sample/office365/filer/show_iframe" page="sample/office365/filer/show_iframe" /></routing-jssp-config>

intra-mart Accel Platform — Office 365 連携プログラミングガイド   第3版 2017-08-01  

48