Return-Path: Delivered-To: apmail-geronimo-scm-archive@www.apache.org Received: (qmail 84383 invoked from network); 30 Apr 2009 20:48:44 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 30 Apr 2009 20:48:44 -0000 Received: (qmail 1202 invoked by uid 500); 30 Apr 2009 20:48:44 -0000 Delivered-To: apmail-geronimo-scm-archive@geronimo.apache.org Received: (qmail 1129 invoked by uid 500); 30 Apr 2009 20:48:43 -0000 Mailing-List: contact scm-help@geronimo.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: dev@geronimo.apache.org List-Id: Delivered-To: mailing list scm@geronimo.apache.org Received: (qmail 1118 invoked by uid 99); 30 Apr 2009 20:48:43 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 30 Apr 2009 20:48:43 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.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; Thu, 30 Apr 2009 20:48:41 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 4F039238896D; Thu, 30 Apr 2009 20:48:20 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r770440 - in /geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint: context/Instanciator.java context/Parser.java reflect/BeanMetadataImpl.java reflect/MetadataUtil.java Date: Thu, 30 Apr 2009 20:48:20 -0000 To: scm@geronimo.apache.org From: gawor@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090430204820.4F039238896D@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: gawor Date: Thu Apr 30 20:48:19 2009 New Revision: 770440 URL: http://svn.apache.org/viewvc?rev=770440&view=rev Log: perform better argument index checking Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/Instanciator.java geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/Parser.java geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/BeanMetadataImpl.java geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/MetadataUtil.java Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/Instanciator.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/Instanciator.java?rev=770440&r1=770439&r2=770440&view=diff ============================================================================== --- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/Instanciator.java (original) +++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/Instanciator.java Thu Apr 30 20:48:19 2009 @@ -22,7 +22,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Properties; @@ -216,7 +215,7 @@ boolean hasIndex = (beanArguments.get(0).getIndex() >= 0); if (hasIndex) { List beanArgumentsCopy = new ArrayList(beanArguments); - Collections.sort(beanArgumentsCopy, new BeanArgumentComparator()); + Collections.sort(beanArgumentsCopy, MetadataUtil.BEAN_COMPARATOR); beanArguments = beanArgumentsCopy; } List arguments = new ArrayList(); @@ -347,11 +346,5 @@ } return clazz; } - - private static class BeanArgumentComparator implements Comparator { - public int compare(BeanArgument object1, BeanArgument object2) { - return object1.getIndex() - object2.getIndex(); - } - } - + } Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/Parser.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/Parser.java?rev=770440&r1=770439&r2=770440&view=diff ============================================================================== --- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/Parser.java (original) +++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/Parser.java Thu Apr 30 20:48:19 2009 @@ -51,6 +51,7 @@ import org.apache.geronimo.blueprint.ExtendedComponentDefinitionRegistry; import org.apache.geronimo.blueprint.namespace.ParserContextImpl; import org.apache.geronimo.blueprint.reflect.ListenerImpl; +import org.apache.geronimo.blueprint.reflect.MetadataUtil; import org.apache.geronimo.blueprint.reflect.RefCollectionMetadataImpl; import org.apache.geronimo.blueprint.reflect.CollectionMetadataImpl; import org.apache.geronimo.blueprint.reflect.BeanMetadataImpl; @@ -509,6 +510,8 @@ } } + MetadataUtil.validateBeanArguments(metadata.getArguments()); + ComponentMetadata m = metadata; // Parse custom attributes Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/BeanMetadataImpl.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/BeanMetadataImpl.java?rev=770440&r1=770439&r2=770440&view=diff ============================================================================== --- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/BeanMetadataImpl.java (original) +++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/BeanMetadataImpl.java Thu Apr 30 20:48:19 2009 @@ -111,14 +111,6 @@ if (this.arguments == null) { this.arguments = new ArrayList(); } - if (!this.arguments.isEmpty()) { - BeanArgument p1 = this.arguments.get(0); - BeanArgument p2 = argument; - if ( (p1.getIndex() > -1 && p2.getIndex() < 0) || - (p1.getIndex() < 0 && p2.getIndex() > -1) ) { - throw new IllegalArgumentException("Index attribute must be specified either on all or none constructor arguments"); - } - } this.arguments.add(argument); } @@ -229,7 +221,7 @@ this.explicitDependencies.remove(dependency); } } - + @Override public String toString() { return "BeanMetadata[" + Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/MetadataUtil.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/MetadataUtil.java?rev=770440&r1=770439&r2=770440&view=diff ============================================================================== --- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/MetadataUtil.java (original) +++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/MetadataUtil.java Thu Apr 30 20:48:19 2009 @@ -17,6 +17,12 @@ package org.apache.geronimo.blueprint.reflect; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import org.osgi.service.blueprint.reflect.BeanArgument; import org.osgi.service.blueprint.reflect.BeanMetadata; import org.osgi.service.blueprint.reflect.ComponentMetadata; import org.osgi.service.blueprint.reflect.IdRefMetadata; @@ -42,6 +48,8 @@ */ public class MetadataUtil { + public static final Comparator BEAN_COMPARATOR = new BeanArgumentComparator(); + static public Metadata cloneMetadata(Metadata source) { if (source == null) { return null; @@ -142,5 +150,45 @@ throw new IllegalArgumentException("Unsupport metadata type: " + (type != null ? type.getName() : null)); } } + + public static List validateBeanArguments(List arguments) { + if (arguments == null || arguments.isEmpty()) { + return arguments; + } + // check if all or none arguments have index attribute + boolean hasIndexFirst = (arguments.get(0).getIndex() > -1); + for (int i = 1; i < arguments.size(); i++) { + boolean hasIndex = (arguments.get(i).getIndex() > -1); + if ( (hasIndexFirst && !hasIndex) || + (!hasIndexFirst && hasIndex) ) { + throw new IllegalArgumentException("Index attribute must be specified either on all or none constructor arguments"); + } + } + if (hasIndexFirst) { + // sort the arguments + List argumentsCopy = new ArrayList(arguments); + Collections.sort(argumentsCopy, MetadataUtil.BEAN_COMPARATOR); + arguments = argumentsCopy; + + // check if the indexes are sequential + for (int i = 0; i < arguments.size(); i++) { + int index = arguments.get(i).getIndex(); + if (index > i) { + throw new IllegalArgumentException("Missing attribute index"); + } else if (index < i) { + throw new IllegalArgumentException("Duplicate attribute index"); + } // must be the same + } + } + + return arguments; + } + + private static class BeanArgumentComparator implements Comparator { + public int compare(BeanArgument object1, BeanArgument object2) { + return object1.getIndex() - object2.getIndex(); + } + } + }