/** * */ package org.javabuilders.handler; import java.util.Set; import org.javabuilders.BuildProcess; import org.javabuilders.Builder; import org.javabuilders.BuilderConfig; import org.javabuilders.ITypeAsValueSupport; import org.javabuilders.InvalidPropertyException; import org.javabuilders.Node; import org.javabuilders.util.PropertyUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Default class for handling type properties * @author Jacek Furmankiewicz */ public class DefaultPropertyHandler extends AbstractPropertyHandler implements ITypeAsValueSupport { private static final Logger logger = LoggerFactory.getLogger(DefaultPropertyHandler.class); private static final DefaultPropertyHandler singleton = new DefaultPropertyHandler(); /** * @return Singleton */ public static DefaultPropertyHandler getInstance() {return singleton;} /** * List of consumed keys * @param consumedKeys */ private DefaultPropertyHandler(Set<String> consumedKeys) { super(consumedKeys); } /** * Constructor * @param consumedKeys List of consumed keys */ private DefaultPropertyHandler(String... consumedKeys) { super(consumedKeys); } /* (non-Javadoc) * @see org.javabuilders.handler.IPropertyHandler#handle(org.javabuilders.BuilderConfig, org.javabuilders.BuildProcess, org.javabuilders.Node, java.lang.String) */ public void handle(BuilderConfig config, BuildProcess result, Node node, String key) throws InvalidPropertyException { if (key != Builder.CONTENT) { Object mainObject = node.getMainObject(); Object value = node.getProperties().get(key); //ignore default 'name' property if object does not have it if (config.getNamePropertyName().equals(key) && !PropertyUtils.isValid(mainObject, config.getNamePropertyName())) { return; } try { PropertyUtils.setProperty(mainObject, key, value); } catch (Exception e) { //try to display more info on which properties are allowed StringBuilder builder = new StringBuilder(); try { builder.append("The known property names for " + mainObject.getClass().getSimpleName() + " are:"); Set<String> names = PropertyUtils.getPropertyNames(mainObject); for (String name : names) { if (builder.length() > 0) { builder.append("\n"); } builder.append(name); } } catch (Exception ex) { logger.error(ex.getMessage(),ex); } logger.error(e.getMessage() + "\n" + builder.toString(),e); throw new InvalidPropertyException(e, node.getKey(),key, value, builder.toString()); } } } /** * Can handle any object */ public Class<?> getApplicableClass() { return Object.class; } }