Added some protection to Period handling in the data dictionary when invalid period expressions are passed i.e. empty strings or non-numeric strings

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@16355 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Gavin Cornwell
2009-09-17 22:04:22 +00:00
parent 45d25dcd7e
commit b0f551db34
2 changed files with 33 additions and 2 deletions

View File

@@ -29,6 +29,8 @@ import java.util.Date;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.namespace.QName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Support for calendar based periods
@@ -37,7 +39,9 @@ import org.alfresco.service.namespace.QName;
*/
public abstract class AbstractCalendarPeriodProvider extends AbstractPeriodProvider
{
/** Logger */
private static Log logger = LogFactory.getLog(AbstractCalendarPeriodProvider.class);
public String getDefaultExpression()
{
return "1";
@@ -50,7 +54,19 @@ public abstract class AbstractCalendarPeriodProvider extends AbstractPeriodProvi
public Date getNextDate(Date date, String expression)
{
int value = Integer.parseInt(expression);
int value = 1;
try
{
value = Integer.parseInt(expression);
}
catch (NumberFormatException nfe)
{
// default to 1 and log warning
value = 1;
if (logger.isWarnEnabled())
logger.warn("\"" + expression + "\" is not a valid period expression!");
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

View File

@@ -882,4 +882,19 @@ public class PeriodTest extends TestCase
assertEquals("2011-12-07T13:37:33.104", df.format(period.getNextDate(date)));
}
/**
* Test a missing expression, ensure 1 is used as the default
*/
public void testMissingExpression()
{
assertTrue(Period.getProviderNames().contains(Days.PERIOD_TYPE));
Date now = new Date();
Calendar calendar = Calendar.getInstance();
Period period = new Period(Days.PERIOD_TYPE + "|");
assertNotNull(period.getNextDate(now));
calendar.setTime(now);
calendar.add(Calendar.DAY_OF_YEAR, 1);
assertEquals(period.getNextDate(now), calendar.getTime());
}
}