You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by jr...@apache.org on 2010/06/03 19:07:18 UTC

svn commit: r951071 - in /openjpa/trunk/openjpa-examples/image-gallery: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/openjpa/ src/main/java/org/apache/openjpa/example/ src/main/java/org/apache/o...

Author: jrbauer
Date: Thu Jun  3 17:07:17 2010
New Revision: 951071

URL: http://svn.apache.org/viewvc?rev=951071&view=rev
Log:
Base source for JPA Bean Validation example

Added:
    openjpa/trunk/openjpa-examples/image-gallery/
    openjpa/trunk/openjpa-examples/image-gallery/pom.xml   (with props)
    openjpa/trunk/openjpa-examples/image-gallery/src/
    openjpa/trunk/openjpa-examples/image-gallery/src/main/
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/ImageType.java   (with props)
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageConstraint.java   (with props)
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageContent.java   (with props)
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageContentValidator.java   (with props)
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageGroup.java   (with props)
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageValidator.java   (with props)
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/SequencedImageGroup.java   (with props)
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Album.java   (with props)
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Creator.java   (with props)
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Image.java   (with props)
    openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Location.java   (with props)
    openjpa/trunk/openjpa-examples/image-gallery/src/test/
    openjpa/trunk/openjpa-examples/image-gallery/src/test/java/
    openjpa/trunk/openjpa-examples/image-gallery/src/test/java/org/
    openjpa/trunk/openjpa-examples/image-gallery/src/test/java/org/apache/
    openjpa/trunk/openjpa-examples/image-gallery/src/test/java/org/apache/openjpa/
    openjpa/trunk/openjpa-examples/image-gallery/src/test/java/org/apache/openjpa/example/
    openjpa/trunk/openjpa-examples/image-gallery/src/test/java/org/apache/openjpa/example/gallery/
    openjpa/trunk/openjpa-examples/image-gallery/src/test/java/org/apache/openjpa/example/gallery/TestJPAValidation.java   (with props)
    openjpa/trunk/openjpa-examples/image-gallery/src/test/resources/
    openjpa/trunk/openjpa-examples/image-gallery/src/test/resources/META-INF/
    openjpa/trunk/openjpa-examples/image-gallery/src/test/resources/META-INF/persistence.xml   (with props)

Added: openjpa/trunk/openjpa-examples/image-gallery/pom.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/pom.xml?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/pom.xml (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/pom.xml Thu Jun  3 17:07:17 2010
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.   
+-->
+<!-- 
+    Please keep the project tag on one line to avoid confusing 
+    the release plugin.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+      <groupId>org.apache.openjpa</groupId>
+      <artifactId>openjpa-parent</artifactId>
+      <version>2.1.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.apache.openjpa.openjpa-examples</groupId>
+  <artifactId>image-gallery</artifactId>
+  <packaging>jar</packaging>
+
+  <name>Apache OpenJPA :: Examples - image-gallery</name>
+  <url>http://openjpa.apache.org/samples.html</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <openjpa.Log>DefaultLevel=WARN</openjpa.Log>
+    <checkstyle.config.location>../../openjpa-project/checkstyle.xml</checkstyle.config.location>
+    <test.jvm.maxpermsize>256m</test.jvm.maxpermsize>
+    <test.jvm.maxheapsize>1024m</test.jvm.maxheapsize>
+    <test.jvm.arguments>-Xmx${test.jvm.maxheapsize} -XX:MaxPermSize=${test.jvm.maxpermsize}</test.jvm.arguments>
+    <surefire.jvm.args>${test.jvm.arguments}</surefire.jvm.args>
+  </properties>
+
+  <dependencies>
+    <!-- When using OpenJPA 2.0.0 with bval, commons-lang must be in the dependency -->
+    <!-- tree before openjpa-all-2.0.0 since openjpa-all bundles commons-lang 2.1   -->
+    <!-- and bval requires version 2.4                                              -->
+    <dependency>
+       <groupId>commons-lang</groupId>
+       <artifactId>commons-lang</artifactId>
+       <version>2.4</version>
+       <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>commons-beanutils</groupId>
+      <artifactId>commons-beanutils</artifactId>
+      <version>1.8.3</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-validation_1.0_spec</artifactId>
+      <version>1.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.bval</groupId>
+      <artifactId>org.apache.bval.bundle</artifactId>
+      <version>0.1-incubating-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.openjpa</groupId>
+      <artifactId>openjpa-all</artifactId>
+      <version>${pom.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.derby</groupId>
+      <artifactId>derby</artifactId>
+      <version>10.5.3.0_1</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>2.1</version>
+          <configuration>
+            <source>1.6</source>
+            <target>1.6</target>
+            <!-- Disable the annotation processor for now due to a JDK 6 bug -->
+            <compilerArgument>-proc:none</compilerArgument>
+          </configuration>
+        </plugin>
+        <plugin>
+          <!-- The jar plugin builds a jar containing the image gallery classes -->
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-jar-plugin</artifactId>
+          <version>2.3</version>
+          <configuration>
+            <archive>
+              <manifest>
+                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+              </manifest>
+            </archive>
+          </configuration>
+        </plugin>
+        <plugin>
+          <!-- The surefire plugin is used to run the jUnit tests -->
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <version>2.4.3</version>
+          <configuration>
+            <argLine>${surefire.jvm.args}</argLine>
+            <useFile>false</useFile>
+            <trimStackTrace>false</trimStackTrace>
+            <useSystemClassLoader>true</useSystemClassLoader>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+    <plugins>
+      <plugin>
+          <!-- Use the openjpa maven plugin to enhance the domain model classes -->
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>openjpa-maven-plugin</artifactId>
+          <version>1.1</version>
+          <configuration>
+            <includes>org/apache/openjpa/examples/gallery/model/*.class</includes>
+            <addDefaultConstructor>true</addDefaultConstructor>
+            <enforcePropertyRestrictions>true</enforcePropertyRestrictions>
+            <persistenceXmlFile>src/test/resources/META-INF/persistence.xml</persistenceXmlFile>
+          </configuration>
+          <executions>
+            <execution>
+              <id>enhancer</id>
+              <phase>process-classes</phase>
+              <goals>
+                <goal>enhance</goal>
+              </goals>
+            </execution>
+          </executions>
+          <dependencies>
+            <dependency>
+              <groupId>org.apache.openjpa</groupId>
+              <artifactId>openjpa-all</artifactId>
+              <version>${pom.version}</version>
+            </dependency>
+          </dependencies>
+      </plugin>
+    </plugins>
+  </build>
+</project>

Propchange: openjpa/trunk/openjpa-examples/image-gallery/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/ImageType.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/ImageType.java?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/ImageType.java (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/ImageType.java Thu Jun  3 17:07:17 2010
@@ -0,0 +1,24 @@
+/*
+ * 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.openjpa.example.gallery;
+
+public enum ImageType {
+    JPEG,
+    GIF
+}

Propchange: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/ImageType.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageConstraint.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageConstraint.java?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageConstraint.java (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageConstraint.java Thu Jun  3 17:07:17 2010
@@ -0,0 +1,45 @@
+/*
+ * 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.openjpa.example.gallery.constraint;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+import org.apache.openjpa.example.gallery.ImageType;
+
+/**
+ * Type-level annotation used to specify an image constraint.  Uses 
+ * ImageValidator to perform the validation.
+ */
+@Documented
+@Constraint(validatedBy = ImageValidator.class)
+@Target({ TYPE })
+@Retention(RUNTIME)
+public @interface ImageConstraint {
+    String message() default "Image data is not a supported format.";
+    Class<?>[] groups() default {};
+    Class<? extends Payload>[] payload() default {};
+    ImageType[] value() default { ImageType.GIF, ImageType.JPEG };
+}

Propchange: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageConstraint.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageContent.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageContent.java?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageContent.java (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageContent.java Thu Jun  3 17:07:17 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.openjpa.example.gallery.constraint;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+import org.apache.openjpa.example.gallery.ImageType;
+
+/**
+ * Attribute-level annotation used to specify an image content constraint.  Uses 
+ * ImageContentValidator to perform the validation.
+ */
+@Documented
+@Constraint(validatedBy = ImageContentValidator.class)
+@Target({ METHOD, FIELD })
+@Retention(RUNTIME)
+public @interface ImageContent {
+    String message() default "Image data is not a supported format.";
+    Class<?>[] groups() default {};
+    Class<? extends Payload>[] payload() default {};
+    ImageType[] value() default { ImageType.GIF, ImageType.JPEG };
+}

Propchange: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageContent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageContentValidator.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageContentValidator.java?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageContentValidator.java (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageContentValidator.java Thu Jun  3 17:07:17 2010
@@ -0,0 +1,72 @@
+/*
+ * 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.openjpa.example.gallery.constraint;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+import org.apache.openjpa.example.gallery.ImageType;
+
+/**
+ * Simple check that file format is of a supported type
+ */
+public class ImageContentValidator implements ConstraintValidator<ImageContent, byte[]> {
+
+    private List<ImageType> allowedTypes = null;
+    /**
+     * Configure the constraint validator based on the image
+     * types it should support.
+     * @param constraint the constraint definition
+     */
+    public void initialize(ImageContent constraint) {
+        allowedTypes = Arrays.asList(constraint.value());
+    }
+
+    /**
+     * Validate a specified value.
+     */
+    public boolean isValid(byte[] value, ConstraintValidatorContext context) {
+        if (value == null) {
+            return false;
+        }
+        // Verify the GIF header is either GIF87 or GIF89
+        if (allowedTypes.contains(ImageType.GIF)) {
+            String gifHeader = new String(value, 0, 6);
+            if (value.length >= 6 &&
+                (gifHeader.equalsIgnoreCase("GIF87a") ||
+                 gifHeader.equalsIgnoreCase("GIF89a"))) {
+                return true;
+            }
+        }
+        // Verify the JPEG begins with SOI & ends with EOI
+        if (allowedTypes.contains(ImageType.JPEG)) {
+            if (value.length >= 4 &&
+                value[0] == 0xff && value[1] == 0xd8 &&
+                value[value.length - 2] == 0xff &&
+                value[value.length -1] == 0xd9) {
+                return true;
+            }
+        }
+        // Unknown file format
+        return false;
+    }
+}

Propchange: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageContentValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageGroup.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageGroup.java?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageGroup.java (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageGroup.java Thu Jun  3 17:07:17 2010
@@ -0,0 +1,26 @@
+/*
+ * 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.openjpa.example.gallery.constraint;
+
+/**
+ * Simple interface used to specify validation group: ImageGroup
+ */
+public interface ImageGroup {
+
+}

Propchange: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageGroup.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageValidator.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageValidator.java?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageValidator.java (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageValidator.java Thu Jun  3 17:07:17 2010
@@ -0,0 +1,90 @@
+/*
+ * 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.openjpa.example.gallery.constraint;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+import org.apache.openjpa.example.gallery.ImageType;
+import org.apache.openjpa.example.gallery.model.Image;
+
+/**
+ * Simple validator used to verify that image data is of a supported type
+ */
+public class ImageValidator implements ConstraintValidator<ImageConstraint, Image> {
+
+    private List<ImageType> allowedTypes = null;
+    /**
+     * Configure the constraint validator based on the image
+     * types it should support.
+     * @param constraint the constraint definition
+     */
+    public void initialize(ImageConstraint constraint) {
+        allowedTypes = Arrays.asList(constraint.value());
+    }
+
+    /**
+     * Validate a specified value.
+     */
+    public boolean isValid(Image value, ConstraintValidatorContext context) {
+        // JSR-303 best practice.  Promotes the use of @NotNull to perform
+        // null checking.
+        if (value == null) {
+            return true;
+        }
+        
+        // All these values will be pre-validated with @NotNull constraints
+        // so they are safe to use
+        byte[] data = value.getData();
+        String fileName = value.getFileName();
+        ImageType type = value.getType();
+        
+        // Verify the GIF type is correct5, has the correct extension and
+        // the data header is either GIF87 or GIF89
+        if (allowedTypes.contains(ImageType.GIF) &&
+            type == ImageType.GIF &&
+            fileName.endsWith(".gif")) {
+            if (data != null && data.length >= 6) {
+                String gifHeader = new String(data, 0, 6);
+                if (gifHeader.equalsIgnoreCase("GIF87a") ||
+                     gifHeader.equalsIgnoreCase("GIF89a")) {
+                    return true;
+                }
+            }
+        }
+        // Verify the JPEG type is correct, has the correct extension and
+        // the data begins with SOI & ends with EOI markers
+        if (allowedTypes.contains(ImageType.JPEG) &&
+                value.getType() == ImageType.JPEG &&
+                (fileName.endsWith(".jpg") ||
+                 fileName.endsWith(".jpeg"))) {
+            if (data.length >= 4 &&
+                    data[0] == 0xff && data[1] == 0xd8 &&
+                    data[data.length - 2] == 0xff &&
+                    data[data.length - 1] == 0xd9) {
+                return true;
+            }
+        }
+        // Unknown file format
+        return false;
+    }
+}

Propchange: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/ImageValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/SequencedImageGroup.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/SequencedImageGroup.java?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/SequencedImageGroup.java (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/SequencedImageGroup.java Thu Jun  3 17:07:17 2010
@@ -0,0 +1,32 @@
+/*
+ * 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.openjpa.example.gallery.constraint;
+
+import javax.validation.GroupSequence;
+import javax.validation.groups.Default;
+
+/**
+ * Sequenced validation group definition.  When this validation group is
+ * used constraints within the Default group will validate first.  If 
+ * successful, constraints within the ImageGroup will validate next.
+ */
+@GroupSequence({Default.class, ImageGroup.class})
+public interface SequencedImageGroup {
+
+}

Propchange: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/constraint/SequencedImageGroup.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Album.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Album.java?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Album.java (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Album.java Thu Jun  3 17:07:17 2010
@@ -0,0 +1,81 @@
+/*
+ * 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.openjpa.example.gallery.model;
+
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.ManyToMany;
+import javax.validation.constraints.NotNull;
+
+/**
+ * Album entity.  Contains references to zero or more images and zero or more
+ * image creators/authors.
+ */
+@Entity
+public class Album {
+
+    @Id
+    @GeneratedValue
+    private long id;
+    
+    @NotNull
+    private String name;
+    
+    @OneToMany
+    private List<Image> images;
+    
+    @ManyToMany
+    private List<Creator> creator;
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setImages(List<Image> images) {
+        this.images = images;
+    }
+
+    public List<Image> getImages() {
+        return images;
+    }
+
+    public void setCreator(List<Creator> creator) {
+        this.creator = creator;
+    }
+
+    public List<Creator> getCreator() {
+        return creator;
+    }
+}

Propchange: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Album.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Creator.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Creator.java?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Creator.java (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Creator.java Thu Jun  3 17:07:17 2010
@@ -0,0 +1,94 @@
+/*
+ * 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.openjpa.example.gallery.model;
+
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
+import javax.validation.constraints.NotNull;
+
+/**
+ * Creator entity.  Contains a reference to one or more images authored by
+ * an instance of the creator.
+ */
+@Entity
+public class Creator {
+
+    @Id
+    @GeneratedValue
+    private long id;
+    
+    @NotNull(message="Photographer's first name must be specified.")
+    private String firstName;
+    
+    @NotNull(message="Photographer's last name must be specified.")
+    private String lastName;
+
+    @OneToMany
+    @OrderBy("fileName")
+    private List<Image> images;
+    
+    @ManyToMany
+    private List<Album> albums;
+    
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    public String getLastName() {
+        return lastName;
+    }
+
+    public void setImages(List<Image> images) {
+        this.images = images;
+    }
+
+    public List<Image> getImages() {
+        return images;
+    }
+
+    public List<Album> getAlbums() {
+        return albums;
+    }
+
+    public void setAlbums(List<Album> albums) {
+        this.albums = albums;
+    }
+}

Propchange: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Creator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Image.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Image.java?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Image.java (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Image.java Thu Jun  3 17:07:17 2010
@@ -0,0 +1,105 @@
+/*
+ * 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.openjpa.example.gallery.model;
+
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
+import org.apache.openjpa.example.gallery.ImageType;
+import org.apache.openjpa.example.gallery.constraint.ImageConstraint;
+import org.apache.openjpa.example.gallery.constraint.ImageGroup;
+
+/**
+ * Image entity which makes use of several BV constraints.
+ */
+@Entity
+@ImageConstraint(groups=ImageGroup.class)
+public class Image {
+    
+    private long id;
+    private ImageType type;
+    private String fileName;
+    private byte[] data;    
+    private Location location;
+    private Creator creator;
+    
+    @Id
+    @GeneratedValue
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    @NotNull(message="Image type must be specified.")
+    @Enumerated(EnumType.STRING)
+    public ImageType getType() {
+        return type;
+    }
+    
+    public void setType(ImageType type) {
+        this.type = type;
+    }
+    
+    @NotNull(message="Image file name must not be null.")
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    @NotNull(message="Image data must not be null.")
+    public byte[] getData() {
+        return data;
+    }
+
+    public void setData(byte[] data) {
+        this.data = data;
+    }
+
+    @Valid
+    @Embedded
+    public Location getLocation() {
+        return location;
+    }
+
+    public void setLocation(Location location) {
+        this.location = location;
+    }
+
+    @ManyToOne
+    public Creator getCreator() {
+        return creator;
+    }
+
+    public void setCreator(Creator creator) {
+        this.creator = creator;
+    }
+}

Propchange: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Image.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Location.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Location.java?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Location.java (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Location.java Thu Jun  3 17:07:17 2010
@@ -0,0 +1,72 @@
+package org.apache.openjpa.example.gallery.model;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+
+/**
+ * Location embeddable with several BV constraints applied.
+ */
+@Embeddable
+public class Location {
+
+    @NotNull(message="City must be specified.")
+    private String city;
+    
+    private String street;
+    
+    private String state;
+
+    @NotNull(message="Country must be specified.")
+    @Size(message="Country must be 50 characters or less.", max=50)
+    @Column(length=50)
+    private String country;
+    
+    @Size(message="Zip code must be 10 characters or less.", max=10)
+    @Pattern(message="Zip code must be 5 digits or use the 5+4 format.",
+        regexp="^\\d{5}(([\\-]|[\\+])\\d{4})?$")
+    @Column(length=10)
+    private String zipCode;
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setStreet(String street) {
+        this.street = street;
+    }
+
+    public String getStreet() {
+        return street;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public void setCountry(String country) {
+        this.country = country;
+    }
+
+    public String getCountry() {
+        return country;
+    }
+
+    public void setZipCode(String zipCode) {
+        this.zipCode = zipCode;
+    }
+
+    public String getZipCode() {
+        return zipCode;
+    }
+}

Propchange: openjpa/trunk/openjpa-examples/image-gallery/src/main/java/org/apache/openjpa/example/gallery/model/Location.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-examples/image-gallery/src/test/java/org/apache/openjpa/example/gallery/TestJPAValidation.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/src/test/java/org/apache/openjpa/example/gallery/TestJPAValidation.java?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/src/test/java/org/apache/openjpa/example/gallery/TestJPAValidation.java (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/src/test/java/org/apache/openjpa/example/gallery/TestJPAValidation.java Thu Jun  3 17:07:17 2010
@@ -0,0 +1,122 @@
+package org.apache.openjpa.example.gallery;
+
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+
+import org.apache.openjpa.example.gallery.model.Image;
+import org.apache.openjpa.example.gallery.model.Location;
+
+public class TestJPAValidation extends junit.framework.TestCase {
+
+    /**
+     * Shows usage of BV constraints with JPA at pre-update, pre-remove,
+     * and pre-persist lifecycle events.
+     */
+    public void testValidation() {
+        EntityManagerFactory emf = 
+            Persistence.createEntityManagerFactory("BeanValidation");
+        EntityManager em = emf.createEntityManager();
+
+        // Create a valid location
+        Location loc = new Location();
+        loc.setCity("Rochester");
+        loc.setState("MN");
+        loc.setZipCode("55901");
+        loc.setCountry("USA");
+
+        // Create an Image with non-matching type and file extension
+        Image img = new Image();
+        img.setType(ImageType.JPEG);
+        img.setFileName("Winter_01.gif");
+        loadImage(img);
+        img.setLocation(loc);
+        
+        // *** PERSIST ***
+        try {
+            em.getTransaction().begin();
+            System.out.println("Persisting an entity with non-matching extension and type");
+            em.persist(img);
+            fail();
+        } catch (ConstraintViolationException cve) {
+            // Transaction was marked for rollback, roll it back and
+            // start a new TX
+            em.getTransaction().rollback();
+            handleConstraintViolation(cve);
+            em.getTransaction().begin();
+            System.out.println("Fixing the file type and re-attempting the persist.");
+            img.setType(ImageType.GIF);
+            em.persist(img);
+            em.getTransaction().commit();
+            System.out.println("Persist was successful");
+        }
+
+        // *** UPDATE ***
+        try {
+            em.getTransaction().begin();
+            // Modify the file name to a non-matching file name 
+            // and commit to trigger an update
+            System.out.println("Modifying file name to use an extension that does not");
+            System.out.println("match the file type.  This will cause a CVE.");
+            img.setFileName("Winter_01.jpg");
+            em.getTransaction().commit();
+            fail();
+        }  catch (ConstraintViolationException cve) {
+            // Handle the exception.  The commit failed so the transaction
+            // was already rolled back.
+            System.out.println("Update failed as expected");
+            handleConstraintViolation(cve);
+        }
+        // The update failure caused img to be detached. It must be merged back 
+        // into the persistence context.
+        img = em.merge(img);
+
+        // *** REMOVE ***
+        em.getTransaction().begin();
+        try {
+            // Remove the type and commit to trigger removal
+            System.out.println("Setting the type to an invalid type.  This will cause a");
+            System.out.println("validation exception upon removal");
+            img.setType(null);
+            em.remove(img);
+            em.getTransaction().commit();
+            fail();
+        }  catch (ConstraintViolationException cve) {
+            // Rollback the active transaction and handle the exception
+            em.getTransaction().rollback();
+            System.out.println("Remove failed as expected");
+            handleConstraintViolation(cve);
+        }
+        em.close();
+        emf.close();
+        System.out.println("Done");
+    }
+
+    // Handles constraint violations by printing out violation information
+    private static void handleConstraintViolation(ConstraintViolationException cve) {
+      Set<ConstraintViolation<?>> cvs = cve.getConstraintViolations();
+      for (ConstraintViolation<?> cv : cvs) {
+          System.out.println("------------------------------------------------");
+          System.out.println("Violation: " + cv.getMessage());
+          System.out.println("Entity: " + cv.getRootBeanClass().getSimpleName());
+          // The violation occurred on a leaf bean (embeddable)
+          if (cv.getLeafBean() != null && cv.getRootBean() != cv.getLeafBean()) {
+              System.out.println("Embeddable: " + cv.getLeafBean().getClass().getSimpleName());
+          }
+          System.out.println("Attribute: " + cv.getPropertyPath());
+          System.out.println("Invalid value: " + cv.getInvalidValue());
+          System.out.println("------------------------------------------------");
+      }
+    }
+
+    // Mock image loading utility...  simply loads the GIF89a header to satisfy the 
+    // constraint validator.
+    private static void loadImage(Image img) {
+        img.setData(new byte[] { 'G', 'I', 'F', '8', '9', 'a' });
+    }
+    
+}

Propchange: openjpa/trunk/openjpa-examples/image-gallery/src/test/java/org/apache/openjpa/example/gallery/TestJPAValidation.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-examples/image-gallery/src/test/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-examples/image-gallery/src/test/resources/META-INF/persistence.xml?rev=951071&view=auto
==============================================================================
--- openjpa/trunk/openjpa-examples/image-gallery/src/test/resources/META-INF/persistence.xml (added)
+++ openjpa/trunk/openjpa-examples/image-gallery/src/test/resources/META-INF/persistence.xml Thu Jun  3 17:07:17 2010
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.   
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
+        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+    version="2.0" >
+    
+     <persistence-unit name="BeanValidation">
+        <description>Example persistence unit for Bean Validation</description>
+        <class>org.apache.openjpa.example.gallery.model.Album</class>
+        <class>org.apache.openjpa.example.gallery.model.Creator</class>
+        <class>org.apache.openjpa.example.gallery.model.Image</class>
+        <class>org.apache.openjpa.example.gallery.model.Location</class>
+        <exclude-unlisted-classes>true</exclude-unlisted-classes>
+        <validation-mode>CALLBACK</validation-mode>
+        <properties>
+          <property name="openjpa.ConnectionDriverName" 
+              value="org.apache.derby.jdbc.EmbeddedDriver" />
+          <property name="openjpa.ConnectionURL"
+              value="jdbc:derby:database/ImageDB;create=true" />
+          <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
+          <property name="openjpa.DynamicEnhancementAgent" value="false"/>
+                
+          <property name="javax.persistence.validation.group.pre-persist"
+              value="org.apache.openjpa.example.gallery.constraint.SequencedImageGroup"/>
+          <property name="javax.persistence.validation.group.pre-update"
+              value="org.apache.openjpa.example.gallery.constraint.SequencedImageGroup"/>
+          <property name="javax.persistence.validation.group.pre-remove"
+              value="javax.validation.groups.Default"/>
+        </properties>
+    </persistence-unit>
+</persistence>
\ No newline at end of file

Propchange: openjpa/trunk/openjpa-examples/image-gallery/src/test/resources/META-INF/persistence.xml
------------------------------------------------------------------------------
    svn:eol-style = native