/*
 * 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.jclouds;

import java.io.Closeable;

import com.google.common.annotations.Beta;
import com.google.common.reflect.TypeToken;

/**
 * {@link View} allows access to the provider-specific, or library-driven api
 * behind an abstraction. One backend context can support multiple views.
 * <p/>
 * For example, the {@code CloudStackContext} can be backend by both
 * {@code ComputeServiceContext} and {@code LoadBalancerServiceContext}, as the
 * api covers these features.
 */
@Beta
public interface View {

   /**
    * 
    * @return type of the context powering the current one.
    */
   TypeToken<?> getBackendType();

   /**
    * Return an object of the specified type to allow access to the backend
    * context. If the backend context is not assignable from the supplied type,
    * an {@link IllegalArgumentException} is thrown.
    * 
    * ex.
    * <pre>
    * ApiContext<NovaApi> backendApi = computeContext.unwrap(new TypeToken<ApiContext<NovaApi>>(){});
    * </pre>
    * @param type
    *           the type of the context to be returned. The backend context must
    *           be assignable from this type.
    * @return an instance of the specified type
    * @throws IllegalArgumentException
    *            if the backend context is not assignable from the specified
    *            class.
    * @see #getBackendType()
    */
   <C extends Context> C unwrap(TypeToken<C> type) throws IllegalArgumentException;

   /**
    * shortcut for {@code unwrap(getWrappedType())}
    * 
    * @throws ClassCastException
    *            if the user supplied {@code C} param is not assignableFrom
    *            {@link #getBackendType()}
    */
   <C extends Context> C unwrap() throws ClassCastException;

   /**
    * Unwraps the underlying api from this view.
    *
    * @param apiClass The class of the api to unwrap.
    * @return The unwrapped api.
    *
    * @since 1.7
    */
   <A extends Closeable> A unwrapApi(Class<A> apiClass);

}
