/*
 * Copyright 2012-present Facebook, 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.facebook.buck.parcelable;

import com.facebook.buck.util.XmlDomParser;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;

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

import java.io.File;
import java.io.IOException;

import javax.annotation.Nullable;

public class Parser {

  /** Utility class: do not instantiate. */
  private Parser() {}

  public static ParcelableClass parse(File xml) throws IOException {
    Document doc = XmlDomParser.parse(xml);

    // packageName, className, creatorClass
    Element classElement = (Element)doc.getElementsByTagName("class").item(0);
    String classNameAttr = getAttribute(classElement, "name");
    int splitIndex = classNameAttr.lastIndexOf('.');
    String packageName = classNameAttr.substring(0, splitIndex);
    String className = classNameAttr.substring(splitIndex + 1);
    String creatorClassName = getAttribute(classElement, "creatorClass");

    // imports
    Element importsElement = (Element)doc.getElementsByTagName("imports").item(0);
    String importsText = importsElement.getTextContent();
    Iterable<String> imports = Splitter.on('\n').omitEmptyStrings().trimResults().split(importsText);

    // defaultFieldVisibility
    Element fieldsElement = (Element)doc.getElementsByTagName("fields").item(0);
    String defaultFieldVisibility = getAttribute(fieldsElement, "defaultVisibility");
    if (defaultFieldVisibility == null) {
      defaultFieldVisibility = "private";
    }

    // fields
    ImmutableList.Builder<ParcelableField> fields = ImmutableList.builder();
    NodeList fieldNodes = fieldsElement.getElementsByTagName("field");
    for (int i = 0; i < fieldNodes.getLength(); i++) {
      Element fieldElement = (Element)fieldNodes.item(i);
      ParcelableField field = new ParcelableField(
          escapeJavaType(getAttribute(fieldElement, "type")),
          getAttribute(fieldElement, "name"),
          getBooleanAttribute(fieldElement, "mutable"),
          getAttribute(fieldElement, "visibility"),
          getAttribute(fieldElement, "jsonProperty"),
          getAttribute(fieldElement, "defaultValue"));
      fields.add(field);
    }

    return new ParcelableClass(
        packageName,
        imports,
        className,
        creatorClassName == null ? className : creatorClassName,
        defaultFieldVisibility,
        fields.build(),
        getAttribute(classElement, "extends"),
        getAttribute(classElement, "superParams"));
  }

  /**
   * We allow { and } to be used in place of &lt; and &gt; for Java generics in our XML
   * descriptor files.
   */
  private static String escapeJavaType(@Nullable String type) {
    return type.replace('{', '<').replace('}', '>');
  }

  /**
   * Return null if the attribute is not present rather than the empty string.
   */
  @Nullable
  private static String getAttribute(Element element, String attributeName) {
    if (element.hasAttribute(attributeName)) {
      return element.getAttribute(attributeName);
    } else {
      return null;
    }
  }

  private static boolean getBooleanAttribute(Element element, String attributeName) {
    String value = getAttribute(element, attributeName);
    return value != null ? Boolean.parseBoolean(value) : false;
  }
}

@@ -3301,18 +3301,8 @@
 ype(
-@Nullable 
 Stri

Remove `@Nullable` annotation from `escapeJavaType` method.