Yes,addObjectParam is the point. I've wrongly used addCallParam. And using Regular Expression here to parse Constant and Mutable is very simple and clean.

The alternative setTable method is  as following:


        d.addSetProperties(pattern + "/Handler", "class", "handler");
        d.addObjectCreate(pathClass+"/*/Constant",ConstantProp.class);
        d.addSetNext(pathClass+"/*/Constant","addConstantProp");
        d.addSetProperties(pathClass+"/*/Constant");

        d.addObjectCreate(pathClass+"/*/Mutable",MutableProp.class);
        d.addSetNext(pathClass+"/*/Mutable","addMutableProp");
        d.addSetProperties(pathClass+"/*/Mutable");

        d.addCallMethod(pattern, "setType", 1);
        d.addObjectParam(pattern, 0, type);

First I think it won't work because of some other issue. Now I'm happy it's fine. Thanks Simone. For the coming Digester 3 , I hope it will be provided with a complete document that is rich in examples. You know current document is not easy to understand, I see after using it for a while.

Kurt


On Fri, 01 Apr 2011 22:32:12 +0800, Simone Tripodi <[email protected]> wrote:

Not sure to understand the question, but try with

       d.addCallMethod(pattern, "setType", 1);
       d.addCallParam(pattern, 0, "type");

if you want to extract the type from the XML (note the "type" instead
of simply type)

Otherwise,

       d.addCallMethod(pattern, "setType", 1);
       d.addObjectParam(pattern, 0, type);

if you need to set the type variable reference

HTH,
Simo

http://people.apache.org/~simonetripodi/
http://www.99soft.org/



On Fri, Apr 1, 2011 at 3:53 PM, Kurt Xu <[email protected]> wrote:
Hello Simone:
 Just below in method setTable is woring.

      d.addCallMethod(pattern, "setType", 1);
      d.addCallParam(pattern, 0, type);

  other part is ok.

Thanks.

Kurt



On Fri, 01 Apr 2011 21:05:08 +0800, Simone Tripodi
<[email protected]> wrote:

Holy cow, Kurt!!! :D
can you be more precise and highlight which is the part that doesn't
work? For what I see, there's one assCallParam() set in your Digetser
and that's for the Handler
Simo

http://people.apache.org/~simonetripodi/
http://www.99soft.org/



2011/4/1 Kurt Xu <[email protected]>:

Hi all digester users & developers:

 Today I use addCallMethod but it doesn't work as before.

the xml is below:


<?xml version="1.0" encoding="UTF-8"?>

<Project name="project1">
  <Functionality description="add comment" url="">
      <Action class="com.mygame.action.UserAction" method="entry"/>
      <BasicInfo kpiCategoryId="K01002" contentType="thread"
statisticsType="处理日"/>
      <Class name="com.mygame.bo.UserBOImpl" method="entry">
          <TextTable type="insert" name="MOCO_CODICMT">
              <Handler
class="com.mytest.siamon.util.DefaultSiamonHandler"/>
              <Main>
                  <Constant column="DeviceType" value="pc"/>
                  <Mutable property="cmtno" argidx="0"
column="PrimaryKey1"/>
              </Main>
              <Sub>
                  <Mutable property="writeid" argidx="0"
column="WriterId"/>
                  <Mutable property="contents" argidx="0"
column="Content"/>
                  <Constant column="TestType" value="test"/>
              </Sub>
          </TextTable>
      </Class>
  </Functionality>
</Project>

 there's a code about Mutable and Constant that they both can show up
under
Main or Sub, the former represents a mutable property and the latter
represents a constant property in out business logic. But the question
is
when TextTable element shows up, I want to set TableMap(XXXTable related
class, pojo)'s type as "txt" through addCallMethod. I research on
official
sample but it is not right in my code, it looks just the same as the
sample.

related java file:

1)ClassItem.java
package com.siamon.model.config;

import java.util.ArrayList;
import java.util.List;

public class ClassItem {

      private String method;
      private String name;
  private List<TableMap> tableMapList=new ArrayList<TableMap>();

  public ClassItem(String name, String method, List<TableMap>
tableMapList)
{
      this.name = name;
      this.method = method;
      this.tableMapList = tableMapList;
  }


  public ClassItem() {
  }

  public String getMethod() {
      return method;
  }

  public void setMethod(String method) {
      this.method = method;
  }

  public String getName() {
      return name;
  }

  public void setName(String name) {
      this.name = name;
  }


  public void addTableMap(TableMap tm){
      getTableMapList().add(tm);
  }

  public List<TableMap> getTableMapList() {
      return tableMapList;
  }
}

2)Project.java
package com.siamon.model;

import com.siamon.model.config.Functionality;

import java.util.ArrayList;
import java.util.List;

public class Project {
  private String name;
  private List<Functionality> functionalities=new
ArrayList<Functionality>();

  public void addFunctionality(Functionality func){
      functionalities.add(func);
  }

  public String getName() {
      return name;
  }

  public void setName(String name) {
      this.name = name;
  }

  public List<Functionality> getFunctionalities() {
      return functionalities;
  }


}

3)ConstantProp.java
package com.siamon.model.config;

public class ConstantProp {
  private String column;
  private String value;

  public String getColumn() {
      return column;
  }

  public void setColumn(String column) {
      this.column = column;
  }

  public String getValue() {
      return value;
  }

  public void setValue(String value) {
      this.value = value;
  }

  @Override
  public String toString() {
      return "ConstantProp [ " +
              "column='" + column + '\'' +
              ", value='" + value + '\'' +
              " ] ";
  }
}

4)MutableProp.java
package com.siamon.model.config;

public class MutableProp {
  private String property;
  private int argIndex;
  private String column;
  private String value;

  public String getProperty() {
      return property;
  }

  public void setProperty(String property) {
      this.property = property;
  }

  public int getArgIndex() {
      return argIndex;
  }

  public void setArgIndex(int argIndex) {
      this.argIndex = argIndex;
  }

  public String getColumn() {
      return column;
  }

  public void setColumn(String column) {
      this.column = column;
  }

  public String getValue() {
      return value;
  }

  public void setValue(String value) {
      this.value = value;
  }

  @Override
  public String toString() {
      return "MutableProp [ " +
              "property='" + property + '\'' +
              ", argIndex=" + argIndex +
              ", column='" + column + '\'' +
              ", value='" + value + '\'' +
              " ] ";
  }
}

5)TableMap.java
package com.siamon.model.config;

import java.util.ArrayList;
import java.util.List;

public class TableMap {
  private String type;
private String handler="com.nhstcorp.siamon.util.DefaultSiamonHandler";
  private List<ConstantProp> constantPropList=new
ArrayList<ConstantProp>();
private List<MutableProp> mutablePropList=new ArrayList<MutableProp>();

  public String getType() {
      return type;
  }

  public void setType(String type) {
      this.type = type;
  }

  public List<MutableProp> getMutablePropList() {
      return mutablePropList;
  }

  public List<ConstantProp> getConstantPropList() {
      return constantPropList;
  }

  public void addMutableProp(MutableProp prop){
     getMutablePropList().add(prop);
  }

  public void addConstantProp(ConstantProp prop){
      getConstantPropList().add(prop);
  }

  public String getHandler() {
      return handler;
  }

  public void setHandler(String handler) {
      this.handler = handler;
  }
}

6)Functionality.java
package com.siamon.model.config;

import java.util.*;

public class Functionality {

      private String url;
  private String description;
  private String actionName;
  private String actionMethod;
  private String kpiCategoryId;
  private String contentType;
  private String statisticsType;
  private List<ClassItem> classItems=new ArrayList<ClassItem>();
  private String projectName;

public Functionality(String projectName, String kpiCategoryId, String
contentType, String statisticsType) {
      this.projectName = projectName;
      this.kpiCategoryId = kpiCategoryId;
      this.contentType = contentType;
      this.statisticsType = statisticsType;
  }

  public Functionality() {
  }

  public String getUrl() {
      return url;
  }

  public void setUrl(String url) {
      this.url = url;
  }

  public String getDescription() {
      return description;
  }

  public void setDescription(String description) {
      this.description = description;
  }

  public String getActionName() {
      return actionName;
  }

  public void setActionName(String actionName) {
      this.actionName = actionName;
  }

  public String getActionMethod() {
      return actionMethod;
  }

  public void setActionMethod(String actionMethod) {
      this.actionMethod = actionMethod;
  }

  public String getKpiCategoryId() {
      return kpiCategoryId;
  }

  public void setKpiCategoryId(String kpiCategoryId) {
      this.kpiCategoryId = kpiCategoryId;
  }

  public String getContentType() {
      return contentType;
  }

  public void setContentType(String contentType) {
      this.contentType = contentType;
  }

  public String getStatisticsType() {
      return statisticsType;
  }

  public void setStatisticsType(String statisticsType) {
      this.statisticsType = statisticsType;
  }

  public List<ClassItem> getClassItems() {
      return classItems;
  }

  public void setClassItems(List<ClassItem> classItems) {
      this.classItems = classItems;
  }

  public String getProjectName() {
      return projectName;
  }

  public void setProjectName(String projectName) {
      this.projectName = projectName;
  }

  public ClassItem findClassItem(String clazz,String method){
      for (ClassItem ci:classItems){
          if (ci.getName().equals(clazz) &&
ci.getMethod().equals(method)){
              return ci;
          }
      }

      return null;
  }

  public void addClassItem(ClassItem ci){
      getClassItems().add(ci);
  }
}


7)parser method
private Project parseProject2(URL url) throws IOException, SAXException
{
      Digester d = new Digester();

      String pathFunc = "Project/Functionality";
      String pathClass = pathFunc + "/Class";


      d.addObjectCreate("Project", Project.class);
      d.addSetProperties("Project");

      d.addObjectCreate(pathFunc, Functionality.class);
      d.addSetNext(pathFunc, "addFunctionality");
      d.addSetProperties(pathFunc);
      d.addSetProperties(pathFunc + "/BasicInfo");

      d.addObjectCreate(pathClass, ClassItem.class);
      d.addSetNext(pathClass, "addClassItem");

      String pathTextTable = pathClass + "/TextTable";
      d.addSetProperties(pathClass);
      d.addObjectCreate(pathTextTable, TableMap.class);
      d.addSetNext(pathTextTable,"addTableMap");


      setTable(d, pathClass,"TextTable","txt");

      d.parse(url);
      Project project = (Project) d.getRoot();

      System.out.println();

      return project;
  }

 private void setTable(Digester d, String pathClass, String tableElem,
String type){
      String pattern=pathClass + "/"+tableElem;

      d.addObjectCreate(pattern+"/Main/Constant",ConstantProp.class);
      d.addSetNext(pattern+"/Main/Constant", "addConstantProp");
      d.addSetProperties(pattern+ "/Main/Constant");

      d.addObjectCreate(pattern+"/Main/Mutable",MutableProp.class);
      d.addSetNext(pattern + "/Main/Mutable", "addMutableProp");
      d.addSetProperties(pattern+ "/Main/Mutable");

      d.addObjectCreate(pattern+"/Sub/Constant",ConstantProp.class);
      d.addSetNext(pattern+"/Sub/Constant", "addConstantProp");
      d.addSetProperties(pattern+ "/Sub/Constant");

      d.addObjectCreate(pattern+"/Sub/Mutable",MutableProp.class);
      d.addSetNext(pattern + "/Sub/Mutable", "addMutableProp");
      d.addSetProperties(pattern+ "/Sub/Mutable");


      d.addSetProperties(pathClass + "/Handler", "class", "handler");
      d.addCallMethod(pattern, "setType", 1);
      d.addCallParam(pattern, 0, type);

      d.addSetProperties(pattern + "/Handler", "class", "handler");
  }

that's all source, the issue is the method setTable can't setType for a TableMap class successfully. It looks very normal, nothing seem wrong,but just doesn't work. I also attach the source to the email, don't know if
it's
allowed.

 Thanks a lot
Kurt

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



--
Using Opera's revolutionary email client: http://www.opera.com/mail/


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



--
Using Opera's revolutionary email client: http://www.opera.com/mail/


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to