001    package org.tynamo.internal.services;
002    
003    import org.apache.tapestry5.beaneditor.BeanModel;
004    import org.apache.tapestry5.internal.beaneditor.BeanModelUtils;
005    import org.apache.tapestry5.internal.services.BeanModelSourceImpl;
006    import org.apache.tapestry5.ioc.Messages;
007    import org.apache.tapestry5.ioc.ObjectLocator;
008    import org.apache.tapestry5.ioc.annotations.Primary;
009    import org.apache.tapestry5.ioc.services.ClassFactory;
010    import org.apache.tapestry5.ioc.services.PropertyAccess;
011    import org.apache.tapestry5.ioc.services.TypeCoercer;
012    import org.apache.tapestry5.services.*;
013    import org.tynamo.descriptor.TynamoClassDescriptor;
014    import org.tynamo.descriptor.extension.BeanModelExtension;
015    import org.tynamo.internal.InternalConstants;
016    import org.tynamo.services.DescriptorService;
017    
018    public class TynamoBeanModelSourceImpl extends BeanModelSourceImpl implements BeanModelSource
019    {
020    
021            DescriptorService descriptorService;
022            RequestGlobals requestGlobals;
023    
024            public TynamoBeanModelSourceImpl(TypeCoercer typeCoercer,
025                                             PropertyAccess propertyAccess,
026                                             PropertyConduitSource propertyConduitSource,
027                                             @ComponentLayer ClassFactory classFactory,
028                                             @Primary DataTypeAnalyzer dataTypeAnalyzer,
029                                             ObjectLocator locator,
030                                             DescriptorService descriptorService, RequestGlobals requestGlobals)
031            {
032                    super(typeCoercer, propertyAccess, propertyConduitSource, classFactory, dataTypeAnalyzer, locator);
033                    this.descriptorService = descriptorService;
034                    this.requestGlobals = requestGlobals;
035            }
036    
037            public <T> BeanModel<T> create(Class<T> beanClass, boolean filterReadOnlyProperties, Messages messages)
038            {
039                    BeanModel<T> dataModel = super.create(beanClass, filterReadOnlyProperties, messages);
040    
041                    TynamoClassDescriptor classDescriptor = descriptorService.getClassDescriptor(beanClass);
042    
043                    if (classDescriptor != null)
044                    {
045                            String activePageName = requestGlobals.getActivePageName().toLowerCase();
046                            int index = activePageName.indexOf(beanClass.getSimpleName().toLowerCase());
047                            String contextKey = index > 0 ? activePageName.substring(0, index) : activePageName;
048    
049                            if (classDescriptor.supportsExtension(BeanModelExtension.class))
050                            {
051                                    BeanModelExtension extension = classDescriptor.getExtension(BeanModelExtension.class);
052                                    BeanModelUtils.modify(dataModel, null,
053                                                    extension.getIncludePropertyNames(contextKey),
054                                                    extension.getExcludePropertyNames(contextKey),
055                                                    extension.getReorderPropertyNames(contextKey));
056                            }
057                    }
058    
059                    return dataModel;
060            }
061    }