/******************************************************************************* * Copyright (c) 2004, 2006 * Thomas Hallgren, Kenneth Olwing, Mitch Sonies * Pontus Rydin, Nils Unden, Peer Torngren * The code, documentation and other materials contained herein have been * licensed under the Eclipse Public License - v 1.0 by the individual * copyright holders listed above, as Initial Contributors under such license. * The text of such license is available at www.eclipse.org. *******************************************************************************/ package org.eclipse.buckminster.core.common.model; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import org.eclipse.buckminster.core.XMLConstants; import org.eclipse.buckminster.runtime.Trivial; import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; /** * @author Thomas Hallgren */ public abstract class ValueHolderFilter extends ValueHolder<String> { private ArrayList<ValueHolder<String>> valueHolders; /** * Add a value holder that will become part of the source to this filter. * * @param valueHolder * The holder to add. */ public void addValueHolder(ValueHolder<String> valueHolder) { if (valueHolders == null) valueHolders = new ArrayList<ValueHolder<String>>(); valueHolders.add(valueHolder); } @Override public boolean equals(Object o) { return super.equals(o) && Trivial.equalsAllowNull(valueHolders, ((ValueHolderFilter) o).valueHolders); } @Override public int hashCode() { int hc = super.hashCode(); hc = 37 * hc + (valueHolders == null ? 0 : valueHolders.hashCode()); return hc; } protected List<String> checkedGetSourceValues(Map<String, ? extends Object> properties, int recursionGuard) { int top = (valueHolders == null) ? 0 : valueHolders.size(); if (top == 0) return Collections.emptyList(); else if (top == 1) return valueHolders.get(0).checkedGetValues(properties, recursionGuard); ArrayList<String> parameters = new ArrayList<String>(top); for (int idx = 0; idx < top; ++idx) { ValueHolder<String> valueHolder = valueHolders.get(idx); if (valueHolder.isMultiValueProducer()) { List<String> vs = valueHolder.checkedGetValues(properties, recursionGuard); for (int vidx = 0; vidx < vs.size(); ++vidx) parameters.add(vs.get(vidx)); } else parameters.add(valueHolder.checkedGetValue(properties, recursionGuard)); } return parameters; } @Override protected void emitElements(ContentHandler handler, String namespace, String prefix) throws SAXException { if (valueHolders != null) { for (ValueHolder<String> vh : valueHolders) vh.toSax(handler, namespace, prefix, vh.getDefaultTag()); } } @Override protected String getElementNamespace(String namespace) { return XMLConstants.BM_COMMON_NS; } @Override protected String getElementPrefix(String prefix) { return XMLConstants.BM_COMMON_PREFIX; } String checkedGetSourceValue(Map<String, ? extends Object> properties, int recursionGuard) { int top = (valueHolders == null) ? 0 : valueHolders.size(); if (top == 0) return NO_VALUE; else if (top == 1) return valueHolders.get(0).checkedGetValue(properties, recursionGuard); StringBuilder bld = new StringBuilder(); for (int idx = 0; idx < top; ++idx) { ValueHolder<String> valueHolder = valueHolders.get(idx); if (valueHolder.isMultiValueProducer()) { List<String> vs = valueHolder.checkedGetValues(properties, recursionGuard); for (int vidx = 0; vidx < vs.size(); ++vidx) bld.append(vs.get(vidx)); } else bld.append(valueHolder.checkedGetValue(properties, recursionGuard)); } return bld.toString(); } }