楼主: jieforest

使用Apache Shindig

[复制链接]
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
11#
 楼主| 发表于 2010-2-27 18:34 | 只看该作者
替换默认的社区服务
在依赖注入支持下,替换默认的社区网络服务就相当简单,主要包括以下主要步骤:
•        实现自定义OpenSocial服务。自定义服务要么作为一个单独的类(清单1)实现,要么为一组类共同实现Shindig所定义的API。
public class CustomOpenSocialService implements ActivityService,

                AppDataService, PersonService, MessageService {


…………………………………..

}
清单1 客户自定义的OpenSocial 服务
•        创建绑定类。一旦自定义的OpenSocial服务到位(我们假定一个:清单1),一个绑定类必须实现(清单2)并告诉Shindig调用它处理请求。
public class NAVTEQBind extends SocialApiGuiceModule {



    ………………

    bind(ActivityService.class).to(CustomOpenSocialService.class);

    bind(AppDataService.class).to(CustomOpenSocialService.class);

    bind(PersonService.class).to(CustomOpenSocialService.class);

    bind(MessageService.class).to(CustomOpenSocialService.class);

    ………………

}

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
12#
 楼主| 发表于 2010-2-27 18:35 | 只看该作者
清单2 绑定自定义OpenSocial服务
•        用绑定类配置Shindig。最后,这个绑定类必须知道Shindig的实现。通过一个配置文件Web.xml改变来处理(清单3).这个配置文件是通过org.apache.shindig.common.servlet.GuiceServletContextListener类调用Shindig应用程序和设置正确的绑定。

<context-param>
    <param-name>guice-modules</param-name>

   <param-value>

org.apache.shindig.common.PropertiesModule:com.navteq.opensocial.bind.NAVTEQBind

   </param-value>
</context-param>

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
13#
 楼主| 发表于 2010-2-27 18:35 | 只看该作者
清单3 Web.config变化
从浏览器中访问OpenSocial REST API
我们需要从浏览器中访问OpenSocial REST APIs。这里的问题是现在浏览器都具有同源策略限制[17]:
“同源策略是指阻止代码获得或者更改从另一个域名下获得的文件或者信息。也就是说我们的请求URL域必须和当前网站的域相同。这基本上意味着,Web浏览器将不同域的内容隔离以阻止它们彼此对终端用户的操作。”
这里有几种克服限制的常用方法:
•        具有GET/POST数据的网页,通过服务器端发送请求,服务器充当一个到达第三方服务器代理。虽然使用广泛,但是这个方法却不够灵活,无法伸缩,并增加了处理请求的延迟(负载大时会更明显)。
•        在页面中使用框架元素创建新区域来访问任何第三方内容。没有返回数据的POSTs方式运行的很好,框架间由于有限的访问很少应用GET方式。但是试图下载文件时也会受到同源政策限制。
•        实现GET返回JSONP(JSON with Padding):在一个函数调用中包装的JSON数据,数据在一个方法调用中返回。当脚本加载时执行。因为同源策略不会阻止动态插入的代码,不会测试脚本是否与Web页面来自相同的域。
由Shindig提供的OpenSocial API是利用GET从社区网络中获取信息和POST更新信息。为了支持GET方式,我们充分利用JSONP,而为了支持POST方式,我们使用框架技术。
为了实现服务器上JSONP支持,我们使用了开源JSONP过滤器[18],不要求对Shindig的方案变动支持。在Shindig的Web.xml中定义过滤器用法(清单4):
<filter>
     <display-name>jsonp</display-name>
     <filter-name>jsonp</filter-name>
     <filter-class>org.jsonp.JsonpFilter</filter-class>
     <init-param>
       <param-name>jsonp</param-name>
       <param-value>jsonpCallback</param-value>
     </init-param>
     <init-param>
       <param-name>json-mime-types</param-name>
       <param-value>application/json</param-value>
     </init-param>
   </filter>
   <filter-mapping>
     <filter-name>jsonp</filter-name>
     <url-pattern>*</url-pattern>
   </filter-mapping>

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
14#
 楼主| 发表于 2010-2-27 18:35 | 只看该作者
清单4 配置JSONP过滤器
我们还必须稍微修改Shindig代码使之能够支持Post方式。Shindig发布版不允许内容类型为application/x-www-form-urlencoded,因为它与OAuth body signing冲突。因为我们没有使用OAuth和application/x-www-form-urlencoded的内容类型的POST浏览器,我们必须修改类org.apache.shindig.protocol.ContentTypes(清单5)和org.apache.shindig.protocol.DataServiceServlet(清单6)允许application/x-www-form-urlencoded:
………………….

public static void checkContentTypes(Set<String> allowedContentTypes,

      String contentType, boolean disallowUnknownContentTypes) throws InvalidContentTypeException {



    if (StringUtils.isEmpty(contentType)) {

       if (disallowUnknownContentTypes) {

        throw new InvalidContentTypeException(

            "No Content-Type specified. One of "

                + StringUtils.join(allowedContentTypes, ", ") + " is required");

       } else {

         // No content type specified, we can fail in other ways later.

         return;

       }

    }



    contentType = ContentTypes.extractMimePart(contentType);



//BL.  comented out to support   
//    if (ContentTypes.FORBIDDEN_CONTENT_TYPES.contains(contentType)) {
//      throw new InvalidContentTypeException(
//          "Cannot use disallowed Content-Type " + contentType);
//    }

..........................................

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
15#
 楼主| 发表于 2010-2-27 18:36 | 只看该作者
清单5 修改ContentTypes类
……………

public static final Set<String> ALLOWED_CONTENT_TYPES =

      new ImmutableSet.Builder<String>().addAll(ContentTypes.ALLOWED_JSON_CONTENT_TYPES)

          .addAll(ContentTypes.ALLOWED_XML_CONTENT_TYPES)

          .addAll(ContentTypes.FORBIDDEN_CONTENT_TYPES)

          .addAll(ContentTypes.ALLOWED_ATOM_CONTENT_TYPES).build();

……………………

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
16#
 楼主| 发表于 2010-2-27 18:36 | 只看该作者
清单6 修改DataServiceServlet类
另一个问题是,浏览器POST方式提交名称/值。虽然,Shindig支持POST名称/值,它也支持由POST body直接处理的数据。作为一个执行增加了一个额外的名称/值参数的主体内容。问题是,在浏览器提交的情况下,Body是空的而其参数的内容被覆盖。 org.apache.shindig.protocol.DefaultHandlerRegistry类(清单7)更改修复了这个问题。
   ……………..

public Future<?> execute(Map<String, String[]> parameters, Reader body,

                             SecurityToken token, BeanConverter converter) {

      try {

        // bind the body contents if available

        if (body != null) {

                String bString = IOUtils.toString(body);

                if(bString.length() > 0)

          parameters.put(operation.bodyParam(), new String[]{bString});

        }

        RequestItem item = methodCaller.getRestRequestItem(parameters, token, converter,

            beanJsonConverter);

        listener.executing(item);



        return methodCaller.call(handlerProvider.get(), item);

………………………………………..

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
17#
 楼主| 发表于 2010-2-27 18:36 | 只看该作者
清单7 禁止覆盖空消息体
最后,当POST方式不会返回任何数据,Shindig实现将空数据转换成一个空的JSON对象,返回的类型为“application/json”。这将导致浏览器尝试主动与用户会话。org.apache.shindig.protocol.DataServiceServlet(清单7)解决了这一问题:
org.apache.shindig.protocol.DataServiceServlet (Listing 7) solves this problem:

    servletResponse.setContentType(converter.getContentType());

    if (responseItem.getErrorCode() >= 200 && responseItem.getErrorCode() < 400) {

      Object response = responseItem.getResponse();

      // TODO: ugliness resulting from not using RestfulItem

      if (!(response instanceof DataCollection) && !(response instanceof RestfulCollection)) {

          //BL - modified to not return fake responce

              if(response instanceof Map){

                      if(((Map)response).isEmpty()){

                              servletResponse.setContentType("text/plain");

                              return;

                      }

              }

              response = ImmutableMap.of("entry", response);

      }

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
18#
 楼主| 发表于 2010-2-27 18:36 | 只看该作者
清单8 禁用空响应

示例应用程序

在这篇文章中,我们描述OpenSococial的实现,用于构造GeoSpatial OpenSocial mashup,允许用户和他的朋友把他们最喜欢的地方放在地图上(图6)

6.jpg (65.78 KB, 下载次数: 12)

6.jpg

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
19#
 楼主| 发表于 2010-2-27 18:37 | 只看该作者
图6 地图上用户和他的朋友

它还允许将用户信息和他最爱的地方以及社区网络信息(图7)发送给另一个朋友。

7.jpg (44.16 KB, 下载次数: 8)

7.jpg

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
20#
 楼主| 发表于 2010-2-27 18:37 | 只看该作者
这种简单的实现只是社区网络和地理空间数据之间许多潜在协同效应之一。基于以上所描述的结合两者的方法,能实现许多其他有趣的混搭网站。

结论

开源社区API的扩展使它很难开发出应用程序支持多种现有的社区网络。在本文中提出的一个解决方案,通过第三方提供的标准API“隐藏”前端实现差异来克服这些问题。 Apache Shindig,提供API和“插件”架构,大大简化了整个实现。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表