blob: 0a6f18d6fe6d151a5b9012a93960e3f005fe964f [file] [log] [blame]
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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 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.
*
* @author Adrian Cole
*
*/
@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>
* RestContext<NovaClient, NovaAsyncClient> backendApi = computeContext.unwrap(NovaApiMetadata.CONTEXT_TOKEN);
* </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(TypeToken.of(clazz))}
*
* @see #unwrap(TypeToken)
*/
<C extends Context> C unwrap(Class<C> clazz) 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;
}