All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.shindig.gadgets.spec.UserPref Maven / Gradle / Ivy

Go to download

Renders gadgets, provides the gadget metadata service, and serves all javascript required by the OpenSocial specification.

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. 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.
 */
package org.apache.shindig.gadgets.spec;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import org.apache.shindig.common.xml.XmlUtil;
import org.apache.shindig.gadgets.variables.Substitutions;

import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

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

/**
 * Represents a UserPref tag.
 */
public class UserPref {
  /**
   * UserPref@name
   * Message bundles
   */
  private final String name;
  public String getName() {
    return name;
  }

  /**
   * UserPref@display_name
   * Message bundles
   */
  private String displayName;
  public String getDisplayName() {
    return displayName;
  }

  /**
   * UserPref@default_value
   * Message bundles
   */
  private String defaultValue;
  public String getDefaultValue() {
    return defaultValue;
  }

  /**
   * UserPref@required
   */
  private final boolean required;
  public boolean getRequired() {
    return required;
  }

  /**
   * UserPref@datatype
   */
  private final DataType dataType;
  public DataType getDataType() {
    return dataType;
  }

  /**
   * UserPref.EnumValue
   * Collapsed so that EnumValue@value is the key and EnumValue@display_value
   * is the value. If display_value is not present, value will be used.
   * Message bundles are substituted into display_value, but not value.
   */
  private Map enumValues;
  public Map getEnumValues() {
    return enumValues;
  }

  /**
   * UserPref.EnumValue (ordered)
   * Useful for rendering ordered lists of user prefs with enum type.
   */
  private List orderedEnumValues;
  public List getOrderedEnumValues() {
    return orderedEnumValues;
  }

  /**
   * Performs substitutions on the pref. See field comments for details on what
   * is substituted.
   *
   * @param substituter
   * @return The substituted pref.
   */
  public UserPref substitute(Substitutions substituter) {
    UserPref pref = new UserPref(this);
    pref.displayName = substituter.substituteString(displayName);
    pref.defaultValue = substituter.substituteString(defaultValue);
    if (enumValues.isEmpty()) {
      pref.enumValues = Collections.emptyMap();
    } else {
      Map values = Maps.newHashMapWithExpectedSize(enumValues.size());
      for (Map.Entry entry : enumValues.entrySet()) {
        values.put(entry.getKey(), substituter.substituteString(entry.getValue()));
      }
      pref.enumValues = ImmutableMap.copyOf(values);
    }
    if (orderedEnumValues.isEmpty()) {
      pref.orderedEnumValues = Collections.emptyList();
    } else {
      List orderedValues = Lists.newLinkedList();
      for (EnumValuePair evp : orderedEnumValues) {
        orderedValues.add(new EnumValuePair(evp.getValue(),
            substituter.substituteString(evp.getDisplayValue())));
      }
      pref.orderedEnumValues = Collections.unmodifiableList(orderedValues);
    }
    return pref;
  }

  @Override
  public String toString() {
    StringBuilder buf = new StringBuilder();
    buf.append("");
    } else {
      buf.append(">\n");
      for (Map.Entry entry : enumValues.entrySet()) {
        buf.append("\n");
      }
      buf.append("");
    }
    return buf.toString();
  }

  /**
   * @param element
   * @throws SpecParserException
   */
  public UserPref(Element element) throws SpecParserException {
    String name = XmlUtil.getAttribute(element, "name");
    if (name == null) {
      throw new SpecParserException("UserPref@name is required.");
    }
    this.name = name;

    displayName = XmlUtil.getAttribute(element, "display_name", name);
    defaultValue = XmlUtil.getAttribute(element, "default_value", "");
    required = XmlUtil.getBoolAttribute(element, "required");

    String dataType = XmlUtil.getAttribute(element, "datatype", "string");
    this.dataType = DataType.parse(dataType);

    NodeList children = element.getElementsByTagName("EnumValue");
    if (children.getLength() > 0) {
      Map enumValues = Maps.newHashMap();
      List orderedEnumValues = Lists.newLinkedList();
      for (int i = 0, j = children.getLength(); i < j; ++i) {
        Element child = (Element)children.item(i);
        String value = XmlUtil.getAttribute(child, "value");
        if (value == null) {
          throw new SpecParserException("EnumValue@value is required.");
        }
        String displayValue
            = XmlUtil.getAttribute(child, "display_value", value);
        enumValues.put(value, displayValue);
        orderedEnumValues.add(new EnumValuePair(value, displayValue));
      }
      this.enumValues = Collections.unmodifiableMap(enumValues);
      this.orderedEnumValues = Collections.unmodifiableList(orderedEnumValues);
    } else {
      this.enumValues = Collections.emptyMap();
      this.orderedEnumValues = Collections.emptyList();
    }
  }

  /**
   * Produces a UserPref suitable for substitute()
   * @param userPref
   */
  private UserPref(UserPref userPref) {
    name = userPref.name;
    dataType = userPref.dataType;
    required = userPref.required;
  }

  /**
   * Possible values for UserPref@datatype
   */
  public static enum DataType {
    STRING, HIDDEN, BOOL, ENUM, LIST, NUMBER;

    /**
     * Parses a data type from the input string.
     *
     * @param value
     * @return The data type of the given value.
     */
    public static DataType parse(String value) {
      for (DataType type : DataType.values()) {
        if (type.toString().compareToIgnoreCase(value) == 0) {
          return type;
        }
      }
      return STRING;
    }
  }

  /**
   * Simple data structure representing a value/displayValue pair
   * for UserPref enums. Value is EnumValue@value, and DisplayValue is EnumValue@displayValue.
   */
  public static final class EnumValuePair {
    private final String value;
    private final String displayValue;

    private EnumValuePair(String value, String displayValue) {
      this.value = value;
      this.displayValue = displayValue;
    }

    public String getValue() {
      return value;
    }

    public String getDisplayValue() {
      return displayValue;
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy