/**
 * 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.openejb.jee;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlID;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;


/**
 * web-facesconfig_2_0.xsd
 *
 * <p>Java class for faces-config-system-event-listenerType complex type.
 *
 * <p>The following schema fragment specifies the expected content contained within this class.
 *
 * <pre>
 * &lt;complexType name="faces-config-system-event-listenerType"&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="system-event-listener-class" type="{http://java.sun.com/xml/ns/javaee}fully-qualified-classType"/&gt;
 *         &lt;element name="system-event-class" type="{http://java.sun.com/xml/ns/javaee}fully-qualified-classType"/&gt;
 *         &lt;element name="source-class" type="{http://java.sun.com/xml/ns/javaee}fully-qualified-classType" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *       &lt;attribute name="id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "faces-config-system-event-listenerType", propOrder = {
    "systemEventListenerClass",
    "systemEventClass",
    "sourceClass"
})
public class FacesSystemEventListener {

    @XmlElement(name = "system-event-listener-class", required = true)
    protected String systemEventListenerClass;
    @XmlElement(name = "system-event-class", required = true)
    protected String systemEventClass;
    @XmlElement(name = "source-class")
    protected String sourceClass;
    @XmlAttribute
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlID
    @XmlSchemaType(name = "ID")
    protected java.lang.String id;

    /**
     * Gets the value of the systemEventListenerClass property.
     *
     * @return possible object is
     * {@link String }
     */
    public String getSystemEventListenerClass() {
        return systemEventListenerClass;
    }

    /**
     * Sets the value of the systemEventListenerClass property.
     *
     * @param value allowed object is
     *              {@link String }
     */
    public void setSystemEventListenerClass(final String value) {
        this.systemEventListenerClass = value;
    }

    /**
     * Gets the value of the systemEventClass property.
     *
     * @return possible object is
     * {@link String }
     */
    public String getSystemEventClass() {
        return systemEventClass;
    }

    /**
     * Sets the value of the systemEventClass property.
     *
     * @param value allowed object is
     *              {@link String }
     */
    public void setSystemEventClass(final String value) {
        this.systemEventClass = value;
    }

    /**
     * Gets the value of the sourceClass property.
     *
     * @return possible object is
     * {@link String }
     */
    public String getSourceClass() {
        return sourceClass;
    }

    /**
     * Sets the value of the sourceClass property.
     *
     * @param value allowed object is
     *              {@link String }
     */
    public void setSourceClass(final String value) {
        this.sourceClass = value;
    }

    /**
     * Gets the value of the id property.
     *
     * @return possible object is
     * {@link java.lang.String }
     */
    public java.lang.String getId() {
        return id;
    }

    /**
     * Sets the value of the id property.
     *
     * @param value allowed object is
     *              {@link java.lang.String }
     */
    public void setId(final java.lang.String value) {
        this.id = value;
    }

}
