|
Re: Getting bean properties from JvmGenericType [message #1060252 is a reply to message #1060200] |
Thu, 23 May 2013 17:00 |
Hallvard Traetteberg Messages: 673 Registered: July 2009 Location: Trondheim, Norway |
Senior Member |
|
|
On 23.05.13 06.32, Aaron Digulla wrote:
> Does someone have a working code sample how to get Java Bean properties
> when I have a JvmGenericType?
I use the following Xtend2 code in a DSL that supports Java Bean
properties and events.
def Iterable<Pair<String, JvmTypeReference>>
getProperties(JvmDeclaredType type, String name) {
val setters = new ArrayList<JvmOperation>
val getters = new ArrayList<JvmOperation>
val properties = new ArrayList<Pair<String, JvmTypeReference>>
for (JvmOperation op : type.allFeatures.filter(typeof(JvmOperation))) {
if (if (name == null) op.setterPropertyName != null else
name.equals(op.setterPropertyName)) {
setters += op
} else if (if (name == null) op.getterPropertyName != null else
name.equals(op.getterPropertyName)) {
getters += op
}
}
for (JvmOperation setter : setters) {
val getter = getters.findFirst[ isGetterFor(setter) ]
if (getter != null) {
properties += getter.getterPropertyName -> getter.returnType
}
}
properties
}
def Pair<String, JvmTypeReference> getProperty(JvmDeclaredType type,
String propertyName) {
getProperties(type, propertyName).head
}
def Pair<String, JvmTypeReference> getProperty(JvmTypeReference
typeRef, String eventName) {
if (typeRef.type instanceof JvmDeclaredType)
getProperty(typeRef.type as JvmDeclaredType, eventName)
else null
}
def accessorName(String name, String prefix, String suffix) {
if (name.startsWith(prefix) && name.length > prefix.length &&
Character::isUpperCase(name.charAt(prefix.length)) && (suffix == null ||
name.endsWith(suffix))) {
return name.substring(prefix.length, name.length - if (suffix !=
null) suffix.length else 0).toFirstLower
}
return null
}
def isAccessorName(String name, String prefix, String suffix) {
accessorName(name, prefix, suffix) != null
}
def setterPropertyName(JvmOperation op) {
if (op.parameters.size == 1) accessorName(op.simpleName, "set", null)
else null
}
def String getterPropertyName(JvmOperation op) {
var getterName = null as String
if (op.parameters.size == 0) {
getterName = accessorName(op.simpleName, "get" , null)
if (getterName == null &&
"boolean".equals(op.returnType.qualifiedName)) {
getterName = accessorName(op.simpleName, "is", null)
}
}
getterName
}
def isGetterFor(JvmOperation op, JvmOperation setter) {
op.getterPropertyName.equals(setter.setterPropertyName) &&
op.returnType.qualifiedName.equals(setter.parameters.head.parameterType.qualifiedName)
}
//
def Iterable<Pair<String, JvmTypeReference>> getEvents(JvmDeclaredType
type, String name) {
val adders = new ArrayList<JvmOperation>
val removers = new ArrayList<JvmOperation>
val events = new ArrayList<Pair<String, JvmTypeReference>>
for (JvmOperation op : type.allFeatures.filter(typeof(JvmOperation))) {
if (if (name == null) op.listenerAdderName != null else
name.equals(op.listenerAdderName)) {
adders += op
} else if (if (name == null) op.listenerRemoverName != null else
name.equals(op.listenerRemoverName)) {
removers += op
}
}
for (JvmOperation remover : removers) {
val adder = adders.findFirst[remover.isListenerRemoverFor(it)]
if (adder != null) {
events += adder.listenerAdderName -> adder.parameters.head.parameterType
}
}
events
}
def Pair<String, JvmTypeReference> getEvent(JvmDeclaredType type,
String eventName) {
getEvents(type, eventName).head
}
def Pair<String, JvmTypeReference> getEvent(JvmTypeReference typeRef,
String eventName) {
if (typeRef.type instanceof JvmDeclaredType)
getEvent(typeRef.type as JvmDeclaredType, eventName)
else null
}
def listenerAdderName(String eventName) { "add" +
eventName.toFirstUpper + "Listener" }
def listenerAdderName(JvmOperation op) {
if (op.parameters.size == 1) accessorName(op.simpleName, "add",
"Listener") else null
}
def listenerRemoverName(String eventName) { "remove" +
eventName.toFirstUpper + "Listener" }
def listenerRemoverName(JvmOperation op) {
if (op.parameters.size == 1) accessorName(op.simpleName, "remove",
"Listener") else null
}
def isListenerRemoverFor(JvmOperation op, JvmOperation adder) {
op.listenerRemoverName.equals(adder.listenerAdderName) &&
op.parameters.head.parameterType.qualifiedName.equals(adder.parameters.head.parameterType.qualifiedName)
}
}
|
|
|
|
Powered by
FUDForum. Page generated in 0.02675 seconds