001: package org.tigris.scarab.om;
002:
003: /* ================================================================
004: * Copyright (c) 2000-2005 CollabNet. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions are
008: * met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in the
015: * documentation and/or other materials provided with the distribution.
016: *
017: * 3. The end-user documentation included with the redistribution, if
018: * any, must include the following acknowlegement: "This product includes
019: * software developed by Collab.Net <http://www.Collab.Net/>."
020: * Alternately, this acknowlegement may appear in the software itself, if
021: * and wherever such third-party acknowlegements normally appear.
022: *
023: * 4. The hosted project names must not be used to endorse or promote
024: * products derived from this software without prior written
025: * permission. For written permission, please contact info@collab.net.
026: *
027: * 5. Products derived from this software may not use the "Tigris" or
028: * "Scarab" names nor may "Tigris" or "Scarab" appear in their names without
029: * prior written permission of Collab.Net.
030: *
031: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
032: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
033: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
034: * IN NO EVENT SHALL COLLAB.NET OR ITS CONTRIBUTORS BE LIABLE FOR ANY
035: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
036: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
037: * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
038: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
039: * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
040: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
041: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
042: *
043: * ====================================================================
044: *
045: * This software consists of voluntary contributions made by many
046: * individuals on behalf of Collab.Net.
047: */
048:
049: import org.apache.torque.util.Criteria;
050: import org.apache.torque.TorqueException;
051:
052: import java.util.ArrayList;
053: import java.util.Iterator;
054: import java.util.List;
055:
056: /**
057: * Exposes additional methods to manage torque-generated Transition objects.
058: */
059: public class TransitionPeer extends BaseTransitionPeer {
060: /**
061: * Returns a list with every defined transition for a given attribute
062: * @param attribute
063: * @return
064: */
065: public static List getAllTransitions(Attribute attribute) {
066: return TransitionManager.getAllTransitions(attribute);
067: }
068:
069: /**
070: * This method will return the list of available transitions which
071: * allow to change an attribute from option 'fromOption' to any other
072: * option. It operates 'in-memory', over the list of every defined
073: * transition for the involved attribute.
074: * @param fromOption
075: * @param toOption
076: * @return
077: */
078: public static List getTransitionsFrom(List availableOptions,
079: Attribute attribute, AttributeOption fromOption) {
080: Integer attribId = attribute.getAttributeId();
081: Integer fromOptionId = (fromOption == null) ? null : fromOption
082: .getOptionId();
083: List result = new ArrayList();
084: List all = getAllTransitions(attribute);
085: for (Iterator it = all.iterator(); it.hasNext();) {
086: Transition t = (Transition) it.next();
087: if (t.getFromOptionId() == null
088: && t.getToOptionId() == null
089: && t.getAttributeId().equals(attribId)) {
090: // Open transition (null -> null)
091: result.add(t);
092: } else if (t.getFromOptionId() == null
093: && t.getAttributeId().equals(attribId)) {
094: // Open beginning
095: result.add(t);
096: } else if (t.getToOptionId() == null
097: && t.getAttributeId().equals(attribId)) {
098: // Open ending
099: result.add(t);
100: } else if (t.getFromOptionId() != null
101: && fromOptionId != null
102: && t.getFromOptionId().equals(fromOptionId)
103: && t.getAttributeId().equals(attribId)) {
104: result.add(t);
105: } else if (t.getFromOptionId() != null
106: && fromOptionId == null
107: && t.getFromOptionId().intValue() == 0
108: && t.getAttributeId().equals(attribId)) {
109: result.add(t);
110: }
111: }
112: return result;
113: }
114:
115: /**
116: * This method will return the list of availaible transitions that allow any
117: * user to change an attribute from option 'fromOption' to 'toOption'. It
118: * operates 'in-memory', over the list of every defined transition for the
119: * involved attribute.
120: *
121: * @param fromOption
122: * @param toOption
123: * @return
124: */
125: public static List getTransitions(AttributeOption fromOption,
126: AttributeOption toOption) {
127: Integer attribId = toOption.getAttributeId();
128: Integer fromOptionId = fromOption.getOptionId();
129: Integer toOptionId = toOption.getOptionId();
130: List result = new ArrayList();
131: try {
132: List all = getAllTransitions(toOption.getAttribute());
133: for (Iterator it = all.iterator(); it.hasNext();) {
134: Transition t = (Transition) it.next();
135: if (t.getFromOptionId() == null
136: && t.getToOptionId() == null
137: && t.getAttributeId().equals(attribId)) {
138: // Open transition (null -> null)
139: result.add(t);
140: } else if (t.getFromOptionId() == null
141: && t.getAttributeId().equals(attribId)
142: && t.getToOptionId() != null
143: && t.getToOptionId().equals(toOptionId)) {
144: // Open beginning
145: result.add(t);
146: } else if (t.getToOptionId() == null
147: && t.getAttributeId().equals(attribId)
148: && t.getFromOptionId() != null
149: && t.getFromOptionId().equals(fromOptionId)) {
150: // Open ending
151: result.add(t);
152: } else if (t.getFromOptionId() != null
153: && t.getFromOptionId().equals(fromOptionId)
154: && t.getToOptionId() != null
155: && t.getToOptionId().equals(toOptionId)
156: && t.getAttributeId().equals(attribId)) {
157: result.add(t);
158: }
159: }
160: } catch (TorqueException e) {
161: log.error("getTransitions(): AttributeOption: "
162: + fromOption.getOptionId() + ": " + e);
163: }
164: return result;
165: }
166:
167: /**
168: * If there is any defined transitions for the given attribute, it will
169: * return true. It's needed because the CheapWorkflow system will not try to
170: * restrict the transitions if there is none defined.
171: *
172: * @param attribute
173: * @return
174: */
175: public static boolean hasDefinedTransitions(Attribute attribute) {
176: boolean result = false;
177: List transitions = getAllTransitions(attribute);
178: result = (transitions != null && transitions.size() > 0);
179: return result;
180: }
181:
182: public static void doDelete(Transition tran) throws TorqueException {
183: Criteria crit = new Criteria();
184: crit.add(ConditionPeer.TRANSITION_ID, tran.getTransitionId());
185: ConditionPeer.doDelete(crit);
186: BaseTransitionPeer.doDelete(tran);
187: }
188: }
|