/* DConnectPluginSpec.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.profile.spec; import org.deviceconnect.android.profile.spec.parser.DConnectProfileSpecJsonParser; import org.deviceconnect.android.profile.spec.parser.DConnectProfileSpecJsonParserFactory; import org.json.JSONException; import org.json.JSONObject; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * プラグインのサポートする仕様を保持するクラス. * <p> * プラグインのサポートするプロファイルのリストを持つ. * </p> * @author NTT DOCOMO, INC. */ public class DConnectPluginSpec { private static final int BUFFER_SIZE = 1024; private final DConnectProfileSpecJsonParser mJsonParser = DConnectProfileSpecJsonParserFactory.getDefaultFactory().createParser(); private final Map<String, DConnectProfileSpec> mProfileSpecs = new ConcurrentHashMap<String, DConnectProfileSpec>(); /** * 入力ストリームからDevice Connectプロファイルの仕様定義を追加する. * * @param profileName プロファイル名 * @param in 入力ストリーム * @throws IOException 入力ストリームの読み込みに失敗した場合 * @throws JSONException JSONの構造が不正な場合 */ public void addProfileSpec(final String profileName, final InputStream in) throws IOException, JSONException { DConnectProfileSpec profileSpec = mJsonParser.parseJson(new JSONObject(loadFile(in))); if (profileSpec.mProfileName == null) { profileSpec.mProfileName = profileName; } for (DConnectApiSpec apiSpec : profileSpec.getApiSpecList()) { apiSpec.setApiName(profileSpec.mApiName); apiSpec.setProfileName(profileSpec.mProfileName); } mProfileSpecs.put(profileName, profileSpec); } private static String loadFile(final InputStream in) throws IOException { try { byte[] buf = new byte[BUFFER_SIZE]; int len; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ((len = in.read(buf)) > 0) { baos.write(buf, 0, len); } return new String(baos.toByteArray()); } finally { in.close(); } } /** * 指定したプロファイルの仕様定義を取得する. * @param profileName プロファイル名 * @return {@link DConnectProfileSpec}のインスタンス */ public DConnectProfileSpec findProfileSpec(final String profileName) { return mProfileSpecs.get(profileName); } /** * プラグインのサポートするプロファイルの仕様定義の一覧を取得する. * <p> * このメソッドから返される一覧には、各プロファイル上で定義されているすべてのAPIの定義が含まれる. * </p> * @return {@link DConnectProfileSpec}のマップ. キーはプロファイル名. */ public Map<String, DConnectProfileSpec> getProfileSpecs() { return new HashMap<String, DConnectProfileSpec>(mProfileSpecs); } }