001: /*
002: The contents of this file are subject to the Common Public Attribution License
003: Version 1.0 (the "License"); you may not use this file except in compliance with
004: the License. You may obtain a copy of the License at
005: http://www.projity.com/license . The License is based on the Mozilla Public
006: License Version 1.1 but Sections 14 and 15 have been added to cover use of
007: software over a computer network and provide for limited attribution for the
008: Original Developer. In addition, Exhibit A has been modified to be consistent
009: with Exhibit B.
010:
011: Software distributed under the License is distributed on an "AS IS" basis,
012: WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the
013: specific language governing rights and limitations under the License. The
014: Original Code is OpenProj. The Original Developer is the Initial Developer and
015: is Projity, Inc. All portions of the code written by Projity are Copyright (c)
016: 2006, 2007. All Rights Reserved. Contributors Projity, Inc.
017:
018: Alternatively, the contents of this file may be used under the terms of the
019: Projity End-User License Agreeement (the Projity License), in which case the
020: provisions of the Projity License are applicable instead of those above. If you
021: wish to allow use of your version of this file only under the terms of the
022: Projity License and not to allow others to use your version of this file under
023: the CPAL, indicate your decision by deleting the provisions above and replace
024: them with the notice and other provisions required by the Projity License. If
025: you do not delete the provisions above, a recipient may use your version of this
026: file under either the CPAL or the Projity License.
027:
028: [NOTE: The text of this license may differ slightly from the text of the notices
029: in Exhibits A and B of the license at http://www.projity.com/license. You should
030: use the latest text at http://www.projity.com/license for your modifications.
031: You may not remove this license text from the source files.]
032:
033: Attribution Information: Attribution Copyright Notice: Copyright © 2006, 2007
034: Projity, Inc. Attribution Phrase (not exceeding 10 words): Powered by OpenProj,
035: an open source solution from Projity. Attribution URL: http://www.projity.com
036: Graphic Image as provided in the Covered Code as file: openproj_logo.png with
037: alternatives listed on http://www.projity.com/logo
038:
039: Display of Attribution Information is required in Larger Works which are defined
040: in the CPAL as a work which combines Covered Code or portions thereof with code
041: not governed by the terms of the CPAL. However, in addition to the other notice
042: obligations, all copies of the Covered Code in Executable and Source Code form
043: distributed must, as a form of attribution of the original author, include on
044: each user interface screen the "OpenProj" logo visible to all users. The
045: OpenProj logo should be located horizontally aligned with the menu bar and left
046: justified on the top left of the screen adjacent to the File menu. The logo
047: must be at least 100 x 25 pixels. When users click on the "OpenProj" logo it
048: must direct them back to http://www.projity.com.
049: */
050: package com.projity.grouping.core.summaries;
051:
052: import java.util.Date;
053: import java.util.Hashtable;
054:
055: import org.apache.commons.collections.BidiMap;
056: import org.apache.commons.collections.bidimap.DualHashBidiMap;
057:
058: import com.projity.datatype.DurationFormat;
059: import com.projity.strings.Messages;
060:
061: /**
062: *
063: */
064: public class SummaryVisitorFactory implements SummaryNames {
065:
066: public static SummaryVisitor getInstance(int type, Class clazz,
067: boolean forceDeep) {
068: //TODO implement this
069:
070: if (type == SAME) {
071: return new ShallowChildWalker(new Same());
072: }
073:
074: if (clazz == Boolean.class) {
075: switch (type) {
076: case OR:
077: return new LeafWalker(new Maximum());
078: case AND:
079: return new LeafWalker(new Minimum());
080: }
081: } else {
082:
083: switch (type) {
084: case MAXIMUM:
085: return new LeafWalker(new Maximum());
086: case MINIMUM:
087: return new LeafWalker(new Minimum());
088: case COUNT_ALL:
089: return new DeepChildWalker(new Count(), true);
090: case SUM:
091: if (forceDeep)
092: return new DeepChildWalker(new Sum(), true);
093: else
094: return new LeafWalker(new Sum());
095: case AVERAGE:
096: return new LeafWalker(new Average());
097: case AVERAGE_FIRST_SUBLEVEL:
098: return new ShallowChildWalker(new Average());
099: case COUNT_FIRST_SUBLEVEL:
100: return new ShallowChildWalker(new Count());
101: case LIST:
102: return new LeafWalker(new ConcatTextSummaryVisitor());
103: case NONE:
104: case THIS:
105: default:
106: }
107: }
108: return null;
109: }
110:
111: private static BidiMap COST_SUMMARY_MAP = new DualHashBidiMap();
112: static {
113: COST_SUMMARY_MAP.put(Messages.getString("Summary.None"),
114: new Integer(NONE));
115: COST_SUMMARY_MAP.put(Messages.getString("Summary.Average"),
116: new Integer(AVERAGE));
117: COST_SUMMARY_MAP.put(Messages
118: .getString("Summary.AverageFirstSublevel"),
119: new Integer(AVERAGE_FIRST_SUBLEVEL));
120: COST_SUMMARY_MAP.put(Messages.getString("Summary.Maximum"),
121: new Integer(MAXIMUM));
122: COST_SUMMARY_MAP.put(Messages.getString("Summary.Minimum"),
123: new Integer(MINIMUM));
124: COST_SUMMARY_MAP.put(Messages.getString("Summary.Sum"),
125: new Integer(SUM));
126: }
127:
128: private static BidiMap DATE_SUMMARY_MAP = new DualHashBidiMap();
129: static {
130: DATE_SUMMARY_MAP.put(Messages.getString("Summary.None"),
131: new Integer(NONE));
132: DATE_SUMMARY_MAP.put(Messages.getString("Summary.Maximum"),
133: new Integer(MAXIMUM));
134: DATE_SUMMARY_MAP.put(Messages.getString("Summary.Minimum"),
135: new Integer(MINIMUM));
136: }
137:
138: private static BidiMap DURATION_SUMMARY_MAP = COST_SUMMARY_MAP;
139:
140: private static BidiMap FLAG_SUMMARY_MAP = new DualHashBidiMap();
141: static {
142: FLAG_SUMMARY_MAP.put(Messages.getString("Summary.None"),
143: new Integer(NONE));
144: FLAG_SUMMARY_MAP.put(Messages.getString("Summary.OR"),
145: new Integer(OR));
146: FLAG_SUMMARY_MAP.put(Messages.getString("Summary.AND"),
147: new Integer(AND));
148: }
149:
150: private static BidiMap NUMBER_SUMMARY_MAP = new DualHashBidiMap();
151: static {
152: NUMBER_SUMMARY_MAP.put(Messages.getString("Summary.None"),
153: new Integer(NONE));
154: NUMBER_SUMMARY_MAP.put(Messages.getString("Summary.Average"),
155: new Integer(AVERAGE));
156: NUMBER_SUMMARY_MAP.put(Messages
157: .getString("Summary.AverageFirstSublevel"),
158: new Integer(AVERAGE_FIRST_SUBLEVEL));
159: NUMBER_SUMMARY_MAP.put(Messages.getString("Summary.CountAll"),
160: new Integer(COUNT_ALL));
161: NUMBER_SUMMARY_MAP.put(Messages
162: .getString("Summary.CountFirstSublevel"), new Integer(
163: COUNT_FIRST_SUBLEVEL));
164: NUMBER_SUMMARY_MAP.put(Messages
165: .getString("Summary.CountNonsummaries"), new Integer(
166: COUNT_NONSUMMARIES));
167: NUMBER_SUMMARY_MAP.put(Messages.getString("Summary.Maximum"),
168: new Integer(MAXIMUM));
169: NUMBER_SUMMARY_MAP.put(Messages.getString("Summary.Minimum"),
170: new Integer(MINIMUM));
171: NUMBER_SUMMARY_MAP.put(Messages.getString("Summary.Sum"),
172: new Integer(SUM));
173: }
174:
175: private static BidiMap TEXT_SUMMARY_MAP = new DualHashBidiMap();
176: static {
177: TEXT_SUMMARY_MAP.put(Messages.getString("Summary.None"),
178: new Integer(NONE));
179: TEXT_SUMMARY_MAP.put(Messages.getString("Summary.List"),
180: new Integer(LIST));
181: }
182:
183: private static Hashtable ALL_SUMMARY_MAP = new Hashtable();
184: static {
185: ALL_SUMMARY_MAP.put("None", new Integer(NONE));
186: ALL_SUMMARY_MAP.put("This", new Integer(THIS));
187: ALL_SUMMARY_MAP.put("List", new Integer(LIST));
188: ALL_SUMMARY_MAP.put("Average", new Integer(AVERAGE));
189: ALL_SUMMARY_MAP.put("AverageFirstSublevel", new Integer(
190: AVERAGE_FIRST_SUBLEVEL));
191: ALL_SUMMARY_MAP.put("CountAll", new Integer(COUNT_ALL));
192: ALL_SUMMARY_MAP.put("CountFirstSublevel", new Integer(
193: COUNT_FIRST_SUBLEVEL));
194: ALL_SUMMARY_MAP.put("CountNonsummaries", new Integer(
195: COUNT_NONSUMMARIES));
196: ALL_SUMMARY_MAP.put("Maximum", new Integer(MAXIMUM));
197: ALL_SUMMARY_MAP.put("Minimum", new Integer(MINIMUM));
198: ALL_SUMMARY_MAP.put("Sum", new Integer(SUM));
199: ALL_SUMMARY_MAP.put("OR", new Integer(OR));
200: ALL_SUMMARY_MAP.put("AND", new Integer(AND));
201:
202: ALL_SUMMARY_MAP.put("Same", new Integer(SAME));
203: }
204:
205: /**
206: * Used when reading in config file to transform a summary name into an id
207: * @param name
208: * @return
209: */
210: public static int getSummaryId(String name) {
211: Integer id = (Integer) ALL_SUMMARY_MAP.get(name);
212: if (id == null)
213: return NONE;
214: return id.intValue();
215: }
216:
217: public static BidiMap getMap(Class clazz, boolean cost) {
218: if (clazz == Double.class) {
219: return cost ? COST_SUMMARY_MAP : NUMBER_SUMMARY_MAP;
220: } else if (clazz == Date.class) {
221: return DATE_SUMMARY_MAP;
222: } else if (clazz == DurationFormat.class) {
223: return DURATION_SUMMARY_MAP;
224: } else if (clazz == String.class) {
225: return TEXT_SUMMARY_MAP;
226: } else if (clazz == Boolean.class) {
227: return FLAG_SUMMARY_MAP;
228: }
229:
230: return null;
231:
232: }
233:
234: }
|