package org.robobinding;
import java.util.Collection;
import java.util.Map;
import org.robobinding.attribute.MissingRequiredAttributesException;
import org.robobinding.util.Maps;
/**
*
* @since 1.0
* @version $Revision: 1.0 $
* @author Robert Taylor
* @author Cheng Wei
*/
public class PendingAttributesForViewImpl implements PendingAttributesForView {
private Object view;
Map<String, String> attributeMappings;
private ViewResolutionErrorsException resolutionErrors;
private boolean isUnrecognizedAttributesAppended;
public PendingAttributesForViewImpl(Object view, Map<String, String> attributeMappings) {
this.view = view;
this.attributeMappings = Maps.newHashMap(attributeMappings);
resolutionErrors = new ViewResolutionErrorsException(view);
isUnrecognizedAttributesAppended = false;
}
@Override
public Object getView() {
return view;
}
@Override
public boolean isEmpty() {
return attributeMappings.isEmpty();
}
@Override
public ViewResolutionErrors getResolutionErrors() {
if (!isUnrecognizedAttributesAppended) {
resolutionErrors.addUnrecognizedAttributes(attributeMappings.keySet());
isUnrecognizedAttributesAppended = true;
}
return resolutionErrors;
}
@Override
public void resolveAttributeIfExists(String attribute, AttributeResolver attributeResolver) {
if (attributeMappings.containsKey(attribute)) {
String attributeValue = attributeMappings.get(attribute);
try {
attributeResolver.resolve(view, attribute, attributeValue);
} catch (AttributeResolutionException e) {
resolutionErrors.addAttributeError(e);
}
attributeMappings.remove(attribute);
}
}
@Override
public void resolveAttributeGroupIfExists(String[] attributeGroup, AttributeGroupResolver attributeGroupResolver) {
if (hasOneOfAttributes(attributeGroup)) {
Map<String, String> presentAttributeMappings = findPresentAttributeMappings(attributeGroup);
Collection<String> presentAttributes = presentAttributeMappings.keySet();
try {
attributeGroupResolver.resolve(view, attributeGroup, presentAttributeMappings);
} catch (MissingRequiredAttributesException e) {
resolutionErrors.addMissingRequiredAttributeError(e);
} catch (AttributeResolutionException e) {
resolutionErrors.addAttributeError(e);
} catch (GroupedAttributeResolutionException e) {
resolutionErrors.addGroupedAttributeError(e);
}
removeAttributes(presentAttributes);
}
}
private boolean hasOneOfAttributes(String[] attributes) {
for (String attribute : attributes) {
if (attributeMappings.containsKey(attribute)) {
return true;
}
}
return false;
}
private Map<String, String> findPresentAttributeMappings(String[] attributes) {
Map<String, String> presentAttributeMappings = Maps.newHashMap();
for (String attribute : attributes) {
if (attributeMappings.containsKey(attribute)) {
String attributeValue = attributeMappings.get(attribute);
presentAttributeMappings.put(attribute, attributeValue);
}
}
return presentAttributeMappings;
}
private void removeAttributes(Collection<String> attributes) {
for (String attribute : attributes) {
attributeMappings.remove(attribute);
}
}
}