Return-Path: X-Original-To: apmail-ace-commits-archive@www.apache.org Delivered-To: apmail-ace-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id E92589A5C for ; Sat, 2 Jun 2012 08:31:37 +0000 (UTC) Received: (qmail 89304 invoked by uid 500); 2 Jun 2012 08:31:37 -0000 Delivered-To: apmail-ace-commits-archive@ace.apache.org Received: (qmail 89237 invoked by uid 500); 2 Jun 2012 08:31:35 -0000 Mailing-List: contact commits-help@ace.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ace.apache.org Delivered-To: mailing list commits@ace.apache.org Received: (qmail 89184 invoked by uid 99); 2 Jun 2012 08:31:33 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 02 Jun 2012 08:31:33 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 02 Jun 2012 08:31:29 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 73A77238896F for ; Sat, 2 Jun 2012 08:31:08 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1345461 - in /ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl: ArtifactObjectImpl.java ArtifactRepositoryImpl.java Date: Sat, 02 Jun 2012 08:31:08 -0000 To: commits@ace.apache.org From: jawi@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120602083108.73A77238896F@eris.apache.org> Author: jawi Date: Sat Jun 2 08:31:07 2012 New Revision: 1345461 URL: http://svn.apache.org/viewvc?rev=1345461&view=rev Log: Fixed a potential deadlock when dealing with artifacts. Modified: ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactObjectImpl.java ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactRepositoryImpl.java Modified: ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactObjectImpl.java URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactObjectImpl.java?rev=1345461&r1=1345460&r2=1345461&view=diff ============================================================================== --- ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactObjectImpl.java (original) +++ ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactObjectImpl.java Sat Jun 2 08:31:07 2012 @@ -42,7 +42,7 @@ public class ArtifactObjectImpl extends * As a general rule, RepositoryObjects do not know about their repository. However, since the Helper * to be used is dictated by the repository, this rule is broken for this class. */ - private ArtifactRepositoryImpl m_repo; + private final ArtifactRepositoryImpl m_repo; ArtifactObjectImpl(Map attributes, String[] mandatoryAttributes, ChangeNotifier notifier, ArtifactRepositoryImpl repo) { super(checkAttributes(attributes, completeMandatoryAttributes(mandatoryAttributes)), notifier, XML_NODE); @@ -54,6 +54,11 @@ public class ArtifactObjectImpl extends m_repo = repo; } + ArtifactObjectImpl(HierarchicalStreamReader reader, ChangeNotifier notifier, ArtifactRepositoryImpl repo) { + super(reader, notifier, XML_NODE); + m_repo = repo; + } + private static String[] completeMandatoryAttributes(String[] mandatory) { String[] result = new String[mandatory.length + 1]; for (int i = 0; i < mandatory.length; i++) { @@ -63,11 +68,6 @@ public class ArtifactObjectImpl extends return result; } - ArtifactObjectImpl(HierarchicalStreamReader reader, ChangeNotifier notifier, ArtifactRepositoryImpl repo) { - super(reader, notifier, XML_NODE); - m_repo = repo; - } - public List getFeatures() { return getAssociations(FeatureObject.class); } @@ -91,11 +91,6 @@ public class ArtifactObjectImpl extends return getHelper().getComparator(); } - @Override - String[] getDefiningKeys() { - return getHelper().getDefiningKeys().clone(); - } - public String getURL() { return getAttribute(KEY_URL); } @@ -124,11 +119,18 @@ public class ArtifactObjectImpl extends return getAttribute(KEY_ARTIFACT_DESCRIPTION); } - private synchronized ArtifactHelper getHelper() { - return m_repo.getHelper(getMimetype()); - } - public void setDescription(String value) { addAttribute(KEY_ARTIFACT_DESCRIPTION, value); } + + @Override + String[] getDefiningKeys() { + return getHelper().getDefiningKeys().clone(); + } + + private ArtifactHelper getHelper() { + // getMimetype is safe, as is getHelper, and m_repo is final, so no + // need to synchronize here... + return m_repo.getHelper(getMimetype()); + } } Modified: ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactRepositoryImpl.java URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactRepositoryImpl.java?rev=1345461&r1=1345460&r2=1345461&view=diff ============================================================================== --- ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactRepositoryImpl.java (original) +++ ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactRepositoryImpl.java Sat Jun 2 08:31:07 2012 @@ -389,7 +389,7 @@ public class ArtifactRepositoryImpl exte is = openInputStream(artifact); } catch (IOException ioe) { - throw new IllegalArgumentException("Artifact " + artifact.toString() + " does not point to a valid file."); + throw new IllegalArgumentException("Artifact " + artifact + " does not point to a valid file."); } finally { if (is != null) { @@ -403,9 +403,10 @@ public class ArtifactRepositoryImpl exte } // Then, check whether the name is legal. - for (byte b : artifact.toString().substring(artifact.toString().lastIndexOf('/') + 1).getBytes()) { + String artifactName = artifact.toString(); + for (byte b : artifactName.substring(artifactName.lastIndexOf('/') + 1).getBytes()) { if (!(((b >= 'A') && (b <= 'Z')) || ((b >= 'a') && (b <= 'z')) || ((b >= '0') && (b <= '9')) || (b == '.') || (b == '-') || (b == '_'))) { - throw new IllegalArgumentException("Artifact " + artifact.toString() + "'s name contains an illegal character '" + new String(new byte[] {b}) + "'"); + throw new IllegalArgumentException("Artifact " + artifactName + "'s name contains an illegal character '" + new String(new byte[] {b}) + "'"); } } }