xiliangxiaoke 2011-04-14
引用说明:原文来自于http://sirius.01242.org/shindig,为了方便本人阅读,文本格式略有调整。
opensocial是一套用于社会化网络平台开发的通用 API,也就是现在流行的sns上用的一套API,自从facebook火了之后,中国的开发者们也按耐不住了,sns网站一下子遍地都是,邮箱里的邀请也是五花八门,国内的主要就是校内,开心,海内,一起.google眼见facebook开放api了,心想我也要分肉,于是也搞了自己的一套,现在和myspace,还有国内的sns网站搞起了合作,大推opensocial. 对于sns网站来说,实际的好处就是可以使用现成的opensocial的应用来丰富网站内容,对于opensocial开发者来说开发一个支持opensocial的gadget可以运行在任何opensocial的sns容器上,对于google来说…呃,他可以说:我就是sns界的老大了.
目前opensocial的实现还只有shindig,就是说如果你希望你的网站支持opensocial写的应用,那么你需要把shindig集成到你的系统中.按照官方的说法:Apache Shindig is an open source project that contains code that you can plug into your server’s infrastructure and begin hosting OpenSocial apps relatively quickly.注意:relatively.
shindig包括四个部分:Gadget Container JavaScript,Gadget Server,OpenSocial Container JavaScript,OpenSocial Data Server,差不多是两两的对应关系,Container JavaScript差不多是前端的API,Server就是后端对API的支持.所以说opensocial得api相当于就是一个JavaScript的API,在特定的Container(iframe)里面运行,然后可以运用container带的一些特性. 集成shindig主要就是对于OpenSocial Data Server部分做一个实现,其他部分基本上不用管
如果你有自己熟悉的JEE server,(我就习惯tomcat),你可以在java/server/target目录下找到一个名字为shindig-server-1-SNAPSHOT.war的war包,然后你看自己爱好部署到自己的服务器上就可以了.
我们把shindig里面代码剥离出来,我这里把unittest的部分去掉了,因为到了实现api接口的部分,unittest还是得重写,这里就整一个干净的shindig.可以在tomcat里面运行并进行调试。假设shindig check out 的目录就是shindig
在display gadget里面可以输入gadget xml的地址,然后点”reset all”就可以看到结果.现在得到的就是一个完整的web工程,可以进行调试了.
现在我们的shindig可以在服务器上跑了,但是在samplecontainer里面跑的都是模拟的数据,这些数据存放在sampledata/canonicaldb.json中,是一个json字符串,实际应用中我们应该把这些数据从自己的数据库中读取出来,只需要实现3个接口就可以了,org.apache.shindig.social.opensocial.spi包下的PersonService,ActivityService,AppDataService
现有的sample中有一个JsonDbOpensocialService实现了这3个接口(在org.apache.shindig.social.sample.spi包下),可以参照看一下.
在shindig中使用的依赖注入工具是google的Guice,可能大家不是很熟悉,有兴趣的可以参照这里,我就结合shindig里面的应用简单地说明一下,熟悉spring的话可以比较快地理解,注入就是将类之间的依赖关系从类的外部设定好,这样可以降低类之间的耦合程度,和spring不同的是,spring的注入设置都在xml文件里,而guice的注入关系都是写在代码里的,通过bind(someInterface.class).to(someImplement.class);这种语句来注入,这些注入都写在一个集成自module类里面,在shindig里面有两个类管理全部的注入,一个是org.apache.shindig.social.core.config.SocialApiGuiceModule,一个是org.apache.shindig.gadgets.servlet.HttpGuiceModule(实际上这个类继承自DefaultGuiceModule),HttpGuiceModule主要是从gadgets.properties里面读取配置,而SocialApiGuiceModule就是我们需要关注的opensocialapi的注入.这两个类在web.xml里面加载,可以看到web.xml里面有如下一段:
<context-param>
<param-name>guice-modules</param-name>
<param-value>org.apache.shindig.gadgets.servlet.HttpGuiceModule:
org.apache.shindig.social.core.config.SocialApiGuiceModule
</param-value>
</context-param>…
<listener>
<listener-class>org.apache.shindig.common.servlet.GuiceServletContextListener</listener-class>
</listener>
这两句就是加载guice的注入关系.如果有需要也可以自己写一个集成module的类,然后添加到这里.用”:”隔开
但是我们仔细看一下,在SocialApiGuiceModule里面并没有发现把PersonService之类的接口绑定到
JsonDbOpensocialService这个类上,是因为现在使用java的标注形式绑定的,打开PersonService文件,在最上面可以看到这样一行@ImplementedBy(JsonDbOpensocialService.class),这是注入的另一种方式,表示JsonDbOpensocialService这个具体类来替换PersonService这个接口.
了解了这些之后,就可以自己写几个类来把sample中JsonDbOpensocialService替换掉,来实现opensocial的API.部分来自这篇文档:Make Your Site an OpenSocial Container Using Shindig
但是这篇文档针对的shindig版本稍低,有些东西已经不能用在新版本的shindig上面,所以主要把里面的sql脚本拿来生成一个测试用的数据库.另外,导入数据库还要用命令行,太不方便了,shindig_sql 这里是一个mysql gui tools用的恢复脚本,直接用gui工具恢复就行了.shindig也被我打了个包,放到lib里面,这里可以下载.
数据库建好了之后(如果你不会建,可以参考本文最上面的链接),我们开始写几个类,把shindig里面自带的读取数据的类替换掉,来实现自己的opensocial data server.
新建了一个包com.my.open,新建三个文件DataLayer.java,JuiceModule.java,MysqlService.java,其中DataLayer.java负责与数据库通信,取到需要的数据,这里就简单地用了jdbc,实际生产环境中一般你可以替换成hibernate,或者用spring管理,MysqlService.java参照shindig中的org.apache.shindig.social.sample.spi.JsonDbOpensocialService修改,负责在调用opensocial api时返回数据,这里是调用了DataLayer来取数据,JuiceModule是用来替换掉shindig中原有的org.apache.shindig.social.core.config.SocialApiGuiceModule来完成依赖注入工作,将opensocial api的实现绑定到我们写的类上面.
JuiceModule比较简单,将三个api service绑定到我们自己的实现上
packagecom.my.open;
importorg.apache.shindig.social.core.config.SocialApiGuiceModule;
importorg.apache.shindig.social.opensocial.spi.ActivityService;
importorg.apache.shindig.social.opensocial.spi.AppDataService;
importorg.apache.shindig.social.opensocial.spi.PersonService;
publicclassJuiceModuleextendsSocialApiGuiceModule{
@Override
protectedvoidconfigure(){
super.configure();
bind(ActivityService.class).to(MysqlService.class);
bind(PersonService.class).to(MysqlService.class);
bind(AppDataService.class).to(MysqlService.class);
}
}
还有两个类比较长,datalayer.java和mysqlservice.java,就不贴出来了,点击链接可以下载
然后需要把web.xml里的GuiceModule替换掉,就是将
<context-param>
<param-name>guice-modules</param-name>
<param-value>
org.apache.shindig.gadgets.servlet.HttpGuiceModule:
org.apache.shindig.social.core.config.SocialApiGuiceModule
</param-value>
</context-param>
替换成
<context-param>
<param-name>guice-modules</param-name>
<param-value>
org.apache.shindig.gadgets.servlet.HttpGuiceModule:
com.my.open.JuiceModule
</param-value>
</context-param>
这样在context加载的时候就会加载我们自己写的module.下面是一些参考资源
http://chrisschalk.com/shindig_docs/io/shindig-io.html
Shindig–DataIntegrationGuide
chabotc.com
opensocial-resources–GoogleCode
OpenSocialAPISpecification(v0.8)–OpenSocial–GoogleCode