/**
*
* Copyright
* 2009-2015 Jayway Products AB
* 2016-2017 Föreningen Sambruk
*
* Licensed under AGPL, Version 3.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.gnu.org/licenses/agpl.txt
*
* 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 se.streamsource.dci.restlet.client;
import java.util.Collections;
import java.util.Locale;
import org.qi4j.api.common.Optional;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.injection.scope.Uses;
import org.qi4j.api.structure.Module;
import org.restlet.Context;
import org.restlet.Request;
import org.restlet.Response;
import org.restlet.Uniform;
import org.restlet.data.ClientInfo;
import org.restlet.data.Language;
import org.restlet.data.MediaType;
import org.restlet.data.Preference;
import org.restlet.data.Reference;
import org.restlet.routing.Filter;
/**
* Builder for CommandQueryClient
*/
public class CommandQueryClientFactory
{
@Structure
private Module module;
@Uses @Optional
private ClientCache cache ;
@Uses
@Optional
private ResponseHandler handler = new NullResponseHandler();
@Uses
private ResponseReaderDelegator readerDelegator;
@Uses
private RequestWriterDelegator requestWriterDelegator;
private Uniform client;
public CommandQueryClientFactory(@Uses final Uniform client)
{
this.client = new Uniform()
{
public void handle(Request request, Response response)
{
Response oldResponse = Response.getCurrent();
try
{
client.handle( request, response );
} finally
{
Response.setCurrent( oldResponse );
}
}
};
}
public CommandQueryClient newClient( Reference reference )
{
return module.objectBuilderFactory().newObjectBuilder( CommandQueryClient.class ).use( this, reference ).newInstance();
}
ResponseHandler getHandler()
{
return handler;
}
void updateCommandRequest( Request request)
{
ClientInfo info = new ClientInfo();
info.setAgent( "Streamflow" ); // TODO Set versions correctly
info.setAcceptedMediaTypes( Collections.singletonList( new Preference<MediaType>( MediaType.APPLICATION_JSON ) ) );
info.setAcceptedLanguages( Collections.singletonList( new Preference<Language>(new Language( Locale.getDefault().getLanguage()) )));
request.setClientInfo( info );
if (cache != null)
cache.updateCommandConditions( request );
}
void updateQueryRequest( Request request)
{
ClientInfo info = new ClientInfo();
info.setAcceptedMediaTypes( Collections.singletonList( new Preference<MediaType>( MediaType.APPLICATION_JSON ) ) );
info.setAcceptedLanguages( Collections.singletonList( new Preference<Language>( new Language( Locale.getDefault().getLanguage() ) ) ) );
request.setClientInfo( info );
}
void updateCache( Response response)
{
if (cache != null)
cache.updateCache( response );
}
Uniform getClient()
{
return client;
}
<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());
}
}