/*
 * Copyright (c) 2007, 2009, Oracle and its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

/*
 * $Id: ClientSOAPHandler.java 52501 2007-01-24 02:29:49Z af70133 $
 */

package com.sun.ts.tests.jaxws.wsa.w2j.document.literal.anonymous;

import com.sun.ts.lib.util.*;
import com.sun.ts.lib.porting.*;
import com.sun.ts.lib.harness.*;
import com.sun.ts.tests.jaxws.common.JAXWS_Util;

import java.util.Iterator;
import java.util.Map;
import java.util.List;
import java.util.Set;

import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPException;

import com.sun.ts.tests.jaxws.common.Handler_Util;
import com.sun.ts.tests.jaxws.wsa.common.WsaBaseSOAPHandler;
import com.sun.ts.tests.jaxws.wsa.common.W3CAddressingConstants;
import com.sun.ts.tests.jaxws.wsa.common.ActionNotSupportedException;
import com.sun.ts.tests.jaxws.wsa.common.AddressingPropertyException;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.Text;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;

public class ClientSOAPHandler extends WsaBaseSOAPHandler {
    protected void checkInboundAction(SOAPMessageContext context, String oper, String action) {
        TestUtil.logMsg("ClientSOAPHandler.checkInboundAction: [operation="+oper+ ", input action="+action+"]");
        if (Handler_Util.checkForMsg(context,"testAnonymousResponsesAssertion")){
	    VerifyAddressingHeadersForAnonymousResponsesAssertion(context,action);
        } else if (Handler_Util.checkForMsg(context,"testNonAnonymousResponsesAssertion")){
	    VerifyAddressingHeadersForNonAnonymousResponsesAssertion(context,action);
 	}
    }

    private void VerifyAddressingHeadersForAnonymousResponsesAssertion(SOAPMessageContext context, String action){
	TestUtil.logMsg("ClientSOAPHandler.VerifyAddressingHeadersForAnonymousResponsesAssertion");
        if (!TestConstants.TEST_ANONYMOUS_RESPONSES_ASSERTION_OUT_ACTION.equals(action)) {
            throw new ActionNotSupportedException("Expected:"+TestConstants.TEST_ANONYMOUS_RESPONSES_ASSERTION_OUT_ACTION+", Actual:"+action);
	}
	String to=null;
	try {
	    to = getTo(context);
	    TestUtil.logMsg("[To="+to+"]");
	} catch (Exception e) {
	    TestUtil.logMsg("Exception occurred: " + e);
        }
	if(to != null) {
	  if(!to.equals(W3CAddressingConstants.WSA_ANONYMOUS_ADDRESS_URI) &&
	     !to.equals(W3CAddressingConstants.WSA_NONE_ADDRESS)) {
            throw new AddressingPropertyException("Expected: wsa:To="+W3CAddressingConstants.WSA_ANONYMOUS_ADDRESS_URI+" or "+W3CAddressingConstants.WSA_NONE_ADDRESS+", Actual: wsa:To="+to);
	  }
	}
	try {
	    String relatesTo = getRelatesTo(context);
	    TestUtil.logMsg("[RelatesTo="+relatesTo+"]");
	} catch (Exception e) {
            throw new AddressingPropertyException("wsa:RelatesTo was not set (unexpected)");
	}
    }

    private void VerifyAddressingHeadersForNonAnonymousResponsesAssertion(SOAPMessageContext context, String action){
	TestUtil.logMsg("ClientSOAPHandler.VerifyAddressingHeadersForNonAnonymousResponsesAssertion");
        if (!TestConstants.TEST_NONANONYMOUS_RESPONSES_ASSERTION_OUT_ACTION.equals(action)) {
            throw new ActionNotSupportedException("Expected:"+TestConstants.TEST_NONANONYMOUS_RESPONSES_ASSERTION_OUT_ACTION+", Actual:"+action);
	}
	String to=null;
	try {
	    to = getTo(context);
	    TestUtil.logMsg("[To="+to+"]");
	} catch (Exception e) {
	    TestUtil.logMsg("Exception occurred: " + e);
        }
	if(to != null && to.equals(W3CAddressingConstants.WSA_ANONYMOUS_ADDRESS_URI)) {
            throw new AddressingPropertyException("Expected: wsa:To=!"+W3CAddressingConstants.WSA_ANONYMOUS_ADDRESS_URI+", Actual: wsa:To="+to);
	}
	try {
	    String relatesTo = getRelatesTo(context);
	    TestUtil.logMsg("[RelatesTo="+relatesTo+"]");
	} catch (Exception e) {
            throw new AddressingPropertyException("wsa:RelatesTo was not set (unexpected)");
	}
    }

    protected String whichHandler() { return "ClientSOAPHandler"; }
}
