Skip to content

Commit

Permalink
refactor: enable to select a strategy to evaluate bean field options
Browse files Browse the repository at this point in the history
  • Loading branch information
ohneda committed Jul 4, 2011
1 parent 9d541f4 commit 0f4c36e
Show file tree
Hide file tree
Showing 8 changed files with 123 additions and 69 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,24 @@ package org.grails.msgpack

import org.grails.msgpack.template.builder.GroovyBeansTemplateBuilderSelector
import org.msgpack.MessagePack
import org.msgpack.template.GroovyBeansFieldEntryReader
import org.grails.msgpack.template.EntityFieldReaderFactory;
import org.grails.msgpack.template.GroovyBeansFieldEntryReader
import org.msgpack.template.builder.BeansBuildContext
import org.msgpack.template.builder.BuildContextBase
import org.msgpack.template.builder.BuildContextFactory
import org.msgpack.template.builder.BuilderSelectorRegistry
import org.msgpack.template.builder.JavassistTemplateBuilder

@Singleton
class GroovyBeanRegister {
class GroovyBeansRegister {

private GroovyBeanRegister(){
private GroovyBeansRegister(){
def registory = BuilderSelectorRegistry.getInstance()

if(!registory.contains(GroovyBeansTemplateBuilderSelector.NAME)){
registory.insert(0, new GroovyBeansTemplateBuilderSelector(
new JavassistTemplateBuilder(
new GroovyBeansFieldEntryReader(),
EntityFieldReaderFactory.getGroovyBeansFieldEntryReader(),
new BuildContextFactory() {
@Override
public BuildContextBase createBuildContext(JavassistTemplateBuilder builder) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.grails.msgpack.template

import org.msgpack.template.BeansFieldEntry;
import org.msgpack.template.FieldOption;
import org.msgpack.template.FieldOptionReader;

@Singleton
public class DomainModelFieldOptionReader implements FieldOptionReader {

@Override
public FieldOption read( Class<?> targetClass, BeansFieldEntry entry,
FieldOption implicitOption ) {
// TODO Auto-generated method stub
return null;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.grails.msgpack.template;

import org.grails.msgpack.template.DomainModelFieldOptionReader
import org.grails.msgpack.template.GroovyBeansFieldEntryReader
import org.msgpack.template.BeansFieldEntryReader
import org.msgpack.template.IFieldEntryReader

public class EntityFieldReaderFactory {

public static IFieldEntryReader getJavaBeansFieldEntryReader(){
new BeansFieldEntryReader();
}

public static IFieldEntryReader getGroovyBeansFieldEntryReader(){
new GroovyBeansFieldEntryReader()
}

public static IFieldEntryReader getGrailsDomainModelFieldEntryReader(){
new GroovyBeansFieldEntryReader(optionReader: DomainModelFieldOptionReader.instance)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.grails.msgpack.template;

import java.util.ArrayList

import org.msgpack.template.BeansFieldEntry
import org.msgpack.template.BeansFieldEntryReader
import org.msgpack.template.FieldOption
import org.msgpack.template.FieldOptionReader
import org.msgpack.template.IFieldEntry

public class GroovyBeansFieldEntryReader extends BeansFieldEntryReader {

FieldOptionReader optionReader = GroovyBeansFieldOptionReader.instance

@Override
public IFieldEntry[] readFieldEntries( Class<?> targetClass,
FieldOption implicitOption ) {

BeansFieldEntry[] entries = (BeansFieldEntry[]) super.readFieldEntries(
targetClass, implicitOption );

ArrayList<BeansFieldEntry> list = new ArrayList<BeansFieldEntry>();
entries.each{
if ( it.getType() != groovy.lang.MetaClass.class ) {
FieldOption op = optionReader.read( targetClass, it,
implicitOption );
it.option = op
list.add( it );
}

}

return list.toArray( new BeansFieldEntry[list.size()] );
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.grails.msgpack.template

import java.lang.reflect.Field;

import org.msgpack.annotation.Ignore;
import org.msgpack.annotation.Nullable;
import org.msgpack.annotation.Optional;
import org.msgpack.annotation.Required;
import org.msgpack.template.BeansFieldEntry;
import org.msgpack.template.FieldOption;
import org.msgpack.template.FieldOptionReader;

@Singleton
class GroovyBeansFieldOptionReader implements FieldOptionReader {

@Override
public FieldOption read( Class<?> targetClass,
BeansFieldEntry entry, FieldOption implicitOption ){
Field field = targetClass.getDeclaredField( entry.getName() );

if ( field.isAnnotationPresent( Ignore.class ) ) {
return FieldOption.IGNORE
} else if ( field.isAnnotationPresent( Required.class ) ) {
return FieldOption.REQUIRED
} else if ( field.isAnnotationPresent( Optional.class ) ) {
return FieldOption.OPTIONAL
} else if ( field.isAnnotationPresent( Nullable.class ) ) {
return FieldOption.NULLABLE
}
return implicitOption;
}

}
6 changes: 6 additions & 0 deletions src/java/org/msgpack/template/FieldOptionReader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.msgpack.template;

public interface FieldOptionReader {
FieldOption read( Class<?> targetClass,
BeansFieldEntry entry, FieldOption implicitOption );
}
61 changes: 0 additions & 61 deletions src/java/org/msgpack/template/GroovyBeansFieldEntryReader.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package org.grails.msgpack

import org.msgpack.MessagePack;
import org.msgpack.MessagePack

import grails.plugin.spock.IntegrationSpec;
import msgpack.beans.Message
import msgpack.beans.User
import msgpack.beans.Comment

class GroovyBeanRegisterSpec extends IntegrationSpec{
class GroovyBeansRegisterSpec extends IntegrationSpec{

def 'simple pack and unpack'(){

given:
GroovyBeanRegister register = GroovyBeanRegister.instance
GroovyBeansRegister register = GroovyBeansRegister.instance

when: 'I regist a groovy bean object with GroovyBeanRegister'
register.register(msgpack.Message)
Expand Down Expand Up @@ -68,7 +68,7 @@ class GroovyBeanRegisterSpec extends IntegrationSpec{
def 'allow some fields to be null with Optional annotation'(){

given:
GroovyBeanRegister register = GroovyBeanRegister.instance
GroovyBeansRegister register = GroovyBeansRegister.instance

when: 'I regist a groovy bean object with GroovyBeanRegister'
register.register(msgpack.Message)
Expand Down

0 comments on commit 0f4c36e

Please sign in to comment.