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 CollabNet <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 CollabNet.
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 CollabNet.
047: */
048:
049: import java.util.List;
050: import java.util.HashMap;
051: import org.apache.torque.TorqueException;
052: import org.apache.torque.om.Persistent;
053: import org.apache.torque.util.Criteria;
054:
055: /**
056: * This class manages AttributeOption objects.
057: *
058: * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
059: * @version $Id: AttributeOptionManager.java 9977 2005-12-09 00:40:59Z hair $
060: */
061: public class AttributeOptionManager extends BaseAttributeOptionManager {
062: /**
063: * Creates a new <code>AttributeOptionManager</code> instance.
064: *
065: * @exception TorqueException if an error occurs
066: */
067: public AttributeOptionManager() throws TorqueException {
068: super ();
069: setRegion(getClassName().replace('.', '_'));
070: validFields = new HashMap();
071: validFields.put(AttributeOptionPeer.OPTION_ID, null);
072: }
073:
074: protected Persistent putInstanceImpl(Persistent om)
075: throws TorqueException {
076: Persistent oldOm = super .putInstanceImpl(om);
077: List listeners = (List) listenersMap
078: .get(AttributeOptionPeer.OPTION_ID);
079: notifyListeners(listeners, oldOm, om);
080: return oldOm;
081: }
082:
083: /**
084: * Instantiates a new AttributeOption
085: *
086: * @return an <code>AttributeOption</code> value
087: */
088: public AttributeOption getInstanceImpl() {
089: return new AttributeOption();
090: }
091:
092: /**
093: * @see #getInstance(Attribute, String, Module, IssueType)
094: */
095: public static AttributeOption getInstance(
096: final Attribute attribute, final String name)
097: throws TorqueException {
098: return getInstance(attribute, name, (Module) null,
099: (IssueType) null);
100: }
101:
102: /**
103: * Using some contextual information, get an instance of a
104: * particular <code>AttributeOption</code>.
105: *
106: * @param attribute The attribute to which the named option
107: * belongs.
108: * @param name The module-specific alias or canonical value of the
109: * option.
110: * @param module May be <code>null</code>.
111: * @param issueType May be <code>null</code>.
112: */
113: public static AttributeOption getInstance(
114: final Attribute attribute, final String name,
115: final Module module, final IssueType issueType)
116: throws TorqueException {
117: AttributeOption ao = null;
118: Criteria crit;
119: // FIXME: Optimize this implementation! It is grossly
120: // inefficient, which is problematic given how often it may be
121: // used.
122: if (module != null && issueType != null) {
123: // Look for a module-scoped alias.
124: crit = new Criteria(4);
125: crit.add(AttributeOptionPeer.ATTRIBUTE_ID, attribute
126: .getAttributeId());
127: crit.addJoin(AttributeOptionPeer.OPTION_ID,
128: RModuleOptionPeer.OPTION_ID);
129: crit.add(RModuleOptionPeer.MODULE_ID, module.getModuleId());
130: crit.add(RModuleOptionPeer.ISSUE_TYPE_ID, issueType
131: .getIssueTypeId());
132: crit.add(RModuleOptionPeer.DISPLAY_VALUE, name);
133: final List rmos = RModuleOptionPeer.doSelect(crit);
134: if (rmos.size() == 1) {
135: final RModuleOption rmo = (RModuleOption) rmos.get(0);
136: ao = rmo.getAttributeOption();
137: }
138: }
139:
140: if (ao == null) {
141: // TODO It seems that we might not necessarily get the global option.
142: // Do we want to add a criteria to limit to getting the global option?
143: // This would be either "= 0" or "is null".
144:
145: crit = new Criteria(2);
146: crit.add(AttributeOptionPeer.OPTION_NAME, name);
147: crit.add(AttributeOptionPeer.ATTRIBUTE_ID, attribute
148: .getAttributeId());
149: crit.setIgnoreCase(true);
150: final List options = AttributeOptionPeer.doSelect(crit);
151: if (options.size() == 1) {
152: ao = (AttributeOption) options.get(0);
153: }
154: }
155: return ao;
156: }
157:
158: }
|