
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.axis2.jaxws.proxy.gorilla_dlw.sei;

import javax.xml.ws.WebFault;


/**
 * This class was generated by the JAXWS SI.
 * JAX-WS RI 2.0_01-b15-fcs
 * Generated source version: 2.0
 * 
 */
@WebFault(name = "assertFault", targetNamespace = "http://org/apache/axis2/jaxws/proxy/gorilla_dlw/data")
public class AssertFault
    extends Exception
{

    /**
     * Java type that goes as soapenv:Fault detail element.
     * 
     */
    private org.apache.axis2.jaxws.proxy.gorilla_dlw.data.AssertFault faultInfo;

    /**
     * 
     * @param message
     * @param faultInfo
     */
    public AssertFault(String message, org.apache.axis2.jaxws.proxy.gorilla_dlw.data.AssertFault faultInfo) {
        super(message);
        this.faultInfo = faultInfo;
    }

    /**
     * 
     * @param cause
     * @param message
     * @param faultInfo
     */
    public AssertFault(String message, org.apache.axis2.jaxws.proxy.gorilla_dlw.data.AssertFault faultInfo, Throwable cause) {
        super(message, cause);
        this.faultInfo = faultInfo;
    }

    /**
     * 
     * @return
     *     returns fault bean: org.apache.axis2.jaxws.proxy.gorilla_dlw.data.AssertFault
     */
    public org.apache.axis2.jaxws.proxy.gorilla_dlw.data.AssertFault getFaultInfo() {
        return faultInfo;
    }

}
