001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     *  contributor license agreements.  See the NOTICE file distributed with
004     *  this work for additional information regarding copyright ownership.
005     *  The ASF licenses this file to You under the Apache License, Version 2.0
006     *  (the "License"); you may not use this file except in compliance with
007     *  the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     *
017     */
018    
019    package org.apache.commons.exec.util;
020    
021    import java.util.Map;
022    import java.util.HashMap;
023    import java.util.Iterator;
024    
025    /**
026     * Helper classes to manipulate maps to pass substition map to the
027     * CommandLine. This class is not part of the public API and
028     * could change without warning.
029     *
030     * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
031     */
032    public class MapUtils
033    {
034        /**
035         * Clones a map.
036         *
037         * @param source the source map
038         * @return the clone of the source map
039         */
040        public static Map copy(Map source) {
041    
042            if(source == null) {
043                return null;
044            }
045    
046            Map result = new HashMap();
047            result.putAll(source);
048            return result;
049        }
050    
051        /**
052         * Clones a map and prefixes the keys in the clone, e.g.
053         * for mapping "JAVA_HOME" to "env.JAVA_HOME" to simulate
054         * the behaviour of ANT.
055         *
056         * @param source the source map
057         * @param prefix the prefix used for all names
058         * @return the clone of the source map
059         */
060        public static Map prefix(Map source, String prefix) {
061    
062            if(source == null) {
063                return null;
064            }
065    
066            Map result = new HashMap();
067    
068            Iterator iter = source.entrySet().iterator();
069    
070            while(iter.hasNext()) {
071                Map.Entry entry = (Map.Entry) iter.next();
072                Object key = entry.getKey();
073                Object value = entry.getValue();
074                result.put(prefix + '.' + key.toString(), value);
075            }
076    
077            return result;
078        }
079    
080        /**
081         * Clones the lhs map and add all things from the
082         * rhs map.
083         *
084         * @param lhs the first map
085         * @param rhs the second map
086         * @return the merged map
087         */
088        public static Map merge(Map lhs, Map rhs) {
089    
090            Map result = null;
091    
092            if((lhs == null) || (lhs.size() == 0)) {
093                result = copy(rhs);
094            }
095            else if((rhs == null) || (rhs.size() == 0)) {
096                result = copy(lhs);
097            }
098            else {
099                result = copy(lhs);
100                result.putAll(rhs);
101            }
102            
103            return result;
104        }
105    }