001/*
002    Licensed to the Apache Software Foundation (ASF) under one
003    or more contributor license agreements.  See the NOTICE file
004    distributed with this work for additional information
005    regarding copyright ownership.  The ASF licenses this file
006    to you under the Apache License, Version 2.0 (the
007    "License"); you may not use this file except in compliance
008    with the License.  You may obtain a copy of the License at
009
010       http://www.apache.org/licenses/LICENSE-2.0
011
012    Unless required by applicable law or agreed to in writing,
013    software distributed under the License is distributed on an
014    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015    KIND, either express or implied.  See the License for the
016    specific language governing permissions and limitations
017    under the License.  
018 */
019
020package org.apache.wiki.event;
021
022
023/**
024 * <p>
025 * WorkflowEvent indicates that a state change to a Workflow: started, running, waiting, completed, aborted. 
026 * These correspond exactly to the states described in the {@link org.apache.wiki.workflow.Workflow}. All events 
027 * are logged with priority INFO.
028 * </p>
029 * 
030 * @since 2.3.79
031 */
032public final class WorkflowEvent extends WikiEvent {
033
034    private static final long serialVersionUID = 1L;
035    
036    /** After Workflow instantiation. */
037    public static final int CREATED = 0;
038
039    /**
040     * After the Workflow has been instantiated, but before it has been started
041     * using the {@link org.apache.wiki.workflow.Workflow#start()} method.
042     */
043    public static final int STARTED = 10;
044
045    /**
046     * fter the Workflow has been started (or re-started) using the
047     * {@link org.apache.wiki.workflow.Workflow#start()} method, 
048     * but before it has finished processing all Steps.
049     */
050    public static final int RUNNING = 20;
051
052    /** When the Workflow has temporarily paused, for example because of a pending Decision. */
053    public static final int WAITING = 30;
054
055    /** After the Workflow has finished processing all Steps, without errors. */
056    public static final int COMPLETED = 40;
057
058    /** If a Step has elected to abort the Workflow. */
059    public static final int ABORTED = 50;
060
061    /**
062     * Constructs a new instance of this event type, which signals a security event has occurred. 
063     * The <code>source</code> parameter is required, and may not be <code>null</code>. When the 
064     * WikiSecurityEvent is constructed, the security logger {@link WikiSecurityEvent#log} is notified.
065     * 
066     * @param src the source of the event, which can be any object: a wiki page, group or 
067     *            authentication/authentication/group manager.
068     * @param type the type of event
069     */
070    public WorkflowEvent( Object src, int type ) {
071        super( src, type );
072        if( src == null ) {
073            throw new IllegalArgumentException( "Argument(s) cannot be null." );
074        }
075    }
076
077    /**
078     * Prints a String (human-readable) representation of this object.
079     * 
080     * @see java.lang.Object#toString()
081     */
082    public String toString() {
083        StringBuilder msg = new StringBuilder();
084        msg.append( "WorkflowEvent." );
085        msg.append( eventName( getType() ) );
086        Object obj = getSrc(); // cfr. https://forums.oracle.com/forums/thread.jspa?threadID=1184115
087        msg.append( " [source=" + obj.toString() );
088        msg.append( "]" );
089        return msg.toString();
090    }
091
092    /**
093     * Returns a textual representation of an event type.
094     * 
095     * @param type the type
096     * @return the string representation
097     */
098    public String eventName( int type ) {
099        switch( type ) {
100            case CREATED:   return "CREATED";
101            case ABORTED:   return "ABORTED";
102            case COMPLETED: return "COMPLETED";
103            case RUNNING:   return "RUNNING";
104            case STARTED:   return "STARTED";
105            case WAITING:   return "WAITING";
106            default:        return super.eventName();
107        }
108    }
109
110}