You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@turbine.apache.org by tv...@apache.org on 2018/07/31 22:24:06 UTC
svn commit: r1837189 - in /turbine/fulcrum/trunk/parser/src:
changes/changes.xml java/org/apache/fulcrum/parser/BaseValueParser.java
java/org/apache/fulcrum/parser/ValueParser.java
Author: tv
Date: Tue Jul 31 22:24:06 2018
New Revision: 1837189
URL: http://svn.apache.org/viewvc?rev=1837189&view=rev
Log:
Fix thread safety issues in BaseValueParser
Modified:
turbine/fulcrum/trunk/parser/src/changes/changes.xml
turbine/fulcrum/trunk/parser/src/java/org/apache/fulcrum/parser/BaseValueParser.java
turbine/fulcrum/trunk/parser/src/java/org/apache/fulcrum/parser/ValueParser.java
Modified: turbine/fulcrum/trunk/parser/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/parser/src/changes/changes.xml?rev=1837189&r1=1837188&r2=1837189&view=diff
==============================================================================
--- turbine/fulcrum/trunk/parser/src/changes/changes.xml (original)
+++ turbine/fulcrum/trunk/parser/src/changes/changes.xml Tue Jul 31 22:24:06 2018
@@ -22,7 +22,23 @@
</properties>
<body>
- <release version="1.0.4" date="in SVN">
+ <release version="2.0.0" date="in SVN">
+ <action dev="tv" type="fix">
+ Fix thread safety issues in BaseValueParser
+ </action>
+ <action dev="tv" type="remove">
+ INCOMAPTIBLE: Remove dependency on fulcrum-upload.
+ All FileItems are now Parts.
+ </action>
+ <action dev="tv" type="update">
+ INCOMAPTIBLE: Update dependency servlet-api to 3.1
+ </action>
+ <action dev="tv" type="update">
+ Require Java-8
+ </action>
+ <action dev="tv" type="update">
+ Derive from Turbine parent POM 4
+ </action>
</release>
<release version="1.0.3" date="2013-10-03">
<action dev="tv" type="update">
Modified: turbine/fulcrum/trunk/parser/src/java/org/apache/fulcrum/parser/BaseValueParser.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/parser/src/java/org/apache/fulcrum/parser/BaseValueParser.java?rev=1837189&r1=1837188&r2=1837189&view=diff
==============================================================================
--- turbine/fulcrum/trunk/parser/src/java/org/apache/fulcrum/parser/BaseValueParser.java (original)
+++ turbine/fulcrum/trunk/parser/src/java/org/apache/fulcrum/parser/BaseValueParser.java Tue Jul 31 22:24:06 2018
@@ -37,8 +37,9 @@ import java.util.Set;
import org.apache.avalon.framework.logger.LogEnabled;
import org.apache.avalon.framework.logger.Logger;
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.FastDateFormat;
import org.apache.fulcrum.pool.Recyclable;
/**
@@ -101,7 +102,7 @@ public class BaseValueParser
private Locale locale = Locale.getDefault();
/** The DateFormat to use for converting dates */
- private DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, locale);
+ private FastDateFormat dateFormat = FastDateFormat.getDateInstance(FastDateFormat.SHORT, locale);
/** The NumberFormat to use when converting floats and decimals */
private NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);
@@ -132,6 +133,7 @@ public class BaseValueParser
/**
* Set a ParserService instance
*/
+ @Override
public void setParserService(ParserService parserService)
{
this.parserService = parserService;
@@ -140,6 +142,7 @@ public class BaseValueParser
/**
* @see org.apache.avalon.framework.logger.LogEnabled#enableLogging(org.apache.avalon.framework.logger.Logger)
*/
+ @Override
public void enableLogging(Logger logger)
{
this.logger = logger;
@@ -158,6 +161,7 @@ public class BaseValueParser
/**
* Recycles the parser.
*/
+ @Override
public void recycle()
{
recycle(DEFAULT_CHARACTER_ENCODING);
@@ -176,6 +180,7 @@ public class BaseValueParser
/**
* Disposes the parser.
*/
+ @Override
public void dispose()
{
clear();
@@ -185,6 +190,7 @@ public class BaseValueParser
/**
* Clear all name/value pairs out of this object.
*/
+ @Override
public void clear()
{
parameters.clear();
@@ -193,6 +199,7 @@ public class BaseValueParser
/**
* Set the character encoding that will be used by this ValueParser.
*/
+ @Override
public void setCharacterEncoding(String s)
{
characterEncoding = s;
@@ -201,6 +208,7 @@ public class BaseValueParser
/**
* Get the character encoding that will be used by this ValueParser.
*/
+ @Override
public String getCharacterEncoding()
{
return characterEncoding;
@@ -209,16 +217,18 @@ public class BaseValueParser
/**
* Set the locale that will be used by this ValueParser.
*/
+ @Override
public void setLocale(Locale l)
{
locale = l;
- setDateFormat(DateFormat.getDateInstance(DateFormat.SHORT, locale));
+ setDateFormat(FastDateFormat.getDateInstance(FastDateFormat.SHORT, locale));
setNumberFormat(NumberFormat.getNumberInstance(locale));
}
/**
* Get the locale that will be used by this ValueParser.
*/
+ @Override
public Locale getLocale()
{
return locale;
@@ -227,7 +237,8 @@ public class BaseValueParser
/**
* Set the date format that will be used by this ValueParser.
*/
- public void setDateFormat(DateFormat df)
+ @Override
+ public void setDateFormat(FastDateFormat df)
{
dateFormat = df;
}
@@ -235,7 +246,8 @@ public class BaseValueParser
/**
* Get the date format that will be used by this ValueParser.
*/
- public DateFormat getDateFormat()
+ @Override
+ public FastDateFormat getDateFormat()
{
return dateFormat;
}
@@ -243,6 +255,7 @@ public class BaseValueParser
/**
* Set the number format that will be used by this ValueParser.
*/
+ @Override
public void setNumberFormat(NumberFormat nf)
{
numberFormat = nf;
@@ -251,6 +264,7 @@ public class BaseValueParser
/**
* Get the number format that will be used by this ValueParser.
*/
+ @Override
public NumberFormat getNumberFormat()
{
return numberFormat;
@@ -262,9 +276,11 @@ public class BaseValueParser
* @param name A String with the name.
* @param value A double with the value.
*/
+ @Override
public void add(String name, double value)
{
- add(name, numberFormat.format(value));
+ NumberFormat nf = (NumberFormat) numberFormat.clone();
+ add(name, nf.format(value));
}
/**
@@ -273,6 +289,7 @@ public class BaseValueParser
* @param name A String with the name.
* @param value An int with the value.
*/
+ @Override
public void add(String name, int value)
{
add(name, (long)value);
@@ -284,6 +301,7 @@ public class BaseValueParser
* @param name A String with the name.
* @param value An Integer with the value.
*/
+ @Override
public void add(String name, Integer value)
{
if (value != null)
@@ -298,6 +316,7 @@ public class BaseValueParser
* @param name A String with the name.
* @param value A long with the value.
*/
+ @Override
public void add(String name, long value)
{
add(name, Long.toString(value));
@@ -309,12 +328,13 @@ public class BaseValueParser
* @param name A String with the name.
* @param value A long with the value.
*/
+ @Override
public void add(String name, String value)
{
if (value != null)
{
String [] items = getParam(name);
- items = (String []) ArrayUtils.add(items, value);
+ items = ArrayUtils.add(items, value);
putParam(name, items);
}
}
@@ -327,6 +347,7 @@ public class BaseValueParser
* @param name A String with the name.
* @param value A String Array.
*/
+ @Override
public void add(String name, String [] value)
{
// ArrayUtils.addAll() looks promising but it would also add
@@ -350,6 +371,7 @@ public class BaseValueParser
* @return The value that was mapped to the key (a <code>String[]</code>)
* or <code>null</code> if the key was not mapped.
*/
+ @Override
public Object remove(String name)
{
return parameters.remove(convert(name));
@@ -363,6 +385,7 @@ public class BaseValueParser
* @param value A String to be processed.
* @return A new String converted to lowercase and trimmed.
*/
+ @Override
public String convert(String value)
{
return convertAndTrim(value);
@@ -376,6 +399,7 @@ public class BaseValueParser
* @param key An Object with the key to search for.
* @return True if the object is found.
*/
+ @Override
public boolean containsKey(Object key)
{
return parameters.containsKey(convert(String.valueOf(key)));
@@ -386,6 +410,7 @@ public class BaseValueParser
*
* @return A <code>Set</code> of the keys.
*/
+ @Override
public Set<String> keySet()
{
return parameters.keySet();
@@ -396,6 +421,7 @@ public class BaseValueParser
*
* @return A object array with the keys.
*/
+ @Override
public String[] getKeys()
{
return keySet().toArray(new String[0]);
@@ -406,6 +432,7 @@ public class BaseValueParser
*
* @return An <code>Iterator</code> over the keys.
*/
+ @Override
public Iterator<String> iterator()
{
return parameters.keySet().iterator();
@@ -470,6 +497,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A boolean.
*/
+ @Override
public boolean getBoolean(String name, boolean defaultValue)
{
Boolean result = getBooleanObject(name);
@@ -483,6 +511,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A boolean.
*/
+ @Override
public boolean getBoolean(String name)
{
return getBoolean(name, false);
@@ -495,6 +524,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A boolean[].
*/
+ @Override
public boolean[] getBooleans(String name)
{
boolean[] result = null;
@@ -523,6 +553,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A Boolean.
*/
+ @Override
public Boolean getBooleanObject(String name)
{
return parseBoolean(getString(name));
@@ -541,6 +572,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A Boolean.
*/
+ @Override
public Boolean getBooleanObject(String name, Boolean defaultValue)
{
Boolean result = getBooleanObject(name);
@@ -554,6 +586,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A Boolean[].
*/
+ @Override
public Boolean[] getBooleanObjects(String name)
{
Boolean[] result = null;
@@ -583,8 +616,9 @@ public class BaseValueParser
if (StringUtils.isNotEmpty(value))
{
+ NumberFormat nf = (NumberFormat) numberFormat.clone();
ParsePosition pos = new ParsePosition(0);
- Number number = numberFormat.parse(value, pos);
+ Number number = nf.parse(value, pos);
if (pos.getIndex() == value.length())
{
@@ -625,6 +659,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A double.
*/
+ @Override
public double getDouble(String name, double defaultValue)
{
Number number = getNumber(name);
@@ -638,6 +673,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A double.
*/
+ @Override
public double getDouble(String name)
{
return getDouble(name, 0.0);
@@ -650,6 +686,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A double[].
*/
+ @Override
public double[] getDoubles(String name)
{
double[] result = null;
@@ -674,6 +711,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A double.
*/
+ @Override
public Double getDoubleObject(String name, Double defaultValue)
{
Number result = getNumber(name);
@@ -687,6 +725,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A double.
*/
+ @Override
public Double getDoubleObject(String name)
{
return getDoubleObject(name, null);
@@ -699,6 +738,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A double[].
*/
+ @Override
public Double[] getDoubleObjects(String name)
{
Double[] result = null;
@@ -723,6 +763,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A float.
*/
+ @Override
public float getFloat(String name, float defaultValue)
{
Number number = getNumber(name);
@@ -736,6 +777,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A float.
*/
+ @Override
public float getFloat(String name)
{
return getFloat(name, 0.0f);
@@ -748,6 +790,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A float[].
*/
+ @Override
public float[] getFloats(String name)
{
float[] result = null;
@@ -772,6 +815,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A Float.
*/
+ @Override
public Float getFloatObject(String name, Float defaultValue)
{
Number result = getNumber(name);
@@ -785,6 +829,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A Float.
*/
+ @Override
public Float getFloatObject(String name)
{
return getFloatObject(name, null);
@@ -797,6 +842,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A float[].
*/
+ @Override
public Float[] getFloatObjects(String name)
{
Float[] result = null;
@@ -821,6 +867,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A BigDecimal.
*/
+ @Override
public BigDecimal getBigDecimal(String name, BigDecimal defaultValue)
{
Number result = getNumber(name);
@@ -834,6 +881,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A BigDecimal.
*/
+ @Override
public BigDecimal getBigDecimal(String name)
{
return getBigDecimal(name, null);
@@ -846,6 +894,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A BigDecimal[].
*/
+ @Override
public BigDecimal[] getBigDecimals(String name)
{
BigDecimal[] result = null;
@@ -870,6 +919,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return An int.
*/
+ @Override
public int getInt(String name, int defaultValue)
{
Number result = getNumber(name);
@@ -883,6 +933,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return An int.
*/
+ @Override
public int getInt(String name)
{
return getInt(name, 0);
@@ -895,6 +946,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return An int[].
*/
+ @Override
public int[] getInts(String name)
{
int[] result = null;
@@ -919,6 +971,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return An Integer.
*/
+ @Override
public Integer getIntObject(String name, Integer defaultValue)
{
Number result = getNumber(name);
@@ -932,6 +985,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return An Integer.
*/
+ @Override
public Integer getIntObject(String name)
{
return getIntObject(name, null);
@@ -944,6 +998,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return An Integer[].
*/
+ @Override
public Integer[] getIntObjects(String name)
{
Integer[] result = null;
@@ -968,6 +1023,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A long.
*/
+ @Override
public long getLong(String name, long defaultValue)
{
Number result = getNumber(name);
@@ -981,6 +1037,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A long.
*/
+ @Override
public long getLong(String name)
{
return getLong(name, 0);
@@ -993,6 +1050,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A long[].
*/
+ @Override
public long[] getLongs(String name)
{
long[] result = null;
@@ -1016,6 +1074,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A Long[].
*/
+ @Override
public Long[] getLongObjects(String name)
{
Long[] result = null;
@@ -1039,6 +1098,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A Long.
*/
+ @Override
public Long getLongObject(String name)
{
return getLongObject(name, null);
@@ -1052,6 +1112,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A Long.
*/
+ @Override
public Long getLongObject(String name, Long defaultValue)
{
Number result = getNumber(name);
@@ -1066,6 +1127,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A byte.
*/
+ @Override
public byte getByte(String name, byte defaultValue)
{
Number result = getNumber(name);
@@ -1079,6 +1141,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A byte.
*/
+ @Override
public byte getByte(String name)
{
return getByte(name, (byte) 0);
@@ -1093,6 +1156,7 @@ public class BaseValueParser
* @return A byte[].
* @exception UnsupportedEncodingException
*/
+ @Override
public byte[] getBytes(String name)
throws UnsupportedEncodingException
{
@@ -1113,6 +1177,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A byte.
*/
+ @Override
public Byte getByteObject(String name, Byte defaultValue)
{
Number result = getNumber(name);
@@ -1126,6 +1191,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A byte.
*/
+ @Override
public Byte getByteObject(String name)
{
return getByteObject(name, null);
@@ -1138,6 +1204,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A String or null if the key is unknown.
*/
+ @Override
public String getString(String name)
{
String [] value = getParam(name);
@@ -1159,6 +1226,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A String.
*/
+ @Override
public String get(String name)
{
return getString(name);
@@ -1172,6 +1240,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A String.
*/
+ @Override
public String getString(String name, String defaultValue)
{
String value = getString(name);
@@ -1187,6 +1256,7 @@ public class BaseValueParser
* @param name The name of the parameter.
* @param value The value to set.
*/
+ @Override
public void setString(String name, String value)
{
if (value != null)
@@ -1202,6 +1272,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return A String[].
*/
+ @Override
public String[] getStrings(String name)
{
return getParam(name);
@@ -1215,6 +1286,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A String[].
*/
+ @Override
public String[] getStrings(String name, String[] defaultValue)
{
String[] value = getParam(name);
@@ -1231,6 +1303,7 @@ public class BaseValueParser
* @param name The name of the parameter.
* @param values The value to set.
*/
+ @Override
public void setStrings(String name, String[] values)
{
if (values != null)
@@ -1246,6 +1319,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return An Object.
*/
+ @Override
public Object getObject(String name)
{
return getString(name);
@@ -1258,6 +1332,7 @@ public class BaseValueParser
* @param name A String with the name.
* @return An Object[].
*/
+ @Override
public Object[] getObjects(String name)
{
return getParam(name);
@@ -1273,6 +1348,7 @@ public class BaseValueParser
* @param defaultValue The default value.
* @return A Date.
*/
+ @Override
public Date getDate(String name, DateFormat df, Date defaultValue)
{
Date result = defaultValue;
@@ -1304,9 +1380,26 @@ public class BaseValueParser
* @param name A String with the name.
* @return A Date.
*/
+ @Override
public Date getDate(String name)
{
- return getDate(name, dateFormat, null);
+ Date result = null;
+ String value = StringUtils.trim(getString(name));
+
+ if (StringUtils.isNotEmpty(value))
+ {
+ try
+ {
+ // Reject invalid dates.
+ result = dateFormat.parse(value);
+ }
+ catch (ParseException e)
+ {
+ logConversionFailure(name, value, "Date");
+ }
+ }
+
+ return result;
}
/**
@@ -1317,6 +1410,7 @@ public class BaseValueParser
* @param df A DateFormat.
* @return A Date.
*/
+ @Override
public Date getDate(String name, DateFormat df)
{
return getDate(name, df, null);
@@ -1330,6 +1424,7 @@ public class BaseValueParser
* @param bean An Object.
* @exception Exception a generic exception.
*/
+ @Override
public void setProperties(Object bean) throws Exception
{
Class<?> beanClass = bean.getClass();
@@ -1354,6 +1449,7 @@ public class BaseValueParser
*
* @return A textual representation of the parsed name/value pairs.
*/
+ @Override
public String toString()
{
StringBuffer sb = new StringBuffer();
@@ -1547,6 +1643,7 @@ public class BaseValueParser
*
* @return true, if the object is disposed.
*/
+ @Override
public boolean isDisposed()
{
return disposed;
@@ -1575,6 +1672,7 @@ public class BaseValueParser
* @return a new String.
*
*/
+ @Override
public String convertAndTrim(String value)
{
return parserService.convertAndTrim(value);
@@ -1590,6 +1688,7 @@ public class BaseValueParser
* (see {@link ParserService})
* @return A new String converted to the correct case and trimmed.
*/
+ @Override
public String convertAndTrim(String value, URLCaseFolding fold)
{
return parserService.convertAndTrim(value, fold);
@@ -1600,6 +1699,7 @@ public class BaseValueParser
*
* @return The current Folding Value
*/
+ @Override
public URLCaseFolding getUrlFolding()
{
return parserService.getUrlFolding();
Modified: turbine/fulcrum/trunk/parser/src/java/org/apache/fulcrum/parser/ValueParser.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/parser/src/java/org/apache/fulcrum/parser/ValueParser.java?rev=1837189&r1=1837188&r2=1837189&view=diff
==============================================================================
--- turbine/fulcrum/trunk/parser/src/java/org/apache/fulcrum/parser/ValueParser.java (original)
+++ turbine/fulcrum/trunk/parser/src/java/org/apache/fulcrum/parser/ValueParser.java Tue Jul 31 22:24:06 2018
@@ -27,6 +27,8 @@ import java.util.Date;
import java.util.Locale;
import java.util.Set;
+import org.apache.commons.lang3.time.FastDateFormat;
+
/**
* ValueParser is a base interface for classes that need to parse
@@ -97,12 +99,12 @@ public interface ValueParser extends Ite
/**
* Set the date format that will be used by this ValueParser.
*/
- void setDateFormat(DateFormat df);
+ void setDateFormat(FastDateFormat df);
/**
* Get the date format that will be used by this ValueParser.
*/
- DateFormat getDateFormat();
+ FastDateFormat getDateFormat();
/**
* Set the number format that will be used by this ValueParser.
@@ -714,6 +716,7 @@ public interface ValueParser extends Ite
*
* @return A String.
*/
+ @Override
String toString();
/**