You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by ma...@apache.org on 2012/08/20 23:48:34 UTC

svn commit: r1375250 - in /ant/ivy/core/trunk: ./ src/java/org/apache/ivy/ src/java/org/apache/ivy/ant/ src/java/org/apache/ivy/plugins/parser/xml/ src/java/org/apache/ivy/plugins/report/ src/java/org/apache/ivy/util/

Author: maartenc
Date: Mon Aug 20 21:48:33 2012
New Revision: 1375250

URL: http://svn.apache.org/viewvc?rev=1375250&view=rev
Log:
FIX: SimpleDateFormat is not thread safe (IVY-1373)

Added:
    ant/ivy/core/trunk/src/java/org/apache/ivy/util/DateUtil.java
Modified:
    ant/ivy/core/trunk/CHANGES.txt
    ant/ivy/core/trunk/src/java/org/apache/ivy/Ivy.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyDeliver.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyPublish.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorUpdater.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorWriter.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportParser.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java

Modified: ant/ivy/core/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=1375250&r1=1375249&r2=1375250&view=diff
==============================================================================
--- ant/ivy/core/trunk/CHANGES.txt (original)
+++ ant/ivy/core/trunk/CHANGES.txt Mon Aug 20 21:48:33 2012
@@ -130,6 +130,7 @@ for detailed view of each issue, please 
 	
    trunk
 =====================================
+- FIX: SimpleDateFormat is not thread safe (IVY-1373)
 - FIX: Maven 'hk2-jar' packaging is now supported (IVY-1357)
 - FIX: Maven 'orbit' and 'pear' packaging is now supported (IVY-899)
 - FIX: Memory leak and infinite loop in ModuleId.java (IVY-1362)

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/Ivy.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/Ivy.java?rev=1375250&r1=1375249&r2=1375250&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/Ivy.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/Ivy.java Mon Aug 20 21:48:33 2012
@@ -65,6 +65,7 @@ import org.apache.ivy.plugins.repository
 import org.apache.ivy.plugins.resolver.BasicResolver;
 import org.apache.ivy.plugins.resolver.DependencyResolver;
 import org.apache.ivy.plugins.trigger.Trigger;
+import org.apache.ivy.util.DateUtil;
 import org.apache.ivy.util.HostUtil;
 import org.apache.ivy.util.Message;
 import org.apache.ivy.util.MessageLoggerEngine;
@@ -130,7 +131,10 @@ public class Ivy {
     
     private static final int KILO = 1024;
 
-    public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMddHHmmss");
+    /**
+     * @deprecated Use the {@link DateUtil} utility class instead.
+     */
+    public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(DateUtil.DATE_FORMAT_PATTERN);
     
     /**
      * the current version of Ivy, as displayed on the console when 

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyDeliver.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyDeliver.java?rev=1375250&r1=1375249&r2=1375250&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyDeliver.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyDeliver.java Mon Aug 20 21:48:33 2012
@@ -28,6 +28,7 @@ import org.apache.ivy.core.module.descri
 import org.apache.ivy.core.module.id.ModuleRevisionId;
 import org.apache.ivy.core.module.status.StatusManager;
 import org.apache.ivy.core.settings.IvySettings;
+import org.apache.ivy.util.DateUtil;
 import org.apache.ivy.util.Message;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.taskdefs.CallTarget;
@@ -375,7 +376,7 @@ public class IvyDeliver extends IvyTask 
         Date pubdate = getPubDate(this.pubdate, new Date());
         if (pubRevision == null) {
             if (revision.startsWith("working@")) {
-                pubRevision = Ivy.DATE_FORMAT.format(pubdate);
+                pubRevision = DateUtil.format(pubdate);
             } else {
                 pubRevision = revision;
             }

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyPublish.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyPublish.java?rev=1375250&r1=1375249&r2=1375250&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyPublish.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyPublish.java Mon Aug 20 21:48:33 2012
@@ -33,6 +33,7 @@ import org.apache.ivy.core.module.id.Art
 import org.apache.ivy.core.module.id.ModuleRevisionId;
 import org.apache.ivy.core.publish.PublishOptions;
 import org.apache.ivy.core.settings.IvySettings;
+import org.apache.ivy.util.DateUtil;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.DynamicAttribute;
 
@@ -271,7 +272,7 @@ public class IvyPublish extends IvyTask 
         Date pubdate = getPubDate(this.pubdate, new Date());
         if (pubRevision == null) {
             if (revision.startsWith("working@")) {
-                pubRevision = Ivy.DATE_FORMAT.format(pubdate);
+                pubRevision = DateUtil.format(pubdate);
             } else {
                 pubRevision = revision;
             }
@@ -295,7 +296,7 @@ public class IvyPublish extends IvyTask 
                 deliver.setDeliveryList(deliveryList);
                 deliver.setModule(getModule());
                 deliver.setOrganisation(getOrganisation());
-                deliver.setPubdate(Ivy.DATE_FORMAT.format(pubdate));
+                deliver.setPubdate(DateUtil.format(pubdate));
                 deliver.setPubrevision(getPubrevision());
                 deliver.setPubbranch(getPubbranch());
                 deliver.setRevision(getRevision());

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java?rev=1375250&r1=1375249&r2=1375250&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java Mon Aug 20 21:48:33 2012
@@ -71,6 +71,7 @@ import org.apache.ivy.plugins.repository
 import org.apache.ivy.plugins.repository.url.URLResource;
 import org.apache.ivy.plugins.resolver.DependencyResolver;
 import org.apache.ivy.plugins.resolver.FileSystemResolver;
+import org.apache.ivy.util.DateUtil;
 import org.apache.ivy.util.FileUtil;
 import org.apache.ivy.util.Message;
 import org.apache.ivy.util.XMLHelper;
@@ -1004,7 +1005,7 @@ public class XmlModuleDescriptorParser e
             String pubDate = settings.substitute(attributes.getValue("publication"));
             if (pubDate != null && pubDate.length() > 0) {
                 try {
-                    getMd().setPublicationDate(Ivy.DATE_FORMAT.parse(pubDate));
+                    getMd().setPublicationDate(DateUtil.parse(pubDate));
                 } catch (ParseException e) {
                     addError("invalid publication date format: " + pubDate);
                     getMd().setPublicationDate(getDefaultPubDate());

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorUpdater.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorUpdater.java?rev=1375250&r1=1375249&r2=1375250&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorUpdater.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorUpdater.java Mon Aug 20 21:48:33 2012
@@ -41,7 +41,6 @@ import java.util.StringTokenizer;
 
 import javax.xml.parsers.ParserConfigurationException;
 
-import org.apache.ivy.Ivy;
 import org.apache.ivy.core.module.descriptor.Configuration;
 import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor;
 import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
@@ -57,6 +56,7 @@ import org.apache.ivy.plugins.repository
 import org.apache.ivy.plugins.repository.file.FileResource;
 import org.apache.ivy.plugins.repository.url.URLResource;
 import org.apache.ivy.util.Checks;
+import org.apache.ivy.util.DateUtil;
 import org.apache.ivy.util.Message;
 import org.apache.ivy.util.XMLHelper;
 import org.apache.ivy.util.extendable.ExtendableItemHelper;
@@ -755,7 +755,7 @@ public final class XmlModuleDescriptorUp
             }
             write(" status=\"" + XMLHelper.escape(status) + "\"");
             if (pubdate != null) {
-                write(" publication=\"" + Ivy.DATE_FORMAT.format(pubdate) + "\"");
+                write(" publication=\"" + DateUtil.format(pubdate) + "\"");
             } else if (attributes.getValue("publication") != null) {
                 write(" publication=\""
                         + substitute(settings, attributes.getValue("publication")) + "\"");

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorWriter.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorWriter.java?rev=1375250&r1=1375249&r2=1375250&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorWriter.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorWriter.java Mon Aug 20 21:48:33 2012
@@ -27,7 +27,6 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import org.apache.ivy.Ivy;
 import org.apache.ivy.core.IvyPatternHelper;
 import org.apache.ivy.core.module.descriptor.Artifact;
 import org.apache.ivy.core.module.descriptor.Configuration;
@@ -43,6 +42,7 @@ import org.apache.ivy.core.module.descri
 import org.apache.ivy.core.module.descriptor.OverrideDependencyDescriptorMediator;
 import org.apache.ivy.core.module.id.ModuleRevisionId;
 import org.apache.ivy.plugins.matcher.MapMatcher;
+import org.apache.ivy.util.DateUtil;
 import org.apache.ivy.util.Message;
 import org.apache.ivy.util.StringUtils;
 import org.apache.ivy.util.XMLHelper;
@@ -450,7 +450,7 @@ public final class XmlModuleDescriptorWr
         }
         out.println("\t\tstatus=\"" + XMLHelper.escape(md.getStatus()) + "\"");
         out.println("\t\tpublication=\""
-                + Ivy.DATE_FORMAT.format(md.getResolvedPublicationDate()) + "\"");
+                + DateUtil.format(md.getResolvedPublicationDate()) + "\"");
         if (md.isDefault()) {
             out.println("\t\tdefault=\"true\"");
         }

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportParser.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportParser.java?rev=1375250&r1=1375249&r2=1375250&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportParser.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportParser.java Mon Aug 20 21:48:33 2012
@@ -31,7 +31,6 @@ import java.util.TreeMap;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
-import org.apache.ivy.Ivy;
 import org.apache.ivy.core.cache.ArtifactOrigin;
 import org.apache.ivy.core.module.descriptor.Artifact;
 import org.apache.ivy.core.module.descriptor.DefaultArtifact;
@@ -39,6 +38,7 @@ import org.apache.ivy.core.module.id.Mod
 import org.apache.ivy.core.report.ArtifactDownloadReport;
 import org.apache.ivy.core.report.DownloadStatus;
 import org.apache.ivy.core.report.MetadataArtifactDownloadReport;
+import org.apache.ivy.util.DateUtil;
 import org.apache.ivy.util.extendable.ExtendableItemHelper;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
@@ -108,7 +108,7 @@ public class XmlReportParser {
                         try {
                             String pubDateAttr = attributes.getValue("pubdate");
                             if (pubDateAttr != null) {
-                                pubdate = Ivy.DATE_FORMAT.parse(pubDateAttr);
+                                pubdate = DateUtil.parse(pubDateAttr);
                             }
                             skip = false;
                         } catch (ParseException e) {

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java?rev=1375250&r1=1375249&r2=1375250&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java Mon Aug 20 21:48:33 2012
@@ -30,7 +30,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import org.apache.ivy.Ivy;
 import org.apache.ivy.core.cache.ArtifactOrigin;
 import org.apache.ivy.core.module.descriptor.License;
 import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
@@ -42,6 +41,7 @@ import org.apache.ivy.core.report.Metada
 import org.apache.ivy.core.resolve.IvyNode;
 import org.apache.ivy.core.resolve.IvyNodeCallers.Caller;
 import org.apache.ivy.core.resolve.IvyNodeEviction.EvictionData;
+import org.apache.ivy.util.DateUtil;
 import org.apache.ivy.util.StringUtils;
 import org.apache.ivy.util.XMLHelper;
 
@@ -85,7 +85,7 @@ public class XmlReportWriter {
         }
         out.println("\t\tconf=\"" + XMLHelper.escape(report.getConfiguration()) + "\"");
         out.println("\t\tconfs=\"" + XMLHelper.escape(StringUtils.join(confs, ", ")) + "\"");
-        out.println("\t\tdate=\"" + Ivy.DATE_FORMAT.format(report.getDate()) + "\"/>");
+        out.println("\t\tdate=\"" + DateUtil.format(report.getDate()) + "\"/>");
 
         out.println("\t<dependencies>");
 
@@ -120,7 +120,7 @@ public class XmlReportWriter {
             details.append(" status=\"");
             details.append(XMLHelper.escape(dep.getDescriptor().getStatus()));
             details.append("\" pubdate=\"");
-            details.append(Ivy.DATE_FORMAT.format(new Date(dep.getPublication())));
+            details.append(DateUtil.format(new Date(dep.getPublication())));
             details.append("\" resolver=\"");
             details.append(XMLHelper.escape(
                 dep.getModuleRevision().getResolver().getName()));

Added: ant/ivy/core/trunk/src/java/org/apache/ivy/util/DateUtil.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/DateUtil.java?rev=1375250&view=auto
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/util/DateUtil.java (added)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/DateUtil.java Mon Aug 20 21:48:33 2012
@@ -0,0 +1,42 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.ivy.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class DateUtil {
+    
+    private DateUtil() {
+        //Utility class
+    }
+    
+    public static final String DATE_FORMAT_PATTERN = "yyyyMMddHHmmss";
+    
+    public static String format(Date date) {
+        SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT_PATTERN);
+        return format.format(date);
+    }
+    
+    public static Date parse(String date) throws ParseException {
+        SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT_PATTERN);
+        return format.parse(date);
+    }
+
+}