初始化

From Apache OpenOffice Wiki
< Zh‎ | Documentation
Revision as of 21:07, 14 July 2018 by Sancho (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search


作业的初始化通过调用其主接口方法完成,该调用还将启动作业。对于同步作业,执行环境将调用 <idlml>com.sun.star.task.XJob:execute</idlml>(),而异步作业则通过 <idlml>com.sun.star.task.XAsyncJob:executeAsync</idlml>() 运行。


这两种方法都接受一个参数 Arguments,它是 com.sun.star.beans.NamedValue 结构的序列。此序列描述了作业上下文。


它包含作业运行的环境,环境可以通知作业是由作业执行程序、分发框架,还是由全局事件广播器服务调用,并可能提供要处理的作业的框架或文档模型。


Tip.png 编写 UNO 组件 - 将组件集成到 OpenOffice.org - 协议处理程序 - 实现 说明如何使用框架来获取与其相关的文档模型。


如果已在配置分支 org.openoffice.Office.Jobs 中配置了作业,Arguments 参数还将生成配置数据。此数据将被分为存储在配置中的基本配置和附加参数。作业配置将在 编写 UNO 组件 - 将组件集成到 OpenOffice.org - 作业 - 配置 中介绍。


最后,Arguments 可以包含在运行时给定作业的动态参数。例如,如果作业已由分发框架调用,并且分发的命令 URL 使用了参数,这些参数可以通过执行参数传送给作业。


下表显示了执行 Arguments 的具体规范:

执行 Arguments 序列的元素
Environment < com.sun.star.beans.NamedValue > 序列。包含环境数据。定义了以下命名值:
EnvType 字符串型。确定在哪个环境中执行作业。定义的值:

"EXECUTOR"作业已通过在作业执行程序中调用 trigger() 执行 "DISPATCH"作业被分发为 vnd.sun.star.job: URL "DOCUMENTEVENT"作业已由全局事件广播器机制执行

EventName [optional] 字符串型。仅当 EnvType 为 "EXECUTOR" 或 "DOCUMENTEVENT" 时存在。包含此作业在配置中为其注册的事件的名称。在运行时期间,相同的组件实现可以使用此信息来处理不同的函数集。
Frame [optional] com.sun.star.frame.XFrame。仅当 EnvType 为 "DISPATCH" 时存在。包含此作业的框架上下文。而且,子列表 DynamicData 可以包含相应 com.sun.star.frame.XDispatch:dispatch() 请求的可选参数列表。
Model [optional] com.sun.star.frame.XModel。仅当 EnvType 为 "DOCUMENTEVENT" 时存在。包含可由作业使用的文档模型。
Config [optional] [sequence< com.sun.star.beans.NamedValue >]。包含作业配置属性的常规集(在 编写 UNO 组件 - 将组件集成到 OpenOffice.org - 作业 - 配置 中介绍),但不是作业特定的数据集,即,此子列表仅包括属性 AliasService,不包括属性 Arguments。属性 Arguments 在元素 JobConfig 中反映(请参阅下一个元素)。注意:此子列表仅在作业使用此数据配置时存在。
Alias 字符串型。此属性声明为配置集 Jobs 中相应集节点的名称。它必须是唯一名称,表示作业的结构化信息。
Service 字符串型。表示作业组件的 UNO 实现名称。
JobConfig [optional] [sequence< com.sun.star.beans.NamedValue >] 此子列表包含在作业配置的 Arguments 属性中指定的特定于作业的一组配置数据。其条目取决于作业实现。注意:此子列表仅在作业使用此数据配置时存在。
DynamicData [optional] [sequence< com.sun.star.beans.NamedValue >]。包含启动此作业执行的调用的可选参数。此外,如果 Environment-EnvType 为 "DISPATCH",它可以包含 com.sun.star.frame.XDispatch:dispatch 请求的参数。


以下示例显示作业如何分析给定的参数,以及如何检测执行作业时所在的环境:

  public synchronized java.lang.Object execute(com.sun.star.beans.NamedValue[] lArgs)
          throws com.sun.star.lang.IllegalArgumentException, com.sun.star.uno.Exception {
 
      // extract all possible sub list of given argument list
      com.sun.star.beans.NamedValue[] lGenericConfig = null;
      com.sun.star.beans.NamedValue[] lJobConfig = null;
      com.sun.star.beans.NamedValue[] lEnvironment = null;
      com.sun.star.beans.NamedValue[] lDispatchArgs = null;
 
      int c = lArgs.length;
      for (int i=0; i<c; ++i) {
          if (lArgs[i].Name.equals("Config"))
              lGenericConfig = (com.sun.star.beans.NamedValue[])
                  com.sun.star.uno.AnyConverter.toArray(lArgs[i].Value);
              else
                  if (lArgs[i].Name.equals("JobConfig"))
                      lJobConfig = (com.sun.star.beans.NamedValue[]) com.sun.star.uno.AnyConverter.toArray(lArgs[i].Value);
              else
                  if (lArgs[i].Name.equals("Environment"))
                      lEnvironment = (com.sun.star.beans.NamedValue[]) com.sun.star.uno.AnyConverter.toArray(lArgs[i].Value);
              else
                  if (lArgs[i].Name.equals("DynamicData"))
                      lDispatchArgs = (com.sun.star.beans.NamedValue[]) com.sun.star.uno.AnyConverter.toArray(lArgs[i].Value);
              else
                  // It is not realy an error - because unknown items can be ignored ...
                  throw new com.sun.star.lang.IllegalArgumentException("unknown sub list detected");
      }
 
      // Analyze the environment info. This sub list is the only guarenteed one!
      if (lEnvironment==null)
          throw new com.sun.star.lang.IllegalArgumentException("no environment");
 
      java.lang.String sEnvType = null;
      java.lang.String sEventName = null;
      com.sun.star.frame.XFrame xFrame = null; com.sun.star.frame.XModel xModel = null;
 
      c = lEnvironment.length;
      for (int i=0; i<c; ++i) {
          if (lEnvironment[i].Name.equals("EnvType"))
              sEnvType = com.sun.star.uno.AnyConverter.toString(lEnvironment[i].Value);
          else
              if (lEnvironment[i].Name.equals("EventName"))
                  sEventName = com.sun.star.uno.AnyConverter.toString(lEnvironment[i].Value);
              else
                  if (lEnvironment[i].Name.equals("Frame"))
                      xFrame = (com.sun.star.frame.XFrame)com.sun.star.uno.AnyConverter.toObject(
                          new com.sun.star.uno.Type(com.sun.star.frame.XFrame.class), lEnvironment[i].Value); 
              else
                  if (lEnvironment[i].Name.equals("Model"))
                      xModel = (com.sun.star.frame.XModel)com.sun.star.uno.AnyConverter.toObject( 
                          new com.sun.star.uno.Type(com.sun.star.frame.XModel.class), 
                                    lEnvironment[i].Value); 
      }
 
      // Further the environment property "EnvType" is required as minimum.
      if (
          (sEnvType==null) ||
          (
          (!sEnvType.equals("EXECUTOR" )) &&
          (!sEnvType.equals("DISPATCH" )) &&
          (!sEnvType.equals("DOCUMENTEVENT"))
          )
         )
      {
          throw new com.sun.star.lang.IllegalArgumentException("no valid value for EnvType");
      }
 
      // Analyze the set of shared config data.
      java.lang.String sAlias = null;
      if (lGenericConfig!=null) {
          c = lGenericConfig.length;
          for (int i=0; i<c; ++i) {
              if (lGenericConfig[i].Name.equals("Alias"))
                  sAlias = com.sun.star.uno.AnyConverter.toString(lGenericConfig[i].Value);
          }
      }
  }
Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages