001/**
002 * Copyright 2005-2016 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 */
016package org.kuali.rice.kew.attribute;
017
018import org.apache.commons.lang.StringUtils;
019import org.apache.log4j.Logger;
020import org.kuali.rice.core.api.config.ConfigurationException;
021import org.kuali.rice.core.api.uif.RemotableAttributeField;
022import org.kuali.rice.core.api.uif.RemotableQuickFinder;
023import org.kuali.rice.kns.lookup.LookupUtils;
024import org.kuali.rice.kns.web.ui.Field;
025import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
026import org.w3c.dom.NamedNodeMap;
027import org.w3c.dom.Node;
028
029import java.util.HashMap;
030import java.util.Map;
031
032/**
033 * This class provides some common shared utility methods shared by the XML-based
034 * attribute implementations. 
035 * 
036 * @author Kuali Rice Team (rice.collab@kuali.org)
037 *
038 */
039public final class XMLAttributeUtils {
040
041    private static final Logger LOG = Logger.getLogger(XMLAttributeUtils.class);
042
043        private XMLAttributeUtils() {
044                throw new UnsupportedOperationException("do not call");
045        }
046
047        public static void establishFieldLookup(Field field, Node lookupNode) {
048                NamedNodeMap quickfinderAttributes = lookupNode.getAttributes();
049                String businessObjectClass = quickfinderAttributes.getNamedItem("businessObjectClass").getNodeValue();
050                field.setQuickFinderClassNameImpl(businessObjectClass);
051        Map<String, String> fieldConversionsMap = new HashMap<String, String>();
052                for (int lcIndex = 0; lcIndex < lookupNode.getChildNodes().getLength(); lcIndex++) {
053                        Node fieldConversionsChildNode = lookupNode.getChildNodes().item(lcIndex);
054                        if ("fieldConversions".equals(fieldConversionsChildNode.getNodeName())) {
055                                for (int fcIndex = 0; fcIndex < fieldConversionsChildNode.getChildNodes().getLength(); fcIndex++) {
056                                        Node fieldConversionChildNode = fieldConversionsChildNode.getChildNodes().item(fcIndex);
057                                        if ("fieldConversion".equals(fieldConversionChildNode.getNodeName())) {
058                                                NamedNodeMap fieldConversionAttributes = fieldConversionChildNode.getAttributes();
059                                                String lookupFieldName = fieldConversionAttributes.getNamedItem("lookupFieldName").getNodeValue();
060                                                String localFieldName = fieldConversionAttributes.getNamedItem("localFieldName").getNodeValue();
061                                                fieldConversionsMap.put(lookupFieldName, localFieldName);
062                                        }
063                                }
064                        }
065                }
066        field.setFieldConversions(fieldConversionsMap);
067        }
068
069    public static void establishFieldLookup(RemotableAttributeField.Builder fieldBuilder, Node lookupNode) {
070                NamedNodeMap quickfinderAttributes = lookupNode.getAttributes();
071        Node dataObjectNode = quickfinderAttributes.getNamedItem("dataObjectClass");
072        if (dataObjectNode == null) {
073            // for legacy compatibility, though businessObjectClass is deprecated
074            dataObjectNode = quickfinderAttributes.getNamedItem("businessObjectClass");
075            if (dataObjectNode != null) {
076                LOG.warn("Field is using deprecated 'businessObjectClass' instead of 'dataObjectClass' for lookup definition, field name is: " + fieldBuilder.getName());
077            } else {
078                throw new ConfigurationException("Failed to locate 'dataObjectClass' for lookup definition.");
079            }
080        }
081        String dataObjectClass = dataObjectNode.getNodeValue();
082        String baseLookupUrl = LookupUtils.getBaseLookupUrl(false);
083        RemotableQuickFinder.Builder quickFinderBuilder = RemotableQuickFinder.Builder.create(baseLookupUrl, dataObjectClass);
084                for (int lcIndex = 0; lcIndex < lookupNode.getChildNodes().getLength(); lcIndex++) {
085                        Map<String, String> fieldConversionsMap = new HashMap<String, String>();
086                        Node fieldConversionsChildNode = lookupNode.getChildNodes().item(lcIndex);
087                        if ("fieldConversions".equals(fieldConversionsChildNode)) {
088                                for (int fcIndex = 0; fcIndex < fieldConversionsChildNode.getChildNodes().getLength(); fcIndex++) {
089                                        Node fieldConversionChildNode = fieldConversionsChildNode.getChildNodes().item(fcIndex);
090                                        if ("fieldConversion".equals(fieldConversionChildNode)) {
091                                                NamedNodeMap fieldConversionAttributes = fieldConversionChildNode.getAttributes();
092                                                String lookupFieldName = fieldConversionAttributes.getNamedItem("lookupFieldName").getNodeValue();
093                                                String localFieldName = fieldConversionAttributes.getNamedItem("localFieldName").getNodeValue();
094                                                fieldConversionsMap.put(lookupFieldName, localFieldName);
095                                        }
096                                }
097                        }
098            quickFinderBuilder.setFieldConversions(fieldConversionsMap);
099                        fieldBuilder.getWidgets().add(quickFinderBuilder);
100                }
101        }
102        
103}