| /////////////////////////////////////////////////////////////// |
| * 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. |
| /////////////////////////////////////////////////////////////// |
| |
| [[tut-composites-step5,Step 5 - Constraints]] |
| = Step 5 - Constraints = |
| |
| Previous step was <<tut-composites-step4>>. |
| |
| In this step we will look at how to use Constraints. When we pass parameters to methods in regular Java code the only |
| restriction we can make is to denote a type. Any other constraints on the input value, such as whether the parameter is |
| optional, integer ranges, string regular expressions, and so on, cannot be expressed, and so we have to put this into |
| Javadoc, and then manually add these checks in the implementation class. |
| |
| In Zest™ there is the option to use Constraints, which are further restrictions on the parameters. This is implemented |
| by having an annotation that describes what the Constraint does, and then an implementation class that checks whether a |
| specific value fulfills the Constraint or not. |
| |
| NOTE: The previous steps had a dependency to the <<core-api>> only. The constraints you've used in this step, |
| introduce a new dependency to the <<library-constraints>>, where all the constraint related classes reside. So |
| update your classpath settings accordingly. |
| |
| There are a number of pre-written constraints in Zest™ which you can use. The null check of the original HelloWorld |
| version is already handled by default since Zest™ considers method parameters to be mandatory if not explicitly marked |
| with the @Optional annotation. So, instead of doing that check we will add other checks that are useful to make, such |
| as ensuring that the passed in string is not empty. |
| |
| The only thing you have to do is add the annotation @NotEmpty to the method parameters you want to constrain in this |
| way. The annotation has a default implementation declared in it by using the @Constraints annotation. You can either |
| just use this, which is the common case, or override it by declaring your own @Constraints annotation in the |
| TransientComposite type. |
| |
| You can add as many Constraint annotations you want to a parameter. All of them will be checked whenever a method is |
| called. |
| |
| Steps for this tutorial: |
| |
| - Add @NotEmpty to the state parameters. |
| |
| == Solution == |
| |
| If you have successfully completed the task, you should end up with the following artifacts; |
| |
| These ones remain unchanged: |
| |
| - +HelloWorld.java+ |
| - +HelloWorldComposite.java+ |
| - +HelloWorldStateMixin.java+ |
| |
| |
| *HelloWorldBehaviour.java* |
| [snippet,java] |
| ---- |
| source=tutorials/composites/src/main/java/org/qi4j/tutorials/composites/tutorial6/HelloWorldBehaviour.java |
| tag=solution |
| ---- |
| |
| *HelloWorldBehaviourMixin.java* |
| [snippet,java] |
| ---- |
| source=tutorials/composites/src/main/java/org/qi4j/tutorials/composites/tutorial6/HelloWorldBehaviourMixin.java |
| tag=solution |
| ---- |
| |
| *HelloWorldBehaviourConcern.java* |
| [snippet,java] |
| ---- |
| source=tutorials/composites/src/main/java/org/qi4j/tutorials/composites/tutorial6/HelloWorldBehaviourConcern.java |
| tag=solution |
| ---- |
| |
| *HelloWorldState.java* |
| [snippet,java] |
| ---- |
| source=tutorials/composites/src/main/java/org/qi4j/tutorials/composites/tutorial6/HelloWorldState.java |
| tag=solution |
| ---- |
| |
| Next step is <<tut-composites-step6>> |