// Path: kawala-common/src/main/java/com/kaching/platform/common/Strings.java
// public static String format(String template, Object... args) {
//   template = String.valueOf(template); // null -> "null"
// 
//   // start substituting the arguments into the '%s' placeholders
//   StringBuilder builder = new StringBuilder(
//       template.length() + 16 * args.length);
//   int templateStart = 0;
//   int i = 0;
//   while (i < args.length) {
//     int placeholderStart = template.indexOf("%s", templateStart);
//     if (placeholderStart == -1) {
//       break;
//     }
//     builder.append(template.substring(templateStart, placeholderStart));
//     builder.append(args[i++]);
//     templateStart = placeholderStart + 2;
//   }
//   builder.append(template.substring(templateStart));
// 
//   // if we run out of placeholders, append the extra args in square braces
//   if (i < args.length) {
//     builder.append(" [");
//     builder.append(args[i++]);
//     while (i < args.length) {
//       builder.append(", ");
//       builder.append(args[i++]);
//     }
//     builder.append("]");
//   }
// 
//   return builder.toString();
// }


import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.transform;
import static com.kaching.platform.common.Strings.format;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import org.objectweb.asm.Type;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Objects;
/**
 * Copyright 2010 Wealthfront 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.kaching.platform.testing;





public class ParsedElements {

  public static class ParsedClass implements ParsedElement {

    private final String name;

    public ParsedClass(String name) {
      this.name = name.replace("/", ".");
    }

    String getPackageName() {
      return name.substring(0, name.split("\\$")[0].lastIndexOf('.'));
    }

    public String getOwner() {
      return name.split("\\$")[0];
    }

    Class<?> load() {
      try {
        return Class.forName(name);
      } catch (ClassNotFoundException e) {
        return null;
      }
    }

    Annotation loadAnnotation(Class<? extends Annotation> annotation) {
      Class<?> clazz = load();
      if (clazz == null) {
// Path: kawala-common/src/main/java/com/kaching/platform/common/Strings.java
// public static String format(String template, Object... args) {
//   template = String.valueOf(template); // null -> "null"
// 
//   // start substituting the arguments into the '%s' placeholders
//   StringBuilder builder = new StringBuilder(
//       template.length() + 16 * args.length);
//   int templateStart = 0;
//   int i = 0;
//   while (i < args.length) {
//     int placeholderStart = template.indexOf("%s", templateStart);
//     if (placeholderStart == -1) {
//       break;
//     }
//     builder.append(template.substring(templateStart, placeholderStart));
//     builder.append(args[i++]);
//     templateStart = placeholderStart + 2;
//   }
//   builder.append(template.substring(templateStart));
// 
//   // if we run out of placeholders, append the extra args in square braces
//   if (i < args.length) {
//     builder.append(" [");
//     builder.append(args[i++]);
//     while (i < args.length) {
//       builder.append(", ");
//       builder.append(args[i++]);
//     }
//     builder.append("]");
//   }
// 
//   return builder.toString();
// }


// Path: kawala-testing/src/main/java/com/kaching/platform/testing/ParsedElements.java
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.transform;
import static com.kaching.platform.common.Strings.format;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import org.objectweb.asm.Type;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Objects;

/**
 * Copyright 2010 Wealthfront 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.kaching.platform.testing;





public class ParsedElements {

  public static class ParsedClass implements ParsedElement {

    private final String name;

    public ParsedClass(String name) {
      this.name = name.replace("/", ".");
    }

    String getPackageName() {
      return name.substring(0, name.split("\\$")[0].lastIndexOf('.'));
    }

    public String getOwner() {
      return name.split("\\$")[0];
    }

    Class<?> load() {
      try {
        return Class.forName(name);
      } catch (ClassNotFoundException e) {
        return null;
      }
    }

    Annotation loadAnnotation(Class<? extends Annotation> annotation) {
      Class<?> clazz = load();
      if (clazz == null) {
        throw new NullPointerException(format("class %s not found", name));