Repository: zest-sandbox
Updated Branches:
  refs/heads/develop 707b73fe4 -> d4dd9c176


http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/pom.xml
----------------------------------------------------------------------
diff --git a/qi4j/libraries/validation/pom.xml 
b/qi4j/libraries/validation/pom.xml
new file mode 100644
index 0000000..0b0b3da
--- /dev/null
+++ b/qi4j/libraries/validation/pom.xml
@@ -0,0 +1,19 @@
+<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/maven-v4_0_0.xsd";>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.qi4j.sandbox</groupId>
+    <artifactId>qi4j-sandbox-libraries</artifactId>
+    <version>0-SNAPSHOT</version>
+  </parent>
+  <groupId>org.qi4j.library</groupId>
+  <artifactId>org.qi4j.library.validation</artifactId>
+  <name>Qi4j Library - Validation</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.qi4j.core</groupId>
+      <artifactId>org.qi4j.core.api</artifactId>
+    </dependency>
+  </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/AbstractValidatableConcern.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/AbstractValidatableConcern.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/AbstractValidatableConcern.java
new file mode 100644
index 0000000..4e7297b
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/AbstractValidatableConcern.java
@@ -0,0 +1,39 @@
+package org.qi4j.library.validation;
+
+import org.qi4j.api.concern.ConcernOf;
+
+import java.util.List;
+
+/**
+ * Base class for validation concerns.
+ */
+public class AbstractValidatableConcern extends ConcernOf<Validatable>
+    implements Validatable
+{
+    public List<ValidationMessage> validate()
+    {
+        List<ValidationMessage> messages = next.validate();
+        Validator validator = new Validator( messages, getResourceBundle() );
+        isValid( validator );
+        return messages;
+    }
+
+    public void checkValid() throws ValidationException
+    {
+        next.checkValid();
+    }
+
+    /**
+     * Override this method to do your own validations
+     *
+     * @param validator used to simplify checks
+     */
+    protected void isValid( Validator validator )
+    {
+    }
+
+    protected String getResourceBundle()
+    {
+        return this.getClass().getPackage().getName() + ".package";
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/AppliesToAnnotation.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/AppliesToAnnotation.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/AppliesToAnnotation.java
new file mode 100644
index 0000000..2d8126e
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/AppliesToAnnotation.java
@@ -0,0 +1,13 @@
+package org.qi4j.library.validation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention( RetentionPolicy.RUNTIME )
+@Target( { ElementType.TYPE } )
+public @interface AppliesToAnnotation
+{
+    Class value();
+}

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ChangeValidationConcern.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ChangeValidationConcern.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ChangeValidationConcern.java
new file mode 100644
index 0000000..003d8b6
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ChangeValidationConcern.java
@@ -0,0 +1,71 @@
+package org.qi4j.library.validation;
+
+import org.qi4j.api.common.AppliesTo;
+import org.qi4j.api.common.AppliesToFilter;
+import org.qi4j.api.concern.ConcernOf;
+import org.qi4j.api.injection.scope.This;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+/**
+ * After invocation, ensure that the validation rules pass.
+ * <p/>
+ * This applies to all methods which throws ValidationException
+ */
+@AppliesTo( ChangeValidationConcern.AppliesTo.class )
+public class ChangeValidationConcern extends ConcernOf<InvocationHandler>
+    implements InvocationHandler
+{
+    public static class AppliesTo
+        implements AppliesToFilter
+    {
+        private final Method checkValidMethod;
+
+        public AppliesTo()
+        {
+            try
+            {
+                checkValidMethod = Validatable.class.getMethod( "checkValid" );
+            }
+            catch( NoSuchMethodException e )
+            {
+                throw new Error( "Invalid interface", e );
+            }
+        }
+
+        public boolean appliesTo( Method method, Class mixin, Class 
compositeType, Class modelClass )
+        {
+            if( method.equals( checkValidMethod ) )
+            {
+                return false;
+            }
+
+            Class[] exceptionClasses = method.getExceptionTypes();
+            for( Class exceptionClass : exceptionClasses )
+            {
+                if( ValidationException.class.isAssignableFrom( exceptionClass 
) )
+                {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+    }
+
+    @This Validatable validatable;
+
+    public Object invoke( Object object, Method method, Object[] objects ) 
throws Throwable
+    {
+        try
+        {
+            return next.invoke( object, method, objects );
+        }
+        finally
+        {
+            // Ensure that object is still in a valid state
+            validatable.checkValid();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/LifecycleValidationConcern.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/LifecycleValidationConcern.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/LifecycleValidationConcern.java
new file mode 100755
index 0000000..ad63929
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/LifecycleValidationConcern.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2007, Lan Boon Ping. All Rights Reserved.
+ *
+ * Licensed 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.qi4j.library.validation;
+
+import org.qi4j.api.concern.ConcernOf;
+import org.qi4j.api.entity.Lifecycle;
+import org.qi4j.api.injection.scope.This;
+
+/**
+ * This modifier is invoked on Lifecycle mixin invocation.
+ * Before the next target invocation, this modifier invokes
+ * {@link Validatable#validate()}.
+ * <p/>
+ * JAVADOC: We need to distinguish between Validatable on create, delete and 
update.
+ */
+public class LifecycleValidationConcern extends ConcernOf<Lifecycle>
+    implements Lifecycle
+{
+    @This Validatable validation;
+
+    public void create()
+    {
+        validation.validate();
+
+        next.create();
+    }
+
+    public void remove()
+    {
+        next.remove();
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/UoWCallbackValidatableMixin.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/UoWCallbackValidatableMixin.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/UoWCallbackValidatableMixin.java
new file mode 100644
index 0000000..bbbd71a
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/UoWCallbackValidatableMixin.java
@@ -0,0 +1,43 @@
+/*  Copyright 2009 Rickard Öberg.
+ *
+ * Licensed 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.qi4j.library.validation;
+
+import org.qi4j.api.injection.scope.This;
+import org.qi4j.api.unitofwork.UnitOfWorkCallback;
+import org.qi4j.api.unitofwork.UnitOfWorkCompletionException;
+
+public class UoWCallbackValidatableMixin
+    implements UnitOfWorkCallback
+{
+    @This private Validatable validatable;
+
+    public void beforeCompletion() throws UnitOfWorkCompletionException
+    {
+        try
+        {
+            validatable.checkValid();
+        }
+        catch( ValidationException e )
+        {
+            throw (UnitOfWorkCompletionException) new 
UnitOfWorkCompletionException( "Validation failed" ).initCause( e );
+        }
+    }
+
+    public void afterCompletion( UnitOfWorkStatus status )
+    {
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/Validatable.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/Validatable.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/Validatable.java
new file mode 100644
index 0000000..b6e5bfc
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/Validatable.java
@@ -0,0 +1,30 @@
+/*  Copyright 2007 Niclas Hedhman.
+ *
+ * Licensed 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.qi4j.library.validation;
+
+import org.qi4j.api.mixin.Mixins;
+
+import java.util.List;
+
+@Mixins( ValidatableMixin.class )
+public interface Validatable
+{
+    List<ValidationMessage> validate();
+
+    void checkValid()
+        throws ValidationException;
+}

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidatableAbstractComposite.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidatableAbstractComposite.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidatableAbstractComposite.java
new file mode 100644
index 0000000..58c0463
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidatableAbstractComposite.java
@@ -0,0 +1,15 @@
+package org.qi4j.library.validation;
+
+import org.qi4j.api.concern.Concerns;
+import org.qi4j.api.mixin.Mixins;
+import org.qi4j.api.unitofwork.UnitOfWorkCallback;
+
+/**
+ * JAVADOC
+ */
+@Concerns( { ValidatableMessagesConcern.class, ChangeValidationConcern.class } 
)
+@Mixins( { ValidatableMixin.class, UoWCallbackValidatableMixin.class, 
ValidationMessagesMixin.class } )
+public interface ValidatableAbstractComposite
+    extends Validatable, UnitOfWorkCallback
+{
+}

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidatableMessagesConcern.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidatableMessagesConcern.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidatableMessagesConcern.java
new file mode 100644
index 0000000..f44705b
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidatableMessagesConcern.java
@@ -0,0 +1,24 @@
+package org.qi4j.library.validation;
+
+import org.qi4j.api.common.AppliesTo;
+import org.qi4j.api.concern.ConcernOf;
+import org.qi4j.api.injection.scope.This;
+
+import java.util.List;
+
+/**
+ * JAVADOC
+ */
+@AppliesTo( Validatable.class )
+public abstract class ValidatableMessagesConcern extends ConcernOf<Validatable>
+    implements Validatable
+{
+    @This ValidationMessages messages;
+
+    public List<ValidationMessage> validate()
+    {
+        List<ValidationMessage> messageList = next.validate();
+        messageList.addAll( messages.getValidationMessages() );
+        return messageList;
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidatableMixin.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidatableMixin.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidatableMixin.java
new file mode 100644
index 0000000..0bc4cad
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidatableMixin.java
@@ -0,0 +1,42 @@
+/*  Copyright 2007 Niclas Hedhman.
+ *
+ * Licensed 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.qi4j.library.validation;
+
+import org.qi4j.api.injection.scope.This;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ValidatableMixin
+    implements Validatable
+{
+    @This Validatable validatable;
+
+    public List<ValidationMessage> validate()
+    {
+        return new ArrayList<ValidationMessage>();
+    }
+
+    public void checkValid() throws ValidationException
+    {
+        List<ValidationMessage> messages = validatable.validate();
+        if( messages.size() > 0 )
+        {
+            throw new ValidationException( messages );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationException.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationException.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationException.java
new file mode 100755
index 0000000..cc2a600
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationException.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2007, Lan Boon Ping. All Rights Reserved.
+ *
+ * Licensed 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.qi4j.library.validation;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Default exception for validation error
+ */
+public class ValidationException
+    extends RuntimeException
+{
+    List<ValidationMessage> messages;
+
+    public ValidationException( String string )
+    {
+        messages = new ArrayList<ValidationMessage>();
+        messages.add( new ValidationMessage( string, 
ValidationMessage.Severity.ERROR ) );
+    }
+
+    public ValidationException( List<ValidationMessage> messages )
+    {
+        this.messages = messages;
+    }
+
+    public List<ValidationMessage> getMessages()
+    {
+        return messages;
+    }
+
+    @Override public String getMessage()
+    {
+        return getLocalizedMessage();
+    }
+
+
+    @Override public String getLocalizedMessage()
+    {
+        StringBuffer buf = new StringBuffer();
+        for( ValidationMessage message : messages )
+        {
+            if( buf.length() != 0 )
+            {
+                buf.append( "\n" );
+            }
+            buf.append( message.getMessage() );
+        }
+
+        return buf.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationMessage.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationMessage.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationMessage.java
new file mode 100644
index 0000000..bced651
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationMessage.java
@@ -0,0 +1,106 @@
+/*  Copyright 2007 Niclas Hedhman.
+ *
+ * Licensed 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.qi4j.library.validation;
+
+import java.io.Serializable;
+import java.text.MessageFormat;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+public class ValidationMessage
+    implements Serializable
+{
+    private String resourceKey;
+    private Object[] arguments;
+
+    private String resourceBundle;
+    private Severity severity;
+
+    public ValidationMessage( String resourceKey, Severity severity )
+    {
+        this( resourceKey, null, severity );
+    }
+
+    public ValidationMessage( String resourceKey, String resourceBundle, 
Severity severity, Object... arguments )
+    {
+        this.resourceKey = resourceKey;
+        this.arguments = arguments;
+        this.resourceBundle = resourceBundle;
+        this.severity = severity;
+    }
+
+    public String getResourceKey()
+    {
+        return resourceKey;
+    }
+
+    public Object[] getArguments()
+    {
+        return arguments;
+    }
+
+    public String getResourceBundle()
+    {
+        return resourceBundle;
+    }
+
+    public Severity getSeverity()
+    {
+        return severity;
+    }
+
+    public String getMessage()
+    {
+        return getMessage( Locale.getDefault() );
+    }
+
+    public String getMessage( Locale aLocale )
+    {
+        String resource;
+        if( resourceBundle != null )
+        {
+            // Look up the message from a bundle
+            ResourceBundle bundle = ResourceBundle.getBundle( resourceBundle, 
aLocale );
+            resource = bundle.getString( resourceKey );
+        }
+        else
+        {
+            // Don't use i18n
+            resource = resourceKey;
+        }
+
+        if( arguments == null )
+        {
+            return resource;
+        }
+        else
+        {
+            return MessageFormat.format( resource, arguments );
+        }
+    }
+
+
+    @Override public String toString()
+    {
+        return getMessage();
+    }
+
+    public enum Severity
+    {
+        INFO, WARNING, ERROR
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationMessages.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationMessages.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationMessages.java
new file mode 100644
index 0000000..5c0c3b1
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationMessages.java
@@ -0,0 +1,17 @@
+package org.qi4j.library.validation;
+
+import java.util.Collection;
+
+/**
+ * JAVADOC
+ */
+public interface ValidationMessages
+{
+    void addValidationMessage( ValidationMessage validationMessage );
+
+    void removeValidationMessage( String message );
+
+    Collection<ValidationMessage> getValidationMessages();
+
+    void clearValidationMessages();
+}

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationMessagesMixin.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationMessagesMixin.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationMessagesMixin.java
new file mode 100644
index 0000000..09964f9
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/ValidationMessagesMixin.java
@@ -0,0 +1,34 @@
+package org.qi4j.library.validation;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * JAVADOC
+ */
+public class ValidationMessagesMixin
+    implements ValidationMessages
+{
+    Map<String, ValidationMessage> messages = new HashMap<String, 
ValidationMessage>();
+
+    public void addValidationMessage( ValidationMessage validationMessage )
+    {
+        messages.put( validationMessage.getResourceKey(), validationMessage );
+    }
+
+    public void removeValidationMessage( String message )
+    {
+        messages.remove( message );
+    }
+
+    public Collection<ValidationMessage> getValidationMessages()
+    {
+        return messages.values();
+    }
+
+    public void clearValidationMessages()
+    {
+        messages.clear();
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/Validator.java
----------------------------------------------------------------------
diff --git 
a/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/Validator.java
 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/Validator.java
new file mode 100644
index 0000000..d9ebf28
--- /dev/null
+++ 
b/qi4j/libraries/validation/src/main/java/org/qi4j/library/validation/Validator.java
@@ -0,0 +1,42 @@
+package org.qi4j.library.validation;
+
+import java.util.List;
+
+/**
+ * JAVADOC
+ */
+public class Validator
+{
+    List<ValidationMessage> messages;
+    String resourceBundle;
+
+    public Validator( List<ValidationMessage> messages, String resourceBundle )
+    {
+        this.messages = messages;
+        this.resourceBundle = resourceBundle;
+    }
+
+    public void error( boolean test, String resourceKey, Object... arguments )
+    {
+        if( test )
+        {
+            messages.add( new ValidationMessage( resourceKey, resourceBundle, 
ValidationMessage.Severity.ERROR, arguments ) );
+        }
+    }
+
+    public void warn( boolean test, String resourceKey, Object... arguments )
+    {
+        if( test )
+        {
+            messages.add( new ValidationMessage( resourceKey, resourceBundle, 
ValidationMessage.Severity.WARNING, arguments ) );
+        }
+    }
+
+    public void info( boolean test, String resourceKey, Object... arguments )
+    {
+        if( test )
+        {
+            messages.add( new ValidationMessage( resourceKey, resourceBundle, 
ValidationMessage.Severity.INFO, arguments ) );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-sandbox/blob/d4dd9c17/qi4j/pom.xml
----------------------------------------------------------------------
diff --git a/qi4j/pom.xml b/qi4j/pom.xml
new file mode 100644
index 0000000..3bce8a4
--- /dev/null
+++ b/qi4j/pom.xml
@@ -0,0 +1,87 @@
+<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>
+  <groupId>org.qi4j.sandbox</groupId>
+  <artifactId>qi4j-sandbox</artifactId>
+  <packaging>pom</packaging>
+  <version>0-SNAPSHOT</version>
+  <name>Qi4j Sandbox - Build POM</name>
+
+  <modules>
+    <module>libraries</module>
+    <module>extensions</module>
+  </modules>
+
+  <repositories>
+    <repository>
+        <id>qi4j-releases</id>
+        <url>https://repository-qi4j.forge.cloudbees.com/release/</url>
+    </repository>
+    <repository>
+        <id>qi4j-snapshots</id>
+        <url>https://repository-qi4j.forge.cloudbees.com/snapshot/</url>
+        <releases><enabled>false</enabled></releases>
+        <snapshots><enabled>true</enabled></snapshots>
+    </repository>
+  </repositories>
+
+  <properties>
+    <version.qi4j>2.0</version.qi4j>
+  </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      
+      <dependency>
+        <groupId>org.qi4j.core</groupId>
+        <artifactId>org.qi4j.core.api</artifactId>
+        <version>${version.qi4j}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.qi4j.core</groupId>
+        <artifactId>org.qi4j.core.spi</artifactId>
+        <version>${version.qi4j}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.qi4j.core</groupId>
+        <artifactId>org.qi4j.core.bootstrap</artifactId>
+        <version>${version.qi4j}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.qi4j.library</groupId>
+        <artifactId>org.qi4j.library.locking</artifactId>
+        <version>${version.qi4j}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.slf4j</groupId>
+        <artifactId>slf4j-api</artifactId>
+        <version>1.6.1</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.qi4j.core</groupId>
+        <artifactId>org.qi4j.core.runtime</artifactId>
+        <scope>runtime</scope>
+        <version>${version.qi4j}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.qi4j.core</groupId>
+        <artifactId>org.qi4j.core.testsupport</artifactId>
+        <version>${version.qi4j}</version>
+        <scope>test</scope>
+      </dependency>
+
+      <dependency>
+        <groupId>junit</groupId>
+        <artifactId>junit</artifactId>
+        <version>4.8.1</version>
+        <scope>test</scope>
+      </dependency>
+
+    </dependencies>
+  </dependencyManagement>
+
+</project>

Reply via email to