/*
 * Copyright (C) 2011 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.inject.grapher;

import com.google.common.collect.Sets;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import java.util.Set;
import java.util.logging.Logger;

/**
 * Root key set creator that starts with all types that are not Guice internal types or the {@link
 * Logger} type.
 *
 * @author bojand@google.com (Bojan Djordjevic)
 * @since 4.0
 */
public class DefaultRootKeySetCreator implements RootKeySetCreator {
  private static final Key<Logger> loggerKey = Key.get(Logger.class);

  @Override
  public Set<Key<?>> getRootKeys(Injector injector) {
    Set<Key<?>> root = Sets.newHashSet();
    for (Key<?> key : injector.getBindings().keySet()) {
      if (key.getTypeLiteral().getRawType().getPackage() != Guice.class.getPackage()
          && !loggerKey.equals(key)) {
        root.add(key);
      }
    }
    return root;
  }
}
