001: /***************************************************************
002: * This file is part of the [fleXive](R) project.
003: *
004: * Copyright (c) 1999-2008
005: * UCS - unique computing solutions gmbh (http://www.ucs.at)
006: * All rights reserved
007: *
008: * The [fleXive](R) project is free software; you can redistribute
009: * it and/or modify it under the terms of the GNU General Public
010: * License as published by the Free Software Foundation;
011: * either version 2 of the License, or (at your option) any
012: * later version.
013: *
014: * The GNU General Public License can be found at
015: * http://www.gnu.org/copyleft/gpl.html.
016: * A copy is found in the textfile GPL.txt and important notices to the
017: * license from the author are found in LICENSE.txt distributed with
018: * these libraries.
019: *
020: * This library is distributed in the hope that it will be useful,
021: * but WITHOUT ANY WARRANTY; without even the implied warranty of
022: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
023: * GNU General Public License for more details.
024: *
025: * For further information about UCS - unique computing solutions gmbh,
026: * please see the company website: http://www.ucs.at
027: *
028: * For further information about [fleXive](R), please see the
029: * project website: http://www.flexive.org
030: *
031: *
032: * This copyright notice MUST APPEAR in all copies of the file!
033: ***************************************************************/package com.flexive.shared.value.mapper;
034:
035: import com.flexive.shared.CacheAdmin;
036: import com.flexive.shared.search.query.ValueComparator;
037: import com.flexive.shared.structure.FxEnvironment;
038: import com.flexive.shared.structure.FxProperty;
039: import com.flexive.shared.structure.FxSelectList;
040: import com.flexive.shared.value.FxValue;
041:
042: import java.util.ArrayList;
043: import java.util.List;
044:
045: /**
046: * InputMapper introduces another level of abstraction for the FxValue input
047: * components.
048: * <p>When rendering the input component, {@link InputMapper#encode(FxValue)} is
049: * called and may wrap the given value in another object. For example, an ordinal
050: * {@link com.flexive.shared.value.FxLargeNumber} like the ACL id may be mapped
051: * to a {@link com.flexive.shared.value.FxSelectOne} value for input rendering.
052: * </p>
053: * <p>
054: * Note that the "output type" of the rendered UI control must be applicable to the
055: * base FxValue type, since there is not "inverted" mapping (from input to base type).
056: * For example, the select list IDs of an {@link SelectOneInputMapper}
057: * must correspond to valid values of the base FxLargeNumber property.
058: * </p>
059: * <p>
060: * Use {@link #getInstance(FxProperty)} to retrieve a new InputMapper for the given
061: * structure property, which for example allows to select ACLs with a select list
062: * instead of a numeric input field.
063: * </p>
064: * <p>
065: * You may also implement your own input mapper and supply it to the FxValueInput component
066: * or attach it to a search query node.
067: * </p>
068: *
069: * @author Daniel Lichtenberger (daniel.lichtenberger@flexive.com), UCS - unique computing solutions gmbh (http://www.ucs.at)
070: * @version $Rev: 181 $
071: */
072: public abstract class InputMapper<BaseType extends FxValue, MappedType extends FxValue> {
073:
074: /**
075: * Map the given value to the destination FxValue type. The resulting object will be
076: * used for rendering the input element for the given value. Note that the "output type" of
077: * the rendered UI control must be applicable to the base FxValue type, i.e. a
078: * call to {@link FxValue#setTranslation(long, Object)} must be successful.
079: *
080: * @param value the value to be mapped
081: * @return the mapped type
082: */
083: public abstract MappedType encode(BaseType value);
084:
085: /**
086: * Returns all available value comparators available in search queries. If the returned
087: * list is empty, it is ignored.
088: *
089: * @return all available value comparators available in search queries
090: */
091: public List<? extends ValueComparator> getAvailableValueComparators() {
092: return new ArrayList<ValueComparator>(0);
093: }
094:
095: /**
096: * Return a new input mapper instance for the given structure property. For example,
097: * this allows to use a select list to choose an ACL, instead of a plain numeric input field.
098: *
099: * @param property the property for which values will be mapped
100: * @return an input mapper
101: */
102: public static InputMapper getInstance(FxProperty property) {
103: final String name = property.getName();
104: final InputMapper mapper;
105: final FxEnvironment environment = CacheAdmin.getEnvironment();
106: if ("ACL".equals(name)) {
107: mapper = new SelectOneInputMapper(FxSelectList.createList(
108: "ACL", environment.getACLs()));
109: } else if ("TYPEDEF".equals(name)) {
110: mapper = new SelectOneInputMapper(FxSelectList.createList(
111: "TYPEDEF", environment.getTypes(true, true, true,
112: false)));
113: } else if ("MANDATOR".equals(name)) {
114: mapper = new SelectOneInputMapper(FxSelectList
115: .createListWithName("MANDATOR", environment
116: .getMandators(true, false)));
117: } else {
118: mapper = IdentityInputMapper.getInstance();
119: }
120: return mapper;
121: }
122:
123: }
|