001 /* 002 // $Id: QueryEvent.java 482 2012-01-05 23:27:27Z jhyde $ 003 // 004 // Licensed to Julian Hyde under one or more contributor license 005 // agreements. See the NOTICE file distributed with this work for 006 // additional information regarding copyright ownership. 007 // 008 // Julian Hyde licenses this file to you under the Apache License, 009 // Version 2.0 (the "License"); you may not use this file except in 010 // compliance with the License. You may obtain a copy of the License at: 011 // 012 // http://www.apache.org/licenses/LICENSE-2.0 013 // 014 // Unless required by applicable law or agreed to in writing, software 015 // distributed under the License is distributed on an "AS IS" BASIS, 016 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 017 // See the License for the specific language governing permissions and 018 // limitations under the License. 019 */ 020 package org.olap4j.query; 021 022 import java.util.*; 023 024 /** 025 * Describes which changes were performed to the query model. 026 * 027 * @author Luc Boudreau 028 * @version $Id: QueryEvent.java 482 2012-01-05 23:27:27Z jhyde $ 029 */ 030 public final class QueryEvent { 031 032 /** 033 * Describes the nature of the event. 034 */ 035 public static enum Type { 036 /** 037 * Event where one or more children of a QueryNode were removed. 038 */ 039 CHILDREN_REMOVED, 040 /** 041 * Event where one or more nodes were added as children of a QueryNode. 042 */ 043 CHILDREN_ADDED, 044 /** 045 * Event where a Selection object operator was changed. 046 */ 047 SELECTION_CHANGED 048 } 049 050 private final QueryNode source; 051 private final QueryEvent.Type operation; 052 private final Map<Integer, QueryNode> children; 053 054 /** 055 * Creates a QueryEvent with a single child. 056 * 057 * @param operation Even type 058 * @param source Query node that generated this event 059 * @param child Child node 060 */ 061 QueryEvent( 062 QueryEvent.Type operation, 063 QueryNode source, 064 QueryNode child, 065 int index) 066 { 067 this.children = Collections.singletonMap(index, child); 068 this.source = source; 069 this.operation = operation; 070 } 071 072 /** 073 * Creates a QueryEvent with multiple children. 074 * 075 * @param operation Even type 076 * @param source Query node that generated this event 077 * @param children Child nodes and their indexes within the parent 078 */ 079 QueryEvent( 080 QueryEvent.Type operation, 081 QueryNode source, 082 Map<Integer, QueryNode> children) 083 { 084 // copy the map, and make immutable 085 this.children = 086 Collections.unmodifiableMap( 087 new HashMap<Integer, QueryNode>(children)); 088 this.source = source; 089 this.operation = operation; 090 } 091 092 /** 093 * Creates a QueryEvent with no children. 094 * 095 * @param operation Even type 096 * @param source Query node that generated this event 097 */ 098 QueryEvent( 099 QueryEvent.Type operation, 100 QueryNode source) 101 { 102 this.children = null; 103 this.source = source; 104 this.operation = operation; 105 } 106 107 /** 108 * Returns the object that generated this event. 109 */ 110 public QueryNode getSource() { 111 return source; 112 } 113 114 /** 115 * Returns the event type. 116 */ 117 // REVIEW: consider renaming to 'getEventType', or rename enum Type to 118 // Operation. 119 public QueryEvent.Type getOperation() { 120 return operation; 121 } 122 123 /** 124 * Returns a map of objects affected by the event and 125 * their index in the list of the source children. 126 * 127 * <p>If the event is of type {@link QueryEvent.Type#SELECTION_CHANGED}, 128 * this method will return null because the source object was affected 129 * and not the children. 130 */ 131 // REVIEW: 'children' is already plural. Consider renaming to 'getChildren' 132 // or 'getChildNodes'. 133 public Map<Integer, QueryNode> getChildrens() { 134 return children; 135 } 136 } 137 138 // End QueryEvent.java