/** * personium.io * Copyright 2014 FUJITSU LIMITED * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.fujitsu.dc.core; import java.text.MessageFormat; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.http.HttpStatus; import com.fujitsu.dc.core.DcCoreMessageUtils.Severity; import com.fujitsu.dc.core.exceptions.ODataErrorMessage; import com.fujitsu.dc.core.utils.EscapeControlCode; /** * ログメッセージ作成クラス. */ @SuppressWarnings("serial") public class DcCoreException extends RuntimeException { /** * OData関連. */ public static class OData { /** * JSONのパースに失敗したとき. */ public static final DcCoreException JSON_PARSE_ERROR = create("PR400-OD-0001"); /** * クエリのパースに失敗. */ public static final DcCoreException QUERY_PARSE_ERROR = create("PR400-OD-0002"); /** * $fileterのパースに失敗. */ public static final DcCoreException FILTER_PARSE_ERROR = create("PR400-OD-0003"); /** * EntityKeyのパースに失敗. */ public static final DcCoreException ENTITY_KEY_PARSE_ERROR = create("PR400-OD-0004"); /** * $formatに指定された値が不正. */ public static final DcCoreException FORMAT_INVALID_ERROR = create("PR400-OD-0005"); /** * リクエストデータのフォーマットが不正. * {0}プロパティ名 */ public static final DcCoreException REQUEST_FIELD_FORMAT_ERROR = create("PR400-OD-0006"); /** * リクエストボディのフィールド名が不正. * {0}:詳細メッセージ * 管理情報を更新しようとした時と、スキーマに存在しない値を設定しようとした時に発生 * 注)このエラーはメッセージをソースで管理することになるため、今後はこれを使わないこと。 */ public static final DcCoreException FIELED_INVALID_ERROR = create("PR400-OD-0007"); /** * 該当Associationが存在しない. */ public static final DcCoreException NO_SUCH_ASSOCIATION = create("PR400-OD-0008"); /** * リクエストボディの必須項目が無い. * {0}:プロパティ名 */ public static final DcCoreException INPUT_REQUIRED_FIELD_MISSING = create("PR400-OD-0009"); /** * リクエストボディの必須項目が無い. */ public static final DcCoreException KEY_FOR_NAVPROP_SHOULD_NOT_BE_SPECIFIED = create("PR400-OD-0010"); /** * リクエストURLのKey指定が無い. */ public static final DcCoreException KEY_FOR_NAVPROP_SHOULD_BE_SPECIFIED = create("PR400-OD-0011"); /** * 文字種が不正. * {0}:プロパティ名 */ public static final DcCoreException INVALID_TYPE_ERROR = create("PR400-OD-0012"); /** * $inlinecountに指定された値が不正. * {0}:inlinecountで指定された値 */ public static final DcCoreException INLINECOUNT_PARSE_ERROR = create("PR400-OD-0013"); /** * 指定されたプロパティが存在しない. */ public static final DcCoreException UNKNOWN_PROPERTY_APPOINTED = create("PR400-OD-0014"); /** * $orderbyのパースに失敗. */ public static final DcCoreException ORDERBY_PARSE_ERROR = create("PR400-OD-0015"); /** * 単一Keyにnullが指定された. */ public static final DcCoreException NULL_SINGLE_KEY = create("PR400-OD-0016"); /** * $selectのパースに失敗. */ public static final DcCoreException SELECT_PARSE_ERROR = create("PR400-OD-0017"); /** * AssociationEndの更新がリクエストされた. */ public static final DcCoreException NOT_PUT_ASSOCIATIONEND = create("PR400-OD-0019"); /** * 登録するデータの型がelasticsearchに登録済みのデータ型と異なる. */ public static final DcCoreException SCHEMA_MISMATCH = create("PR400-OD-0020"); /** * $batchのボディのFormatが不正. * ヘッダの指定誤り * {0}:ヘッダ名 */ public static final DcCoreException BATCH_BODY_FORMAT_HEADER_ERROR = create("PR400-OD-0021"); /** * $batchのボディのFormatが不正. * changesetのネストが指定されていた場合 */ public static final DcCoreException BATCH_BODY_FORMAT_CHANGESET_NEST_ERROR = create("PR400-OD-0022"); /** * $batchのボディのパースに失敗した場合. */ public static final DcCoreException BATCH_BODY_PARSE_ERROR = create("PR400-OD-0023"); /** * 更新リクエストでボディのNTKPに指定されたリソースが存在しない場合. * {0}:NTKPで指定された値 */ public static final DcCoreException BODY_NTKP_NOT_FOUND_ERROR = create("PR400-OD-0024"); /** * $expandで指定されたNTKPがリソースとして存在しない場合. * {0}:$expandで指定された値 */ public static final DcCoreException EXPAND_NTKP_NOT_FOUND_ERROR = create("PR400-OD-0025"); /** * $expandのパースに失敗. */ public static final DcCoreException EXPAND_PARSE_ERROR = create("PR400-OD-0026"); /** * すでに別のスキーマ型のIndexが作成されている場合. */ public static final DcCoreException ANOTHRE_SCHEMA_TYPE_ALREADY_EXISTS = create("PR400-OD-0027"); /** * $linksのEntityKeyのパースに失敗. */ public static final DcCoreException ENTITY_KEY_LINKS_PARSE_ERROR = create("PR400-OD-0028"); /** * クエリに指定された値が不正. */ public static final DcCoreException QUERY_INVALID_ERROR = create("PR400-OD-0029"); /** * $Batchで指定されたリクエスト数が不正. */ public static final DcCoreException TOO_MANY_REQUESTS = create("PR400-OD-0030"); /** * $links登録で1:1を指定. */ public static final DcCoreException INVALID_MULTIPLICITY = create("PR400-OD-0031"); /** * EnitityTypeの階層数、内包プロパティ数の制限を超えた. */ public static final DcCoreException ENTITYTYPE_STRUCTUAL_LIMITATION_EXCEEDED = create("PR400-OD-0032"); /** * EnitityType数の制限を超えた. */ public static final DcCoreException ENTITYTYPE_COUNT_LIMITATION_EXCEEDED = create("PR400-OD-0033"); /** * $batchのボディのFormatが不正. * リクエストパスの指定誤り * {0}:リクエストパス */ public static final DcCoreException BATCH_BODY_FORMAT_PATH_ERROR = create("PR400-OD-0034"); /** * $batchのボディのFormatが不正. * $batchで受付できないメソッドを指定された * {0}:メソッド */ public static final DcCoreException BATCH_BODY_FORMAT_METHOD_ERROR = create("PR400-OD-0035"); /** * クエリのパースに失敗. * {0}:失敗したクエリ */ public static final DcCoreException QUERY_PARSE_ERROR_WITH_PARAM = create("PR400-OD-0036"); /** * $batch内全体で指定された$topの値の合計が上限値を超えた. */ public static final DcCoreException BATCH_TOTAL_TOP_COUNT_LIMITATION_EXCEEDED = create("PR400-OD-0037"); /** * $linksが作成可能な最大件数をオーバー. */ public static final DcCoreException LINK_UPPER_LIMIT_RECORD_EXEED = create("PR400-OD-0038"); /** * 指定された$expandの値の合計が上限値を超えた. */ public static final DcCoreException EXPAND_COUNT_LIMITATION_EXCEEDED = create("PR400-OD-0039"); /** * $orderbyクエリに配列型のプロパティが指定された. */ public static final DcCoreException CANNOT_SPECIFY_THE_LIST_TYPE_TO_ORDERBY = create("PR400-OD-0040"); /** * リクエストヘッダー{0}の値{1}が正しくない. */ public static final DcCoreException BAD_REQUEST_HEADER_VALUE = create("PR400-OD-0041"); /** * 未サポートの操作が実行された 詳細:{0}. */ public static final DcCoreException OPERATION_NOT_SUPPORTED = create("PR400-OD-0042"); /** * 未知の演算子が指定された場合. */ public static final DcCoreException UNSUPPORTED_QUERY_OPERATOR = create("PR400-OD-0043"); /** * 未知の関数が指定された場合. */ public static final DcCoreException UNSUPPORTED_QUERY_FUNCTION = create("PR400-OD-0044"); /** * 未知のプロパティを指定した場合. */ public static final DcCoreException UNKNOWN_QUERY_KEY = create("PR400-OD-0045"); /** * プロパティのデータ型とは異なる書式の値が指定された場合. */ public static final DcCoreException OPERATOR_AND_OPERAND_TYPE_MISMATCHED = create("PR400-OD-0046"); /** * プロパティのデータ型の範囲外の値が指定された場合. */ public static final DcCoreException UNSUPPORTED_OPERAND_FORMAT = create("PR400-OD-0047"); /** * 検索値のアンエスケープができなかった場合. */ public static final DcCoreException OPERATOR_AND_OPERAND_UNABLE_TO_UNESCAPE = create("PR400-OD-0048"); /** * Cell URL Invalid format. * {0} property name */ public static final DcCoreException CELL_URL_FORMAT_ERROR = create("PR400-OD-0049"); /** * Schema URI Invalid format. * {0} property name */ public static final DcCoreException SCHEMA_URI_FORMAT_ERROR = create("PR400-OD-0050"); /** * 該当EntitySetが存在しない. */ public static final DcCoreException NO_SUCH_ENTITY_SET = create("PR404-OD-0001"); /** * 該当Entityが存在しない. */ public static final DcCoreException NO_SUCH_ENTITY = create("PR404-OD-0002"); /** * 該当リソースが存在しない. */ public static final DcCoreException NOT_FOUND = create("PR404-OD-0000"); /** * 該当Navigation Propertyが存在しない. */ public static final DcCoreException NOT_SUCH_NAVPROP = create("PR404-OD-0003"); /** * 関係するデータが存在するエンティティへの操作. */ public static final DcCoreException CONFLICT_HAS_RELATED = create("PR409-OD-0001"); /** * リンクが既に存在する. */ public static final DcCoreException CONFLICT_LINKS = create("PR409-OD-0002"); /** * エンティティが既に存在する. */ public static final DcCoreException ENTITY_ALREADY_EXISTS = create("PR409-OD-0003"); /** * 複合キーのエンティティに対して$linksを削除した時に同名のエンティティが既に存在する. */ public static final DcCoreException CONFLICT_UNLINKED_ENTITY = create("PR409-OD-0004"); /** * 単一キーのエンティティに対して$linksを追加した時に同名のエンティティが既に存在する. */ public static final DcCoreException CONFLICT_DUPLICATED_ENTITY = create("PR409-OD-0005"); /** * AssociationEndのLink登録時にすでに同一の関連が存在する. */ public static final DcCoreException CONFLICT_DUPLICATED_ENTITY_RELATION = create("PR409-OD-0006"); /** * If-Matchヘッダの指定が無い. */ public static final DcCoreException HEADER_NOT_EXIST = create("PR412-OD-0001"); /** * 該当EntityのEtagがマッチしない. */ public static final DcCoreException ETAG_NOT_MATCH = create("PR412-OD-0002"); /** * . */ public static final DcCoreException CONFLICT_NP = create("PR412-OD-0003"); /** * 未サポートのメディアタイプが指定された. */ public static final DcCoreException UNSUPPORTED_MEDIA_TYPE = create("PR415-OD-0001"); /** * プロパティ名の重複を検出した. */ public static final DcCoreException DUPLICATED_PROPERTY_NAME = create("PR500-OD-0001"); /** * 内部データの矛盾を検出した. */ public static final DcCoreException DETECTED_INTERNAL_DATA_CONFLICT = create("PR500-OD-0002"); } /** * WebDAV関連. * TODO WebDavのエラーはWebDavの仕様に合わせて実装する。 */ public static class Dav { /** * XMLのパースに失敗したとき. */ public static final DcCoreException XML_ERROR = create("PR400-DV-0001"); /** * XMLの内容がおかしいとき. */ public static final DcCoreException XML_CONTENT_ERROR = create("PR400-DV-0002"); /** * Depthが0,1,infinity以外のとき. * {0}:Depthヘッダの値 */ public static final DcCoreException INVALID_DEPTH_HEADER = create("PR400-DV-0003"); /** * ROLEが存在しない時. */ public static final DcCoreException ROLE_NOT_FOUND = create("PR400-DV-0004"); /** * Roleと紐付くBOXが存在しないとき. * {0}:BOX URL */ public static final DcCoreException BOX_LINKED_BY_ROLE_NOT_FOUND = create("PR400-DV-0005"); /** * XMLのバリデートに失敗したとき. */ public static final DcCoreException XML_VALIDATE_ERROR = create("PR400-DV-0006"); /** * コレクションの子要素が多すぎる場合. */ public static final DcCoreException COLLECTION_CHILDRESOURCE_ERROR = create("PR400-DV-0007"); /** * コレクションの階層が深すぎる場合. */ public static final DcCoreException COLLECTION_DEPTH_ERROR = create("PR400-DV-0008"); /** * ヘッダに不正な値が設定されている場合. * {0}:ヘッダのキー * {1}:ヘッダの値 */ public static final DcCoreException INVALID_REQUEST_HEADER = create("PR400-DV-0009"); /** * 必須ヘッダの指定が無い場合. * {0}:ヘッダのキー */ public static final DcCoreException REQUIRED_REQUEST_HEADER_NOT_EXIST = create("PR400-DV-0010"); /** * 移動元のリソースとして__srcが指定された場合. */ public static final DcCoreException SERVICE_SOURCE_COLLECTION_PROHIBITED_TO_MOVE = create("PR400-DV-0011"); /** * 移動先のリソースとして、既存のリソースが指定された場合. */ public static final DcCoreException RESOURCE_PROHIBITED_TO_OVERWRITE = create("PR400-DV-0012"); /** * 移動先のリソースとして、ODataコレクション配下のパスが指定された場合. */ public static final DcCoreException RESOURCE_PROHIBITED_TO_MOVE_ODATA_COLLECTION = create("PR400-DV-0013"); /** * 移動先のリソースとして、ファイル配下のパスが指定された場合. */ public static final DcCoreException RESOURCE_PROHIBITED_TO_MOVE_FILE = create("PR400-DV-0014"); /** * BoxはMOVEメソッドでの移動対象とはできない. */ public static final DcCoreException RESOURCE_PROHIBITED_TO_MOVE_BOX = create("PR400-DV-0015"); /** * 移動先のリソースとして、Serviceコレクション配下のパスが指定された場合. */ public static final DcCoreException RESOURCE_PROHIBITED_TO_MOVE_SERVICE_COLLECTION = create("PR400-DV-0016"); /** * 移動先のリソースとして__srcが指定された場合. */ public static final DcCoreException SERVICE_SOURCE_COLLECTION_PROHIBITED_TO_OVERWRITE = create("PR400-DV-0017"); /** * 移動元がコレクションで、移動先のリソースとしてサービスソースコレクションが指定された場合. */ public static final DcCoreException SERVICE_SOURCE_COLLECTION_PROHIBITED_TO_CONTAIN_COLLECTION = create("PR400-DV-0018"); /** * リソースが存在しないとき. */ public static final DcCoreException RESOURCE_NOT_FOUND = create("PR404-DV-0001"); /** * BOXが存在しないとき. * {0}:BOX名 */ public static final DcCoreException BOX_NOT_FOUND = create("PR404-DV-0002"); /** * CELLが存在しないとき. */ public static final DcCoreException CELL_NOT_FOUND = create("PR404-DV-0003"); /** * メソッドが受け付けられないとき. */ public static final DcCoreException METHOD_NOT_ALLOWED = create("PR405-DV-0001"); /** * Depthがinfinityのとき. */ public static final DcCoreException PROPFIND_FINITE_DEPTH = create("PR403-DV-0001"); /** * コレクション削除時に子リソースがある場合は削除失敗. */ public static final DcCoreException HAS_CHILDREN = create("PR403-DV-0003"); /** * コレクション・ファイル名が不正なとき. */ public static final DcCoreException RESOURCE_NAME_INVALID = create("PR403-DV-0004"); /** * 移動元と移動先が同じ場合. * {0}:Destination ヘッダの値 */ public static final DcCoreException DESTINATION_EQUALS_SOURCE_URL = create("PR403-DV-0005"); /** * コレクション・ファイルのPUT・MKCOL・MOVE時に親リソースが存在しない時. */ public static final DcCoreException HAS_NOT_PARENT = create("PR409-DV-0001"); /** * 該当リソースのEtagがマッチしない. */ public static final DcCoreException ETAG_NOT_MATCH = create("PR412-DV-0001"); /** * Overwriteヘッダで"F"が指定されたが移動先のリソースが既に存在する時. */ public static final DcCoreException DESTINATION_ALREADY_EXISTS = create("PR412-DV-0002"); /** * Rangeヘッダ指定誤り. */ public static final DcCoreException REQUESTED_RANGE_NOT_SATISFIABLE = create("PR416-DV-0001"); /** * ファイルシステムの矛盾を検知. */ public static final DcCoreException FS_INCONSISTENCY_FOUND = create("PR500-DV-0001"); /** * Boxから辿ってidで検索して、Davデータに不整合があった場合. */ public static final DcCoreException DAV_INCONSISTENCY_FOUND = create("PR500-DV-0002"); /** * Boxから辿ってidで検索して、Davデータに不整合があった場合. */ public static final DcCoreException DAV_UNAVAILABLE = create("PR503-DV-0001"); } /** * サービスコレクションのエラー. */ public static class ServiceCollection { /** * DC-Engineの接続に失敗した場合. */ public static final DcCoreException SC_ENGINE_CONNECTION_ERROR = create("PR500-SC-0001"); /** * ファイルのオープンに失敗した場合(未使用_実装内容に言及しているため、使用しないこと). */ public static final DcCoreException SC_FILE_OPEN_ERROR = create("PR500-SC-0002"); /** * ファイルのクローズに失敗した場合(未使用_実装内容に言及しているため、使用しないこと). */ public static final DcCoreException SC_FILE_CLOSE_ERROR = create("PR500-SC-0003"); /** * ファイルのクローズに失敗した場合(未使用_実装内容に言及しているため、使用しないこと). */ public static final DcCoreException SC_IO_ERROR = create("PR500-SC-0004"); /** * その他のエラー. */ public static final DcCoreException SC_UNKNOWN_ERROR = create("PR500-SC-0005"); /** * サービス呼出しで不正なHTTPレスポンスが返却された場合のエラー. */ public static final DcCoreException SC_INVALID_HTTP_RESPONSE_ERROR = create("PR500-SC-0006"); } /** * SentMessage受信API呼出し時のエラー. */ public static class SentMessage { /** * ToRelationに指定されたリソースが存在しない場合. * {0}:指定された値 */ public static final DcCoreException TO_RELATION_NOT_FOUND_ERROR = create("PR400-SM-0001"); /** * ToRelationに指定されたリソースに紐付くExtCellが存在しない場合. * {0}:指定された値 */ public static final DcCoreException RELATED_EXTCELL_NOT_FOUND_ERROR = create("PR400-SM-0002"); /** * 送信先URLが最大送信許可数を超えた場合. */ public static final DcCoreException OVER_MAX_SENT_NUM = create("PR400-SM-0003"); /** * リクエストに失敗した場合. */ public static final DcCoreException SM_CONNECTION_ERROR = create("PR500-SM-0001"); /** * ボディのパースに失敗した場合. */ public static final DcCoreException SM_BODY_PARSE_ERROR = create("PR500-SM-0002"); } /** * ReceiveMessageAPI呼出し時のエラー. */ public static class ReceiveMessage { /** * メッセージの関係登録で既に関係が存在する. */ public static final DcCoreException REQUEST_RELATION_EXISTS_ERROR = create("PR400-RM-0001"); /** * メッセージのRequestRelationのパースに失敗. */ public static final DcCoreException REQUEST_RELATION_PARSE_ERROR = create("PR409-RM-0001"); /** * 関係削除対象のRelationが存在しない. */ public static final DcCoreException REQUEST_RELATION_DOES_NOT_EXISTS = create("PR409-RM-0002"); /** * メッセージのRequestRelationTargetのパースに失敗. */ public static final DcCoreException REQUEST_RELATION_TARGET_PARSE_ERROR = create("PR409-RM-0003"); /** * 関係削除対象のExtCellが存在しない. */ public static final DcCoreException REQUEST_RELATION_TARGET_DOES_NOT_EXISTS = create("PR409-RM-0004"); /** * RequestRelationとRequestRelationTargetのリンク情報が存在しない. */ public static final DcCoreException LINK_DOES_NOT_EXISTS = create("PR409-RM-0005"); } /** * サーバ内部エラー. * サーバ側の障害やバグにより処理を続行できないときに投げる. 問題の原因を表すようなものとする。 基本的にののカテゴリの例外発生時にはWARN以上のログ出力となる */ public static class Server { /** * 原因不明のエラー. */ public static final DcCoreException UNKNOWN_ERROR = create("PR500-SV-0000"); /** * データストアへの接続に失敗したとき. */ public static final DcCoreException DATA_STORE_CONNECTION_ERROR = create("PR500-SV-0001"); /** * データストア関連の不明なエラー. */ public static final DcCoreException DATA_STORE_UNKNOWN_ERROR = create("PR500-SV-0002"); /** * ESへのリクエストでリトライオーバーしたとき. */ public static final DcCoreException ES_RETRY_OVER = create("PR500-SV-0003"); /** * ファイルシステムに異常が発生したとき. */ public static final DcCoreException FILE_SYSTEM_ERROR = create("PR500-SV-0004"); /** * データストアの検索に失敗. */ public static final DcCoreException DATA_STORE_SEARCH_ERROR = create("PR500-SV-0005"); /** * データストアの更新に失敗し、ロールバックにも失敗した. */ public static final DcCoreException DATA_STORE_UPDATE_ROLLBACK_ERROR = create("PR500-SV-0006"); /** * データストアの更新に失敗し、ロールバックが成功した. */ public static final DcCoreException DATA_STORE_UPDATE_ERROR_ROLLBACKED = create("PR500-SV-0007"); /** * memcachedへの接続に失敗したとき. */ public static final DcCoreException SERVER_CONNECTION_ERROR = create("PR503-SV-0002"); /** * Memcachedのロックステータス取得に失敗したとき. */ public static final DcCoreException GET_LOCK_STATE_ERROR = create("PR503-SV-0003"); /** * ユニットユーザ単位のデータリストア中のとき. */ public static final DcCoreException SERVICE_MENTENANCE_RESTORE = create("PR503-SV-0004"); /** * ReadDeleteOnlyモード状態のとき. */ public static final DcCoreException READ_DELETE_ONLY = create("PR503-SV-0005"); /** * Adsへの接続に失敗したとき. */ public static final DcCoreException ADS_CONNECTION_ERROR = create("PR503-SV-0006"); } /** * NetWork関連エラー. */ public static class NetWork { /** * NetWork関連エラー. */ public static final DcCoreException NETWORK_ERROR = create("PR500-NW-0000"); /** * HTTPリクエストに失敗. */ public static final DcCoreException HTTP_REQUEST_FAILED = create("PR500-NW-0001"); /** * 接続先が想定外の応答を返却. */ public static final DcCoreException UNEXPECTED_RESPONSE = create("PR500-NW-0002"); /** * 接続先が想定外の値を返却. */ public static final DcCoreException UNEXPECTED_VALUE = create("PR500-NW-0003"); } /** * 認証系エラー. */ public static class Auth { /** * パスワード文字列が不正. */ public static final DcCoreException PASSWORD_INVALID = create("PR400-AU-0001"); /** * リクエストパラメータが不正. */ public static final DcCoreException REQUEST_PARAM_INVALID = create("PR400-AU-0002"); /** * パスワード文字列が不正. */ public static final DcCoreException DC_CREDENTIAL_REQUIRED = create("PR400-AU-0003"); /** * ユニットユーザアクセスではない. */ public static final DcCoreException UNITUSER_ACCESS_REQUIRED = create("PR403-AU-0001"); /** * 必要な権限が無い. */ public static final DcCoreException NECESSARY_PRIVILEGE_LACKING = create("PR403-AU-0002"); /** * 認証ヘッダに指定されたユニットユーザではアクセセスできない. */ public static final DcCoreException NOT_YOURS = create("PR403-AU-0003"); /** * スキーマ認証が必要. */ public static final DcCoreException SCHEMA_AUTH_REQUIRED = create("PR403-AU-0004"); /** * このスキーマ認証ではアクセスできない. */ public static final DcCoreException SCHEMA_MISMATCH = create("PR403-AU-0005"); /** * スキーマ認証レベルが不足. */ public static final DcCoreException INSUFFICIENT_SCHEMA_AUTHZ_LEVEL = create("PR403-AU-0006"); /** * ルートCA証明書の設定エラー. */ public static final DcCoreException ROOT_CA_CRT_SETTING_ERROR = create("PR500-AN-0001"); /** * リクエストパラメータが不正. */ public static final DcCoreException REQUEST_PARAM_CLIENTID_INVALID = create("PR400-AZ-0002"); /** * リクエストパラメータが不正. */ public static final DcCoreException REQUEST_PARAM_REDIRECT_INVALID = create("PR400-AZ-0003"); } /** * Event関連エラー. */ public static class Event { /** * JSONパースに失敗. */ public static final DcCoreException JSON_PARSE_ERROR = create("PR400-EV-0001"); /** * X-Dc-RequestKey の値が不正. */ public static final DcCoreException X_DC_REQUESTKEY_INVALID = create("PR400-EV-0002"); /** * リクエストボディの必須項目が無い. * {0}:プロパティ名 */ public static final DcCoreException INPUT_REQUIRED_FIELD_MISSING = create("PR400-EV-0003"); /** * リクエストデータのフォーマットが不正. * {0}プロパティ名 */ public static final DcCoreException REQUEST_FIELD_FORMAT_ERROR = create("PR400-EV-0004"); /** * Httpレスポンスの出力に失敗したとき. */ public static final DcCoreException EVENT_RESPONSE_FAILED = create("PR500-EV-0001"); /** * 圧縮されたイベントログファイルがオープンできないとき. */ public static final DcCoreException ARCHIVE_FILE_CANNOT_OPEN = create("PR500-EV-0002"); } /** * barファイルインストール関連エラー. */ public static class BarInstall { /** * リクエストヘッダーの値が不正なとき. */ public static final DcCoreException REQUEST_HEADER_FORMAT_ERROR = create("PR400-BI-0001"); /** * Barファイルのファイルサイズが上限値を超えているとき. */ public static final DcCoreException BAR_FILE_SIZE_TOO_LARGE = create("PR400-BI-0002"); /** * Barファイル内エントリのファイルサイズが上限値を超えているとき. */ public static final DcCoreException BAR_FILE_ENTRY_SIZE_TOO_LARGE = create("PR400-BI-0003"); /** * インストール対象のBoxがBox Schemaとして登録済みのとき. */ public static final DcCoreException BAR_FILE_BOX_SCHEMA_ALREADY_EXISTS = create("PR400-BI-0004"); /** * Barファイルのファイルサイズが上限値を超えているとき. */ public static final DcCoreException BAR_FILE_SIZE_INVALID = create("PR400-BI-0005"); /** * JSONファイルの形式が不正なとき. */ public static final DcCoreException JSON_FILE_FORMAT_ERROR = create("PR400-BI-0006"); /** * barファイルがオープンできないとき. */ public static final DcCoreException BAR_FILE_CANNOT_OPEN = create("PR400-BI-0007"); /** * barファイルが読み込めないとき. */ public static final DcCoreException BAR_FILE_CANNOT_READ = create("PR400-BI-0008"); /** * barファイルの構造が正しくないとき. */ public static final DcCoreException BAR_FILE_INVALID_STRUCTURES = create("PR400-BI-0009"); /** * インストール対象のBoxが登録済みのとき. */ public static final DcCoreException BAR_FILE_BOX_ALREADY_EXISTS = create("PR405-BI-0001"); /** * Httpレスポンスの出力に失敗したとき. */ public static final DcCoreException BAR_FILE_RESPONSE_FAILED = create("PR500-BI-0001"); } /** * その他エラー. */ public static class Misc { /** * メソッドが受け付けられないとき. */ public static final DcCoreException METHOD_NOT_ALLOWED = create("PR405-MC-0001"); /** * サーバ内の処理中にキャンセルされた場合。 * $batchのタイムアウトで使用。 */ public static final DcCoreException SERVER_REQUEST_TIMEOUT = create("PR408-MC-0001"); /** * セル一括削除時に削除対象のセルにアクセスがあったとき. */ public static final DcCoreException CONFLICT_CELLACCESS = create("PR409-MC-0001"); /** * ヘッダの前提条件指定が満たされていないとき. */ public static final DcCoreException PRECONDITION_FAILED = create("PR412-MC-0001"); /** * メソッドが未実装のとき. */ public static final DcCoreException METHOD_NOT_IMPLEMENTED = create("PR501-MC-0001"); /** * 未実装機能. */ public static final DcCoreException NOT_IMPLEMENTED = create("PR501-MC-0002"); /** * 同時リクエストが多すぎるとき. * 排他制御のタイムアウトで使用。 */ public static final DcCoreException TOO_MANY_CONCURRENT_REQUESTS = create("PR503-SV-0001"); } String code; Severity severity; String message; int status; /** * インナークラスを強制的にロードする. * エラー分類のインナークラスが追加になったらここに追加すること. */ public static void loadConfig() { new OData(); new Dav(); new ServiceCollection(); new Server(); new Auth(); new Event(); new Misc(); } /** * コンストラクタ. * @param status HTTPレスポンスステータス * @param severityエラーレベル * @param code エラーコード * @param message エラーメッセージ */ DcCoreException(final String code, final Severity severity, final String message, final int status, final Throwable t) { super(t); this.code = code; this.severity = severity; this.message = message; this.status = status; } /** * コンストラクタ. * @param status HTTPレスポンスステータス * @param severityエラーレベル * @param code エラーコード * @param message エラーメッセージ */ DcCoreException(final String code, final Severity severity, final String message, final int status) { this(code, severity, message, status, null); } /** * レスポンスオブジェクトの作成. * @return JAX-RS応答オブジェクト */ public Response createResponse() { // TODO エラー時、JSONを固定で指定しているが制限解除時にContent-Typeを指定するようにする!! return Response.status(status) .entity(new ODataErrorMessage(code, message)) .type(MediaType.valueOf(MediaType.APPLICATION_JSON)) .build(); } /** * ログレベルを返却する. * @return ログレベル */ public Severity getSeverity() { return this.severity; } /** * HTTPステータスコードを返却する. * @return HTTPステータスコード */ public int getStatus() { return this.status; } /** * エラーコードを返却する. * @return エラーコード */ public String getCode() { return this.code; } @Override public String getMessage() { return this.message; } /** * 原因例外を追加したものを作成して返します. * @param t 原因例外 * @return DcCoreException */ public DcCoreException reason(final Throwable t) { // クローンを作成 DcCoreException ret = new DcCoreException(this.code, this.severity, this.message, this.status, t); return ret; } /** * メッセージをパラメタ置換したものを作成して返します. エラーメッセージ上の $1 $2 等の表現がパラメタ置換用キーワードです。 * @param params 付加メッセージ * @return DcCoreMessage */ public DcCoreException params(final Object... params) { // 置換メッセージ作成 String ms = MessageFormat.format(this.message, params); // 制御コードのエスケープ処理 ms = EscapeControlCode.escape(ms); // メッセージ置換クローンを作成 DcCoreException ret = new DcCoreException(this.code, this.severity, ms, this.status); return ret; } /** * ファクトリーメソッド. * @param code メッセージコード * @return DcCoreException */ public static DcCoreException create(String code) { int statusCode = parseCode(code); // ログレベルの取得 Severity severity = DcCoreMessageUtils.getSeverity(code); if (severity == null) { // ログレベルが設定されていなかったらレスポンスコードから自動的に判定する。 severity = decideSeverity(statusCode); } // ログメッセージの取得 String message = DcCoreMessageUtils.getMessage(code); return new DcCoreException(code, severity, message, statusCode); } /** * レスポンスコードからログレベルの判定. * @param statusCode ステータスコード * @return ステータスコードから判定されたログレベル */ static Severity decideSeverity(int statusCode) { // 設定が省略されている場合はエラーコードからログレベルを取得 if (statusCode >= HttpStatus.SC_INTERNAL_SERVER_ERROR) { // 500系の場合はウォーニング(500以上はまとめてウォーニング) return Severity.WARN; } else if (statusCode >= HttpStatus.SC_BAD_REQUEST) { // 400系の場合はインフォ return Severity.INFO; } else { // それ以外の場合は考えられないのでウォーニング. // 200系とか300系をDcCoreExceptionで処理する場合はログレベル設定をちゃんと書きましょう. return Severity.WARN; } } /** * メッセージコードのパース. * @param code メッセージコード * @return ステータスコードまたはログメッセージの場合は-1。 */ static int parseCode(String code) { Pattern p = Pattern.compile("^PR(\\d{3})-\\w{2}-\\d{4}$"); Matcher m = p.matcher(code); if (!m.matches()) { throw new IllegalArgumentException( "message code should be in \"PR000-OD-0000\" format. code=[" + code + "]."); } return Integer.parseInt(m.group(1)); } }