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    }