Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » TMF (Xtext) » Getting bean properties from JvmGenericType
Getting bean properties from JvmGenericType [message #1060200] Thu, 23 May 2013 13:32 Go to next message
Aaron Digulla is currently offline Aaron DigullaFriend
Messages: 258
Registered: July 2009
Location: Switzerland
Senior Member
Does someone have a working code sample how to get Java Bean properties when I have a JvmGenericType?

Regards,

A. Digulla
Re: Getting bean properties from JvmGenericType [message #1060252 is a reply to message #1060200] Thu, 23 May 2013 17:00 Go to previous messageGo to next message
Hallvard Traetteberg is currently offline Hallvard TraettebergFriend
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)
}
}
Re: Getting bean properties from JvmGenericType [message #1060369 is a reply to message #1060252] Fri, 24 May 2013 10:28 Go to previous message
Aaron Digulla is currently offline Aaron DigullaFriend
Messages: 258
Registered: July 2009
Location: Switzerland
Senior Member
Thanks! That looks very promising.

Can you please edit your answer and wrap the code in a "[code]" element (just select all of it and click on the last button in the "Formatting Tools" above the message editor).

Alternatively, create a gist.
Previous Topic:EMF changes do not reflect Xtext Document
Next Topic:Set XText content-type to UTF-8
Goto Forum:
  


Current Time: Fri Apr 26 20:40:36 GMT 2024

Powered by FUDForum. Page generated in 0.03628 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top