You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@locus.apache.org on 2000/11/01 22:39:38 UTC

cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/util/xml SaxContext.java XmlMapper.java

costin      00/11/01 13:39:38

  Modified:    src/share/org/apache/tomcat/util/xml SaxContext.java
                        XmlMapper.java
  Log:
  Added few more helper methods to the xml mapper.
  - you can define "variables" ( a global Hashtable ) ( that will
   eliminate the need for intermediary objects )
  - shortcuts for common accesses to current and previous object
  
  Revision  Changes    Path
  1.2       +38 -7     jakarta-tomcat/src/share/org/apache/tomcat/util/xml/SaxContext.java
  
  Index: SaxContext.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/xml/SaxContext.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SaxContext.java	2000/02/08 20:13:32	1.1
  +++ SaxContext.java	2000/11/01 21:39:35	1.2
  @@ -16,32 +16,55 @@
   // XXX this interface is not final, but a prototype.
   
   /** SAX Context - used to match and perform actions 
  - *    provide access to the current stack and XML elements.
  + *  provide access to the current stack and XML elements.
  + * 
  + *  We maintain a stack with all elements and their attributes.
  + *  We also support a stack of objects that can be used as in a
  + *  stack-based programming language.
    *
    * @author costin@dnt.ro
    */
   public interface SaxContext  {
   
  -    // -------------------- Access to parsing context
  +    // -------------------- Access to the element stack
   
  +    /** Body of the last tag.
  +     */
  +    public String getBody();
  +
  +    /** Attributes of the current tag
  +     */
  +    public AttributeList getCurrentAttributes();
  +
  +    /** Current element
  +     */
  +    public String getCurrentElement();
  +
  +
       /** Depth of the tag stack.
  +     *  XXX getElementDepth() ?
        */
       public int getTagCount();
   
  -    /** Access attributes of a particular tag
  +    /** Random access to attributes of a particular element.
        */
       public AttributeList getAttributeList( int pos );
   
  -    /** Access a particular tag
  +    /** Random Access a particular parent element
  +     *  XXX getElement() is a better name
        */
       public String getTag( int pos );
   
  -    /** Body of the last tag
  -     */
  -    public String getBody();
   
  +
       // -------------------- Object stack
   
  +    public void pushObject(Object o);
  +    public Object popObject();
  +
  +    public Object currentObject();
  +    public Object previousObject();
  +    
       /**
          The root object is either set by caller before starting the parse
          or can be created using the first tag. It is used to set object in
  @@ -54,6 +77,7 @@
   	as result of parsing. You can either use the stack ( which is
   	very powerfull construct !), or use the root object
   	and navigation in the result tree.
  +	@deprecated
       */
       public Stack getObjectStack();
   
  @@ -62,4 +86,11 @@
       public int getDebug();
   
       public void log( String s );
  +
  +    public XmlMapper getMapper();
  +
  +    // -------------------- Variables -------------------- 
  +    public void setVariable( String s, Object v );
  +
  +    public Object getVariable( String s );
   }
  
  
  
  1.28      +142 -68   jakarta-tomcat/src/share/org/apache/tomcat/util/xml/XmlMapper.java
  
  Index: XmlMapper.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/xml/XmlMapper.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- XmlMapper.java	2000/08/10 22:39:24	1.27
  +++ XmlMapper.java	2000/11/01 21:39:35	1.28
  @@ -32,7 +32,8 @@
        */
       private Hashtable fileDTDs = new Hashtable();
       private Hashtable resDTDs = new Hashtable();
  -
  +    private Hashtable variables = new Hashtable();
  +    
       // Stack of elements
       Stack oStack=new Stack();
       Object root;
  @@ -144,6 +145,10 @@
   	return (AttributeList)attributeStack[pos];
       }
   
  +    public AttributeList getCurrentAttributes() {
  +	return (AttributeList)attributeStack[sp-1];
  +    }
  +
       public int getTagCount() {
   	return sp;
       }
  @@ -152,6 +157,10 @@
   	return tagStack[pos];
       }
   
  +    public String getCurrentElement() {
  +	return tagStack[sp-1];
  +    }
  +
       public String getBody() {
   	return body;
       }
  @@ -160,6 +169,25 @@
   	return oStack;
       }
   
  +    public Object popObject() {
  +	return oStack.pop();
  +    }
  +
  +    public Object currentObject() {
  +	return oStack.peek();
  +    }
  +
  +    public Object previousObject() {
  +	Object o=oStack.pop();
  +	Object result=oStack.peek();
  +	oStack.push( o );
  +	return result;
  +    }
  +
  +    public void pushObject(Object o) {
  +	oStack.push( o );
  +    }
  +
       public Object getRoot() {
   	return root;
       }
  @@ -195,15 +223,29 @@
   	System.out.println("XmlMapper: " + msg);
       }
   
  +    public void setVariable( String name, Object value ) {
  +	if( value==null)
  +	    variables.remove(name);
  +	else
  +	    variables.put( name, value );
  +    }
  +
  +    public Object getVariable( String name ) {
  +	return variables.get( name );
  +    }
  +    
  +    public XmlMapper getMapper() {
  +	return this;
  +    }
  +    
       /** read an XML file, construct and return the object hierarchy
        */
       public Object readXml(File xmlFile, Object root)
   	throws Exception
       {
   	if(root!=null) {
  -	    Stack st=this.getObjectStack();
   	    this.root=root;
  -	    st.push( root );
  +	    this.pushObject( root );
   	}
   	try {
   	    SAXParser parser=null;
  @@ -240,9 +282,8 @@
   	throws Exception
       {
   	if(root!=null) {
  -	    Stack st=this.getObjectStack();
   	    this.root=root;
  -	    st.push( root );
  +	    this.pushObject( root );
   	}
   	SAXParser parser=null;
   	try {
  @@ -311,8 +352,8 @@
   	addRule( "xmlmapper:debug",
   		 new XmlAction() {
   			 public void start(SaxContext ctx) {
  -			     int top=ctx.getTagCount()-1;
  -			     AttributeList attributes = ctx.getAttributeList( top );
  +			     AttributeList attributes =
  +				 ctx.getCurrentAttributes();
   			     String levelS=attributes.getValue("level");
   			     XmlMapper mapper=(XmlMapper)ctx;
   			     if( levelS!=null)
  @@ -325,8 +366,8 @@
   		 new XmlAction() {
   			 public void start(SaxContext ctx) {
   			     XmlMapper mapper=(XmlMapper)ctx;
  -			     int top=ctx.getTagCount()-1;
  -			     AttributeList attributes = ctx.getAttributeList( top );
  +			     AttributeList attributes =
  +				 ctx.getCurrentAttributes();
   			     String match=attributes.getValue("match");
   			     if(match==null) return; //log
   			     String obj=attributes.getValue("object-create");
  @@ -480,6 +521,12 @@
   	return new SetProperties();
       }
   
  +    /** Set a variable varName using the value of an attribute
  +     */
  +    public XmlAction setVariable( String varName, String attName ) {
  +	return new SetVariable( varName, attName );
  +    }
  +
       /** For the last 2 objects in stack, create a parent-child
        *	and child.childM with parente as parameter
        */
  @@ -573,27 +620,26 @@
       }
   
       public void start( SaxContext ctx) throws Exception {
  -	Stack st=ctx.getObjectStack();
  -	int top=ctx.getTagCount()-1;
  -	String tag=ctx.getTag(top);
  +	String tag=ctx.getCurrentElement();
   	String classN=className;
   
   	if( attrib!=null) {
  -	    AttributeList attributes = ctx.getAttributeList( top );
  +	    AttributeList attributes = ctx.getCurrentAttributes();
   	    if (attributes.getValue(attrib) != null)
   		classN= attributes.getValue(attrib);
   	}
   	Class c=Class.forName( classN );
   	Object o=c.newInstance();
  -	st.push(o);
  -	if( ctx.getDebug() > 0 ) ctx.log("new "  + attrib + " " + classN + " "  + tag  + " " + o);
  +	ctx.pushObject(o);
  +	if( ctx.getDebug() > 0 )
  +	    ctx.log("new "  + attrib + " " + classN + " "  + tag  + " " + o);
       }
   
       public void cleanup( SaxContext ctx) {
  -	Stack st=ctx.getObjectStack();
  -	String tag=ctx.getTag(ctx.getTagCount()-1);
  -	Object o=st.pop();
  -	if( ctx.getDebug() > 0 ) ctx.log("pop " + tag + " " + o.getClass().getName() + ": " + o);
  +	String tag=ctx.getCurrentElement();
  +	Object o=ctx.popObject();
  +	if( ctx.getDebug() > 0 ) ctx.log("pop " + tag + " " +
  +					 o.getClass().getName() + ": " + o);
       }
   }
   
  @@ -601,16 +647,13 @@
   /** Set object properties using XML attribute list
    */
   class SetProperties extends XmlAction {
  -    //    static Class paramT[]=new Class[] { "String".getClass() };
   
       public SetProperties() {
       }
   
       public void start( SaxContext ctx ) {
  -	Stack st=ctx.getObjectStack();
  -	Object elem=st.peek();
  -	int top=ctx.getTagCount()-1;
  -	AttributeList attributes = ctx.getAttributeList( top );
  +	Object elem=ctx.currentObject();
  +	AttributeList attributes = ctx.getCurrentAttributes();
   
   	for (int i = 0; i < attributes.getLength (); i++) {
   	    String type = attributes.getType (i);
  @@ -623,11 +666,14 @@
       }
   
       /** Find a method with the right name
  -	If found, call the method ( if param is int or boolean we'll convert value to
  -	the right type before) - that means you can have setDebug(1).
  +	If found, call the method ( if param is int or boolean we'll convert
  +	value to the right type before) - that means you can have setDebug(1).
       */
  -    static void setProperty( SaxContext ctx, Object o, String name, String value ) {
  -	if( ctx.getDebug() > 1 ) ctx.log("setProperty(" + o.getClass() + " " +  name + "="  + value  +")" );
  +    static void setProperty( SaxContext ctx, Object o, String name,
  +			     String value ) {
  +	if( ctx.getDebug() > 1 ) ctx.log("setProperty(" +
  +					 o.getClass() + " " +  name + "="  +
  +					 value  +")" );
   
   	String setter= "set" +capitalize(name);
   
  @@ -661,7 +707,8 @@
   			try {
   			    params[0]=new Integer(value);
   			} catch( NumberFormatException ex ) {ok=false;}
  -		    } else if ("java.lang.Boolean".equals( paramType.getName()) ||
  +		    } else if ("java.lang.Boolean".
  +			       equals( paramType.getName()) ||
   			"boolean".equals( paramType.getName())) {
   			params[0]=new Boolean(value);
   		    } else {
  @@ -669,7 +716,6 @@
   		    }
   
   		    if( ok ) {
  -			//	System.out.println("XXX: " + methods[i] + " " + o + " " + params[0] );
   			methods[i].invoke( o, params );
   			return;
   		    }
  @@ -690,13 +736,19 @@
   	    }
   
   	} catch( SecurityException ex1 ) {
  -	    if( ctx.getDebug() > 0 ) ctx.log("SecurityException for " + o.getClass() + " " +  name + "="  + value  +")" );
  +	    if( ctx.getDebug() > 0 )
  +		ctx.log("SecurityException for " + o.getClass() + " " +
  +			name + "="  + value  +")" );
   	    if( ctx.getDebug() > 1 ) ex1.printStackTrace();
   	} catch (IllegalAccessException iae) {
  -	    if( ctx.getDebug() > 0 ) ctx.log("IllegalAccessException for " + o.getClass() + " " +  name + "="  + value  +")" );
  +	    if( ctx.getDebug() > 0 )
  +		ctx.log("IllegalAccessException for " +
  +			o.getClass() + " " +  name + "="  + value  +")" );
   	    if( ctx.getDebug() > 1 ) iae.printStackTrace();
   	} catch (InvocationTargetException ie) {
  -	    if( ctx.getDebug() > 0 ) ctx.log("InvocationTargetException for " + o.getClass() + " " +  name + "="  + value  +")" );
  +	    if( ctx.getDebug() > 0 )
  +		ctx.log("InvocationTargetException for " + o.getClass() +
  +			" " +  name + "="  + value  +")" );
   	    if( ctx.getDebug() > 1 ) ie.printStackTrace();
   	}
       }
  @@ -729,15 +781,13 @@
       }
   
       public void end( SaxContext ctx) throws Exception {
  -	Stack st=ctx.getObjectStack();
  -
  -	Object obj=st.pop();
  -	Object parent=st.peek();
  -	st.push( obj ); // put it back
  +	Object obj=ctx.currentObject();
  +	Object parent=ctx.previousObject();
   
   	String parentC=parent.getClass().getName();
  -	if( ctx.getDebug() > 0 ) ctx.log("Calling " + obj.getClass().getName() + "." + childM +
  -					 " " + parentC);
  +	if( ctx.getDebug() > 0 )
  +	    ctx.log("Calling " + obj.getClass().getName() + "." + childM +
  +		    " " + parentC);
   
   	Class params[]=new Class[1];
   	if( paramT==null) {
  @@ -762,14 +812,12 @@
       }
   
       public void end( SaxContext ctx) throws Exception {
  -	Stack st=ctx.getObjectStack();
  +	Object obj=ctx.currentObject();
  +	Object parent=ctx.previousObject();
   
  -	Object obj=st.pop();
  -	Object parent=st.peek();
  -	st.push( obj ); // put it back
  -
   	String parentC=parent.getClass().getName();
  -	if( ctx.getDebug() >0) ctx.log("Calling " + parentC + "." + parentM  +" " + obj  );
  +	if( ctx.getDebug() >0)
  +	    ctx.log("Calling " + parentC + "." + parentM  +" " + obj  );
   
   	Class params[]=new Class[1];
   	if( paramT==null) {
  @@ -784,7 +832,7 @@
   
   /**
    */
  -class  MethodSetter extends 	    XmlAction {
  +class  MethodSetter extends XmlAction {
       String mName;
       int paramC;
       String paramTypes[];
  @@ -801,24 +849,23 @@
       }
   
       public void start( SaxContext ctx) {
  -	Stack st=ctx.getObjectStack();
  -	if(paramC==0) return;
   	String params[]=new String[paramC];
  -	st.push( params );
  +	ctx.pushObject( params );
       }
   
  -    static final Class STRING_CLASS="String".getClass(); // XXX is String.CLASS valid in 1.1 ?
  +    static final Class STRING_CLASS="String".getClass(); 
   
       public void end( SaxContext ctx) throws Exception {
  -	Stack st=ctx.getObjectStack();
  -	String params[]=null;
  -	if( paramC >0 ) params=(String []) st.pop();
  -	Object parent=st.peek();
  +	String params[]=(String [])ctx.popObject();
  +	Object parent=ctx.currentObject();
   
  +	// XXX ???
   	if( paramC == 0 ) {
   	    params=new String[1];
   	    params[0]= ctx.getBody().trim();
  -	    if( ctx.getDebug() > 0 ) ctx.log("" + parent.getClass().getName() + "." + mName + "( " + params[0] + ")");
  +	    if( ctx.getDebug() > 0 )
  +		ctx.log("" + parent.getClass().getName() + "." +
  +			mName + "( " + params[0] + ")");
   	}
   
   	Class paramT[]=new Class[params.length];
  @@ -843,7 +890,8 @@
   	try {
   	    m=parent.getClass().getMethod( mName, paramT );
   	} catch( NoSuchMethodException ex ) {
  -	    ctx.log("Can't find method " + mName + " in " + parent + " CLASS " + parent.getClass());
  +	    ctx.log("Can't find method " + mName + " in " +
  +		    parent + " CLASS " + parent.getClass());
   	    return;
   	}
   	m.invoke( parent, realParam );
  @@ -876,20 +924,15 @@
       // If param is an attrib, set it
       public void start( SaxContext ctx) {
   	if( attrib==null) return;
  -
  -	Stack st=ctx.getObjectStack();
  -	String h[]=(String[])st.peek();
  -
  -	int top=ctx.getTagCount()-1;
  -	AttributeList attributes = ctx.getAttributeList( top );
  +	String h[]=(String[])ctx.currentObject();
  +	AttributeList attributes = ctx.getCurrentAttributes();
   	h[paramId]= attributes.getValue(attrib);
       }
   
       // If param is the body, set it
       public void end( SaxContext ctx) {
   	if( attrib!=null) return;
  -	Stack st=ctx.getObjectStack();
  -	String h[]=(String[])st.peek();
  +	String h[]=(String[])ctx.currentObject();
   	h[paramId]= ctx.getBody().trim();
       }
   }
  @@ -902,8 +945,39 @@
       }
   
       public void end( SaxContext ctx) {
  -	Stack st=ctx.getObjectStack();
  -	Object top = st.pop();
  -	if( ctx.getDebug() > 0 ) ctx.log("Pop " + top.getClass().getName());
  +	Object top = ctx.popObject();
  +	if( ctx.getDebug() > 0 )
  +	    ctx.log("Pop " +
  +		    ((top==null) ? "null" : 
  +		    top.getClass().getName()));
  +    }
  +}
  +
  +/**
  + */
  +class SetVariable extends XmlAction {
  +    String varName;
  +    String attributeN;
  +    
  +    public SetVariable(String varName, String attributeN) {
  +	super();
  +	this.varName=varName;
  +	this.attributeN=attributeN;
  +    }
  +    
  +    public void start( SaxContext ctx) throws Exception {
  +	AttributeList attributes = ctx.getCurrentAttributes();
  +	ctx.setVariable( varName,
  +			 attributes.getValue(attributeN));
  +	if( ctx.getDebug() > 0 )
  +	    ctx.log("setVariable " + varName + " " + attributeN + " " +
  +		    attributes.getValue( attributeN ));
  +    }
  +
  +    public void cleanup( SaxContext ctx) {
  +	ctx.setVariable( varName, null);
  +	if( ctx.getDebug() > 0 )
  +	    ctx.log("setVariable " + varName + " " + attributeN + " " +
  +		    "null");
       }
   }