Package com.google.template.soy.data.internal

Source Code of com.google.template.soy.data.internal.AugmentedSoyMapData

/*
* Copyright 2008 Google Inc.
*
* Licensed 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.
*/

package com.google.template.soy.data.internal;

import com.google.common.base.Preconditions;
import com.google.common.collect.Sets;
import com.google.template.soy.data.SoyData;
import com.google.template.soy.data.SoyDataException;
import com.google.template.soy.data.SoyListData;
import com.google.template.soy.data.SoyMapData;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;


/**
* Augmented map data combining a base map data object with some additional data that may hide some
* of the base map data (if they have the same keys).
*
* <p> Important: Do not use outside of Soy code (treat as superpackage-private).
*
* @author Kai Huang
*/
public class AugmentedSoyMapData extends SoyMapData {


  /** The base map data object. */
  private final SoyMapData baseData;


  /**
   * @param baseData The base map data object.
   */
  public AugmentedSoyMapData(SoyMapData baseData) {
    Preconditions.checkNotNull(baseData);
    this.baseData = baseData;
  }


  @Override public Map<String, SoyData> asMap() {

    SoyMapData combinedMapData = new SoyMapData();
    addMapDataHelper(combinedMapData, "", baseData.asMap());
    addMapDataHelper(combinedMapData, "", super.asMap());
    return Collections.unmodifiableMap(combinedMapData.asMap());
  }


  /**
   * Private helper for {@code asMap()} to add a map (or submap) to the combined map data.
   * @param combinedMapData The combined map data that we're building.
   * @param keyPrefix The key prefix if adding a submap (or empty string if adding one of the
   *     top-level maps: the base data or the augmented data).
   * @param map The map of data to add.
   */
  private static void addMapDataHelper(
      SoyMapData combinedMapData, String keyPrefix, Map<String, SoyData> map) {

    for (Map.Entry<String, SoyData> entry : map.entrySet()) {
      String key = entry.getKey();
      SoyData value = entry.getValue();
      if (value instanceof SoyMapData) {
        addMapDataHelper(combinedMapData, keyPrefix + key + ".", ((SoyMapData) value).asMap());
      } else if (value instanceof SoyListData) {
        addListDataHelper(combinedMapData, keyPrefix + key + ".", ((SoyListData) value).asList());
      } else {
        combinedMapData.put(keyPrefix + key, value);
      }
    }
  }


  /**
   * Private helper for {@code asMap()} to add a sublist to the combined map data.
   * @param combinedMapData The combined map data that we're building.
   * @param keyPrefix The key prefix for this sublist.
   * @param list The list of data to add.
   */
  private static void addListDataHelper(
      SoyMapData combinedMapData, String keyPrefix, List<SoyData> list) {

    for (int i = 0; i < list.size(); ++i) {
      SoyData el = list.get(i);
      if (el instanceof SoyMapData) {
        addMapDataHelper(combinedMapData, keyPrefix + i + ".", ((SoyMapData) el).asMap());
      } else if (el instanceof SoyListData) {
        addListDataHelper(combinedMapData, keyPrefix + i + ".", ((SoyListData) el).asList());
      } else {
        combinedMapData.put(keyPrefix + i, el);
      }
    }
  }


  @Override public Set<String> getKeys() {
    return Collections.unmodifiableSet(Sets.union(super.getKeys(), baseData.getKeys()));
  }


  @Override public String toString() {
    return toStringHelper(asMap());
  }


  @Override public boolean toBoolean() {
    return true;
  }


  @Override public void put(String keyStr, SoyData value) {
    if (keyStr.indexOf('.') >= 0) {
      throw new SoyDataException(
          "Attempted to put multi-part key string into AugmentedSoyMapData. Please ensure that" +
          " all of your 'param' commands only use top-level keys.");
    }
    super.putSingle(keyStr, value);
  }


  // Note: No need to override putSingle since it would do same thing as super method.


  /**
   * Removal of data from AugmentedSoyMapData is not well defined, so it's prohibited.
   */
  @Override public void remove(String keyStr) {
    throw new UnsupportedOperationException();
  }


  /**
   * Removal of data from AugmentedSoyMapData is not well defined, so it's prohibited.
   */
  @Override public void removeSingle(String key) {
    throw new UnsupportedOperationException();
  }


  @Override public SoyData getSingle(String key) {

    SoyData value = super.getSingle(key);
    if (value != null) {
      return value;
    }
    return baseData.getSingle(key);
  }

}
TOP

Related Classes of com.google.template.soy.data.internal.AugmentedSoyMapData

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.