You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bval.apache.org by si...@apache.org on 2010/03/28 14:28:32 UTC

svn commit: r928387 [9/15] - in /incubator/bval/trunk: ./ agimatec-jsr303/ agimatec-validation/ bval-core/ bval-core/.externalToolBuilders/ bval-core/.settings/ bval-core/src/ bval-core/src/main/ bval-core/src/main/java/ bval-core/src/main/java/org/ bv...

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/NestedMetaProperty.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/NestedMetaProperty.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/NestedMetaProperty.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/PropertyDescriptorImpl.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/PropertyDescriptorImpl.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/PropertyDescriptorImpl.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/PropertyDescriptorImpl.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,67 @@
+/*
+ * 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.bval.jsr303;
+
+
+import javax.validation.metadata.PropertyDescriptor;
+
+import org.apache.bval.model.MetaBean;
+import org.apache.bval.model.Validation;
+
+
+/**
+ * Description: <br/>
+ * User: roman <br/>
+ * Date: 25.02.2009 <br/>
+ * Time: 16:54:37 <br/>
+ * Copyright: Agimatec GmbH
+ */
+class PropertyDescriptorImpl extends ElementDescriptorImpl implements PropertyDescriptor {
+    private boolean cascaded;
+    private String propertyPath;
+
+    PropertyDescriptorImpl(MetaBean metaBean, Validation[] validations) {
+        super(metaBean, validations);
+    }
+
+    PropertyDescriptorImpl(Class elementClass, Validation[] validations) {
+        super(elementClass, validations);
+    }
+
+    public void setCascaded(boolean cascaded) {
+        this.cascaded = cascaded;
+    }
+
+    public boolean isCascaded() {
+        return cascaded;
+    }
+
+    public void setPropertyPath(String propertyPath) {
+        this.propertyPath = propertyPath;
+    }
+
+    public String getPropertyName() {
+        return propertyPath;
+    }
+
+    public String toString() {
+        return "PropertyDescriptorImpl{" + "returnType=" + elementClass + ", propertyPath='" +
+              propertyPath + '\'' + '}';
+    }
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/PropertyDescriptorImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/PropertyDescriptorImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/PropertyDescriptorImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/AppendValidationToList.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/AppendValidationToList.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/AppendValidationToList.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/AppendValidationToList.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,46 @@
+/**
+ *  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.bval.jsr303.extensions;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.bval.jsr303.AppendValidation;
+import org.apache.bval.jsr303.ConstraintValidation;
+
+/**
+ * Description: <br/>
+ * User: roman <br/>
+ * Date: 01.02.2010 <br/>
+ * Time: 13:41:22 <br/>
+ * Copyright: Agimatec GmbH
+ */
+public class AppendValidationToList implements AppendValidation {
+    private final List<ConstraintValidation> validations = new ArrayList();
+
+    public AppendValidationToList() {
+    }
+
+    public void append(ConstraintValidation validation) {
+        validations.add(validation);
+    }
+
+    public List<ConstraintValidation> getValidations() {        
+        return validations;
+    }
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/AppendValidationToList.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/AppendValidationToList.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/AppendValidationToList.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptor.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptor.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptor.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,34 @@
+/**
+ *  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.bval.jsr303.extensions;
+
+import javax.validation.metadata.ElementDescriptor;
+import java.util.List;
+
+/**
+ * Description: This class will disappear when such
+ * functionality is part of the JSR303 specification.<br/>
+ * User: roman <br/>
+ * Date: 11.11.2009 <br/>
+ * Time: 12:38:17 <br/>
+ * Copyright: Agimatec GmbH
+ */
+public interface ConstructorDescriptor extends ElementDescriptor {
+    List<ParameterDescriptor> getParameterDescriptors(); //index aligned
+
+    boolean isCascaded();
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptorImpl.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptorImpl.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptorImpl.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptorImpl.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,60 @@
+/**
+ *  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.bval.jsr303.extensions;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.bval.jsr303.ElementDescriptorImpl;
+import org.apache.bval.model.MetaBean;
+import org.apache.bval.model.Validation;
+
+/**
+ * Description: <br/>
+ * User: roman <br/>
+ * Date: 01.02.2010 <br/>
+ * Time: 10:57:39 <br/>
+ * Copyright: Agimatec GmbH
+ */
+public class ConstructorDescriptorImpl extends ElementDescriptorImpl
+      implements ConstructorDescriptor, ProcedureDescriptor {
+    private List<ParameterDescriptor> parameterDescriptors = new ArrayList();
+    private boolean cascaded;
+
+    protected ConstructorDescriptorImpl(MetaBean metaBean, Validation[] validations) {
+        super(metaBean, validations);
+    }
+
+    protected ConstructorDescriptorImpl(Class elementClass, Validation[] validations) {
+        super(elementClass, validations);
+    }
+
+    public boolean isCascaded() {
+        return cascaded;
+    }
+
+    public void setCascaded(boolean cascaded) {
+        this.cascaded = cascaded;
+    }
+
+
+    public List<ParameterDescriptor> getParameterDescriptors() //index aligned
+    {
+        return parameterDescriptors;
+    }
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptorImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptorImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ConstructorDescriptorImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptor.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptor.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptor.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,40 @@
+/**
+ *  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.bval.jsr303.extensions;
+
+import javax.validation.metadata.BeanDescriptor;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.Set;
+
+/**
+ * Description: This class will disappear when such
+ * functionality is part of the JSR303 specification.<br/>
+ * User: roman <br/>
+ * Date: 11.11.2009 <br/>
+ * Time: 12:38:45 <br/>
+ * Copyright: Agimatec GmbH
+ */
+public interface MethodBeanDescriptor extends BeanDescriptor {
+    MethodDescriptor getConstraintsForMethod(Method method);
+
+    ConstructorDescriptor getConstraintsForConstructor(Constructor constructor);
+
+    Set<MethodDescriptor> getConstrainedMethods();
+
+    Set<ConstructorDescriptor> getConstrainedConstructors();
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptorImpl.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptorImpl.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptorImpl.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptorImpl.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,88 @@
+/**
+ *  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.bval.jsr303.extensions;
+
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.bval.jsr303.AgimatecFactoryContext;
+import org.apache.bval.jsr303.BeanDescriptorImpl;
+import org.apache.bval.model.MetaBean;
+import org.apache.bval.model.Validation;
+
+/**
+ * Description: <br/>
+ * User: roman <br/>
+ * Date: 11.11.2009 <br/>
+ * Time: 15:18:00 <br/>
+ * Copyright: Agimatec GmbH
+ */
+class MethodBeanDescriptorImpl extends BeanDescriptorImpl
+      implements MethodBeanDescriptor {
+    private Map<Method, MethodDescriptorImpl> methodConstraints;
+    private Map<Constructor, ConstructorDescriptorImpl> constructorConstraints;
+
+    protected MethodBeanDescriptorImpl(AgimatecFactoryContext factoryContext,
+                                       MetaBean metaBean, Validation[] validations) {
+        super(factoryContext, metaBean, validations);
+    }
+
+    public void setMethodConstraints(Map<Method, MethodDescriptorImpl> methodConstraints) {
+        this.methodConstraints = methodConstraints;
+    }
+
+    public void setConstructorConstraints(
+          Map<Constructor, ConstructorDescriptorImpl> constructorConstraints) {
+        this.constructorConstraints = constructorConstraints;
+    }
+
+    public MethodDescriptor getConstraintsForMethod(Method method) {
+        return methodConstraints.get(method);
+    }
+
+    public ConstructorDescriptor getConstraintsForConstructor(Constructor constructor) {
+        return constructorConstraints.get(constructor);
+    }
+
+    public Set<MethodDescriptor> getConstrainedMethods() {
+        return new HashSet(methodConstraints.values());
+    }
+
+    public void putMethodDescriptor(Method method, MethodDescriptorImpl desc) {
+        methodConstraints.put(method, desc);
+    }
+
+    public Set<ConstructorDescriptor> getConstrainedConstructors() {
+        return new HashSet(methodConstraints.values());
+    }
+
+    public void putConstructorDescriptor(Constructor cons, ConstructorDescriptorImpl desc) {
+        constructorConstraints.put(cons, desc);
+    }
+
+    public Map<Method, MethodDescriptorImpl> getMethodConstraints() {
+        return methodConstraints;
+    }
+
+    public Map<Constructor, ConstructorDescriptorImpl> getConstructorConstraints() {
+        return constructorConstraints;
+    }
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptorImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptorImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodBeanDescriptorImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptor.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptor.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptor.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,35 @@
+/**
+ *  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.bval.jsr303.extensions;
+
+import javax.validation.metadata.ElementDescriptor;
+import java.util.List;
+
+/**
+ * Description: This class will disappear when such
+ * functionality is part of the JSR303 specification.<br/>
+ * User: roman <br/>
+ * Date: 11.11.2009 <br/>
+ * Time: 12:38:09 <br/>
+ * Copyright: Agimatec GmbH
+ */
+public interface MethodDescriptor extends ElementDescriptor {
+    List<ParameterDescriptor> getParameterDescriptors(); //index aligned
+
+    boolean isCascaded();
+
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptorImpl.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptorImpl.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptorImpl.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptorImpl.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,60 @@
+/**
+ *  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.bval.jsr303.extensions;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.bval.jsr303.ElementDescriptorImpl;
+import org.apache.bval.model.MetaBean;
+import org.apache.bval.model.Validation;
+
+/**
+ * Description: <br/>
+ * User: roman <br/>
+ * Date: 01.02.2010 <br/>
+ * Time: 10:38:05 <br/>
+ * Copyright: Agimatec GmbH
+ */
+public class MethodDescriptorImpl extends ElementDescriptorImpl
+      implements MethodDescriptor, ProcedureDescriptor {
+    private List<ParameterDescriptor> parameterDescriptors = new ArrayList();
+    private boolean cascaded;
+
+    protected MethodDescriptorImpl(MetaBean metaBean, Validation[] validations) {
+        super(metaBean, validations);
+    }
+
+    protected MethodDescriptorImpl(Class elementClass, Validation[] validations) {
+        super(elementClass, validations);
+    }
+
+    public List<ParameterDescriptor> getParameterDescriptors() //index aligned
+    {
+        return parameterDescriptors;
+    }
+
+    public boolean isCascaded() {
+        return cascaded;
+    }
+
+    public void setCascaded(boolean cascaded) {
+        this.cascaded = cascaded;
+    }
+
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptorImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptorImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodDescriptorImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidator.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidator.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidator.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidator.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,123 @@
+/**
+ *  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.bval.jsr303.extensions;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validator;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.Set;
+
+/**
+ * Description: Appendix C. Proposal for method-level validation.
+ * This interface contains the APIs added to javax.validation.Validator.
+ * It can be removed as soon as the Validator interface contains these methods.
+ * The extension is not a part of the JSR303 core specification yet, but could
+ * be in a future revision.<br/>
+ * You can access the extension via the use of the Validator.unwrap() method.<br/>
+ * User: roman <br/>
+ * Date: 11.11.2009 <br/>
+ * Time: 11:04:56 <br/>
+ * Copyright: Agimatec GmbH
+ */
+public interface MethodValidator extends Validator {
+    /**
+     * Validate each parameter value based on the constraints described on
+     * the parameters of <code>method</code>.
+     *
+     * @param clazz           class hosting the method
+     * @param method          the method whose parameters are currectly validated
+     * @param parameterValues the parameter values passed to the method for invocation
+     * @param groups          groups targeted for validation
+     * @return set of constraint violations
+     * @throws IllegalArgumentException if the method does not belong to <code>T</code>
+     *                                  or if the Object[] does not match the method signature
+     */
+    <T> Set<ConstraintViolation<T>> validateParameters(Class<T> clazz, Method method,
+                                                       Object[] parameterValues,
+                                                       Class<?>... groups);
+
+    /**
+     * Validate the parameter value based on the constraints described on
+     * the parameterIndex-th parameter of <code>method</code>.
+     *
+     * @param clazz          class hosting the method
+     * @param method         the method whose parameters are currectly validated
+     * @param parameterValue the parameter value passed to the parameterIndex-t parameter of method
+     * @param parameterIndex parameter index of the parameter validated in method
+     * @param groups         groups targeted for validation
+     * @return set of constraint violations
+     * @throws IllegalArgumentException if the method does not belong to <code>T</code>
+     *                                  or if parameterIndex is out of bound
+     */
+    <T> Set<ConstraintViolation<T>> validateParameter(Class<T> clazz, Method method,
+                                                   Object parameterValue,
+                                                   int parameterIndex,
+                                                   Class<?>... groups);
+
+    /**
+     * Validate each parameter value based on the constraints described on
+     * <code>method</code>.
+     *
+     * @param clazz         class hosting the method
+     * @param method        the method whose result is validated
+     * @param returnedValue the value returned by the method invocation
+     * @param groups        groups targeted for validation
+     * @return set of constraint violations
+     * @throws IllegalArgumentException if the method does not belong to <code>T</code>
+     */
+    <T> Set<ConstraintViolation<T>> validateReturnedValue(Class<T> clazz, Method method,
+                                                       Object returnedValue,
+                                                       Class<?>... groups);
+
+    /**
+     * Validate each parameter value based on the constraints described on
+     * the parameters of <code>constructor</code>.
+     *
+     * @param clazz           class hosting the constructor
+     * @param constructor     the constructor whose parameters are currectly validated
+     * @param parameterValues the parameter values passed to the constructor for invocation
+     * @param groups          groups targeted for validation
+     * @return set of constraint violations
+     * @throws IllegalArgumentException if the constructor does not belong to <code>T</code>
+     *                                  or if the Object[] does not match the constructor signature
+     */
+    <T> Set<ConstraintViolation<T>> validateParameters(Class<T> clazz,
+                                                    Constructor constructor,
+                                                    Object[] parameterValues,
+                                                    Class<?>... groups);
+
+    /**
+     * Validate the parameter value based on the constraints described on
+     * the parameterIndex-th parameter of <code>constructor</code>.
+     *
+     * @param clazz          class hosting the constructor
+     * @param constructor    the method whose parameters are currectly validated
+     * @param parameterValue the parameter value passed to the
+     *                       parameterIndex-th parameter of constructor
+     * @param parameterIndex parameter index of the parameter validated in constructor
+     * @param groups         groups targeted for validation
+     * @return set of constraint violations
+     * @throws IllegalArgumentException if the constructor does not belong to <code>T</code>
+     *                                  or if prameterIndex is out of bound
+     */
+    <T> Set<ConstraintViolation<T>> validateParameter(Class<T> clazz,
+                                                   Constructor constructor,
+                                                   Object parameterValue,
+                                                   int parameterIndex,
+                                                   Class<?>... groups);
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidator.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorImpl.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorImpl.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorImpl.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorImpl.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,282 @@
+/**
+ *  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.bval.jsr303.extensions;
+
+import org.apache.bval.jsr303.*;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.metadata.ConstraintDescriptor;
+
+import org.apache.bval.jsr303.AgimatecFactoryContext;
+import org.apache.bval.jsr303.BeanDescriptorImpl;
+import org.apache.bval.jsr303.ClassValidator;
+import org.apache.bval.jsr303.ConstraintValidation;
+import org.apache.bval.jsr303.ConstraintValidationListener;
+import org.apache.bval.jsr303.GroupValidationContext;
+import org.apache.bval.jsr303.groups.Group;
+import org.apache.bval.jsr303.groups.Groups;
+import org.apache.bval.model.MetaBean;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Description: experimental implementation of method-level-validation <br/>
+ * User: roman <br/>
+ * Date: 11.11.2009 <br/>
+ * Time: 12:36:20 <br/>
+ * Copyright: Agimatec GmbH
+ */
+class MethodValidatorImpl extends ClassValidator implements MethodValidator {
+
+    public MethodValidatorImpl(AgimatecFactoryContext factoryContext) {
+        super(factoryContext);
+    }
+
+    @Override
+    protected BeanDescriptorImpl createBeanDescriptor(MetaBean metaBean) {
+        MethodBeanDescriptorImpl descriptor = new MethodBeanDescriptorImpl(factoryContext,
+              metaBean, metaBean.getValidations());
+        MethodValidatorMetaBeanFactory factory =
+              new MethodValidatorMetaBeanFactory(factoryContext);
+        factory.buildMethodDescriptor(descriptor);
+        return descriptor;
+    }
+
+    /**
+     * enhancement: method-level-validation not yet completly implemented
+     * <pre>example:
+     * <code>
+     * public @NotNull String saveItem(@Valid @NotNull Item item, @Max(23) BigDecimal
+     * </code></pre>
+     * spec:
+     * The constraints declarations evaluated are the constraints hosted on the
+     * parameters of the method or constructor. If @Valid is placed on a parameter,
+     * constraints declared on the object itself are considered.
+     *
+     * @throws IllegalArgumentException enhancement: if the method does not belong to <code>T</code>
+     *                                  or if the Object[] does not match the method signature
+     */
+    public <T> Set<ConstraintViolation<T>> validateParameters(Class<T> clazz, Method method,
+                                                              Object[] parameters,
+                                                              Class<?>... groupArray) {
+        MethodBeanDescriptorImpl beanDesc =
+              (MethodBeanDescriptorImpl) getConstraintsForClass(clazz);
+        MethodDescriptorImpl methodDescriptor =
+              (MethodDescriptorImpl) beanDesc.getConstraintsForMethod(method);
+        return validateParameters(methodDescriptor.getMetaBean(),
+              methodDescriptor.getParameterDescriptors(), parameters, groupArray);
+    }
+
+    public <T> Set<ConstraintViolation<T>> validateParameter(Class<T> clazz, Method method,
+                                                             Object parameter,
+                                                             int parameterIndex,
+                                                             Class<?>... groupArray) {
+        MethodBeanDescriptorImpl beanDesc =
+              (MethodBeanDescriptorImpl) getConstraintsForClass(clazz);
+        MethodDescriptorImpl methodDescriptor =
+              (MethodDescriptorImpl) beanDesc.getConstraintsForMethod(method);
+        ParameterDescriptorImpl paramDesc = (ParameterDescriptorImpl) methodDescriptor
+              .getParameterDescriptors().get(parameterIndex);
+        return validateParameter(paramDesc, parameter, groupArray);
+    }
+
+    public <T> Set<ConstraintViolation<T>> validateParameters(Class<T> clazz,
+                                                              Constructor constructor,
+                                                              Object[] parameters,
+                                                              Class<?>... groupArray) {
+        MethodBeanDescriptorImpl beanDesc =
+              (MethodBeanDescriptorImpl) getConstraintsForClass(clazz);
+        ConstructorDescriptorImpl constructorDescriptor =
+              (ConstructorDescriptorImpl) beanDesc.getConstraintsForConstructor(constructor);
+        return validateParameters(constructorDescriptor.getMetaBean(),
+              constructorDescriptor.getParameterDescriptors(), parameters, groupArray);
+    }
+
+    public <T> Set<ConstraintViolation<T>> validateParameter(Class<T> clazz,
+                                                             Constructor constructor,
+                                                             Object parameter,
+                                                             int parameterIndex,
+                                                             Class<?>... groupArray) {
+        MethodBeanDescriptorImpl beanDesc =
+              (MethodBeanDescriptorImpl) getConstraintsForClass(clazz);
+        ConstructorDescriptorImpl methodDescriptor =
+              (ConstructorDescriptorImpl) beanDesc.getConstraintsForConstructor(constructor);
+        ParameterDescriptorImpl paramDesc = (ParameterDescriptorImpl) methodDescriptor
+              .getParameterDescriptors().get(parameterIndex);
+        return validateParameter(paramDesc, parameter, groupArray);
+    }
+
+    /**
+     * If @Valid  is placed on the method, the constraints declared on the object
+     * itself are considered.
+     */
+    public <T> Set<ConstraintViolation<T>> validateReturnedValue(Class<T> clazz, Method method,
+                                                                 Object returnedValue,
+                                                                 Class<?>... groupArray) {
+        MethodBeanDescriptorImpl beanDesc =
+              (MethodBeanDescriptorImpl) getConstraintsForClass(clazz);
+        MethodDescriptorImpl methodDescriptor =
+              (MethodDescriptorImpl) beanDesc.getConstraintsForMethod(method);
+        final GroupValidationContext<ConstraintValidationListener<Object>> context =
+              createContext(methodDescriptor.getMetaBean(), returnedValue, groupArray);
+        validateReturnedValueInContext(context, methodDescriptor);
+        ConstraintValidationListener result = context.getListener();
+        return result.getConstaintViolations();
+    }
+
+    private <T> Set<ConstraintViolation<T>> validateParameters(MetaBean metaBean,
+                                                               List<ParameterDescriptor> paramDescriptors,
+                                                               Object[] parameters,
+                                                               Class<?>... groupArray) {
+        if (parameters == null) throw new IllegalArgumentException("cannot validate null");
+        if (parameters.length > 0) {
+            try {
+                GroupValidationContext<ConstraintValidationListener<Object[]>> context =
+                      createContext(metaBean, null, groupArray);
+                for (int i = 0; i < parameters.length; i++) {
+                    ParameterDescriptorImpl paramDesc =
+                          (ParameterDescriptorImpl) paramDescriptors.get(i);
+                    context.setBean(parameters[i]);
+                    validateParameterInContext(context, paramDesc);
+                }
+                ConstraintValidationListener result = context.getListener();
+                return result.getConstaintViolations();
+            } catch (RuntimeException ex) {
+                throw unrecoverableValidationError(ex, parameters);
+            }
+        } else {
+            return Collections.EMPTY_SET;
+        }
+    }
+
+    private <T> Set<ConstraintViolation<T>> validateParameter(
+          ParameterDescriptorImpl paramDesc, Object parameter, Class<?>... groupArray) {
+        try {
+            final GroupValidationContext<ConstraintValidationListener<Object>> context =
+                  createContext(paramDesc.getMetaBean(), parameter, groupArray);
+            final ConstraintValidationListener result = context.getListener();
+            validateParameterInContext(context, paramDesc);
+            return result.getConstaintViolations();
+        } catch (RuntimeException ex) {
+            throw unrecoverableValidationError(ex, parameter);
+        }
+    }
+
+    /** validate constraints hosted on parameters of a method */
+    private <T> void validateParameterInContext(
+          GroupValidationContext<ConstraintValidationListener<T>> context,
+          ParameterDescriptorImpl paramDesc) {
+
+        final Groups groups = context.getGroups();
+
+        for (ConstraintDescriptor consDesc : paramDesc.getConstraintDescriptors()) {
+            ConstraintValidation validation = (ConstraintValidation) consDesc;
+            // 1. process groups
+            for (Group current : groups.getGroups()) {
+                context.setCurrentGroup(current);
+                validation.validate(context);
+            }
+            // 2. process sequences
+            for (List<Group> eachSeq : groups.getSequences()) {
+                for (Group current : eachSeq) {
+                    context.setCurrentGroup(current);
+                    validation.validate(context);
+                    /**
+                     * if one of the group process in the sequence leads to one or more validation failure,
+                     * the groups following in the sequence must not be processed
+                     */
+                    if (!context.getListener().isEmpty()) break;
+                }
+            }
+        }
+        if (paramDesc.isCascaded() && context.getValidatedValue() != null) {
+            context.setMetaBean(factoryContext.getMetaBeanFinder().
+                  findForClass(context.getValidatedValue().getClass()));
+            // 1. process groups
+            for (Group current : groups.getGroups()) {
+                context.setCurrentGroup(current);
+                validateContext(context);
+            }
+            // 2. process sequences
+            for (List<Group> eachSeq : groups.getSequences()) {
+                for (Group current : eachSeq) {
+                    context.setCurrentGroup(current);
+                    validateContext(context);
+                    /**
+                     * if one of the group process in the sequence leads to one or more validation failure,
+                     * the groups following in the sequence must not be processed
+                     */
+                    if (!context.getListener().isEmpty()) break;
+                }
+            }
+        }
+    }
+
+    /** validate constraints hosted on parameters of a method */
+    private <T> void validateReturnedValueInContext(
+          GroupValidationContext<ConstraintValidationListener<T>> context,
+          MethodDescriptorImpl methodDescriptor) {
+
+        final Groups groups = context.getGroups();
+
+        for (ConstraintDescriptor consDesc : methodDescriptor.getConstraintDescriptors()) {
+            ConstraintValidation validation = (ConstraintValidation) consDesc;
+            // 1. process groups
+            for (Group current : groups.getGroups()) {
+                context.setCurrentGroup(current);
+                validation.validate(context);
+            }
+            // 2. process sequences
+            for (List<Group> eachSeq : groups.getSequences()) {
+                for (Group current : eachSeq) {
+                    context.setCurrentGroup(current);
+                    validation.validate(context);
+                    /**
+                     * if one of the group process in the sequence leads to one or more validation failure,
+                     * the groups following in the sequence must not be processed
+                     */
+                    if (!context.getListener().isEmpty()) break;
+                }
+            }
+        }
+        if (methodDescriptor.isCascaded() && context.getValidatedValue() != null) {
+            context.setMetaBean(factoryContext.getMetaBeanFinder().
+                  findForClass(context.getValidatedValue().getClass()));
+            // 1. process groups
+            for (Group current : groups.getGroups()) {
+                context.setCurrentGroup(current);
+                validateContext(context);
+            }
+            // 2. process sequences
+            for (List<Group> eachSeq : groups.getSequences()) {
+                for (Group current : eachSeq) {
+                    context.setCurrentGroup(current);
+                    validateContext(context);
+                    /**
+                     * if one of the group process in the sequence leads to one or more validation failure,
+                     * the groups following in the sequence must not be processed
+                     */
+                    if (!context.getListener().isEmpty()) break;
+                }
+            }
+        }
+    }
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorMetaBeanFactory.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorMetaBeanFactory.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorMetaBeanFactory.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorMetaBeanFactory.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,153 @@
+/**
+ *  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.bval.jsr303.extensions;
+
+
+import javax.validation.Constraint;
+import javax.validation.ConstraintValidator;
+import javax.validation.Valid;
+
+import org.apache.bval.jsr303.AgimatecFactoryContext;
+import org.apache.bval.jsr303.AppendValidation;
+import org.apache.bval.jsr303.Jsr303MetaBeanFactory;
+import org.apache.bval.jsr303.util.SecureActions;
+import org.apache.bval.model.Validation;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Description: <br/>
+ * User: roman <br/>
+ * Date: 01.02.2010 <br/>
+ * Time: 12:07:24 <br/>
+ * Copyright: Agimatec GmbH
+ */
+public class MethodValidatorMetaBeanFactory extends Jsr303MetaBeanFactory {
+    public MethodValidatorMetaBeanFactory(AgimatecFactoryContext factoryContext) {
+        super(factoryContext);
+    }
+
+    public void buildMethodDescriptor(MethodBeanDescriptorImpl descriptor) {
+        try {
+            buildMethodConstraints(descriptor);
+            buildConstructorConstraints(descriptor);
+        } catch (Exception e) {
+            throw new IllegalArgumentException(e.getMessage(), e);
+        }
+    }
+
+    private void buildConstructorConstraints(MethodBeanDescriptorImpl beanDesc)
+          throws InvocationTargetException, IllegalAccessException {
+        beanDesc.setConstructorConstraints(new HashMap());
+
+        for (Constructor cons : beanDesc.getMetaBean().getBeanClass()
+              .getDeclaredConstructors()) {
+            if (!factoryContext.getFactory().getAnnotationIgnores()
+                  .isIgnoreAnnotations(cons)) {
+
+                ConstructorDescriptorImpl consDesc =
+                      new ConstructorDescriptorImpl(beanDesc.getMetaBean(), new Validation[0]);
+                beanDesc.putConstructorDescriptor(cons, consDesc);
+
+                Annotation[][] paramsAnnos = cons.getParameterAnnotations();
+                int idx = 0;
+                for (Annotation[] paramAnnos : paramsAnnos) {
+                    processAnnotations(consDesc, paramAnnos, idx);
+                    idx++;
+                }
+            }
+        }
+    }
+
+    private void buildMethodConstraints(MethodBeanDescriptorImpl beanDesc)
+          throws InvocationTargetException, IllegalAccessException {
+        beanDesc.setMethodConstraints(new HashMap());
+
+        for (Method method : beanDesc.getMetaBean().getBeanClass().getDeclaredMethods()) {
+            if (!factoryContext.getFactory().getAnnotationIgnores()
+                  .isIgnoreAnnotations(method)) {
+
+
+                MethodDescriptorImpl methodDesc = new MethodDescriptorImpl(
+                      beanDesc.getMetaBean(), new Validation[0]);
+                beanDesc.putMethodDescriptor(method, methodDesc);
+
+                // return value validations
+                AppendValidationToList validations = new AppendValidationToList();
+                for (Annotation anno : method.getAnnotations()) {
+                    processAnnotation(anno, methodDesc, validations);
+                }
+                methodDesc.getConstraintDescriptors().addAll(
+                      (List)validations.getValidations());
+
+                // parameter validations
+                Annotation[][] paramsAnnos = method.getParameterAnnotations();
+                int idx = 0;
+                for (Annotation[] paramAnnos : paramsAnnos) {
+                    processAnnotations(methodDesc, paramAnnos, idx);
+                    idx++;
+                }
+            }
+        }
+    }
+
+    private void processAnnotations(ProcedureDescriptor methodDesc, Annotation[] paramAnnos,
+                                    int idx)
+          throws InvocationTargetException, IllegalAccessException {
+        AppendValidationToList validations = new AppendValidationToList();
+        for (Annotation anno : paramAnnos) {
+            processAnnotation(anno, methodDesc, validations);
+        }
+        ParameterDescriptorImpl paramDesc = new ParameterDescriptorImpl(
+              methodDesc.getMetaBean(), validations.getValidations().toArray(
+              new Validation[validations.getValidations().size()]));
+        paramDesc.setIndex(idx);
+        methodDesc.getParameterDescriptors().add(paramDesc);
+    }
+
+    private void processAnnotation(Annotation annotation, ProcedureDescriptor desc,
+                                   AppendValidation validations)
+          throws InvocationTargetException, IllegalAccessException {
+
+        if (annotation instanceof Valid) {
+            desc.setCascaded(true);
+        } else {
+            Constraint vcAnno = annotation.annotationType().getAnnotation(Constraint.class);
+            if (vcAnno != null) {
+                Class<? extends ConstraintValidator<?, ?>>[] validatorClasses;
+                validatorClasses = findConstraintValidatorClasses(annotation, vcAnno);
+                applyConstraint(annotation, validatorClasses, null,
+                      desc.getMetaBean().getBeanClass(), null, validations);
+            } else {
+                /**
+                 * Multi-valued constraints
+                 */
+                Object result = SecureActions.getAnnotationValue(annotation, ANNOTATION_VALUE);
+                if (result != null && result instanceof Annotation[]) {
+                    for (Annotation each : (Annotation[]) result) {
+                        processAnnotation(each, desc, validations); // recursion
+                    }
+                }
+            }
+        }
+    }
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorMetaBeanFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorMetaBeanFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/MethodValidatorMetaBeanFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptor.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptor.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptor.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,39 @@
+/**
+ *  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.bval.jsr303.extensions;
+
+import javax.validation.metadata.ElementDescriptor;
+
+/**
+ * Description: This class will disappear when such
+ * functionality is part of the JSR303 specification.<br/>
+ * User: roman <br/>
+ * Date: 11.11.2009 <br/>
+ * Time: 12:37:59 <br/>
+ * Copyright: Agimatec GmbH
+ */
+public interface ParameterDescriptor extends ElementDescriptor {
+    /**
+     * Is the parameter marked by the <code>@Valid</code> annotation.
+     *
+     * @return <code>true</code> if the annotation is present, <code>false</code> otherwise.
+     */
+    boolean isCascaded();
+
+    int getIndex();
+}
+

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptorImpl.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptorImpl.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptorImpl.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptorImpl.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,59 @@
+/**
+ *  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.bval.jsr303.extensions;
+
+import org.apache.bval.jsr303.ElementDescriptorImpl;
+import org.apache.bval.model.MetaBean;
+import org.apache.bval.model.Validation;
+
+
+/**
+ * Description: <br/>
+ * User: roman <br/>
+ * Date: 01.02.2010 <br/>
+ * Time: 10:49:29 <br/>
+ * Copyright: Agimatec GmbH
+ */
+public class ParameterDescriptorImpl extends ElementDescriptorImpl
+      implements ParameterDescriptor {
+    private boolean cascaded;
+    private int index;
+
+    public ParameterDescriptorImpl(MetaBean metaBean, Validation[] validations) {
+        super(metaBean, validations);
+    }
+
+    public ParameterDescriptorImpl(Class elementClass, Validation[] validations) {
+        super(elementClass, validations);
+    }
+
+    public boolean isCascaded() {
+        return cascaded;
+    }
+
+    public void setCascaded(boolean cascaded) {
+        this.cascaded = cascaded;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptorImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptorImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ParameterDescriptorImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ProcedureDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ProcedureDescriptor.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ProcedureDescriptor.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ProcedureDescriptor.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,37 @@
+/**
+ *  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.bval.jsr303.extensions;
+
+
+import java.util.List;
+
+import org.apache.bval.model.MetaBean;
+
+/**
+ * Description: <br/>
+ * User: roman <br/>
+ * Date: 01.02.2010 <br/>
+ * Time: 14:43:28 <br/>
+ * Copyright: Agimatec GmbH
+ */
+public interface ProcedureDescriptor {
+    MetaBean getMetaBean();
+
+    void setCascaded(boolean b);
+
+    List<ParameterDescriptor> getParameterDescriptors();
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ProcedureDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ProcedureDescriptor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/extensions/ProcedureDescriptor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Group.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Group.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Group.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Group.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,66 @@
+/*
+ * 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.bval.jsr303.groups;
+
+import javax.validation.groups.Default;
+
+/**
+ * immutable object -
+ * wrap an interface that represents a single group.
+ */
+public class Group {
+    /**
+     * the Default Group
+     */
+    public static final Group DEFAULT = new Group(Default.class);
+    
+    private final Class<?> group;
+
+    public Group(Class<?> group) {
+        this.group = group;
+    }
+
+    public Class<?> getGroup() {
+        return group;
+    }
+
+    @Override
+    public String toString() {
+        return "Group{" + "group=" + group + '}';
+    }
+
+	public boolean isDefault() {
+		return Default.class.equals(group);
+	}
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        Group group1 = (Group) o;
+
+        return !(group != null ? !group.equals(group1.group) : group1.group != null);
+    }
+
+    @Override
+    public int hashCode() {
+        return (group != null ? group.hashCode() : 0);
+    }
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Group.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Group.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Group.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Groups.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Groups.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Groups.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Groups.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,97 @@
+/*
+ * 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.bval.jsr303.groups;
+
+
+import javax.validation.GroupDefinitionException;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * defines the order to validate groups during validation.
+ * with some inspiration from reference implementation
+ *
+ * @author Roman Stumm
+ */
+public class Groups {
+    /** The list of single groups. */
+    protected List<Group> groups = new LinkedList<Group>();
+
+    /** The list of sequences. */
+    protected List<List<Group>> sequences = new LinkedList<List<Group>>();
+
+    public List<Group> getGroups() {
+        return groups;
+    }
+
+    public List<List<Group>> getSequences() {
+        return sequences;
+    }
+
+    void insertGroup(Group group) {
+        if (!groups.contains(group)) {
+            groups.add(group);
+        }
+    }
+
+    void insertSequence(List<Group> groups) {
+        if (groups == null || groups.isEmpty()) {
+            return;
+        }
+
+        if (!sequences.contains(groups)) {
+            sequences.add(groups);
+        }
+    }
+
+    public void assertDefaultGroupSequenceIsExpandable(List<Group> defaultGroups) {
+        for (List<Group> groupList : sequences) {
+            int idx = groupList.indexOf(Group.DEFAULT);
+            if (idx != -1) {
+                ensureExpandable(groupList, defaultGroups, idx);
+            }
+        }
+    }
+
+    private void ensureExpandable(List<Group> groupList, List<Group> defaultGroupList,
+                                  int defaultGroupIndex) {
+        for (int i = 0; i < defaultGroupList.size(); i++) {
+            Group group = defaultGroupList.get(i);
+            if (group.isDefault()) {
+                continue; // the default group is the one we want to replace
+            }
+            int index = groupList
+                  .indexOf(group); // sequence contains group of default group sequence
+            if (index == -1) {
+                continue; // if group is not in the sequence
+            }
+
+            if ((i == 0 && index == defaultGroupIndex - 1) ||
+                  (i == defaultGroupList.size() - 1 && index == defaultGroupIndex + 1)) {
+                // if we are at the beginning or end of he defaultGroupSequence and the
+                // matches are either directly before or after we can continue,
+                // since we basically have two groups
+                continue;
+            }
+            throw new GroupDefinitionException("Unable to expand default group list" +
+                  defaultGroupList + " into sequence " + groupList);
+        }
+    }
+
+}
\ No newline at end of file

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Groups.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Groups.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/Groups.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/GroupsComputer.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/GroupsComputer.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/GroupsComputer.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/GroupsComputer.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,131 @@
+/*
+ * 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.bval.jsr303.groups;
+
+
+import javax.validation.GroupSequence;
+import javax.validation.ValidationException;
+import javax.validation.groups.Default;
+import java.util.*;
+
+/**
+ * Description: compute group order, based on the hibernate validator algorithm
+ * to guarantee compatibility with interpretation of spec by reference implementation <br/>
+ * Implementation is thread-safe.
+ * User: roman <br/>
+ * Date: 09.04.2009 <br/>
+ * Time: 09:15:50 <br/>
+ * Copyright: Agimatec GmbH
+ */
+public class GroupsComputer {
+    /** The default group array used in case any of the validate methods is called without a group. */
+    public static final Class<?>[] DEFAULT_GROUP_ARRAY = new Class<?>[]{Default.class};
+    private static final Groups DEFAULT_GROUPS;
+
+    static {
+        DEFAULT_GROUPS =
+              new GroupsComputer().computeGroups(Arrays.asList(DEFAULT_GROUP_ARRAY));
+    }
+
+    /** caching resolved groups in a thread-safe map. */
+    private final Map<Class<?>, List<Group>> resolvedSequences =
+          Collections.synchronizedMap(new HashMap<Class<?>, List<Group>>());
+
+    public Groups computeGroups(Class<?>[] groups) {
+        if (groups == null) {
+            throw new IllegalArgumentException("null passed as group");
+        }
+
+        // if no groups is specified use the default
+        if (groups.length == 0) {
+            return DEFAULT_GROUPS;
+        }
+
+        return computeGroups(Arrays.asList(groups));
+    }
+
+
+    protected Groups computeGroups(Collection<Class<?>> groups) {
+        if (groups == null || groups.size() == 0) {
+            throw new IllegalArgumentException("At least one group has to be specified.");
+        }
+
+        for (Class<?> clazz : groups) {
+            if (!clazz.isInterface()) {
+                throw new ValidationException(
+                      "A group has to be an interface. " + clazz.getName() + " is not.");
+            }
+        }
+
+        Groups chain = new Groups();
+        for (Class<?> clazz : groups) {
+            GroupSequence anno = clazz.getAnnotation(GroupSequence.class);
+            if (anno == null) {
+                Group group = new Group(clazz);
+                chain.insertGroup(group);
+                insertInheritedGroups(clazz, chain);
+            } else {
+                insertSequence(clazz, anno, chain);
+            }
+        }
+
+        return chain;
+    }
+
+    private void insertInheritedGroups(Class<?> clazz, Groups chain) {
+        for (Class<?> extendedInterface : clazz.getInterfaces()) {
+            Group group = new Group(extendedInterface);
+            chain.insertGroup(group);
+            insertInheritedGroups(extendedInterface, chain);
+        }
+    }
+
+    private void insertSequence(Class<?> clazz, GroupSequence anno, Groups chain) {
+        List<Group> sequence;
+        if (resolvedSequences.containsKey(clazz)) {
+            sequence = resolvedSequences.get(clazz);
+        } else {
+            sequence = resolveSequence(clazz, anno, new HashSet<Class<?>>());
+        }
+        chain.insertSequence(sequence);
+    }
+
+    private List<Group> resolveSequence(Class<?> group, GroupSequence sequenceAnnotation,
+                                        Set<Class<?>> processedSequences) {
+        if (processedSequences.contains(group)) {
+            throw new ValidationException("Cyclic dependency in groups definition");
+        } else {
+            processedSequences.add(group);
+        }
+        List<Group> resolvedGroupSequence = new LinkedList<Group>();
+        Class<?>[] sequenceArray = sequenceAnnotation.value();
+        for (Class<?> clazz : sequenceArray) {
+            GroupSequence anno = clazz.getAnnotation(GroupSequence.class);
+            if (anno == null) {
+                resolvedGroupSequence.add(new Group(clazz)); // group part of sequence
+            } else {
+                List<Group> tmpSequence =
+                      resolveSequence(clazz, anno, processedSequences);  // recursion!
+                resolvedGroupSequence.addAll(tmpSequence);
+            }
+        }
+        resolvedSequences.put(group, resolvedGroupSequence);
+        return resolvedGroupSequence;
+    }
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/GroupsComputer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/GroupsComputer.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/groups/GroupsComputer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/resolver/CachingRelevant.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/resolver/CachingRelevant.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/resolver/CachingRelevant.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/resolver/CachingRelevant.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,31 @@
+/*
+ * 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.bval.jsr303.resolver;
+
+/**
+ * Description: indicator interface to let the implementation choose
+ * whether results of traversable resolver should be cached <br/>
+ * User: roman <br/>
+ * Date: 25.11.2009 <br/>
+ * Time: 13:59:20 <br/>
+ * Copyright: Agimatec GmbH
+ */
+public interface CachingRelevant {
+    boolean needsCaching();
+}

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/resolver/CachingRelevant.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/resolver/CachingRelevant.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/resolver/CachingRelevant.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/resolver/CachingTraversableResolver.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/resolver/CachingTraversableResolver.java?rev=928387&view=auto
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/resolver/CachingTraversableResolver.java (added)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/resolver/CachingTraversableResolver.java Sun Mar 28 12:28:25 2010
@@ -0,0 +1,153 @@
+/*
+ * 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.bval.jsr303.resolver;
+
+import javax.validation.Path;
+import javax.validation.TraversableResolver;
+import java.lang.annotation.ElementType;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Cache results of a delegated traversable resovler to optimize calls
+ * It works only for a single validate* call and should not be used if
+ * the TraversableResolver is accessed concurrently
+ * <p/>
+ * Date: 25.11.2009 <br/>
+ * Time: 13:56:18 <br/>
+ *
+ * @author Roman Stumm (based on the code of Emmanuel Bernard)
+ */
+public class CachingTraversableResolver implements TraversableResolver, CachingRelevant {
+    private TraversableResolver delegate;
+    private Map<CacheEntry, CacheEntry> cache = new HashMap<CacheEntry, CacheEntry>();
+
+    /** @return true when a CachingTraversableResolver is to be used during validation */
+    public static boolean needsCaching(TraversableResolver resolver) {
+        // caching, if we do not know exactly
+        return !(resolver instanceof CachingRelevant) ||
+              ((CachingRelevant) resolver).needsCaching();
+    }
+
+    public CachingTraversableResolver(TraversableResolver delegate) {
+        this.delegate = delegate;
+    }
+
+    public static TraversableResolver cacheFor(TraversableResolver traversableResolver) {
+        if (needsCaching(traversableResolver)) {
+            return new CachingTraversableResolver(traversableResolver);
+        } else {
+            return traversableResolver;
+        }
+    }
+
+    public boolean isReachable(Object traversableObject, Path.Node traversableProperty,
+                               Class<?> rootBeanType, Path pathToTraversableObject,
+                               ElementType elementType) {
+        CacheEntry currentLH = new CacheEntry(traversableObject, traversableProperty,
+              rootBeanType, pathToTraversableObject, elementType);
+        CacheEntry cachedLH = cache.get(currentLH);
+        if (cachedLH == null) {
+            currentLH.reachable = delegate.isReachable(traversableObject, traversableProperty,
+                  rootBeanType, pathToTraversableObject, elementType);
+            cache.put(currentLH, currentLH);
+            cachedLH = currentLH;
+        } else if (cachedLH.reachable == null) {
+            cachedLH.reachable = delegate.isReachable(traversableObject, traversableProperty,
+                  rootBeanType, pathToTraversableObject, elementType);
+        }
+        return cachedLH.reachable;
+    }
+
+    public boolean isCascadable(Object traversableObject, Path.Node traversableProperty,
+                                Class<?> rootBeanType, Path pathToTraversableObject,
+                                ElementType elementType) {
+        CacheEntry currentLH = new CacheEntry(traversableObject, traversableProperty,
+              rootBeanType, pathToTraversableObject, elementType);
+        CacheEntry cachedLH = cache.get(currentLH);
+        if (cachedLH == null) {
+            currentLH.cascadable = delegate.isCascadable(traversableObject,
+                  traversableProperty, rootBeanType, pathToTraversableObject, elementType);
+            cache.put(currentLH, currentLH);
+            cachedLH = currentLH;
+        } else if (cachedLH.cascadable == null) {
+            cachedLH.cascadable = delegate.isCascadable(traversableObject, traversableProperty,
+                  rootBeanType, pathToTraversableObject, elementType);
+        }
+        return cachedLH.cascadable;
+    }
+
+    public boolean needsCaching() {
+        return false;  // I am the cache. Do not need cache for cache
+    }
+
+    private static class CacheEntry {
+        private final Object object;
+        private final Path.Node node;
+        private final Class<?> type;
+        private final Path path;
+        private final ElementType elementType;
+        private final int hashCode;
+
+        private Boolean reachable;
+        private Boolean cascadable;
+
+
+        private CacheEntry(Object traversableObject, Path.Node traversableProperty,
+                           Class<?> rootBeanType, Path pathToTraversableObject,
+                           ElementType elementType) {
+            this.object = traversableObject;
+            this.node = traversableProperty;
+            this.type = rootBeanType;
+            this.path = pathToTraversableObject;
+            this.elementType = elementType;
+            this.hashCode = buildHashCode();
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass()) {
+                return false;
+            }
+
+            CacheEntry that = (CacheEntry) o;
+
+            return elementType == that.elementType && path.equals(that.path) &&
+                  type.equals(that.type) &&
+                  !(object != null ? !object.equals(that.object) : that.object != null) &&
+                  node.equals(that.node);
+
+        }
+
+        @Override
+        public int hashCode() {
+            return hashCode;
+        }
+
+        private int buildHashCode() {
+            int result = object != null ? object.hashCode() : 0;
+            result = 31 * result + node.hashCode();
+            result = 31 * result + type.hashCode();
+            result = 31 * result + path.hashCode();
+            result = 31 * result + elementType.hashCode();
+            return result;
+        }
+    }
+}
\ No newline at end of file