    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one or more
    003 * contributor license agreements.  See the NOTICE file distributed with
    004 * this work for additional information regarding copyright ownership.
    005 * The ASF licenses this file to You under the Apache License, Version 2.0
    006 * (the "License"); you may not use this file except in compliance with
    007 * the License.  You may obtain a copy of the License at
    008 *
    009 *     https://www.apache.org/licenses/LICENSE-2.0
    010 *
    011 * Unless required by applicable law or agreed to in writing, software
    012 * distributed under the License is distributed on an "AS IS" BASIS,
    013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014 * See the License for the specific language governing permissions and
    015 * limitations under the License.
    016 */
    017package org.apache.commons.configuration2.event;
    018
    019/**
    020 * <p>
    021 * An event class for reporting updates on a configuration object.
    022 * </p>
    023 * <p>
    024 * Event objects of this type are used for &quot;raw&quot; events, i.e. unfiltered modifications of any kind. A level
    025 * with semantically higher events (for example for property changes) may be built on top of this fundamental event mechanism.
    026 * </p>
    027 * <p>
    028 * Each event can contain the following data:
    029 * </p>
    030 * <ul>
    031 * <li>A source object, which is usually the configuration object that was modified.</li>
    032 * <li>The event's type. This is an object that corresponds to constant declarations in specific event classes. It
    033 * describes what exactly has happened.</li>
    034 * <li>If available, the name of the property whose modification caused the event.</li>
    035 * <li>If available, the value of the property that caused this event.</li>
    036 * <li>A flag whether this event was generated before or after the update of the source configuration. A modification of
    037 * a configuration typically causes two events: one event before and one event after the modification is performed. This
    038 * allows event listeners to react at the correct point of time.</li>
    039 * </ul>
    040 * <p>
    041 * The following standard events are generated by typical configuration implementations (the constants for the event
    042 * types are defined in this class:
    043 * </p>
    044 * <dl>
    045 * <dt>ADD_PROPERTY</dt>
    046 * <dd>This event is triggered for each call of the {@code addProperty()} method of a configuration object. It contains
    047 * the name of the property, to which new data is added, and the value object that is added to this property (this may
    048 * be an array or a list if multiple values are added).</dd>
    049 * <dt>SET_PROPERTY</dt>
    050 * <dd>Calling the {@code setProperty()} method triggers this event. The event object stores the name of the affected
    051 * property and its new value.</dd>
    052 * <dt>CLEAR_PROPERTY</dt>
    053 * <dd>If a property is removed from a configuration (by calling the {@code clearProperty()} method), an event of this
    054 * type is fired. In this case the event object only stores the name of the removed property, the value is
    055 * <strong>null</strong>.</dd>
    056 * <dt>CLEAR</dt>
    057 * <dd>This event is fired when the whole configuration is cleared. The corresponding event object contains no
    058 * additional data.</dd>
    059 * </dl>
    060 *
    061 * @since 1.3
    062 */
    063public class ConfigurationEvent extends Event {
    064    /**
    065     * Constant for the common super type of all configuration update events.
    066     *
    067     * @since 2.0
    068     */
    069    public static final EventType<ConfigurationEvent> ANY = new EventType<>(Event.ANY, "CONFIGURATION_UPDATE");
    070
    071    /**
    072     * Constant for the event type for an add property operation.
    073     *
    074     * @since 2.0
    075     */
    076    public static final EventType<ConfigurationEvent> ADD_PROPERTY = new EventType<>(ANY, "ADD_PROPERTY");
    077
    078    /**
    079     * Constant for the event type for a set property operation.
    080     *
    081     * @since 2.0
    082     */
    083    public static final EventType<ConfigurationEvent> SET_PROPERTY = new EventType<>(ANY, "SET_PROPERTY");
    084
    085    /**
    086     * Constant for the event type for a clear property operation.
    087     *
    088     * @since 2.0
    089     */
    090    public static final EventType<ConfigurationEvent> CLEAR_PROPERTY = new EventType<>(ANY, "CLEAR_PROPERTY");
    091
    092    /**
    093     * Constant for the event type for a clear operation.
    094     *
    095     * @since 2.0
    096     */
    097    public static final EventType<ConfigurationEvent> CLEAR = new EventType<>(ANY, "CLEAR");
    098
    099    /**
    100     * Constant for the common base event type for all hierarchical update events. Events derived from this type are
    101     * generated by some specific methods of hierarchical configurations.
    102     *
    103     * @since 2.0
    104     */
    105    public static final EventType<ConfigurationEvent> ANY_HIERARCHICAL = new EventType<>(ANY, "HIERARCHICAL");
    106
    107    /**
    108     * Constant for the event type for an add nodes operation.
    109     *
    110     * @since 2.0
    111     */
    112    public static final EventType<ConfigurationEvent> ADD_NODES = new EventType<>(ANY_HIERARCHICAL, "ADD_NODES");
    113
    114    /**
    115     * Constant for the event type for a clear tree operation.
    116     *
    117     * @since 2.0
    118     */
    119    public static final EventType<ConfigurationEvent> CLEAR_TREE = new EventType<>(ANY_HIERARCHICAL, "CLEAR_TREE");
    120
    121    /**
    122     * Constant for the event type indicating a change on a sub configuration.
    123     *
    124     * @since 2.0
    125     */
    126    public static final EventType<ConfigurationEvent> SUBNODE_CHANGED = new EventType<>(ANY_HIERARCHICAL, "SUBNODE_CHANGED");
    127
    128    /**
    129     * The serial version UID.
    130     */
    131    private static final long serialVersionUID = 20140703L;
    132
    133    /** Stores the property name. */
    134    private final String propertyName;
    135
    136    /** Stores the property value. */
    137    private final Object propertyValue;
    138
    139    /** Stores the before update flag. */
    140    private final boolean beforeUpdate;
    141
    142    /**
    143     * Creates a new instance of {@code ConfigurationEvent} and initializes it.
    144     *
    145     * @param source the event source
    146     * @param type the event's type
    147     * @param propertyName the name of the affected property
    148     * @param propertyValue the value of the affected property
    149     * @param beforeUpdate the before update flag
    150     */
    151    public ConfigurationEvent(final Object source, final EventType<? extends ConfigurationEvent> type, final String propertyName, final Object propertyValue,
    152        final boolean beforeUpdate) {
    153        super(source, type);
    154        this.propertyName = propertyName;
    155        this.propertyValue = propertyValue;
    156        this.beforeUpdate = beforeUpdate;
    157    }
    158
    159    /**
    160     * Gets the name of the affected property. This can be <strong>null</strong> if no property change has lead to this event.
    161     *
    162     * @return the name of the property
    163     */
    164    public String getPropertyName() {
    165        return propertyName;
    166    }
    167
    168    /**
    169     * Gets the value of the affected property if available.
    170     *
    171     * @return the value of the property; can be <strong>null</strong>
    172     */
    173    public Object getPropertyValue() {
    174        return propertyValue;
    175    }
    176
    177    /**
    178     * Returns a flag if this event was generated before or after an update.
    179     *
    180     * @return <strong>true</strong> if this event was generated before an update; <strong>false</strong> otherwise
    181     */
    182    public boolean isBeforeUpdate() {
    183        return beforeUpdate;
    184    }
    185}