public void addRuleInstances(Digester digester) {
   digester.addObjectCreate(prefix, clazz);
   digester.addBeanPropertySetter(prefix + "/" + TAG_NAME, "name");
   digester.addBeanPropertySetter(prefix + "/" + TAG_GROUP, "group");
   digester.addBeanPropertySetter(prefix + "/" + TAG_DESCRIPTION, "description");
   digester.addBeanPropertySetter(prefix + "/" + TAG_VOLATILITY, "volatility");
   digester.addRule(
       prefix + "/" + TAG_MISFIRE_INSTRUCTION, new MisfireInstructionRule("misfireInstruction"));
   digester.addBeanPropertySetter(prefix + "/" + TAG_CALENDAR_NAME, "calendarName");
   digester.addObjectCreate(prefix + "/" + TAG_JOB_DATA_MAP, JobDataMap.class);
   digester.addCallMethod(
       prefix + "/" + TAG_JOB_DATA_MAP + "/" + TAG_ENTRY,
       "put",
       2,
       new Class[] {Object.class, Object.class});
   digester.addCallParam(prefix + "/" + TAG_JOB_DATA_MAP + "/" + TAG_ENTRY + "/" + TAG_KEY, 0);
   digester.addCallParam(prefix + "/" + TAG_JOB_DATA_MAP + "/" + TAG_ENTRY + "/" + TAG_VALUE, 1);
   digester.addSetNext(prefix + "/" + TAG_JOB_DATA_MAP, "setJobDataMap");
   digester.addBeanPropertySetter(prefix + "/" + TAG_JOB_NAME, "jobName");
   digester.addBeanPropertySetter(prefix + "/" + TAG_JOB_GROUP, "jobGroup");
   Converter converter = new DateConverter(new String[] {XSD_DATE_FORMAT, DTD_DATE_FORMAT});
   digester.addRule(
       prefix + "/" + TAG_START_TIME,
       new SimpleConverterRule("startTime", converter, Date.class));
   digester.addRule(
       prefix + "/" + TAG_END_TIME, new SimpleConverterRule("endTime", converter, Date.class));
 }
  public static GoPluginDescriptor parseXML(
      InputStream pluginXML,
      String pluginJarFileLocation,
      File pluginBundleLocation,
      boolean isBundledPlugin)
      throws IOException, SAXException {
    Digester digester = initDigester();
    GoPluginDescriptorParser parserForThisXML =
        new GoPluginDescriptorParser(pluginJarFileLocation, pluginBundleLocation, isBundledPlugin);
    digester.push(parserForThisXML);

    digester.addCallMethod("go-plugin", "createPlugin", 2);
    digester.addCallParam("go-plugin", 0, "id");
    digester.addCallParam("go-plugin", 1, "version");

    digester.addCallMethod("go-plugin/about", "createAbout", 4);
    digester.addCallParam("go-plugin/about/name", 0);
    digester.addCallParam("go-plugin/about/version", 1);
    digester.addCallParam("go-plugin/about/target-go-version", 2);
    digester.addCallParam("go-plugin/about/description", 3);

    digester.addCallMethod("go-plugin/about/vendor", "createVendor", 2);
    digester.addCallParam("go-plugin/about/vendor/name", 0);
    digester.addCallParam("go-plugin/about/vendor/url", 1);

    digester.addCallMethod("go-plugin/about/target-os/value", "addTargetOS", 1);
    digester.addCallParam("go-plugin/about/target-os/value", 0);

    digester.parse(pluginXML);

    return parserForThisXML.descriptor;
  }
Esempio n. 3
0
  public void addRuleInstances(Digester digester) {
    // allow client package conversions to be configured.
    digester.addObjectCreate(
        "enunciate/modules/php/package-conversions/convert", PackageModuleConversion.class);
    digester.addSetProperties("enunciate/modules/php/package-conversions/convert");
    digester.addSetNext(
        "enunciate/modules/php/package-conversions/convert", "addClientPackageConversion");

    digester.addCallMethod("enunciate/modules/php/facets/include", "addFacetInclude", 1);
    digester.addCallParam("enunciate/modules/php/facets/include", 0, "name");
    digester.addCallMethod("enunciate/modules/php/facets/exclude", "addFacetExclude", 1);
    digester.addCallParam("enunciate/modules/php/facets/exclude", 0, "name");
  }
  void processProperties(final String xml) throws IOException, SAXException {

    final Digester digester = getDigester();
    digester.addObjectCreate(XmlConfiguration.properties, Properties.class);
    digester.addCallMethod(XmlConfiguration.property, "put", 2);
    digester.addCallParam(XmlConfiguration.property, 0, "key");
    digester.addCallParam(XmlConfiguration.property, 1, "value");

    final StringReader reader = new StringReader(xml.trim());

    final Object o;

    try {

      o = digester.parse(reader);
    } catch (SAXException e) {

      if (e.getException().toString().equals("java.lang.NullPointerException")) {

        throw new InvalidConfigurationException(
            "Invalid XML configuration for <properties>. <property> must only contain both a key and a value attribute.",
            e);
      }

      // at this time, I don't even know how to get to this path, but I'm sure some user will figure
      // it out : P
      throw new InvalidConfigurationException(
          "Unable to parse XML configuration for <properties>: " + e.getMessage(), e);
    }

    if (o == null) {

      return;
    }

    final Properties properties = (Properties) o;

    addProperties(properties);
  }
Esempio n. 5
0
 /**
  * Reading of the configuration
  *
  * @param pStream stream
  * @throws ConfigurationException exception if an error occurs
  */
 public void parse(InputStream pStream) throws ConfigurationException {
   StringBuffer errors = new StringBuffer();
   Digester digester =
       preSetupDigester(
           "-//Quartz Configuration DTD //EN", "/config/quartz-timer-config.dtd", errors);
   // Root directory treatment
   digester.addCallMethod(
       "quartz-timer-configuration/quartzKey", "setQuartzKey", 1, new Class[] {String.class});
   digester.addCallParam("quartz-timer-configuration/quartzKey", 0);
   digester.push(this);
   // Parser call
   parse(digester, pStream, errors);
   if (errors.length() > 0) {
     throw new ConfigurationException(
         QuartzMessages.getString(
             "quartz.exception.configuration.parse", new Object[] {errors.toString()}));
   }
 }
 /** Add the default set of digest rules */
 protected void addDefaultDigesterRules(Digester digester) {
   digester.addSetProperties(TAG_QUARTZ, TAG_OVERWRITE_EXISTING_JOBS, "overWriteExistingJobs");
   digester.addObjectCreate(TAG_QUARTZ + "/" + TAG_JOB_LISTENER, "jobListener", "class-name");
   digester.addCallMethod(TAG_QUARTZ + "/" + TAG_JOB_LISTENER, "setName", 1);
   digester.addCallParam(TAG_QUARTZ + "/" + TAG_JOB_LISTENER, 0, "name");
   digester.addSetNext(TAG_QUARTZ + "/" + TAG_JOB_LISTENER, "addListenerToSchedule");
   digester.addRuleSet(
       new CalendarRuleSet(TAG_QUARTZ + "/" + TAG_CALENDAR, "addCalendarToSchedule"));
   digester.addRuleSet(new CalendarRuleSet("*/" + TAG_BASE_CALENDAR, "setBaseCalendar"));
   digester.addObjectCreate(TAG_QUARTZ + "/" + TAG_JOB, JobSchedulingBundle.class);
   digester.addObjectCreate(TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_JOB_DETAIL, JobDetail.class);
   digester.addBeanPropertySetter(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_JOB_DETAIL + "/" + TAG_NAME, "name");
   digester.addBeanPropertySetter(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_JOB_DETAIL + "/" + TAG_GROUP, "group");
   digester.addBeanPropertySetter(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_JOB_DETAIL + "/" + TAG_DESCRIPTION, "description");
   digester.addBeanPropertySetter(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_JOB_DETAIL + "/" + TAG_JOB_CLASS, "jobClass");
   digester.addCallMethod(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_JOB_DETAIL + "/" + TAG_JOB_LISTENER_REF,
       "addJobListener",
       0);
   digester.addBeanPropertySetter(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_JOB_DETAIL + "/" + TAG_VOLATILITY, "volatility");
   digester.addBeanPropertySetter(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_JOB_DETAIL + "/" + TAG_DURABILITY, "durability");
   digester.addBeanPropertySetter(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_JOB_DETAIL + "/" + TAG_RECOVER, "requestsRecovery");
   digester.addObjectCreate(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_JOB_DETAIL + "/" + TAG_JOB_DATA_MAP,
       JobDataMap.class);
   digester.addCallMethod(
       TAG_QUARTZ
           + "/"
           + TAG_JOB
           + "/"
           + TAG_JOB_DETAIL
           + "/"
           + TAG_JOB_DATA_MAP
           + "/"
           + TAG_ENTRY,
       "put",
       2,
       new Class[] {Object.class, Object.class});
   digester.addCallParam(
       TAG_QUARTZ
           + "/"
           + TAG_JOB
           + "/"
           + TAG_JOB_DETAIL
           + "/"
           + TAG_JOB_DATA_MAP
           + "/"
           + TAG_ENTRY
           + "/"
           + TAG_KEY,
       0);
   digester.addCallParam(
       TAG_QUARTZ
           + "/"
           + TAG_JOB
           + "/"
           + TAG_JOB_DETAIL
           + "/"
           + TAG_JOB_DATA_MAP
           + "/"
           + TAG_ENTRY
           + "/"
           + TAG_VALUE,
       1);
   digester.addSetNext(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_JOB_DETAIL + "/" + TAG_JOB_DATA_MAP,
       "setJobDataMap");
   digester.addSetNext(TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_JOB_DETAIL, "setJobDetail");
   digester.addRuleSet(
       new TriggerRuleSet(
           TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_TRIGGER + "/" + TAG_SIMPLE,
           SimpleTrigger.class));
   digester.addBeanPropertySetter(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_TRIGGER + "/" + TAG_SIMPLE + "/" + TAG_REPEAT_COUNT,
       "repeatCount");
   digester.addBeanPropertySetter(
       TAG_QUARTZ
           + "/"
           + TAG_JOB
           + "/"
           + TAG_TRIGGER
           + "/"
           + TAG_SIMPLE
           + "/"
           + TAG_REPEAT_INTERVAL,
       "repeatInterval");
   digester.addSetNext(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_TRIGGER + "/" + TAG_SIMPLE, "addTrigger");
   digester.addRuleSet(
       new TriggerRuleSet(
           TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_TRIGGER + "/" + TAG_CRON, CronTrigger.class));
   digester.addBeanPropertySetter(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_TRIGGER + "/" + TAG_CRON + "/" + TAG_CRON_EXPRESSION,
       "cronExpression");
   digester.addRule(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_TRIGGER + "/" + TAG_CRON + "/" + TAG_TIME_ZONE,
       new SimpleConverterRule("timeZone", new TimeZoneConverter(), TimeZone.class));
   digester.addSetNext(
       TAG_QUARTZ + "/" + TAG_JOB + "/" + TAG_TRIGGER + "/" + TAG_CRON, "addTrigger");
   digester.addSetNext(TAG_QUARTZ + "/" + TAG_JOB, "addJobToSchedule");
 }
Esempio n. 7
0
  /**
   * Method that uses the {@link org.apache.commons.digester.Digester} to read the objects from the
   * given xml-File an build the java-Objects in a parent-child Hirachy.
   *
   * @param _xml URL to the XML-File
   */
  public void readXMLFile(final URL _xml) {
    Digester digester = new Digester();

    digester.setValidating(false);

    digester.addObjectCreate("import", RootObject.class);

    // Read the Definitions
    digester.addCallMethod("import/definition/date", "setDateFormat", 1);
    digester.addCallParam("import/definition/date", 0, "format");

    // Read OrderObject
    digester.addFactoryCreate("import/definition/order", new OrderObjectFactory(), false);
    digester.addCallMethod(
        "import/definition/order/attribute",
        "addAttribute",
        3,
        new Class[] {Integer.class, String.class, String.class});
    digester.addCallParam("import/definition/order/attribute", 0, "index");
    digester.addCallParam("import/definition/order/attribute", 1, "name");
    digester.addCallParam("import/definition/order/attribute", 2, "criteria");
    digester.addSetNext("import/definition/order", "addOrder", "org.efaps.importer.OrderObject");

    // Read DefaultObject
    digester.addObjectCreate("import/definition/default", DefaultObject.class);
    digester.addCallMethod("import/definition/default", "addDefault", 3);
    digester.addCallParam("import/definition/default", 0, "type");
    digester.addCallParam("import/definition/default", 1, "name");
    digester.addCallParam("import/definition/default", 2);

    digester.addObjectCreate("import/definition/default/linkattribute", ForeignObject.class);
    digester.addCallMethod("import/definition/default/linkattribute", "setLinkAttribute", 2);
    digester.addCallParam("import/definition/default/linkattribute", 0, "name");
    digester.addCallParam("import/definition/default/linkattribute", 1, "type");

    digester.addCallMethod(
        "import/definition/default/linkattribute/queryattribute", "addAttribute", 2);
    digester.addCallParam("import/definition/default/linkattribute/queryattribute", 0, "name");
    digester.addCallParam("import/definition/default/linkattribute/queryattribute", 1);

    digester.addSetNext(
        "import/definition/default/linkattribute", "addLink", "org.efaps.importer.ForeignObject");

    // Create the Objects
    digester.addFactoryCreate("*/object", new InsertObjectFactory(), false);

    digester.addCallMethod("*/object/attribute", "addAttribute", 3);
    digester.addCallParam("*/object/attribute", 0, "name");
    digester.addCallParam("*/object/attribute", 1);
    digester.addCallParam("*/object/attribute", 2, "unique");

    digester.addCallMethod("*/object/file", "setCheckinObject", 2);
    digester.addCallParam("*/object/file", 0, "name");
    digester.addCallParam("*/object/file", 1, "url");

    digester.addCallMethod("*/object/parentattribute", "setParentAttribute", 2);
    digester.addCallParam("*/object/parentattribute", 0, "name");
    digester.addCallParam("*/object/parentattribute", 1, "unique");

    digester.addCallMethod("*/object/linkattribute", "addUniqueAttribute", 2);
    digester.addCallParam("*/object/linkattribute", 0, "unique");
    digester.addCallParam("*/object/linkattribute", 1, "name");

    digester.addSetNext("*/object", "addChild", "org.efaps.importer.InsertObject");

    digester.addObjectCreate("*/object/linkattribute", ForeignObject.class);
    digester.addCallMethod("*/object/linkattribute", "setLinkAttribute", 2);
    digester.addCallParam("*/object/linkattribute", 0, "name");
    digester.addCallParam("*/object/linkattribute", 1, "type");

    digester.addCallMethod("*/object/linkattribute/queryattribute", "addAttribute", 2);
    digester.addCallParam("*/object/linkattribute/queryattribute", 0, "name");
    digester.addCallParam("*/object/linkattribute/queryattribute", 1);

    digester.addSetNext("*/object/linkattribute", "addLink", "org.efaps.importer.ForeignObject");

    try {
      this.root = (RootObject) digester.parse(_xml);
    } catch (IOException e) {
      e.printStackTrace(System.err);
    } catch (SAXException e) {
      e.printStackTrace(System.err);
    }
  }
Esempio n. 8
0
  /**
   * Create Digester rules for manufacturers and models
   *
   * @return
   */
  protected Digester createManufacturerDigester() {
    // Initialize the digester
    Digester digester = new Digester();
    digester.setValidating(false);
    // Manufacturer stage
    digester.addObjectCreate("*/Manufacturer", ManufacturerItem.class);
    digester.addBeanPropertySetter("*/Manufacturer/ExternalID", "externalID");
    digester.addBeanPropertySetter("*/Manufacturer/Name", "name");
    digester.addBeanPropertySetter("*/Manufacturer/Description", "description");
    digester.addSetNext("*/Manufacturer", "add");

    digester.addCallMethod("*/Models", "addIncludeFile4Model", 1);
    digester.addCallParam("*/Models", 0, "filename");

    // Model stage
    digester.addFactoryCreate("*/Models/Model", ModelItemObjectCreationFactory.class);
    // digester.addObjectCreate("*/Models/Model", ModelItem.class);
    digester.addSetNext("*/Models/Model", "addModel");

    // Basic information
    // digester.addCallMethod("*/Models/Model", "setFamilyID", 1);
    // digester.addCallParam("*/Models/Model", 0, "family");
    digester.addBeanPropertySetter("*/Models/Model/ExternalID", "externalID");
    digester.addBeanPropertySetter("*/Models/Model/Name", "name");
    digester.addBeanPropertySetter("*/Models/Model/Description", "description");
    // digester.addBeanPropertySetter("*/Models/Model/FamilyID", "familyID");
    digester.addBeanPropertySetter("*/Models/Model/IconFile", "iconFile");
    digester.addBeanPropertySetter("*/Models/Model/IsOmaDmEnabled", "isOmaDmEnabled");
    digester.addBeanPropertySetter("*/Models/Model/OmaDmVersion", "omaDmVersion");
    digester.addBeanPropertySetter("*/Models/Model/IsOmaCpEnabled", "isOmaCpEnabled");
    digester.addBeanPropertySetter("*/Models/Model/OmaCpVersion", "omaCpVersion");
    digester.addBeanPropertySetter("*/Models/Model/IsNokiaOtaEnabled", "isNokiaOtaEnabled");
    digester.addBeanPropertySetter("*/Models/Model/NokiaOtaVersion", "nokiaOtaVersion");
    digester.addBeanPropertySetter(
        "*/Models/Model/SupportedDownloadMethods", "supportedDownloadMethods");
    digester.addBeanPropertySetter("*/Models/Model/FirmwareVersionNode", "firmwareVersionNode");
    digester.addBeanPropertySetter("*/Models/Model/FirmwareUpdateNode", "firmwareUpdateNode");
    digester.addBeanPropertySetter("*/Models/Model/FirmwareDownloadNode", "firmwareDownloadNode");
    digester.addBeanPropertySetter(
        "*/Models/Model/FirmwareDownloadAndUpdateNode", "firmwareDownloadAndUpdateNode");
    digester.addBeanPropertySetter("*/Models/Model/FirmwareStatusNode", "firmwareStatusNode");
    // DDF Information
    digester.addCallMethod("*/Models/Model/DDFs/DDF", "addDdfFile", 1);
    digester.addCallParam("*/Models/Model/DDFs/DDF", 0, "filename");
    // DM Profile Mappings
    digester.addCallMethod(
        "*/Models/Model/ProfileMappings/ProfileMapping", "addProfileMappingFile", 1);
    digester.addCallParam("*/Models/Model/ProfileMappings/ProfileMapping", 0, "filename");
    // CP Templates
    digester.addCallMethod("*/Models/Model/CPTemplates", "addCpTemplatesFiles", 1);
    digester.addCallParam("*/Models/Model/CPTemplates", 0, "filename");
    // TAC Informations
    digester.addCallMethod("*/Models/Model/TACs/TAC", "addTac", 1);
    digester.addCallParam("*/Models/Model/TACs/TAC", 0);
    // Firmwares
    digester.addObjectCreate("*/Models/Model/Firmwares/Firmware", FirmwareItem.class);
    digester.addBeanPropertySetter("*/Models/Model/Firmwares/Firmware/FromVersion", "fromVersion");
    digester.addBeanPropertySetter("*/Models/Model/Firmwares/Firmware/ToVersion", "toVersion");
    digester.addBeanPropertySetter("*/Models/Model/Firmwares/Firmware/Status", "status");
    digester.addBeanPropertySetter("*/Models/Model/Firmwares/Firmware/Filename", "filename");
    digester.addSetNext("*/Models/Model/Firmwares/Firmware", "addFirmware");
    // Specifications
    digester.addCallMethod("*/Models/Model/Specifications/Specification", "setSpecification", 3);
    digester.addCallParam("*/Models/Model/Specifications/Specification", 0, "category");
    digester.addCallParam("*/Models/Model/Specifications/Specification", 1, "name");
    digester.addCallParam("*/Models/Model/Specifications/Specification", 2, "value");

    // Model Family stage
    digester.addFactoryCreate("*/Models/Family", ModelFamilyItemObjectCreationFactory.class);
    // digester.addObjectCreate("*/Models/Family", ModelFamilyItem.class);
    digester.addSetNext("*/Models/Family", "addModelFamily");
    // Basic information
    // digester.addCallMethod("*/Models/Family", "setParentID", 1);
    // digester.addCallParam("*/Models/Family", 0, "parent");
    // digester.addSetNestedProperties("*/Models/Family", "parent", "parentID");
    digester.addBeanPropertySetter("*/Models/Family/ExternalID", "externalID");
    digester.addBeanPropertySetter("*/Models/Family/Name", "name");
    digester.addBeanPropertySetter("*/Models/Family/Description", "description");
    // digester.addBeanPropertySetter("*/Models/Family/ParentID", "parentID");
    digester.addBeanPropertySetter("*/Models/Family/IconFile", "iconFile");
    digester.addBeanPropertySetter("*/Models/Family/IsOmaDmEnabled", "isOmaDmEnabled");
    digester.addBeanPropertySetter("*/Models/Family/OmaDmVersion", "omaDmVersion");
    digester.addBeanPropertySetter("*/Models/Family/IsOmaCpEnabled", "isOmaCpEnabled");
    digester.addBeanPropertySetter("*/Models/Family/OmaCpVersion", "omaCpVersion");
    digester.addBeanPropertySetter("*/Models/Family/IsNokiaOtaEnabled", "isNokiaOtaEnabled");
    digester.addBeanPropertySetter("*/Models/Family/NokiaOtaVersion", "nokiaOtaVersion");
    digester.addBeanPropertySetter(
        "*/Models/Family/SupportedDownloadMethods", "supportedDownloadMethods");
    digester.addBeanPropertySetter("*/Models/Family/FirmwareVersionNode", "firmwareVersionNode");
    digester.addBeanPropertySetter("*/Models/Family/FirmwareUpdateNode", "firmwareUpdateNode");
    digester.addBeanPropertySetter("*/Models/Family/FirmwareDownloadNode", "firmwareDownloadNode");
    digester.addBeanPropertySetter(
        "*/Models/Family/FirmwareDownloadAndUpdateNode", "firmwareDownloadAndUpdateNode");
    digester.addBeanPropertySetter("*/Models/Family/FirmwareStatusNode", "firmwareStatusNode");
    // DDF Information
    digester.addCallMethod("*/Models/Family/DDFs/DDF", "addDdfFile", 1);
    digester.addCallParam("*/Models/Family/DDFs/DDF", 0, "filename");
    // DM Profile Mappings
    digester.addCallMethod(
        "*/Models/Family/ProfileMappings/ProfileMapping", "addProfileMappingFile", 1);
    digester.addCallParam("*/Models/Family/ProfileMappings/ProfileMapping", 0, "filename");
    // CP Templates
    digester.addCallMethod("*/Models/Family/CPTemplates", "addCpTemplatesFiles", 1);
    digester.addCallParam("*/Models/Family/CPTemplates", 0, "filename");
    // Firmwares
    digester.addObjectCreate("*/Models/Family/Firmwares/Firmware", FirmwareItem.class);
    digester.addBeanPropertySetter("*/Models/Family/Firmwares/Firmware/FromVersion", "fromVersion");
    digester.addBeanPropertySetter("*/Models/Family/Firmwares/Firmware/ToVersion", "toVersion");
    digester.addBeanPropertySetter("*/Models/Family/Firmwares/Firmware/Status", "status");
    digester.addBeanPropertySetter("*/Models/Family/Firmwares/Firmware/Filename", "filename");
    digester.addSetNext("*/Models/Family/Firmwares/Firmware", "addFirmware");
    // Specifications
    digester.addCallMethod("*/Models/Family/Specifications/Specification", "setSpecification", 3);
    digester.addCallParam("*/Models/Family/Specifications/Specification", 0, "category");
    digester.addCallParam("*/Models/Family/Specifications/Specification", 1, "name");
    digester.addCallParam("*/Models/Family/Specifications/Specification", 2, "value");

    return (digester);
  }