rdonkin     2002/12/11 14:12:11

  Modified:    betwixt/src/java/org/apache/commons/betwixt
                        ElementDescriptor.java
               betwixt/src/java/org/apache/commons/betwixt/digester
                        XMLIntrospectorHelper.java
               betwixt/src/java/org/apache/commons/betwixt/expression
                        MethodUpdater.java
               betwixt/src/java/org/apache/commons/betwixt/io
                        BeanCreateRule.java BeanReader.java
               betwixt/src/test/org/apache/commons/betwixt
                        TestBeanReader.java
               betwixt/src/test/org/apache/commons/betwixt/digester
                        IDBean.java IDTest1.xml SimpleReadTest.xml
                        TestIDRead.java
  Log:
  Big changes for what was a small problem. I think that there was a bad fix to a bug 
which had broken an untested part of the system. Note that the xml produced by these 
changes differs from that created before. I'm pretty sure that this is how it used to 
work but this may break some things.
  
  Revision  Changes    Path
  1.4       +3 -2      
jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/ElementDescriptor.java
  
  Index: ElementDescriptor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/ElementDescriptor.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ElementDescriptor.java    1 Jul 2002 18:43:00 -0000       1.3
  +++ ElementDescriptor.java    11 Dec 2002 22:12:10 -0000      1.4
  @@ -129,8 +129,9 @@
   
       public String toString() {
           return 
  -            "ElementDescriptor[qname=" + getQualifiedName() + ",class=" + 
getPropertyType() 
  -            + ",singular=" + getSingularPropertyType() + "]";
  +            "ElementDescriptor[qname=" + getQualifiedName() + ",pname=" + 
getPropertyName() 
  +            + ",class=" + getPropertyType() + ",singular=" + 
getSingularPropertyType()
  +            + ",updater=" + getUpdater() + "]";
       }
       
       /** Creates a <code>ElementDescriptor</code> with namespace URI and qualified 
name */
  
  
  
  1.10      +15 -5     
jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/digester/XMLIntrospectorHelper.java
  
  Index: XMLIntrospectorHelper.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/digester/XMLIntrospectorHelper.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XMLIntrospectorHelper.java        7 Nov 2002 16:15:08 -0000       1.9
  +++ XMLIntrospectorHelper.java        11 Dec 2002 22:12:11 -0000      1.10
  @@ -351,16 +351,21 @@
                       Class[] types = method.getParameterTypes();
                       if ( types != null && types.length == 1 ) {
                           String propertyName = Introspector.decapitalize( 
name.substring(3) );
  +                        if ( log.isTraceEnabled() ) {
  +                            log.trace( name + "->" + propertyName );
  +                        }
   
                           // now lets try find the ElementDescriptor which displays
                           // a property which starts with propertyName
                           // and if so, we'll set a new Updater on it if there
                           // is not one already
  -                        ElementDescriptor descriptor = findGetCollectionDescriptor( 
introspector, rootDescriptor, propertyName );
  +                        ElementDescriptor descriptor = 
  +                            findGetCollectionDescriptor( introspector, 
rootDescriptor, propertyName );
                               
  -                            if ( log.isDebugEnabled() ) {
  -                                log.debug( "!! " + propertyName + " -> " + 
descriptor);
  -                            }
  +                        if ( log.isDebugEnabled() ) {        
  +                            log.debug( "!! " + propertyName + " -> " + descriptor );
  +                            log.debug( "!! " + name + " -> " + 
descriptor.getPropertyName() );
  +                        }
                           
                           if ( descriptor != null ) {
                               descriptor.setUpdater( new MethodUpdater( method ) );
  @@ -440,7 +445,12 @@
           // create the Map of propertyName -> descriptor that the PluralStemmer will 
choose
           Map map = new HashMap();
           //String propertyName = rootDescriptor.getPropertyName();
  -        if (propertyName != null) {
  +        if ( log.isTraceEnabled() ) {
  +            log.trace( "findPluralDescriptor( " + propertyName 
  +                + " ):root property name=" + rootDescriptor.getPropertyName() );
  +        }
  +        
  +        if (rootDescriptor.getPropertyName() != null) {
               map.put(propertyName, rootDescriptor);
           }
           makeElementDescriptorMap( rootDescriptor, map );
  
  
  
  1.4       +6 -1      
jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/expression/MethodUpdater.java
  
  Index: MethodUpdater.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/expression/MethodUpdater.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- MethodUpdater.java        9 Jul 2002 21:50:31 -0000       1.3
  +++ MethodUpdater.java        11 Dec 2002 22:12:11 -0000      1.4
  @@ -78,7 +78,12 @@
   public class MethodUpdater implements Updater {
   
       /** Logger */
  -    private static final Log log = LogFactory.getLog( MethodUpdater.class );
  +    private static Log log = LogFactory.getLog( MethodUpdater.class );
  +
  +    /** Programmatically set log */
  +    public static void setLog( Log aLog ) {
  +        log = aLog;
  +    }
       
       /** The method to call on the bean */
       private Method method;
  
  
  
  1.12      +47 -14    
jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/BeanCreateRule.java
  
  Index: BeanCreateRule.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/BeanCreateRule.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- BeanCreateRule.java       29 Aug 2002 21:40:29 -0000      1.11
  +++ BeanCreateRule.java       11 Dec 2002 22:12:11 -0000      1.12
  @@ -94,11 +94,11 @@
   public class BeanCreateRule extends Rule {
   
       /** Logger */
  -    private static final Log log = LogFactory.getLog( BeanCreateRule.class );
  +    private static Log log = LogFactory.getLog( BeanCreateRule.class );
       
       /** Set log to be used by <code>BeanCreateRule</code> instances */
  -    public static void setLog(Log log) {
  -        log = log;
  +    public static void setLog(Log aLog) {
  +        log = aLog;
       }
       
       /** The descriptor of this element */
  @@ -113,8 +113,6 @@
       private Class beanClass;
       /** The prefix added to digester rules */
       private String pathPrefix;
  -    /** Beans digested indexed by <code>ID</code> */
  -    private Map beansById = new HashMap();
       /** Use id's to match beans? */
       private boolean matchIDs = true;
       
  @@ -297,7 +295,7 @@
                       // XXX so i'm leaving this till later
                       String id = attributes.getValue( "id" );
                       if ( id != null ) {
  -                        beansById.put( id, instance );
  +                        getBeansById().put( id, instance );
                       }
                   }
               }
  @@ -323,21 +321,23 @@
   
               if ( updater != null ) {
                   if ( log.isDebugEnabled() ) {
  -                    log.debug( "Calling updater for: " + descriptor + " with: " + 
instance + " on bean: " + context.getBean() );
  +                    log.debug( "Calling updater for: " + descriptor + " with: " 
  +                        + instance + " on bean: " + context.getBean() );
                   }
                   updater.update( context, instance );
  +            } else {
  +                if ( log.isDebugEnabled() ) {
  +                    log.debug( "No updater for: " + descriptor + " with: " 
  +                        + instance + " on bean: " + context.getBean() );
  +                }
               }
  -            
           }
       }
   
       /** 
        * Tidy up.
        */
  -    public void finish() {
  -        // clear beans map
  -        beansById.clear();
  -    }
  +    public void finish() {}
   
   
       // Implementation methods
  @@ -357,14 +357,22 @@
                   // XXX need to check up about ordering
                   // XXX this is a very simple system that assumes that id occurs 
before idrefs
                   // XXX would need some thought about how to implement a fuller 
system
  -                Object bean = beansById.get( idref );
  +                log.trace( "Found IDREF" );
  +                Object bean = getBeansById().get( idref );
                   if ( bean != null ) {
  +                    if (log.isTraceEnabled()) {
  +                        log.trace( "Matched bean " + bean );
  +                    }
                       return bean;
                   }
  +                log.trace( "No match found" );
               }
           }
           
           try {
  +            if (log.isTraceEnabled()) {
  +                log.trace( "Creating instance of " + beanClass );
  +            }
               return beanClass.newInstance();
           }
           catch (Exception e) {
  @@ -408,12 +416,13 @@
                   String propertyName = childDescriptor.getPropertyName();
                   String qualifiedName = childDescriptor.getQualifiedName();
                   if ( qualifiedName == null ) {
  -                    log.trace("Ignoring");
  +                    log.trace( "Ignoring" );
                       continue;
                   }
                   String path = prefix + qualifiedName;
                   // this code is for making sure that recursive elements
                   // can also be used..
  +                
                   if (qualifiedName.equals(currentDescriptor.getQualifiedName())) {
                       log.trace("Creating generic rule for recursive elements");
                       int index = -1;
  @@ -421,6 +430,7 @@
                           index = prefix.indexOf(qualifiedName);
                           if (index == -1) {
                               // shouldn't happen.. 
  +                            log.debug( "Oops - this shouldn't happen" );
                               continue;
                           }
                           int removeSlash = prefix.endsWith("/")?1:0;
  @@ -539,8 +549,31 @@
           else {
               if ( log.isDebugEnabled() ) {
                   log.debug( "Ignoring duplicate digester rule for path: " + path + " 
rule: " + rule );
  +                log.debug( "New rule (not added): " + rule );
  +                log.debug( "Existing rule:" + matches.get(0) );
               }
           }
  +    }    
  +
  +    /**
  +     * Get the map used to index beans (previously read in) by id.
  +     * This is stored in the evaluation context.
  +     */
  +    protected Map getBeansById() {
  +        //
  +        // we need a single index for beans read in by id
  +        // so that we can use them for idref-matching
  +        // store this in the context
  +        //
  +        Map beansById = (Map) context.getVariable( "beans-index" );
  +        if ( beansById == null ) {
  +            // lazy creation
  +            beansById = new HashMap();
  +            context.setVariable( "beans-index", beansById );
  +            log.trace( "Created new index-by-id map" );
  +        }
  +        
  +        return beansById;
       }
       
       /**
  
  
  
  1.6       +3 -0      
jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/BeanReader.java
  
  Index: BeanReader.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/BeanReader.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- BeanReader.java   24 Oct 2002 11:13:22 -0000      1.5
  +++ BeanReader.java   11 Dec 2002 22:12:11 -0000      1.6
  @@ -134,6 +134,9 @@
        */
       public void registerBeanClass(Class beanClass) throws IntrospectionException {
           if ( ! registeredClasses.contains( beanClass ) ) {
  +            if ( log.isTraceEnabled() ) {
  +                log( "Registering class " + beanClass );
  +            }
               registeredClasses.add( beanClass );
               
               // introspect and find the ElementDescriptor to use as the root
  
  
  
  1.7       +58 -0     
jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/TestBeanReader.java
  
  Index: TestBeanReader.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/TestBeanReader.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- TestBeanReader.java       7 Nov 2002 16:15:08 -0000       1.6
  +++ TestBeanReader.java       11 Dec 2002 22:12:11 -0000      1.7
  @@ -30,6 +30,9 @@
   
   import org.apache.commons.betwixt.io.BeanReader;
   import org.apache.commons.betwixt.io.BeanWriter;
  +import org.apache.commons.betwixt.io.BeanCreateRule;
  +
  +import org.apache.commons.betwixt.digester.XMLIntrospectorHelper;
   
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
  @@ -198,6 +201,61 @@
       
       private void checkBean(AdderButNoPropertyBean bean) throws Exception {
           assertEquals("Bad addString call count", 3, bean.stringCallCount());
  +    }
  +    
  +    private void checkBean(PersonListBean bean) throws Exception {
  +        assertEquals("PersonList size", 4, bean.getPersonList().size());
  +        assertEquals("PersonList value (1)", "Athos", ((PersonBean) 
bean.getPersonList().get(0)).getName());
  +        assertEquals("PersonList value (2)", "Porthos", ((PersonBean) 
bean.getPersonList().get(1)).getName());
  +        assertEquals("PersonList value (3)", "Aramis", ((PersonBean) 
bean.getPersonList().get(2)).getName());
  +        assertEquals("PersonList value (4)", "D'Artagnan", ((PersonBean) 
bean.getPersonList().get(3)).getName());
  +    }
  +    
  +    public void testPersonList() throws Exception {
  +
  +        PersonListBean people = new PersonListBean();
  +        people.addPerson(new PersonBean(22, "Athos"));
  +        people.addPerson(new PersonBean(25, "Porthos"));
  +        people.addPerson(new PersonBean(23, "Aramis"));
  +        people.addPerson(new PersonBean(18, "D'Artagnan"));
  +        
  +        checkBean(people);
  +//
  +// Logging and debugging code for this method commented out
  +//
  +//        writeBean(people);
  +
  +//        SimpleLog log = new SimpleLog("[TestPersonList:XMLIntrospectorHelper]");
  +//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
  +//        XMLIntrospectorHelper.setLog(log);
  +        
  +        
  +//        log = new SimpleLog("[TestPersonList:BeanCreateRule]");
  +//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
  +//        BeanCreateRule.setLog(log);
  +        
  +//        log = new SimpleLog("[TestPersonList:XMLIntrospector]");
  +//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
  +        
  +        BeanReader reader = new BeanReader();
  +//        reader.getXMLIntrospector().setLog(log);
  +              
  +//        log = new SimpleLog("[TestPersonList:BeanReader]");
  +//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
  +        
  +//        reader.setLog(log);
  +        reader.registerBeanClass( PersonListBean.class );
  +        
  +        InputStream in =  
  +            new FileInputStream( 
getTestFile("src/test/org/apache/commons/betwixt/person-list.xml") );
  +        try {
  +        
  +            checkBean((PersonListBean) reader.parse( in ));
  +            
  +        }
  +        finally {
  +            in.close();
  +        }   
       }
   }
   
  
  
  
  1.2       +11 -4     
jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/digester/IDBean.java
  
  Index: IDBean.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/digester/IDBean.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- IDBean.java       29 Aug 2002 19:28:50 -0000      1.1
  +++ IDBean.java       11 Dec 2002 22:12:11 -0000      1.2
  @@ -65,6 +65,9 @@
   import java.util.List;
   import java.util.ArrayList;
   
  +import org.apache.commons.logging.Log;
  +import org.apache.commons.logging.LogFactory;
  +
   /** Bean for testing ID-IDRef reading.
     *
     * @author Robert Burrell Donkin
  @@ -72,6 +75,8 @@
     */
   public class IDBean {
       
  +    static Log log = LogFactory.getLog( IDBean.class );
  +    
       private String id;
       private String name;
       
  @@ -79,7 +84,7 @@
       
       private List children = new ArrayList();
       
  -    public IDBean() {}
  +    public IDBean() { log.debug("Created"); }
       
       public IDBean(String id, String name) {
           setId(id);
  @@ -99,6 +104,7 @@
       }        
       
       public void setName(String name) {
  +        log.debug("Set name: " + name);
           this.name = name;
       }
   
  @@ -107,6 +113,7 @@
       }
       
       public void addChild(IDBean child) {
  +        log.debug("Added child " + child + " to bean " + this);
           children.add(child);
       }
       
  
  
  
  1.2       +7 -7      
jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/digester/IDTest1.xml
  
  Index: IDTest1.xml
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/digester/IDTest1.xml,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- IDTest1.xml       29 Aug 2002 21:22:52 -0000      1.1
  +++ IDTest1.xml       11 Dec 2002 22:12:11 -0000      1.2
  @@ -2,23 +2,23 @@
   <IDBean id="1">
       <name>alpha</name>
       <children>
  -        <IDBean id="2">
  +        <child id="2">
               <name>beta</name>
               <children/>
               <id>two</id>
  -        </IDBean>
  -        <IDBean id="3">
  +        </child>
  +        <child id="3">
               <name>gamma</name>
               <children>       
  -                <IDBean id="4">
  +                <child id="4">
                       <name>epsilon</name>
                       <children/>
                       <id>four</id>    
  -                </IDBean>
  -                <IDBean idref="2"/>
  +                </child>
  +                <child idref="2"/>
               </children>
               <id>three</id>
  -        </IDBean>
  +        </child>
       </children>
       <id>one</id>
   </IDBean>
  
  
  
  1.2       +5 -5      
jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/digester/SimpleReadTest.xml
  
  Index: SimpleReadTest.xml
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/digester/SimpleReadTest.xml,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SimpleReadTest.xml        29 Aug 2002 19:28:50 -0000      1.1
  +++ SimpleReadTest.xml        11 Dec 2002 22:12:11 -0000      1.2
  @@ -2,16 +2,16 @@
   <IDBean id="1">
       <name>alpha</name>
       <children>
  -        <IDBean id="2">
  +        <child id="2">
               <name>beta</name>
               <children/>
               <id>two</id>
  -        </IDBean>
  -        <IDBean id="3">
  +        </child>
  +        <child id="3">
               <name>gamma</name>
               <children/>
               <id>three</id>
  -        </IDBean>
  +        </child>
       </children>
       <id>one</id>
  -</IDBean>
  \ No newline at end of file
  +</IDBean>
  
  
  
  1.3       +30 -16    
jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/digester/TestIDRead.java
  
  Index: TestIDRead.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/digester/TestIDRead.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TestIDRead.java   29 Aug 2002 21:22:52 -0000      1.2
  +++ TestIDRead.java   11 Dec 2002 22:12:11 -0000      1.3
  @@ -65,6 +65,8 @@
   import java.io.FileInputStream;
   import java.io.InputStream;
   
  +import org.apache.commons.betwixt.expression.MethodUpdater;
  +
   import org.apache.commons.betwixt.io.BeanWriter;
   import org.apache.commons.betwixt.io.BeanReader;
   import org.apache.commons.betwixt.io.BeanCreateRule;
  @@ -107,19 +109,27 @@
           BeanReader reader = new BeanReader();
           
   //         logging just for this method
  -//        SimpleLog log = new SimpleLog("[XMLIntrospectorHelper]");
  +//        SimpleLog log = new SimpleLog("[testSimpleRead:XMLIntrospectorHelper]");
   //        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
   //        XMLIntrospectorHelper.setLog(log);
   //        
  -//        log = new SimpleLog("[BeanCreateRule]");
  +//        log = new SimpleLog("[testSimpleRead:MethodUpdater]");
  +//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
  +//        MethodUpdater.setLog(log);
  +        
  +//        log = new SimpleLog("[testSimpleRead:BeanCreateRule]");
   //        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
   //        BeanCreateRule.setLog(log);
  -//
  -//        log = new SimpleLog("[BeanReader]");
  +
  +//        log = new SimpleLog("[testSimpleRead:IDBean]");
  +//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
  +//        IDBean.log = log;
  +
  +//        log = new SimpleLog("[testSimpleRead:BeanReader]");
   //        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);        
   //        reader.setLog(log);
  -//
  -//        log = new SimpleLog("[XMLIntrospector]");
  +
  +//        log = new SimpleLog("[testSimpleRead:XMLIntrospector]");
   //        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
   //        reader.getXMLIntrospector().setLog(log);
           
  @@ -128,8 +138,11 @@
           InputStream in = new FileInputStream( 
               
getTestFile("src/test/org/apache/commons/betwixt/digester/SimpleReadTest.xml") );
               
  -        try {
  +        try {        
  +//            log = new SimpleLog("[testSimpleRead]");
  +//            log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
               Object obj = reader.parse( in );
  +//            log.debug(obj);
               
               assertEquals("Read bean type is incorrect", true, (obj instanceof 
IDBean) );
               IDBean alpha = (IDBean) obj;
  @@ -152,19 +165,19 @@
           BeanReader reader = new BeanReader();
           
   //         logging just for this method
  -//        SimpleLog log = new SimpleLog("[XMLIntrospectorHelper]");
  +//        SimpleLog log = new SimpleLog("[testIDRead:XMLIntrospectorHelper]");
   //        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
   //        XMLIntrospectorHelper.setLog(log);
   //        
  -//        log = new SimpleLog("[BeanCreateRule]");
  +//        log = new SimpleLog("[testIDRead:BeanCreateRule]");
   //        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
   //        BeanCreateRule.setLog(log);
   //
  -//        log = new SimpleLog("[BeanReader]");
  +//        log = new SimpleLog("[testIDRead:BeanReader]");
   //        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);        
   //        reader.setLog(log);
   //
  -//        log = new SimpleLog("[XMLIntrospector]");
  +//        log = new SimpleLog("[testIDRead:XMLIntrospector]");
   //        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
   //        reader.getXMLIntrospector().setLog(log);
           
  @@ -189,6 +202,7 @@
               assertEquals("Wrong list size (B)", 2 ,  gamma.getChildren().size());
               
               IDBean sonOfGamma = (IDBean) gamma.getChildren().get(1);
  +            
               assertEquals("Wrong id (A)", "two" ,  sonOfGamma.getId());
               assertEquals("Wrong name (C)", "beta" ,  sonOfGamma.getName());
               
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to