メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2009年7月18日土曜日

[Apache Shindig][お勉強][OpenSocial] メモ53 container.jsで定義した値を使ってJava側supportsField()を実装してみる

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 コメント: