/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  The ASF licenses this file to You
 * under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.  For additional information regarding
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */
package org.apache.abdera2.common.templates;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

@SuppressWarnings("unchecked")
public class DefaultingContext 
  extends DelegatingContext {

  private static final long serialVersionUID = 3395776996994628136L;
  private final Context defaults;
  
  public DefaultingContext(Context main, Context defaults) {
    super(main);
    if (defaults == null)
      throw new IllegalArgumentException();
    this.defaults = defaults;
  }

  public <T> T resolve(String var) {
    T t = (T)super.resolve(var);
    return t != null ? t : (T)defaults.resolve(var);
  }

  public Iterator<String> iterator() {
    Set<String> set = new HashSet<String>();
    for (String name : subcontext)
      set.add(name);
    for (String name : defaults)
      set.add(name);
    return set.iterator();
  }
  
  public boolean contains(String var) {
    boolean a = subcontext.contains(var);
    return a ? a : defaults.contains(var);
  }
  
  public String toString() {
    StringBuilder buf = new StringBuilder();
    buf.append("Subcontext: " + subcontext);
    buf.append("\n");
    buf.append("Default Context: " + defaults);
    return buf.toString();
  }
}
