001 package org.trails.io;
002
003 import org.apache.commons.logging.Log;
004 import org.apache.commons.logging.LogFactory;
005 import org.apache.tapestry.services.DataSqueezer;
006 import org.apache.tapestry.util.io.SqueezeAdaptor;
007 import org.trails.descriptor.DescriptorService;
008 import org.trails.descriptor.IPropertyDescriptor;
009
010 /**
011 * Squeezes a {@link IPropertyDescriptor}
012 */
013 public class PropertyDescriptorSqueezerStrategy implements SqueezeAdaptor
014 {
015
016 private static final Log LOG = LogFactory.getLog(PropertyDescriptorSqueezerStrategy.class);
017
018 public static final String PREFIX = "W";
019 private DescriptorService descriptorService;
020
021 public Class getDataClass()
022 {
023 return IPropertyDescriptor.class;
024 }
025
026 public String getPrefix()
027 {
028 return PREFIX;
029 }
030
031 public DescriptorService getDescriptorService()
032 {
033 return descriptorService;
034 }
035
036 public void setDescriptorService(DescriptorService descriptorService)
037 {
038 this.descriptorService = descriptorService;
039 }
040
041 public String squeeze(DataSqueezer squeezer, Object object)
042 {
043 final IPropertyDescriptor propertyDescriptor = (IPropertyDescriptor) object;
044
045 if (LOG.isDebugEnabled())
046 {
047 LOG.debug("squeezing: " + propertyDescriptor.getBeanType().getName() + "." + propertyDescriptor.getName());
048 }
049
050 final String squeezed = squeezer.squeeze(propertyDescriptor.getBeanType());
051 return PREFIX + squeezed + "." + propertyDescriptor.getName();
052 }
053
054 public Object unsqueeze(DataSqueezer squeezer, String string)
055 {
056 if (LOG.isDebugEnabled())
057 {
058 LOG.debug("unsqueezing: " + string);
059 }
060
061 final int dotIndex = string.lastIndexOf(".");
062 final String squeezed = string.substring(PREFIX.length(), dotIndex);
063 final String propertyName = string.substring(dotIndex + 1);
064 final Class clazz = (Class) squeezer.unsqueeze(squeezed);
065 return getDescriptorService().getClassDescriptor(clazz).getPropertyDescriptor(propertyName);
066 }
067
068 }