//
// XMLEnumerateClassNames.java
//
// The contents of this file are subject to the SNIA Public License Version 1.0
// (the "License"); you may not use this file except in compliance with the
// License. You may obtain a copy of the License at
//
//    http://www.snia.org/resources/openSource.html
//
// Software distributed under the License is distributed on an "AS IS" basis,
// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the 
// License for the specific language governing rights and limitations
// under the License.
//
// The Original Code is XMLEnumerateClassNames.java
// 
// The Initial Developer of the Original Code is David Simons.
//
// Contributor(s):
//
//
// This source uses the Solaris WBEM APIs version 2.2. 
// Synchronization will be maintained with the Solaris WBEM APIS,
// which are being standardized through the Java Community Process.
//
//
// $Id: XMLEnumerateClassNames.java,v 1.1 2003/07/17 18:32:55 kumpf Exp $
//
// $Log: XMLEnumerateClassNames.java,v $
// Revision 1.1  2003/07/17 18:32:55  kumpf
// HP-BAPU: PEP-64 CIM Client and CIM Listener Java Interface
//
// Revision 1.1.1.1  2001/10/31 18:17:40  karl
// import of SNIA 0_7
//
// Revision 1.11  2001/08/05 12:25:32  davidsi
// - When there are no results, return an empty enumeration not null.
//
// Revision 1.10  2001/07/07 16:28:32  davidsi
// - Allow null object paths to be specified for the classnames.
//
// Revision 1.9  2001/07/07 16:25:56  davidsi
// - Need to now specially detect the case where the classname has not
//   been set since it will now not been null but rather the special
//   unset marker in the object path.
//
// Revision 1.8  2001/07/07 15:44:18  davidsi
// - From Angela Lee - fix the enumeration to be object path instances
//   rather than strings containing the classnames.
//
// Revision 1.7  2000/08/16 05:59:59  shawn
// merge P_TOMCAT31 branch
//
// Revision 1.6.8.1  2000/08/10 00:03:36  shawn
// head merge
//
// Revision 1.6  2000/05/11 10:11:24  davidsi
// - Fixed tabs.
//
// Revision 1.5  2000/05/07 13:24:50  davidsi
// - Fixed encoding for class names so that it is a stream of <CLASSNAME>
//   elements.
//
// Revision 1.4  2000/05/06 17:20:03  davidsi
// - Brought in line with SUN WBEM APIs 2.2
//
// Revision 1.3  2000/04/09 14:38:34  davidsi
// - Fixed extraction and generation of classnames.
//
// Revision 1.2  2000/02/13 15:10:05  davidsi
// - Added text to cover re-use of Solaris WBEM APIs.
//
// Revision 1.1.1.1  2000/02/06 16:41:02  davidsi
// Initial version.
//
//
//
package org.snia.wbemcmd.xml;

import java.util.Enumeration;
import java.util.Vector;
import java.net.MalformedURLException;
import org.snia.wbem.cim.CIMException;
import org.snia.wbem.cim.CIMObjectPath;
import org.snia.wbemcmd.utils.SimpleEnum;


import org.snia.wbem.client.CIMOMHandle;

public class XMLEnumerateClassNames extends XMLClass {
    static String commandName="EnumerateClassNames";

    public void execute(HTTPWriter pw,XMLNode node,CIMObjectPath path,CIMOMHandle hdl) 
        throws CIMException,MalformedURLException {
    String className;
    boolean deepInheritance;
    Enumeration enum;
    
    className=node.extractParameterValueAttr(XMLP_CLASSNAME,XMLNode.XML_ELEMENT_CLASSNAME,
                           paramName);
    deepInheritance=node.extractParameterValue(XMLP_DEEP,false);
    
    path.setObjectName(className);

    enum=hdl.enumerateClassNames(path, deepInheritance);

    while (enum.hasMoreElements()) {
        String obj=((CIMObjectPath)enum.nextElement()).getObjectName();
        //
        // Note, we assume a class name won't need escaping
        //
        pw.println("<CLASSNAME NAME=\""+obj+"\"/>");
    }
    
    return;
    }    

    
    //
    //
    //
    public static Enumeration enumClass(HTTPOutput output,
           CIMObjectPath path,
           boolean deep) throws CIMException {
        return(XMLEnumerateClassNames.enumerateClassNames(output, path, deep));
    }

    public static Enumeration enumerateClassNames(HTTPOutput output,
        CIMObjectPath path,
        boolean deepInheritance) throws CIMException {
    XMLNode result;
    Vector params=new Vector();
    String className=null;

    if (path!=null) {
        className=path.getObjectName();
        //
        // Map unset classname back to null
        //
        if (className.equals(CIMObjectPath.NOT_SET))
        className=null;
    }
    
    output.setMethod(commandName);
    
    if (className!=null)
        params.addElement(new Param(XMLP_CLASSNAME,Param.VALUESET,
            "<CLASSNAME NAME=\""+className+"\"/>"));
    params.addElement(new Param(XMLP_DEEP, deepInheritance));

    
    result=intrinsicMethod(output,path,commandName,params);
    
    SimpleEnum se=new SimpleEnum(); 
    if (result==null) {
        return(se);
    }
    
    //
    // Build enumeration
    //
    for(result=result;result!=null;result=result.getNext()) {
        if (result.getToken()==XMLNode.XML_ELEMENT_CLASSNAME) {
        className=result.getAttribute(paramName);
        if (className!=null) {
            CIMObjectPath cop = new CIMObjectPath(className, 
                              path.getNameSpace());
            cop.setHost(path.getHost());
            se.addElement(cop);
        }
        } else {
        return(null);
        }
    }
    return(se);
    }        
    
}
