JavaScript APIでは、opensocial.getEnvironment().supportsField()
というメソッドが用意されているが、ここで元となるsupportedField(多分container.jsで定義)
を使って、Java側でsupportsFieldをやってみた。
container.jsで定義された値は、
ContainerConfigというクラスに保存されているので、そこからsupportedFieldを取得する。
取得したsupportedFieldをひとつひとつ見ていって、サポートしているかどうか判断する。
で、コードはこんな感じ。
public boolean supportsField(String container, String objectName, String fieldTree) {
assert fieldTree != null;
assert objectName != null;
assert container != null;
if (logger.isDebugEnabled()) {
logger.debug("サポートチェック開始:"
+ "objectName:[" + objectName + "]:"
+ "fieldTree:[" + fieldTree + "]:"
);
}
String jsonString = "${Cur['gadgets.features']['opensocial-0.8'].supportedFields." + objectName + "}";
String[] field = null;
if (fieldTree.indexOf(".")!= -1) {
field = fieldTree.split("\\.");
}
else {
field = new String[1];
field[0] = fieldTree;
}
List<Object> supportedFieldList = containerConfig.getList(container, jsonString);
for (int ii=0,length = field.length; ii<length; ii++) {
for (Object obj: supportedFieldList) {
if (obj instanceof String) {
if (field[ii].equals(obj)) {
if (logger.isDebugEnabled()) {
logger.debug("サポートチェック終了:対応(String):"
+ "objectName:[" + objectName + "]:"
+ "fieldTree:[" + fieldTree + "]:"
);
}
return true;
}
}
else if (obj instanceof ImmutableMap) {
ImmutableMap map = (ImmutableMap) obj;
List<Object> tmp = (List<Object>)map.get(field[ii]);
if (tmp != null) {
if (ii == length - 1) {
if (logger.isDebugEnabled()) {
logger.debug("サポートチェック終了:対応(Map):"
+ "objectName:[" + objectName + "]:"
+ "fieldTree:[" + fieldTree + "]:"
);
}
return true;
}
supportedFieldList = tmp;
break;
}
}
else {
assert false;
}
}
}
if (logger.isDebugEnabled()) {
logger.debug("サポートチェック終了:非対応:"
+ "objectName:[" + objectName + "]:"
+ "fieldTree:[" + fieldTree + "]:"
);
}
return false;
}
containerConfigはプロパティとして、Injectされているものとした。
もっといい方法があるかとは思う。
そもそも、container.jsで記述するサポートする項目は、
既存のSNSなりの項目に合わせるので、Javaから判断する必要は無いっぽい。
一応これで、
if (supportsField(token.getContainer(), "person", Person.Field.ADDRESSES)) {
などと、使用することができる。
ちなみに、Person.Field.NAMEのADDITIONAL_NAMEがサポートされているかどうか、
などといった、ネストした項目もチェック可能。
if (supportsField(token.getContainer(), "person", Person.Field.NAME + "." + Name.Field.ADDTIONAL_NAME)) {
なんてな風にしてみた。
--
なんとなく違う気がする。
Person.Field.NAME + "." + Name.Field.ADDTIONAL_NAME
という部分が独自すぎ。。
container.jsの
"supportedFields" : {
"person" : ["id", {"name" : ["familyName", "givenName", "unstructured"]}, "thumbnailUrl", "profileUrl"],
"activity" : ["id", "title"]
}
を、
"supportedFields" : {
"person" : ["id", "name", "thumbnailUrl", "profileUrl"],
"name" : ["familyName", "givenName", "unstructured"],
"activity" : ["id", "title"]
}
として、
if (supportsField(token.getContainer(), "name", Name.Field.ADDTIONAL_NAME)) {
なんてした方がいいような気がする。
.
0 コメント:
コメントを投稿