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 }