GriffonClass.java
001 /*
002  * Copyright 2004-2012 the original author or authors.
003  * 
004  * Licensed under the Apache License, Version 2.0 (the "License");
005  * you may not use this file except in compliance with the License.
006  * You may obtain a copy of the License at
007  * 
008  *      http://www.apache.org/licenses/LICENSE-2.0
009  * 
010  * Unless required by applicable law or agreed to in writing, software
011  * distributed under the License is distributed on an "AS IS" BASIS,
012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013  * See the License for the specific language governing permissions and
014  * limitations under the License.
015  */
016 package griffon.core;
017 
018 import groovy.lang.MetaClass;
019 
020 import java.util.Arrays;
021 import java.util.Set;
022 import java.util.TreeSet;
023 
024 /**
025  * Represents any class in a Griffon application that is related to an artifact.</p>
026  * While {@code GriffonArtifact} points to the real artifact instance, this class points to the meta
027  * information that can be obtained from such artifact.
028  *
029  * @author Steven Devijver (Grails 0.1)
030  * @author Graeme Rocher (Grails 0.1)
031  * @author Andres Almiray
032  */
033 public interface GriffonClass extends ApplicationHandler {
034     Set<String> STANDARD_PROPERTIES = new TreeSet<String>(
035             Arrays.asList("class", "metaClass", "app", "UIThread", "griffonClass", "log", "artifactType"));
036 
037     /**
038      * Gets the initial value of the given property on the class.</p>
039      *
040      * @param name The name of the property
041      * @return The initial value
042      */
043     Object getPropertyValue(String name);
044 
045     /**
046      * Returns true if the class has the specified property.</p>
047      *
048      * @param name The name of the property
049      * @return True if it does
050      */
051     boolean hasProperty(String name);
052 
053     /**
054      * Creates a new instance of this class.</p>
055      * <p/>
056      * This method can be used as factory method in the Spring application context.</p>
057      *
058      * @return a new instance of this class
059      */
060     Object newInstance();
061 
062     /**
063      * Returns the logical name of the class in the application without the trailing convention part if applicable
064      * and without the package name.</p>
065      *
066      * @return the logical name
067      */
068     String getName();
069 
070     /**
071      * Returns the short name of the class without package prefix</p>
072      *
073      * @return The short name
074      */
075     String getShortName();
076 
077     /**
078      * Returns the full name of the class in the application with the the trailing convention part and with
079      * the package name.</p>
080      *
081      * @return the full name
082      */
083     String getFullName();
084 
085     /**
086      * Returns the name of the class as a property name</p>
087      *
088      * @return The property name representation
089      */
090     String getPropertyName();
091 
092     /**
093      * Returns the logical name of the class as a property name</p>
094      *
095      * @return The logical property name
096      */
097     String getLogicalPropertyName();
098 
099     /**
100      * Returns the name of the property in natural terms (eg. 'lastName' becomes 'Last Name').<p>
101      *
102      * @return The natural property name
103      */
104     String getNaturalName();
105 
106     /**
107      * Returns the package name of the class.</p>
108      *
109      * @return the package name
110      */
111     String getPackageName();
112 
113     /**
114      * Returns the actual class represented by the GriffonClass</p>
115      *
116      * @return the class
117      */
118     Class getClazz();
119 
120     /**
121      * Returns the artifact type represented by the GriffonClass</p>
122      *
123      * @return the artifact type, i.e. "controller".
124      */
125     String getArtifactType();
126 
127     /**
128      * Gets the {@code MetaClass} of this GriffonClass.
129      *
130      * @return The MetaClass for this Griffon class
131      */
132     MetaClass getMetaClass();
133 
134     /**
135      * @return Sample (reference) instance for this Griffon class
136      */
137     Object getReferenceInstance();
138 
139     /**
140      * Obtains a property value for the given name and type.
141      *
142      * @param name The name
143      * @param type The type
144      * @return The property value
145      */
146     <T> T getPropertyValue(String name, Class<T> type);
147 }