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.kew.attribute;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.apache.log4j.Logger;
020    import org.kuali.rice.core.api.config.ConfigurationException;
021    import org.kuali.rice.core.api.uif.RemotableAttributeField;
022    import org.kuali.rice.core.api.uif.RemotableQuickFinder;
023    import org.kuali.rice.kns.lookup.LookupUtils;
024    import org.kuali.rice.kns.web.ui.Field;
025    import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
026    import org.w3c.dom.NamedNodeMap;
027    import org.w3c.dom.Node;
028    
029    import java.util.HashMap;
030    import 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     */
039    public 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    }