package org.jboss.resteasy.auth.oauth;

import java.util.Set;

import org.jboss.resteasy.auth.oauth.i18n.Messages;

/**
 * Used to make sure the OAuthProvider implementer does not return null values.
 * If any null is returned, throws a RuntimeException
 * @author Stéphane Épardaud <stef@epardaud.fr>
 */
public class OAuthProviderChecker implements OAuthProvider {
	
	private OAuthProvider provider;

	public OAuthProviderChecker(OAuthProvider provider) {
		this.provider = provider;
	}

	private <T> T checkNull(T arg) {
		if(arg == null)
		   throw new RuntimeException(Messages.MESSAGES.oAuthProviderShouldNotReturnNull());
		return arg;
	}
	
	public OAuthConsumer registerConsumer(String consumerKey, String displayName, String connectURI) 
	    throws OAuthException {
        return checkNull(provider.registerConsumer(consumerKey, displayName, connectURI));
    }

	public OAuthConsumer getConsumer(String consumerKey) throws OAuthException {
		return checkNull(provider.getConsumer(consumerKey));
	}

	public String getRealm() {
		return checkNull(provider.getRealm());
	}

	public OAuthRequestToken getRequestToken(String consumerKey, String requestKey)
			throws OAuthException {
		return checkNull(provider.getRequestToken(consumerKey, requestKey));
	}

	public OAuthToken getAccessToken(String consumerKey, String accessKey)
	throws OAuthException {
		return checkNull(provider.getAccessToken(consumerKey, accessKey));
	}

	public void checkTimestamp(OAuthToken token, long timestamp) throws OAuthException {
		provider.checkTimestamp(token, timestamp);
	}

	public OAuthToken makeAccessToken(String consumerKey,
			String requestKey, String verifier) throws OAuthException {
		return checkNull(provider.makeAccessToken(consumerKey, requestKey, verifier));
	}

	public OAuthToken makeRequestToken(String consumerKey, String callback, 
	                                   String[] scopes, String[] permissions)
			throws OAuthException {
		return checkNull(provider.makeRequestToken(consumerKey, callback, scopes, permissions));
	}

	public String authoriseRequestToken(String consumerKey, String requestKey)
			throws OAuthException {
		return checkNull(provider.authoriseRequestToken(consumerKey, requestKey));
	}

    public void registerConsumerScopes(String consumerKey, String[] scopes)
            throws OAuthException {
        provider.registerConsumerScopes(consumerKey, scopes);
    }
    
    public void registerConsumerPermissions(String consumerKey, String[] permissions)
        throws OAuthException {
        provider.registerConsumerPermissions(consumerKey, permissions);
    }

    public Set<String> convertPermissionsToRoles(String[] permissions) {
        return provider.convertPermissionsToRoles(permissions);
    }
}
