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    
020    package org.apache.wiki.event;
021    
022    import java.util.EventObject;
023    
024    /**
025     * Abstract parent class for wiki events.
026     *
027     * @since 2.3.79
028     */
029    public abstract class WikiEvent extends EventObject
030    {
031        private static final long serialVersionUID = 1829433967558773960L;
032    
033        /** Indicates a exception or error state. */
034        public static final int ERROR          = -99;
035    
036        /** Indicates an undefined state. */
037        public static final int UNDEFINED      = -98;
038    
039        private int m_type = UNDEFINED;
040    
041        private final long m_when;
042    
043        // ............
044    
045    
046       /**
047         * Constructs an instance of this event.
048         * @param src the Object that is the source of the event.
049         * @param type   the event type.
050         */
051        public WikiEvent( Object src, int type )
052        {
053            super( src );
054            m_when = System.currentTimeMillis();
055            setType( type );
056        }
057        
058        /**
059         * Convenience method that returns the typed object to which the event applied.
060         * 
061         * @return the typed object to which the event applied.
062         */
063        @SuppressWarnings("unchecked")
064        public <T> T getSrc()
065        {
066            return (T) super.getSource();
067        }
068    
069    
070        /**
071         *  Returns the timestamp of when this WikiEvent occurred.
072         *
073         * @return this event's timestamp
074         * @since 2.4.74
075         */
076        public long getWhen()
077        {
078            return m_when;
079        }
080    
081    
082       /**
083         * Sets the type of this event. Validation of acceptable
084         * type values is the responsibility of each subclass.
085         *
086         * @param type      the type of this WikiEvent.
087         */
088        protected void setType( int type )
089        {
090            m_type = type;
091        }
092    
093    
094       /**
095         * Returns the type of this event.
096         *
097         * @return  the type of this WikiEvent. See the enumerated values
098         *          defined in {@link org.apache.wiki.event.WikiEvent}).
099         */
100        public int getType()
101        {
102            return m_type;
103        }
104    
105    
106       /** Returns a String (human-readable) description of an event type.
107         * This should be subclassed as necessary.
108         * @return the String description
109         */
110        public String getTypeDescription()
111        {
112            switch ( m_type )
113            {
114                case ERROR:                return "exception or error event";
115                case UNDEFINED:            return "undefined event type";
116                default:                   return "unknown event type (" + m_type + ")";
117            }
118        }
119    
120    
121       /**
122         * Returns true if the int value is a valid WikiEvent type.
123         * Because the WikiEvent class does not itself any event types,
124         * this method returns true if the event type is anything except
125         * {@link #ERROR} or {@link #UNDEFINED}. This method is meant to
126         * be subclassed as appropriate.
127         * 
128         * @param type The value to test.
129         * @return true, if the value is a valid WikiEvent type.
130         */
131        public static boolean isValidType( int type )
132        {
133            return type != ERROR && type != UNDEFINED;
134        }
135    
136    
137        /**
138         * Returns a textual representation of an event type.
139         * @return the String representation
140         */
141        public String eventName()
142        {
143            switch( m_type )
144            {
145                case ERROR:                return "ERROR";
146                case UNDEFINED:            return "UNDEFINED";
147                default:                   return "UNKNOWN (" + m_type + ")";
148            }
149        }
150    
151        /**
152         * Prints a String (human-readable) representation of this object.
153         * This should be subclassed as necessary.
154         * @see java.lang.Object#toString()
155         * @return the String representation
156         */
157        public String toString()
158        {
159            StringBuffer out = new StringBuffer();
160            out.append( "WikiEvent." );
161            out.append( eventName() );
162            out.append( " [source=" );
163            out.append( getSource().toString() );
164            out.append( "]" );
165            return out.toString();
166        }
167    
168    }