blob: 26e85609bb34429aa809744719326f0b20d761b7 [file] [log] [blame]
/**
*
* Copyright 2009-2011 Rickard Öberg AB
*
* 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 org.apache.zest.library.rest.client.api;
import java.util.ArrayList;
import java.util.List;
import org.apache.zest.api.common.Optional;
import org.apache.zest.api.injection.scope.Structure;
import org.apache.zest.api.injection.scope.Uses;
import org.apache.zest.api.structure.Module;
import org.apache.zest.library.rest.client.ClientCache;
import org.apache.zest.library.rest.client.RequestWriterDelegator;
import org.apache.zest.library.rest.client.ResponseReaderDelegator;
import org.apache.zest.library.rest.client.spi.RequestWriter;
import org.apache.zest.library.rest.client.spi.ResponseHandler;
import org.apache.zest.library.rest.client.spi.ResponseReader;
import org.restlet.Request;
import org.restlet.Response;
import org.restlet.Uniform;
import org.restlet.data.ClientInfo;
import org.restlet.data.Form;
import org.restlet.data.Language;
import org.restlet.data.MediaType;
import org.restlet.data.Preference;
import org.restlet.data.Reference;
/**
* Builder for UsecaseClient
*/
public class ContextResourceClientFactory
{
@Structure
private Module module;
@Uses
@Optional
private ClientCache cache;
@Uses
private ResponseReaderDelegator readerDelegator;
@Uses
private RequestWriterDelegator requestWriterDelegator;
@Uses
private Uniform client;
private ClientInfo info = new ClientInfo();
private Form requestHeaders = new Form();
private ResponseHandler errorHandler;
public ContextResourceClient newClient( Reference reference )
{
ContextResourceClient contextResourceClient = module.newObject( ContextResourceClient.class, this, reference );
contextResourceClient.onError( errorHandler );
return contextResourceClient;
}
public void setAgent(String agent)
{
info.setAgent( agent );
}
public Form getCustomRequestHeaders()
{
return requestHeaders;
}
public void setAcceptedLanguages(Language... acceptedLanguages)
{
List<Preference<Language>> languages = new ArrayList<Preference<Language>>();
for( Language acceptedLanguage : acceptedLanguages )
{
languages.add( new Preference<Language>( ));
}
info.setAcceptedLanguages( languages );
}
public void setAcceptedMediaTypes(MediaType... acceptedMediaTypes)
{
List<Preference<MediaType>> mediatypes = new ArrayList<Preference<MediaType>>();
for( MediaType mediaType : acceptedMediaTypes )
{
mediatypes.add( new Preference<MediaType>(mediaType) );
}
info.setAcceptedMediaTypes( mediatypes );
}
public ClientInfo getInfo()
{
return info;
}
public void setErrorHandler( ResponseHandler errorHandler )
{
this.errorHandler = errorHandler;
}
public ResponseHandler getErrorHandler()
{
return errorHandler;
}
// Internal
void updateCommandRequest( Request request )
{
request.setClientInfo( info );
// Update cache information
if( cache != null )
{
cache.updateCommandConditions( request );
}
// Add all custom headers
if (!requestHeaders.isEmpty())
request.getAttributes().put( "org.restlet.http.headers", requestHeaders );
}
void updateQueryRequest( Request request )
{
request.setClientInfo( info );
// Update cache information
if( cache != null )
{
cache.updateQueryConditions( request );
}
}
void updateCache( Response response )
{
if( cache != null )
{
cache.updateCache( response );
}
}
Uniform getClient()
{
return client;
}
public <T> T readResponse( Response response, Class<T> queryResult )
{
return (T) readerDelegator.readResponse( response, queryResult );
}
public void writeRequest( Request request, Object queryRequest )
{
if( !requestWriterDelegator.writeRequest( queryRequest, request ) )
{
throw new IllegalArgumentException( "Illegal query request type:" + queryRequest.getClass().getName() );
}
}
public void registerResponseReader(ResponseReader reader)
{
readerDelegator.registerResponseReader( reader );
}
public void registerRequestWriter(RequestWriter writer)
{
requestWriterDelegator.registerRequestWriter( writer );
}
}