View Javadoc

1   /*
2    * Entreri, an entity-component framework in Java
3    *
4    * Copyright (c) 2013, Michael Ludwig
5    * All rights reserved.
6    *
7    * Redistribution and use in source and binary forms, with or without modification,
8    * are permitted provided that the following conditions are met:
9    *
10   *     Redistributions of source code must retain the above copyright notice,
11   *         this list of conditions and the following disclaimer.
12   *     Redistributions in binary form must reproduce the above copyright notice,
13   *         this list of conditions and the following disclaimer in the
14   *         documentation and/or other materials provided with the distribution.
15   *
16   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
20   * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23   * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26   */
27  package com.lhkbob.entreri.impl;
28  
29  import com.lhkbob.entreri.property.PropertyFactory;
30  
31  /**
32   * PropertyDeclaration represents a particular "property" instance declared in a Component
33   * sub-interface. A property is represented by a bean getter method and an associated
34   * setter. This interface captures the requisite information needed to implement a
35   * component type.
36   *
37   * @author Michael Ludwig
38   */
39  public interface PropertyDeclaration extends Comparable<PropertyDeclaration> {
40      /**
41       * Get the logical name of the property, either the name extracted from the getter
42       * bean method, or from the {@link com.lhkbob.entreri.property.Named} annotation.
43       *
44       * @return The property name
45       */
46      public String getName();
47  
48      /**
49       * Get the canonical class name of the type of value stored by this property.
50       *
51       * @return The type of this property, suitable for inclusion in source code
52       */
53      public String getType();
54  
55      /**
56       * Get the canonical class name of the {@link com.lhkbob.entreri.property.Property
57       * Property} implementation corresponding to the type of this property.
58       *
59       * @return The property implementation, suitable for inclusion in source code
60       */
61      public String getPropertyImplementation();
62  
63      /**
64       * Get the name of the setter method that will be used to modify this property value.
65       * Multiply properties may use the same setter, and {@link #getSetterParameter()}
66       * determines their order in the signature. All properties in a ComponentSpecification
67       * that share a setter name use the same setter method.
68       *
69       * @return The name of the setter method
70       */
71      public String getSetterMethod();
72  
73      /**
74       * Get the name of the getter method that is used to access the value of this
75       * property. Its return type is equal to {@link #getType()} and it will not take any
76       * arguments.
77       *
78       * @return The bean getter method
79       */
80      public String getGetterMethod();
81  
82      /**
83       * Get the parameter index used by this property in the signature of its corresponding
84       * setter method. This will be 0 for properties that use the standard bean setter
85       * method, but may be different when properties share the same setter with multiple
86       * parameters.
87       *
88       * @return The method parameter corresponding to this property
89       */
90      public int getSetterParameter();
91  
92      /**
93       * Get whether or not the signature of the setter method of this property returns the
94       * owning Component or if it returns void.  When multiple properties have the same
95       * setter method name, this will always agree.
96       *
97       * @return True if the method signature returns the component
98       */
99      public boolean getSetterReturnsComponent();
100 
101     /**
102      * Get whether or not this property should use the shared instance API to store and
103      * get values of the property.
104      *
105      * @return True if the getter was annotated with {@link com.lhkbob.entreri.property.SharedInstance}
106      */
107     public boolean isShared();
108 
109     /**
110      * Get the PropertyFactory instance that was configured for this property. It must be
111      * used to instantiate the property objects that will be assignable to the type
112      * returned by {@link #getPropertyImplementation()}, and will be configured by all
113      * attribute annotations applied to the getter method.
114      * <p/>
115      * This is only available during a runtime situation, and should not be called when
116      * ComponentSpecification came from the mirror API.
117      *
118      * @return The property factory for this property
119      */
120     public PropertyFactory<?> getPropertyFactory();
121 }