shindig研究拼凑

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

  1. 在eclipse里面建立一个标准的web项目,由于不同的插件方式不同,这步就不细说了,我这里没有插件,就建了一个java项目.
  2. 把java\server\target\shindig-server-1-SNAPSHOT\WEB-INF\lib里面的jar包拷到你自己web项目的WEB-INF\lib里面,以shindig开头的四个包不要拷.
  3. 将java\server\target\shindig-server-1-SNAPSHOT\gadgets文件夹拷贝到webroot根下
    • 在eclipse中导入shindig\java\common\src\main\java
    • shindig\java\gadgets\src\main\java
    • shindig\java\social-api\src\main\java
    • shindig\features下的文件,其中target文件夹不用导入
    • shindig\java\gadgets\conf下的gadgets.properties文件
    • 在src下建containers/default目录,copy shindig/config/container.js到此目录下
    • 将shindig\java\server\src\main\webapp\WEB-INF下web.xml拷贝到webroot\WEB-INF下
    • shindig\java\server\target\shindig-server-1-SNAPSHOT\gadgets\files\sampledata目录copy到src下
  4. 如果编译有问题,检查一下导入的包是否齐全了.
  5. 然后将项目发布到tomcat中,在浏览器中输入http:///gadgets/files/samplecontainer/samplecontainer.html

正常情况下应该出来一个例子的页面,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.javamysqlservice.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

相关推荐