4.14.1 サンプルコード

ここでは,エンティティリゾルバのサンプルコードを示します。

このサンプルコードは,XBRLおよびXML Schemaのスキーマをファイルとしてローカルに保存し,解析時にローカルにあるファイルを利用するための簡単なエンティティリゾルバの実装例です。

サンプルコード(SampleEntityResolver.java)は,各サンプルファイルが格納されているフォルダにあります。

<uCosminexus Business Reporting Processorのインストールフォルダ>¥samples¥<XBRLバージョン>¥<サンプル名>

サンプルファイルが格納されているフォルダの詳細は,「4.15.1 サンプルファイルの格納場所」を参照してください。

エンティティリゾルバのサンプルコードは次のとおりです。

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;

import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;

public class SampleEntityResolver implements EntityResolver {

   // スキーマのURI
   private static final String XBRL20_INSTANCE_URI =
       "http://www.xbrl.org/2001/xbrl-instance.xsd";
   private static final String XBRL20_LINKBASE_URI =
       "http://www.xbrl.org/2001/xbrl-linkbase.xsd";
   private static final String XBRL21_INSTANCE_URI =
       "http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd";
   private static final String XBRL21_LINKBASE_URI =
       "http://www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd";
   private static final String XML_SCHEMA_URI =
       "http://www.w3.org/2001/XMLSchema.xsd";
   private static final String XML_URI =
       "http://www.w3.org/2001/xml.xsd";
   private static final String XBRL_DT_URI =
       "http://xbrl.org/2005/xbrldt-2005.xsd";
   private static final String XBRL_DI_URI =
       "http://xbrl.org/2006/xbrldi-2006.xsd";

   // ファイルセパレータ
   private static String SEP = File.separator;

   // ファイルの実体に付加するパス
   private static String basePath =
       System.getProperty("user.dir") + SEP + ".." + SEP + "schemas";

   // URIと実体のマッピング
   private static final Map<String, String> HTTPMAP =
       new HashMap<String, String>();

   // 静的初期化子
   static {
       HTTPMAP.put(XBRL20_INSTANCE_URI, "xbrl-instance.xsd");
       HTTPMAP.put(XBRL20_LINKBASE_URI, "xbrl-linkbase.xsd");
       HTTPMAP.put(XBRL21_INSTANCE_URI, "xbrl-instance-2003-12-31.xsd");
       HTTPMAP.put(XBRL21_LINKBASE_URI, "xbrl-linkbase-2003-12-31.xsd");
       HTTPMAP.put(XML_SCHEMA_URI,      "XMLSchema.xsd");
       HTTPMAP.put(XML_URI,             "xml.xsd");
       HTTPMAP.put(XBRL_DT_URI,         "xbrldt-2005.xsd");
       HTTPMAP.put(XBRL_DI_URI,         "xbrldi-2006.xsd");
   };


   /**
    * EntityResolverで定義されたインターフェースの実装です
    * 特定のURIの場合,ローカルファイル名の新しい入力ソースを作成します
    * 特定のURIとは,このオブジェクトのHTTPMAP変数で宣言された値です
    * その他のURIの場合は,nullを返します
    *
    * @param publicId 参照される外部エンティティの公開識別子
    * @param systemId  参照される外部エンティティのシステム識別子
    * @return 新しい入力ソースを記述する InputSource オブジェクトを返す
    *         systemIdに対応するローカルファイル名がない場合は null を返す
    */
   public InputSource resolveEntity(String publicId, String systemId) {

       InputSource is = null;

       if (systemId != null) {
           // ファイル名があればInputSourceを作成して返す。
           String filename = HTTPMAP.get(systemId);
           if (filename != null) {
               // ファイル名を絶対URIにする。
               File file = new File(basePath + SEP + filename);
               try {
                   file = file.getCanonicalFile();
                   URI uri = file.toURI();
                   is = new InputSource(uri.toString());
               } catch (IOException e) {
                   System.err.println(e.getMessage());
               }
           }
       }

       return is;
   }
}