//
// XMLEnumerateInstances.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 XMLEnumerateInstances.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: XMLEnumerateInstances.java,v 1.1 2003/07/17 18:32:55 kumpf Exp $
//
// $Log: XMLEnumerateInstances.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:41  karl
// import of SNIA 0_7
//
// Revision 1.10  2001/03/20 17:10:47  davidsi
// - Added VALUE.NAMEDINSTANCE tags.
//
// Revision 1.9  2000/11/18 13:00:15  davidsi
// - Commented code out that requests a property list - some CIMOMs
//   fail if this parameter is present.
//
// Revision 1.8  2000/11/12 14:47:51  davidsi
// - Added support for <VALUE.OBJECT>
//
// Revision 1.7  2000/11/06 19:29:37  davidsi
// - Added support for <VALUE_NAMEDOBJECT>.
//
// Revision 1.6  2000/08/16 05:59:59  shawn
// merge P_TOMCAT31 branch
//
// Revision 1.5.8.1  2000/08/10 00:03:36  shawn
// head merge
//
// Revision 1.5  2000/05/11 10:11:24  davidsi
// - Fixed tabs.
//
// 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:40:17  davidsi
// - Fixed extraction and generation of classnames.
// - Removed VALUE.NAMEDOBJECT elements.
//
// 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.wbem.cim.CIMClass;
import org.snia.wbem.cim.CIMInstance;
import org.snia.wbemcmd.utils.SimpleEnum;
import org.snia.wbem.client.CIMOMHandle;

public class XMLEnumerateInstances extends XMLClass {
    static String commandName="EnumerateInstances";
    

    public void execute(HTTPWriter pw,XMLNode node,CIMObjectPath path,CIMOMHandle hdl) 
        throws CIMException,MalformedURLException {
    String className;
    Enumeration enum;
    boolean localOnly;
    boolean includeQualifiers;
    boolean includeClassOrigin;
    boolean deep;
    String[] propertyList;
    
    className=node.extractParameterValueAttr(XMLP_CLASSNAME,XMLNode.XML_ELEMENT_CLASSNAME,
                           paramName);
    if (className==null) {
        throw new CIMException(CIMException.CIM_ERR_NOT_FOUND,"Class was null");
    }
    propertyList=node.extractParameterStringArray(XMLP_PROPERTYLIST);
    localOnly=node.extractParameterValue(XMLP_LOCAL,true);
    deep=node.extractParameterValue(XMLP_DEEP,true);
    includeQualifiers=node.extractParameterValue(XMLP_QUAL,true);
    includeClassOrigin=node.extractParameterValue(XMLP_ORIGIN,false);
    //
    // Get class
    //
    path.setObjectName(className);
    CIMClass cimClass=hdl.getClass(path,false);

    //
    // Get Instance
    //
    path.setObjectName(className);

    //enum=hdl.enumInstances(path,deep,localOnly);
    enum=hdl.enumerateInstances(path, deep, localOnly, 
        includeQualifiers, includeClassOrigin, propertyList);

    while (enum.hasMoreElements()) {
        CIMInstance ci=(CIMInstance)(enum.nextElement());
        CIMObjectPath cop=new CIMObjectPath(ci.getClassName(),ci.getKeyValuePairs());
        cop.setNameSpace(path.getNameSpace());
        pw.println("<VALUE.NAMEDINSTANCE>");
        pw.println(cop.toXml());
        pw.println(ci.toXml(null,localOnly,includeQualifiers,includeClassOrigin,propertyList));
        pw.println("</VALUE.NAMEDINSTANCE>");
    }
    return;
    }

    
    //
    //
    public static Enumeration enumInstances(HTTPOutput output,
            CIMObjectPath path,
            boolean deep,
            boolean localOnly) throws CIMException {
        return(enumerateInstances(output, path, deep, localOnly, false, false, null));
    }

    public static Enumeration enumerateInstances(HTTPOutput output,
        CIMObjectPath path,
        boolean deepInheritance,
        boolean localOnly,
        boolean includeQualifiers,
        boolean includeClassOrigin,
        String propertyList[]) throws CIMException {
    XMLNode result;
    XMLAttribute attr;
    String className=path.getObjectName();
    SimpleEnum se=new SimpleEnum();
    Vector params=new Vector();

    output.setMethod(commandName);
    
    if (className!=null)
        params.addElement(new Param(XMLP_CLASSNAME,Param.VALUESET,
            "<CLASSNAME NAME=\""+className+"\"/>"));
    else 
        throw new CIMException(CIMException.CIM_ERR_NOT_FOUND,"Class was null");
    params.addElement(new Param(XMLP_DEEP, deepInheritance));
    params.addElement(new Param(XMLP_LOCAL, localOnly));
    params.addElement(new Param(XMLP_QUAL, includeQualifiers));
    params.addElement(new Param(XMLP_ORIGIN, includeClassOrigin));

    String extra="";
    if (propertyList != null) 
    {
        extra="<IPARAMVALUE NAME=\""+XMLP_PROPERTYLIST+"\"><VALUE.ARRAY>";
        for(int i=0;i<propertyList.length;i++)
            extra=extra.concat("<VALUE>"+propertyList[i]+"</VALUE>");
        extra=extra.concat("</VALUE.ARRAY></IPARAMVALUE>");         
    }
    
    result=intrinsicMethod(output,path,commandName,params,extra);
    
    if (result==null) {
        return(se);
    }
    
    // Now find XML_ELEMENT_INSTANCE element
    for(;;) {
        XMLNode child;
        if (result==null) {
        return(se);
        }
        // Now find XML_ELEMENT_VALUE_NAMEDOBJECT element which
        // shouldn't be comming back but some implementations
        // insist on using it
        if (result.getToken()==XMLNode.XML_ELEMENT_VALUE_NAMEDOBJECT 
            || result.getToken()==XMLNode.XML_ELEMENT_VALUE_NAMEDINSTANCE) {
        XMLNode lresult=result.getChild();
        if (lresult==null || lresult.getToken()!=XMLNode.XML_ELEMENT_INSTANCENAME) {
           throw new CIMException(CIMException.XMLERROR,"XMLEnumerationInstances.enumInstances","Need <INSTANCENAME>");
        }    
        // getInstanceName(tmpNode, path);
        lresult=lresult.getNext();
        if (lresult==null)
            throw new CIMException(CIMException.XMLERROR,
                "XMLEnumerationInstances.enumInstances",
                "Need <INSTANCE> - no node");

        lresult=lresult.findElement(XMLNode.XML_ELEMENT_INSTANCE);
        if (lresult==null) {
            throw new CIMException(CIMException.XMLERROR,                        "XMLEnumerationInstances.enumInstances",
                "Need <INSTANCE> - no node found");
        }  
        CIMInstance cimInstance=new CIMInstance(lresult);
        se.addElement(cimInstance);
        result=result.getNext();
        } else if (result.getToken()==XMLNode.XML_ELEMENT_VALUE_OBJECT) {
        XMLNode lresult=result.getChild();
        lresult=lresult.findElement(XMLNode.XML_ELEMENT_INSTANCE);
        if (lresult==null) {
            return(se);
        }  
        se.addElement( new CIMInstance(result) );
        result=result.getNext();
        } else {
        result=result.findElement(XMLNode.XML_ELEMENT_INSTANCE);
        if (result==null) {
            return(se);
        }  
        se.addElement( new CIMInstance(result) );
        result=result.getNext();
        }
    }
    }
}
