如何从atg中的ordertools组件检索订单或如何测试orderlookup droplet api

时间:2014-03-15 18:07:25

标签: java atg atg-droplet atg-dust

我试图通过传递一些参数来命令查看Droplet API。我假设必需的参数是userId和organisationIds我已经通过了另外我也已经通过" state"参数。所有这些参数都通过请求传递,然后调用droplet的服务方法。但是服务方法没有返回任何内容。我的目标是检查这个droplet是否检索到预期的命令集。我们可以使用droplet invoker但是我试过这种方式,但它没有工作可能是我错过了什么。请帮助我! 当我尝试使用OrderLookUp API时,这是我的代码

DynamoHttpServletRequest request = ServletUtil.getCurrentRequest();

    mTestService.setCurrentRequest(request);
    if (request == null) {
        mTestService.vlogError("Request is null.");
        Assert.fail("Request is null ");
    }
    else
    {
        Object droplet = mTestService
                .getRequestScopedComponent("OrderLookupDroplet");

        OrderLookupDroplet=(OrderLookup) droplet;
        request.setParameter("state", "submitted");
        request.setParameter("organisationIds", organizationIds);
        request.setParameter("userId", userId);
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        DynamoHttpServletRequest dynRequest = (DynamoHttpServletRequest) request;
        TestingDynamoHttpServletRequest wrappedRequest = new TestingDynamoHttpServletRequest(
                dynRequest, buffer);
        TestingDynamoHttpServletResponse wrappedResponce = new TestingDynamoHttpServletResponse(
                dynRequest.getResponse());
         OrderLookupDroplet.service(wrappedRequest, wrappedResponce);
    }

以上示例只是代码的一部分..

这是我尝试使用Droplet调用程序时的代码

DropletInvoker invoker = new DropletInvoker(mNucleus);
        invoker.getRequest().setParameter("state", "submitted");
      //  String [] siteIds = {"siteA", "siteB"};
      //  invoker.getRequest().setParameter("siteIds", Arrays.asList(siteIds));
        String [] organizationIds = {"OrgA", "OrgB"};
        invoker.getRequest().setParameter("organizationIds", organizationIds);
        String [] orderIds = {"orderautouser001OrgA" , "orderautouser001OrgB"};
        invokeDroplet(invoker, "autouser001", orderIds);
......

protected void invokeDroplet(DropletInvoker pInvoker, String pUserId, String[] pOrderIds) throws Exception
  {
    Map<String, Object> localParams = new HashMap();
    localParams.put("userId", pUserId);
    DropletResult result = pInvoker.invokeDroplet("/atg/commerce/order/OrderLookup", localParams);
    RenderedOutputParameter oparam = result.getRenderedOutputParameter("output", 0);

    assertNotNull("'output' oparam was not rendered", oparam);

    assertEquals("Check totalCount.", pOrderIds.length, oparam.getFrameParameter("totalCount"));

    List<Order> orders = (List<Order>)oparam.getFrameParameter("result");
    assertEquals("Check order array length.", pOrderIds.length, orders.size());
    for (int index = 0; index < pOrderIds.length; index++) {
      boolean found = false;
      for (Order order: orders) {
        if (pOrderIds[index].equals(order.getId())) {
          found = true;
          break;
        }
      }
      assertTrue("Expected orderId " + pOrderIds[index] + " not found in result array", found);
    }

在第一种情况下,我不知道如何通过直接使用orderlookup api来检索订单....在第二种情况下,虽然我知道如何使用它,但仍然失败!请帮帮我..谢谢提前

3 个答案:

答案 0 :(得分:1)

你不应该在java类中使用它们,它们只应该在jsp页面中使用。有关在jsp页面上使用它的例子hot的OrderLookup的文档是here

如果要获取存储在存储库中的订单或任何其他数据,则应使用存储库API和RQL(存储库查询语言)。示例如何从存储库中获取数据,您可以找到here和RQL语法here

答案 1 :(得分:1)

感谢您发表意见。好消息是我们可以调用任何其他API的小滴

OrderLookup droplet = (OrderLookup) sNucleus.resolveName("/atg/commerce/order/OrderLookup");
        ServletTestUtils utils = new ServletTestUtils();
        mRequest = utils.createDynamoHttpServletRequestForSession(sNucleus, null, null);
        ServletUtil.setCurrentRequest(mRequest);
        mResponse = new DynamoHttpServletResponse();
        mRequest.setResponse(mResponse);
        mResponse.setRequest(mRequest);
        mResponse.setResponse(new GenericHttpServletResponse());
        mRequest.setParameter("userId", "publishing");

        droplet.setSearchByUserId(true);
        droplet.service(mRequest, mResponse);
        ArrayList<Order> orders = (ArrayList<Order>) mRequest.getObjectParameter("result");

这里的“结果”参数是这个droplet设置的输出参数。而userId我硬编码为我已创建的“发布”.Inore servletTestUtils类是由我创建的,这与这里的droplet理论没什么关系:)

答案 2 :(得分:0)

我假设您的代码示例,并且您提到DropletInvoker,您正在编写单元测试,并且这不是功能代码。

如果它是功能代码,那么你真的真的,不应该从另一个Nucleus组件调用Droplet。 Droplet仅存在于JSP页面中使用。如果您需要Java代码中Droplet的功能,您应该将Droplet重构为包含主逻辑的服务,以及一个简单地充当服务外观的Droplet,以允许从页面调用它。

对于OrderLookup外观Droplet,您无需重构任何内容。要使用的服务应为OrderManagerOrderTools,具体取决于您的需求。请注意,Order对象和Order存储库项之间存在差异,您应该更喜欢使用订单对象 - 因此,如果您确实需要,请直接使用Order Repository。