//
// XMLModifyInstance.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 XMLModifyInstance.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: XMLModifyInstance.java,v 1.1 2003/07/17 18:32:55 kumpf Exp $
//
// $Log: XMLModifyInstance.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:49  karl
// import of SNIA 0_7
//
// Revision 1.8  2000/08/16 05:59:59  shawn
// merge P_TOMCAT31 branch
//
// Revision 1.7.6.1  2000/08/10 00:03:36  shawn
// head merge
//
// Revision 1.7  2000/07/10 18:12:00  davidsi
// - No longer use HTTPWriter, go direct to HTTPOutput
//
// Revision 1.6  2000/05/18 14:19:25  davidsi
// - Fixed missing getNext() call to move to instance node.
//
// Revision 1.5  2000/05/11 10:11:25  davidsi
// - Fixed tabs.
//
// Revision 1.4  2000/05/06 17:20:04  davidsi
// - Brought in line with SUN WBEM APIs 2.2
//
// Revision 1.3  2000/04/09 14:42:36  davidsi
// - Removed VALUE.NAMEDOBJECT elements.
//
// Revision 1.2  2000/02/13 15:10:07  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.CIMInstance;
import org.snia.wbem.client.CIMOMHandle;

public class XMLModifyInstance extends XMLClass {
    
    static String commandName="ModifyInstance";
    static String XMLP_MODIFIED_INSTANCE="ModifiedInstance";
    
    public void execute(HTTPWriter pw,XMLNode node,CIMObjectPath path,CIMOMHandle hdl)
        throws CIMException, MalformedURLException 
    {
        String propertyList[];
        boolean includeQualifiers;
        
        propertyList=node.extractParameterStringArray(XMLP_PROPERTYLIST);
        includeQualifiers=node.extractParameterValue(XMLP_QUAL,true);

        //
        // Check parameter name is "ModifiedInstance"
        //
        String name=node.getAttribute(paramName); 
        if (!name.equalsIgnoreCase(XMLP_MODIFIED_INSTANCE))
            throw new CIMException(CIMException.CIM_ERR_INVALID_PARAMETER,
                "Parameter name was "+name);

        node=node.mustChildElementChild(XMLNode.XML_ELEMENT_VALUE_NAMEDINSTANCE);
        //
        // Fetch <INSTANCENAME> element
        //
        getInstanceName(node,path);
        node=node.getNext();
        
        CIMInstance cimInstance=new CIMInstance(node);
        //
        // Much more validation needs to be performed!
        //

        //hdl.setInstance(path,cimInstance);
        hdl.modifyInstance(path, cimInstance, includeQualifiers, propertyList);
        return;
    }
    

    public static void modifyInstance(HTTPOutput output,
            CIMObjectPath path,
            CIMInstance cimInstance) throws CIMException { 
        XMLModifyInstance.modifyInstance(output, path, cimInstance, true, null);
    }

    public static void modifyInstance(
        HTTPOutput output,
        CIMObjectPath path,
        CIMInstance modifiedInstance,
        boolean includeQualifiers,
        String propertyList[]) throws CIMException
    {
        XMLNode result;
        String nameSpace=path.getNameSpace();
        String className=path.getObjectName();
        
        output.setMethod(commandName);
        try {
            String msgid=intrinsicMethodHeader(output,path,commandName);
            output.println("<IPARAMVALUE NAME=\""+XMLP_MODIFIED_INSTANCE+"\">");
            output.println("<VALUE.NAMEDINSTANCE>");
            output.println(path.toXml());        // don't use cimInstance to do this
                            // because it will insert an INSTANCEPATH which
                            // isn't allowed
            output.println(modifiedInstance.toXml(null));
            output.println("</VALUE.NAMEDINSTANCE>");
            output.println("</IPARAMVALUE>" );

            Param p = new Param(XMLP_QUAL, includeQualifiers);
            output.println("<IPARAMVALUE NAME=\""+
                    p.getArgName()+"\">"+
                    p.getArgValue()+"</IPARAMVALUE>");

            if (propertyList != null) 
            {
                output.println("<IPARAMVALUE NAME=\""+XMLP_PROPERTYLIST+"\"><VALUE.ARRAY>");
                for(int i=0;i<propertyList.length;i++)
                    output.println("<VALUE>"+propertyList[i]+"</VALUE>");
                output.println("</VALUE.ARRAY></IPARAMVALUE>");         
            }

            result=intrinsicMethodTail(output,commandName,msgid);
        } catch (MalformedURLException mue ) {
            throw new CIMException(CIMException.CIM_ERR_FAILED);
        }
        return;
    }    
    
}
