知识大全 Eclipse环境下的OpenSocial开发
Posted 知
篇首语:书到用时方恨少,事非经过不知难。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Eclipse环境下的OpenSocial开发相关的知识,希望对你有一定的参考价值。
Eclipse环境下的OpenSocial开发 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
什么是 OpenSocial
OpenSocial 是基于开放标准的一组通用的 API 用于帮助 WEB 的开发者构建跨多个社交网站的可移植的社交应用程序 OpenSocial 提供开发者一套通用的 API 基于该通用 API 开发的社交应用程序可以运行在任意支持 OpenSocial 规范的社交网站上
关于更多的有关 OpenSocial 内容 请读者参见
Apache Shindig
Shindig 是 OpenSocial 规范的引用实现 其主要的组件包括 :
Gadget Container JavaScript OpenSocial Gadget 容器 客户端的 JavaScript 类库 (gadget js) 提供例如 UI Layout Security Communication 等相关的功能
Gadget Rendering Server 负责解析 Gadget XML 转化成浏览器使用的 HTML/JavaScript/CSS
OpenSocial Container JavaScript 位于客户端的 OpenSocial 容器 也是 JavaScript 类库 提供 OpenSocial 相关的功能 例如存取 People Activity AppData 等相关的社交数据
OpenSocial Data Server 提供基于 Restful/RPC 协议的 Services 用于存取 People Activity AppData 等相关的社交数据
图 是 Shindig 的服务器端架构图
图 Shindig Architecture( 引自 Chris Schalk@GoogleTM)
从图 中可以看到 Shindig 基于 Java Servlet Stack 实现 GadgetRenderingServlet 负责 Gadget Rendering 而 DataServiceServlet 和 JsonRpcServlet 实现 OpenSocial Data Server 中相对应的 Restful 及其 RPC 服务 JsonDbOpensocialService 通过实现 ActivityService PersonService AppDataService 三个接口向 Shindig OpenSocial 容器提供基于 Json 格式的 OpenSocial 数据 客户端的 Gadgets 可以使用标准的 OpenSocial API 访问到这些数据
关于更多的有关 Apache Shindig 内容 请读者参见
Eclipse 环境下编译 / 调试 Shindig
我们通过以下的步骤来完成
安装 Maven plugin
Maven 是一个基于 Java 的代码构建和依赖管理工具 Apache Shindig 的源代码是通过 Maven 来管理的 所以我们需要安装 Maven 的 Eclipse 插件 读者可以使用 Eclipse 的 updatesite 机制 连接到 站点安装
使用 Subversion 下载 Shindig 代码
在 使用 SVN 客户端下载到 Shindig 的源代码
编译和调试 Shindig
首先 在 Eclipse IDE 里 通过 File/Import/General/Maven Projects 选项导入我们下载的所有 Shindig 的源代码 导入完成后 Shindig 就作为几个 Maven 工程存在于你当前的 WorkSpace 中
通过 Run/Debug Configurations/Maven Build 配置编译 Shindig 参数 如图 所示
图 Package Shindig
如图 所示 E:\\svn_repository\\opensocial shindig 是你的 Shindig 源代码的根目录 点击 Debug 这将使用 Maven 来 Build 整个 Shindig 代码 在 Build 成功后 我们使用 Jetty 来启动 Shindig 默认情况下 Jetty Server 将运行在 端口 如图 所示
图 Run Shindig
如图 所示 我们设置了 Maven 目标 使用 Jetty 来启动 Shindig 而 Base directory 设置为 shindig server Maven 工程的根目录 点击 Debug Jetty Server 运行 而 Shindig 部署在 Jetty Server 上 在 Shindig 成功启动后 你就可以使用//localhost: /gadgets/files/samplecontainer/l来访问 Shindig 提供的 Gadget 的例子
Shindig 服务器端 SPI 扩展
Shindig 作为 OpenSocial 规范的引用实现 提供了 SPI 的扩展能力 允许你把数据适配到 Shindig 容器中去 你的这些数据也许存在于诸如 My SQL/Oracle 的关系数据库 或者是以 JSON 格式存储的静态文件 无论哪种存储 你都可能通过 Shindig SPI 将它们适配到 Shindig 从而使这些数据公布在 OpenSocial 平台上
图 Shindig SPI 扩展
如图 所示 你的应用需要实现 ActivityService PersonService AppDataService 三个接口 利用诸如 JDBC/Hibernate 等机制把数据提供给 Shindig
接下来 本文将通过一个例子 实现 PersonService 接口向 Shindig 提供 People/Friends 相关的 OpenSocial 数据
清单 是 SocialTestJsonPersonService类的实现
清单 SocialTestJsonPersonService Class
public class SocialTestJsonPersonService implements PersonService private static final String PEOPLE_TABLE = people ; private static final String FRIEND_LINK_TABLE = friendLinks ; private JSONObject db; private BeanConverter converter; …… public Future<RestfulCollection<Person>> getPeople(Set<UserId> userIds GroupId groupId CollectionOptions options Set<String> fields SecurityToken token) throws ProtocolException List<Person> result = Lists newArrayList(); try //Read people data from JSON table JSONArray people = db getJSONArray(PEOPLE_TABLE); Set<String> idSet = getIdSet(userIds groupId token); for (int i = ; i < people length(); i++) JSONObject person = people getJSONObject(i); if (!ntains(person get(Person Field ID toString()))) continue; // Add group support later Person personObj = filterFields(person fields Person class); result add(personObj); if (GroupId Type self == groupId getType() && result isEmpty()) throw new ProtocolException(HttpServletResponse SC_BAD_REQUEST Person not found ); int totalSize = result size(); return ImmediateFuture newInstance(new RestfulCollection<Person>( result options getFirst() totalSize options getMax())); catch (JSONException je) throw new ProtocolException( HttpServletResponse SC_INTERNAL_SERVER_ERROR je getMessage() je); public Future<Person> getPerson(UserId id Set<String> fields SecurityToken token) throws ProtocolException try //Read people data from JSON table JSONArray people = db getJSONArray(PEOPLE_TABLE); for (int i = ; i < people length(); i++) JSONObject person = people getJSONObject(i); if (id != null && person get(Person Field ID toString()) equals( id getUserId(token))) Person personObj = filterFields(person fields Person class); return ImmediateFuture newInstance(personObj); throw new ProtocolException(HttpServletResponse SC_BAD_REQUEST Person not found ); catch (JSONException je) throw new ProtocolException( HttpServletResponse SC_INTERNAL_SERVER_ERROR je getMessage() je); ……从清单 可以看到 SocialTestJsonPersonService 实现了 PersonService 两个接口方法 getPeople 及其 getPerson getPeople 根据传入参数 userIds 返回相应于该 ID 列表的用户列表 而 getPerson 根据传入参数 id 返回相应于该 ID 的用户
注意 Shindig 依赖 Guice 做动态的依赖注入 (dependency Injection) 我们需要在 apache shindig social sample SampleModule 里指示 Guice 把 PersonService 绑定到 SocialTestJsonPersonService 实现 如清单 所示
清单 SampleModule Class
public class SampleModule extends SocialApiGuiceModule @Override protected void configure() nfigure(); bind(String class) annotatedWith(Names named( shindig canonical json db )) toInstance( sampledata/canonicaldb json ); bind(String class) annotatedWith(Names named( shindig socialtest json db )) toInstance( sampledata/socialtestdb json ); bind(ActivityService class) to(JsonDbOpensocialService class); bind(AppDataService class) to(JsonDbOpensocialService class); //bind(PersonService class) to(JsonDbOpensocialService class); bind(PersonService class) to(SocialTestJsonPersonService class); bind(MessageService class) to(JsonDbOpensocialService class); bind(OAuthDataStore class) to(SampleOAuthDataStore class); // We do this so that jsecurity realms can get access to the jsondbservice singleton requestStaticInjection(SampleRealm class); ……从清单 中 还可以看到 标记为 shindig socialtest json db 的字符串绑定到了 sampledata/socialtestdb json socialtestdb json 是我们示例中的 JSON 数据文件 用来保存 People 数据 在 SocialTestJsonPersonService 的实现中 db getJSONArray(PEOPLE_TABLE) 就是从该 JSON 文件获取所有的 People 数据
在下一节 我们给出客户端实现 来消费 socialtestdb json 中的 Social 数据
Gadget/Restful 客户端实现
Gadget 实现
清单 SocialAppTest xml
<?xml version= encoding= UTF ?> <Module> <ModulePrefs title= Social Application Test author_email= > <Require feature= osapi /> <Require feature= dynamic height /> </ModulePrefs> <Content type= ><![CDATA[<! Fetching People and Friends > <div> <button onclick= fetchPeople(); >Fetch people and friends</button> <div> <span id= viewer ></span> <ul id= friends ></ul> </div> </div> <script type= text/javascript > var allPeople; function render(data) var viewer = data viewer; allPeople = data viewerFriends list; document getElementById( viewer ) innerHTML = viewer id; document getElementById( friends ) innerHTML = ; for (var i = ; i < allPeople length; i++) document getElementById( friends ) innerHTML += <li> + allPeople[i] name formatted + </li> ; gadgets window adjustHeight(); function fetchPeople() var fields = [ id age name gender profileUrl thumbnailUrl ]; var batch = osapi newBatch(); batch add( viewer osapi people getViewer(sortBy: name fields:fields)); batch add( viewerFriends osapi people getViewerFriends(sortBy: name fields:fields)); batch add( viewerData osapi appdata get(keys:[ count ])); batch add( viewerFriendData osapi appdata get(groupId: @friends keys:[ count ])); batch execute(render); </script>]]></Content> </Module>如清单 所示 fetchPeople 使用了 osapi 获得 OpenSocial 数据 并把它们展示在 HTML 页面上 osapi 是一个轻量级的 JavaScript 类库 用于帮助客户端获得 OpenSocial 数据 显示该 Gadget 的 HTML 页面代码 (l) 请读者详见文章后面的资源类表 在这里我们就不一一列出
现在 我们可以在 Eclipse IDE 中启动 Shindig 在你的浏览器里输入地址
//localhost: /gadgets/files/samplecontainer/l 打开 SocialAppTest Gadget 点击 Fetch people and friends 按钮 SocialAppTest Gadget 向本地 Shindig 请求数据 Shindig 从 socialtestdb json JSON 文件中获取数据 返回给 Gadget 并在浏览器中显示 如图 所示
图 SocialAppTest Gadget
RESTful 客户端实现
另外 我们还可以选择使用 Java 应用程序 通过 REST 协议获得 OpenSocial 数据 如清单 所示
清单 RESTful Client 实现
public class SocialAppTest private static final String BASE_URI = //localhost: /social/rest/ ; private static final String VIEWER_ID = john doe ; public static void main(String[] args) OpenSocialClient client = new OpenSocialClient( SocialAppTest ); client setProperty(OpenSocialClient Property REST_BASE_URI BASE_URI); client setProperty(OpenSocialClient Property VIEWER_ID VIEWER_ID); try OpenSocialPerson viewer = client fetchPerson(VIEWER_ID); System out println( Viewer: + viewer getId()); Collection<OpenSocialPerson> friends = client fetchFriends(viewer getId()); for (OpenSocialPerson friend : friends) System out println( Friend: + friend getId()); catch (Exception e) e printStackTrace();清单 的运行结果和 SocialAppTest Gadget 一样 显示当前的 Viewer 及其他的朋友
结束语
通过本文 读者已经了解了如何使用 Shindig SPI 来将自己的 Social 数据适配到 Shindig 平台 也了解了如何构建客户端的应用来消费这些 Social 数据
cha138/Article/program/Java/hx/201311/26538相关参考
开发Eclipse下的自定义控件[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!addMous
开发Eclipse下的自定义控件[5] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!publicv
开发Eclipse下的自定义控件[6] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!publicv
开发Eclipse下的自定义控件[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 本文首先介
开发Eclipse下的自定义控件[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 作为一个可
搭建Eclipse+MyEclipse开发环境 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一
Eclipse下配置swt开发环境 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 创建存储过程的
知识大全 Eclipse+JBoss+MySQL开发环境设置的介绍
Eclipse+JBoss+MySQL开发环境设置的介绍 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
使用EclipseIDE创建统一开发环境 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 许多原因
知识大全 在Ubuntu下打造Avr-Eclipse开发环境
在Ubuntu下打造Avr-Eclipse开发环境 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!