package org.robobinding.attribute;
import static org.robobinding.attribute.StaticResourceAttribute.isStaticResourceAttribute;
import static org.robobinding.attribute.StaticResourcesAttribute.isStaticResourcesAttribute;
import static org.robobinding.attribute.ValueModelAttribute.isValueModelAttribute;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @since 1.0
* @version $Revision: 1.0 $
* @author Robert Taylor
* @author Cheng Wei
*/
public class PropertyAttributeParser {
public AbstractPropertyAttribute parse(String name, String value) {
if (isValueModelAttribute(value)) {
return new ValueModelAttribute(name, value);
} else if (isStaticResourcesAttribute(value)) {
return new StaticResourcesAttribute(name, value);
} else if (isStaticResourceAttribute(value)) {
return new StaticResourceAttribute(name, value);
}
throw new MalformedAttributeException(name, describeSyntaxError(value));
}
public ValueModelAttribute parseAsValueModelAttribute(String name, String value) {
if (isValueModelAttribute(value)) {
return new ValueModelAttribute(name, value);
}
throw new MalformedAttributeException(name, describeSyntaxError(value));
}
StaticResourceAttribute parseAsStaticResourceAttribute(String name, String value) {
if (isStaticResourceAttribute(value)) {
return new StaticResourceAttribute(name, value);
}
throw new MalformedAttributeException(name, describeSyntaxError(value));
}
private String describeSyntaxError(String value) {
String errorMessage = "Invalid binding syntax: '" + value + "'.";
Matcher propertyBindingAttempted = Pattern.compile("\\{.+|.+\\}").matcher(value);
Matcher resourceBindingAttempted = Pattern.compile(".*@.*").matcher(value);
if (!propertyBindingAttempted.matches())
errorMessage += "\n\nDid you mean '{" + value + "}' or '${" + value + "}'? (one/two-way binding)\n";
else if (resourceBindingAttempted.matches())
errorMessage += "\n\nDid you mean to omit the curly braces? (Curly braces are for binding to a property on the presentation model, "
+ "not static resources)";
return errorMessage;
}
}