001: /*
002: * $Id: GraphContext.java,v 1.2 2002/02/15 23:44:28 skavish Exp $
003: *
004: * ==========================================================================
005: *
006: * The JGenerator Software License, Version 1.0
007: *
008: * Copyright (c) 2000 Dmitry Skavish (skavish@usa.net). All rights reserved.
009: *
010: * Redistribution and use in source and binary forms, with or without
011: * modification, are permitted provided that the following conditions are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution, if
022: * any, must include the following acknowlegement:
023: * "This product includes software developed by Dmitry Skavish
024: * (skavish@usa.net, http://www.flashgap.com/)."
025: * Alternately, this acknowlegement may appear in the software itself,
026: * if and wherever such third-party acknowlegements normally appear.
027: *
028: * 4. The name "The JGenerator" must not be used to endorse or promote
029: * products derived from this software without prior written permission.
030: * For written permission, please contact skavish@usa.net.
031: *
032: * 5. Products derived from this software may not be called "The JGenerator"
033: * nor may "The JGenerator" appear in their names without prior written
034: * permission of Dmitry Skavish.
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL DMITRY SKAVISH OR THE OTHER
040: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: *
049: */
050:
051: package org.openlaszlo.iv.flash.context;
052:
053: import java.util.*;
054:
055: /**
056: * Abstract generator context which supports path expressions.
057: *
058: * PathContexts allow for expressions which can evaluate expressions to lists
059: * of contexts, not just Strings.
060: *
061: * @author James Taylor
062: */
063:
064: public abstract class GraphContext extends Context {
065: public abstract List getValueList(String path);
066:
067: public abstract String getValue(String path);
068:
069: protected List getValueListFromParent(String path) {
070: Context parent = getParent();
071:
072: // Find closest parent which is a GraphContext and call its
073: // getValueList method.
074:
075: while (parent != null) {
076:
077: if (parent instanceof GraphContext) {
078: return ((GraphContext) parent).getValueList(path);
079: } else {
080: parent = parent.getParent();
081: }
082: }
083:
084: // If no parent is a GraphContext, return an empty list.
085:
086: return null;
087: }
088:
089: /**
090: * Sort given List of contexts using given path 'sortby' as a key
091: *
092: * @param list List to sort
093: * @param sortby Path expression to sort on
094: * @param ascending if true then sort in ascending order, otherwise in descending
095: * @return sorted copy of list
096: */
097:
098: public static List sortValueList(List list, final String sortby,
099: final boolean ascending) {
100: // create list to sort into
101:
102: ArrayList newList = new ArrayList(list);
103:
104: // sort
105:
106: Collections.sort(newList, new java.util.Comparator() {
107: public int compare(Object o1, Object o2) {
108: String val1 = ((GraphContext) o1).getValue(sortby);
109: String val2 = ((GraphContext) o2).getValue(sortby);
110:
111: if (ascending) {
112: return val1.compareTo(val2);
113: } else {
114: return val2.compareTo(val1);
115: }
116: }
117: });
118:
119: return newList;
120: }
121:
122: }
|