AbstractPhaseListener.java

// license-header java merge-point
// Generated by andromda-jsf cartridge (utils\AbstractPhaseListener.java.vsl) DO NOT EDIT!
package org.andromda.presentation.jsf;

import java.util.HashMap;
import java.util.Map;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

/**
 * An abstract phase listener that can be extended, provides some basic functionality (like
 * the prevention of the phase listener being used more than once if it happens to be
 * registered more than once by the container, like seems to happen with myfaces used with liferay).
 *
 * @author Chad Brandon
 */
public abstract class AbstractPhaseListener
    implements PhaseListener
{
    private static final long serialVersionUID = 1L;

    private static Map<Class<? extends AbstractPhaseListener>, Object> firstInstances
        = new HashMap<Class<? extends AbstractPhaseListener>, Object>();

    private boolean isFirstInstance()
    {
        return firstInstances.get(this.getClass()).equals(this);
    }

    /**
     *
     */
    public AbstractPhaseListener()
    {
        if (!firstInstances.containsKey(this.getClass()))
        {
            firstInstances.put(this.getClass(), this);
        }
    }

    /**
     * @see PhaseListener#beforePhase(PhaseEvent)
     */
    @Override
    public void beforePhase(PhaseEvent event)
    {
        if (this.isFirstInstance())
        {
            this.handleBeforePhase(event);
        }
    }

    /**
     * @param event
     */
    protected abstract void handleBeforePhase(PhaseEvent event);

    /**
     * @see PhaseListener#afterPhase(PhaseEvent)
     */
    @Override
    public void afterPhase(PhaseEvent event)
    {
        if (this.isFirstInstance())
        {
            this.handleAfterPhase(event);
        }
    }

    /**
     * @param event
     */
    protected abstract void handleAfterPhase(PhaseEvent event);

    /**
     * @see PhaseListener#getPhaseId()
     */
    @Override
    public PhaseId getPhaseId()
    {
        return PhaseId.ANY_PHASE;
    }
}