/* * Copyright (c) 2008, 2009 Borland Software Corporation * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Boris Blajer (Borland) */ package org.eclipse.gmf.internal.xpand.model; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import org.eclipse.gmf.internal.xpand.StreamsHolder; /** * Holder for named streams. */ public class XpandStreamsHolder implements StreamsHolder { private HashMap<String, StringBuilder> myStreams; private HashSet<String> myStreamsAccessed; public String getStreamContents(String slotName) { if (myStreams == null) { throw new EvaluationException("Undefined stream " + slotName); } StringBuilder result = myStreams.get(slotName); if (result == null) { throw new EvaluationException("Undefined stream " + slotName); } setAccessed(slotName); if (result.length() == 0) { return null; } return result.toString(); } public List<String> getSlotNames() { if (myStreams == null) { return Collections.emptyList(); } //Filter streams that have no content ArrayList<String> result = new ArrayList<String>(myStreams.size()); for (Map.Entry<String, StringBuilder> next : myStreams.entrySet()) { if (next.getValue().length() == 0) { continue; } result.add(next.getKey()); } return Collections.unmodifiableList(result); } public void addNamedStream(String name, StringBuilder stream) { if (myStreams == null) { myStreams = new HashMap<String, StringBuilder>(); } assert !myStreams.containsKey(name); myStreams.put(name, stream); } private void setAccessed(String slotName) { if (myStreamsAccessed == null) { myStreamsAccessed = new HashSet<String>(); } myStreamsAccessed.add(slotName); } public boolean isAccessed(String slotName) { return myStreamsAccessed != null && myStreamsAccessed.contains(slotName); } }