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 * https://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 */ 017package org.apache.commons.validator.util; 018 019import java.util.Collection; 020import java.util.HashMap; 021import java.util.Iterator; 022import java.util.Map; 023import java.util.Map.Entry; 024 025import org.apache.commons.beanutils.PropertyUtils; 026import org.apache.commons.collections.FastHashMap; // DEPRECATED 027import org.apache.commons.logging.Log; 028import org.apache.commons.logging.LogFactory; 029import org.apache.commons.validator.Arg; 030import org.apache.commons.validator.Msg; 031import org.apache.commons.validator.Var; 032 033/** 034 * Basic utility methods. 035 * <p> 036 * The use of FastHashMap is deprecated and will be replaced in a future 037 * release. 038 * </p> 039 */ 040public class ValidatorUtils { 041 042 private static final Log LOG = LogFactory.getLog(ValidatorUtils.class); 043 044 /** 045 * Makes a deep copy of a {@code FastHashMap} if the values 046 * are {@code Msg}, {@code Arg}, 047 * or {@code Var}. Otherwise, it is a shallow copy. 048 * 049 * @param fastHashMap {@code FastHashMap} to copy. 050 * @return FastHashMap A copy of the {@code FastHashMap} that was 051 * passed in. 052 * @deprecated This method is not part of Validator's public API. Validator 053 * will use it internally until FastHashMap references are removed. Use 054 * copyMap() instead. 055 */ 056 @Deprecated 057 public static FastHashMap copyFastHashMap(final FastHashMap fastHashMap) { 058 final FastHashMap results = new FastHashMap(); 059 @SuppressWarnings("unchecked") // FastHashMap is not generic 060 final Iterator<Entry<String, ?>> iterator = fastHashMap.entrySet().iterator(); 061 while (iterator.hasNext()) { 062 final Entry<String, ?> entry = iterator.next(); 063 final String key = entry.getKey(); 064 final Object value = entry.getValue(); 065 if (value instanceof Msg) { 066 results.put(key, ((Msg) value).clone()); 067 } else if (value instanceof Arg) { 068 results.put(key, ((Arg) value).clone()); 069 } else if (value instanceof Var) { 070 results.put(key, ((Var) value).clone()); 071 } else { 072 results.put(key, value); 073 } 074 } 075 results.setFast(true); 076 return results; 077 } 078 079 /** 080 * Makes a deep copy of a {@link Map} if the values are 081 * {@code Msg}, {@code Arg}, or {@code Var}. Otherwise, 082 * it is a shallow copy. 083 * 084 * @param map The source Map to copy. 085 * @return A copy of the {@link Map} that was passed in. 086 */ 087 public static Map<String, Object> copyMap(final Map<String, Object> map) { 088 final Map<String, Object> results = new HashMap<>(map.size()); 089 map.forEach((key, value) -> { 090 if (value instanceof Msg) { 091 results.put(key, ((Msg) value).clone()); 092 } else if (value instanceof Arg) { 093 results.put(key, ((Arg) value).clone()); 094 } else if (value instanceof Var) { 095 results.put(key, ((Var) value).clone()); 096 } else { 097 results.put(key, value); 098 } 099 }); 100 return results; 101 } 102 103 /** 104 * Convenience method for getting a value from a bean property as a 105 * {@link String}. If the property is a {@code String[]} or 106 * {@link Collection} and it is empty, an empty {@link String} 107 * "" is returned. Otherwise, property.toString() is returned. This method 108 * may return {@code null} if there was an error retrieving the 109 * property. 110 * 111 * @param bean The bean object. 112 * @param property The name of the property to access. 113 * @return The value of the property. 114 */ 115 public static String getValueAsString(final Object bean, final String property) { 116 Object value = null; 117 118 try { 119 value = PropertyUtils.getProperty(bean, property); 120 121 } catch (final ReflectiveOperationException e) { 122 LOG.error(e.getMessage(), e); 123 } 124 125 if (value == null) { 126 return null; 127 } 128 129 if (value instanceof String[]) { 130 return ((String[]) value).length > 0 ? value.toString() : ""; 131 132 } 133 if (value instanceof Collection) { 134 return ((Collection<?>) value).isEmpty() ? "" : value.toString(); 135 136 } 137 return value.toString(); 138 139 } 140 141 /** 142 * <p>Replace part of a {@link String} with another value.</p> 143 * 144 * @param value {@link String} to perform the replacement on. 145 * @param key The name of the constant. 146 * @param replaceValue The value of the constant. 147 * @return The modified value. 148 */ 149 public static String replace(final String value, final String key, final String replaceValue) { 150 if (value == null || key == null || replaceValue == null) { 151 return value; 152 } 153 return value.replace(key, replaceValue); 154 } 155 156 /** 157 * Constructs a new instance. 158 * 159 * @deprecated Will be private in the next major version. 160 */ 161 @Deprecated 162 public ValidatorUtils() { 163 // empty 164 } 165 166}