001    /**
002     * Copyright 2005-2014 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.krms.impl.ui;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
020    import org.kuali.rice.krms.api.repository.operator.CustomOperator;
021    import org.kuali.rice.krms.impl.util.KrmsImplConstants;
022    
023    import javax.xml.namespace.QName;
024    
025    /**
026     * Utility service used by the KRMS agenda editing UI for display and access to custom operators.
027     *
028     * @author Kuali Rice Team (rice.collab@kuali.org)
029     */
030    public class CustomOperatorUiTranslator {
031    
032    
033        /**
034         * Parses the {@link QName} for the custom operator service from the form value string, which has the format
035         * {@code customOperator:<Namespace>:<serviceName>}
036         *
037         * @param customOperatorFormValue
038         * @return the QName for the custom operator service
039         */
040        public QName parseCustomOperatorServiceQName(String customOperatorFormValue) {
041            if (customOperatorFormValue == null ||
042                    !isCustomOperatorFormValue(customOperatorFormValue)) {
043                throw new IllegalArgumentException("custom operator form value (" + customOperatorFormValue +
044                        ") must be formatted as " +
045                        KrmsImplConstants.CUSTOM_OPERATOR_PREFIX + "namespace:serviceName");
046            }
047    
048            String [] customOperatorServiceInfo = customOperatorFormValue.split(":");
049    
050            if (customOperatorServiceInfo == null || customOperatorServiceInfo.length != 3) {
051                throw new IllegalArgumentException("custom operator form value (" + customOperatorFormValue +
052                        ") must be formatted as " +
053                        KrmsImplConstants.CUSTOM_OPERATOR_PREFIX + "namespace:serviceName");
054            }
055    
056            QName customOperatorServiceQName = new QName(customOperatorServiceInfo[1], customOperatorServiceInfo[2]);
057    
058            return customOperatorServiceQName;
059        }
060    
061        /**
062         * Gets the custom operator function name which is used for display purposes
063         *
064         * @param customOperatorFormValue the form value representing the custom operator
065         * @return
066         */
067        public String getCustomOperatorName(String customOperatorFormValue) {
068            return getCustomOperator(customOperatorFormValue).getOperatorFunctionDefinition().getName();
069        }
070    
071        /**
072         * Gets the service instance given the specially formatted form value.
073         *
074         * <p>The form value contains the namespace and name of the service, which is used internally for retrieval.</p>
075         *
076         * @param customOperatorFormValue the custom operator form value
077         * @return the custom operator service instance
078         * @throws IllegalArgumentException if the customOperatorFormValue is null or is formatted incorrectly
079         */
080        public CustomOperator getCustomOperator(String customOperatorFormValue) {
081            return GlobalResourceLoader.getService(parseCustomOperatorServiceQName(customOperatorFormValue));
082        }
083    
084        /**
085         * Checks if a form value represents a custom operator.
086         *
087         * <p>The determination is made be checking for a special prefix value that is used by convention.</p>
088         *
089         * @param formValue the form value to check
090         * @return true if the form value represents a custom operator.
091         */
092        public boolean isCustomOperatorFormValue(String formValue) {
093            if (StringUtils.isEmpty(formValue)) {
094                return false;
095            }
096    
097            return formValue.startsWith(KrmsImplConstants.CUSTOM_OPERATOR_PREFIX);
098        }
099    
100    }