/*******************************************************************************
 * Copyright (c) 2009, 2011 SAP AG and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     SAP AG - initial API and implementation
 ******************************************************************************/
package org.eclipse.ocl.examples.eventmanager.filters;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;

/**
 * Matches an {@link Notification#getEventType() event type}. The constants are
 * defined in {@link Notifier}.
 * 
 * @author Philipp Berger, Axel Uhl
 * 
 */
public class EventTypeFilter extends AbstractEventFilter {
    private final int eventType;

    /**
     * Creates a new {@link EventTypeFilter} with the given filter type.
     * For the different types {@see Notifier}
     * @param eventType
     * @param negated defines whether the filter is negated
     */
    public EventTypeFilter(int eventType, boolean negated) {
        super(negated);
        this.eventType = eventType;
    }

    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        EventTypeFilter other = (EventTypeFilter) obj;
        if (eventType != other.eventType) {
            return false;
        }
        return isNegated() == ((AbstractEventFilter) other).isNegated();
    }

    /**
     * Gives the event type of this filter object
     * @return an integer representing the event type
     */
    public int getEventType() {
        return eventType;
    }

    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + eventType;
        if (isNegated()) {
            result = prime * result;
        }
        return result;
    }

    public boolean matchesFor(Notification event) {
        return event.getEventType() == getEventType();
    }

    @Override
    public String toString() {
    	String result;
        switch (getEventType()) {
        case 0:
            result = "filter CREATE";

        case 1:
            result = "filter SET";

        case 2:
            result = "filter UNSET";

        case 3:
            result = "filter ADD";

        case 4:
            result = "filter REMOVE";

        case 5:
            result = "filter ADD_MANY";

        case 6:
            result = "filter REMOVE_MANY";

        case 7:
            result = "filter MOVE";

        case 8:
            result = "filter REMOVING_ADAPTER";

        case 9:
            result = "filter RESOLVE";
        }

        result = "filter undefined";
        return (isNegated()?"negated ":"") + result;
    }

    @Override
    public EventTypeFilter clone() {
        return new EventTypeFilter(getEventType(), isNegated());

    }

    @Override
    public Object getFilterCriterion() {
        return getEventType();
    }
} // EventTypeFilterImpl
