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;
}
} |