/*
 * Copyright 2018-present Open Networking Foundation
 *
 * Licensed 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.onosproject.workflow.api;

import org.onosproject.event.AbstractEvent;

/**
 * Workflow data event class.
 */
public class WorkflowDataEvent extends AbstractEvent<WorkflowDataEvent.Type, WorkflowData> {

    /**
     * Workflow data event types.
     */
    public enum Type {

        /**
         * Insertion of workflow data.
         */
        INSERT,

        /**
         * Updation of workflow data.
         */
        UPDATE,

        /**
         * Removal of workflow data.
         */
        REMOVE
    }

    /**
     * Constructor for workflow data event.
     * @param type workflow data event type
     * @param data workflow data
     */
    public WorkflowDataEvent(Type type, WorkflowData data) {
        super(type, data);
    }
}
