/*
* Copyright (c) 2013-2014 the original author or authors
*
* 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 io.werval.runtime.outcomes;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import io.werval.api.Config;
import io.werval.api.http.Status;
import io.werval.api.mime.MimeTypes;
import io.werval.api.outcomes.OutcomeBuilder;
import io.werval.api.outcomes.Outcomes;
import io.werval.runtime.http.ResponseHeaderInstance;
import io.werval.util.URLs;
import static io.werval.api.http.Headers.Names.LOCATION;
import static io.werval.api.http.Status.ACCEPTED;
import static io.werval.api.http.Status.BAD_GATEWAY;
import static io.werval.api.http.Status.BAD_REQUEST;
import static io.werval.api.http.Status.CONFLICT;
import static io.werval.api.http.Status.CREATED;
import static io.werval.api.http.Status.EXPECTATION_FAILED;
import static io.werval.api.http.Status.FAILED_DEPENDENCY;
import static io.werval.api.http.Status.FORBIDDEN;
import static io.werval.api.http.Status.FOUND;
import static io.werval.api.http.Status.GATEWAY_TIMEOUT;
import static io.werval.api.http.Status.GONE;
import static io.werval.api.http.Status.HTTP_VERSION_NOT_SUPPORTED;
import static io.werval.api.http.Status.INSUFFICIENT_STORAGE;
import static io.werval.api.http.Status.INTERNAL_SERVER_ERROR;
import static io.werval.api.http.Status.LOCKED;
import static io.werval.api.http.Status.METHOD_NOT_ALLOWED;
import static io.werval.api.http.Status.MULTI_STATUS;
import static io.werval.api.http.Status.NON_AUTHORITATIVE_INFORMATION;
import static io.werval.api.http.Status.NOT_ACCEPTABLE;
import static io.werval.api.http.Status.NOT_FOUND;
import static io.werval.api.http.Status.NOT_IMPLEMENTED;
import static io.werval.api.http.Status.NOT_MODIFIED;
import static io.werval.api.http.Status.NO_CONTENT;
import static io.werval.api.http.Status.OK;
import static io.werval.api.http.Status.PARTIAL_CONTENT;
import static io.werval.api.http.Status.PRECONDITION_FAILED;
import static io.werval.api.http.Status.REQUEST_ENTITY_TOO_LARGE;
import static io.werval.api.http.Status.REQUEST_TIMEOUT;
import static io.werval.api.http.Status.REQUEST_URI_TOO_LONG;
import static io.werval.api.http.Status.RESET_CONTENT;
import static io.werval.api.http.Status.SEE_OTHER;
import static io.werval.api.http.Status.SERVICE_UNAVAILABLE;
import static io.werval.api.http.Status.TEMPORARY_REDIRECT;
import static io.werval.api.http.Status.TOO_MANY_REQUESTS;
import static io.werval.api.http.Status.UNAUTHORIZED;
import static io.werval.api.http.Status.UNPROCESSABLE_ENTITY;
import static io.werval.api.http.Status.UNSUPPORTED_MEDIA_TYPE;
import static io.werval.runtime.ConfigKeys.WERVAL_CHARACTER_ENCODING;
/**
* Outcomes instance.
*/
public final class OutcomesInstance
implements Outcomes
{
private final Config config;
private final MimeTypes mimeTypes;
private final ResponseHeaderInstance response;
public OutcomesInstance( Config config, MimeTypes mimeTypes, ResponseHeaderInstance response )
{
this.config = config;
this.mimeTypes = mimeTypes;
this.response = response;
}
@Override
public OutcomeBuilder status( int status )
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( status ) );
}
@Override
public OutcomeBuilder ok()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( OK ) );
}
@Override
public OutcomeBuilder ok( byte[] body )
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( OK ) ).withBody( body );
}
@Override
public OutcomeBuilder ok( String body )
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( OK ) ).withBody( body );
}
@Override
public OutcomeBuilder ok( String body, Charset charset )
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( OK ) ).withBody( body, charset );
}
@Override
public OutcomeBuilder created()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( CREATED ) );
}
@Override
public OutcomeBuilder accepted()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( ACCEPTED ) );
}
@Override
public OutcomeBuilder nonAuthoritativeInformation()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( NON_AUTHORITATIVE_INFORMATION ) );
}
@Override
public OutcomeBuilder noContent()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( NO_CONTENT ) );
}
@Override
public OutcomeBuilder resetContent()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( RESET_CONTENT ) );
}
@Override
public OutcomeBuilder partialContent()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( PARTIAL_CONTENT ) );
}
@Override
public OutcomeBuilder multiStatus()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( MULTI_STATUS ) );
}
@Override
public OutcomeBuilder found( String url )
{
return redirect( url, Collections.<String, List<String>>emptyMap(), FOUND );
}
@Override
public OutcomeBuilder found( String url, Map<String, List<String>> queryString )
{
return redirect( url, queryString, FOUND );
}
@Override
public OutcomeBuilder seeOther( String url )
{
return redirect( url, Collections.<String, List<String>>emptyMap(), SEE_OTHER );
}
@Override
public OutcomeBuilder seeOther( String url, Map<String, List<String>> queryString )
{
return redirect( url, queryString, SEE_OTHER );
}
@Override
public OutcomeBuilder notModified()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( NOT_MODIFIED ) );
}
@Override
public OutcomeBuilder temporaryRedirect( String url )
{
return redirect( url, Collections.<String, List<String>>emptyMap(), TEMPORARY_REDIRECT );
}
@Override
public OutcomeBuilder temporaryRedirect( String url, Map<String, List<String>> queryString )
{
return redirect( url, queryString, TEMPORARY_REDIRECT );
}
@Override
public OutcomeBuilder badRequest()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( BAD_REQUEST ) );
}
@Override
public OutcomeBuilder unauthorized()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( UNAUTHORIZED ) );
}
@Override
public OutcomeBuilder forbidden()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( FORBIDDEN ) );
}
@Override
public OutcomeBuilder notFound()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( NOT_FOUND ) );
}
@Override
public OutcomeBuilder methodNotAllowed()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( METHOD_NOT_ALLOWED ) );
}
@Override
public OutcomeBuilder notAcceptable()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( NOT_ACCEPTABLE ) );
}
@Override
public OutcomeBuilder requestTimeout()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( REQUEST_TIMEOUT ) );
}
@Override
public OutcomeBuilder conflict()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( CONFLICT ) );
}
@Override
public OutcomeBuilder gone()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( GONE ) );
}
@Override
public OutcomeBuilder preconditionFailed()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( PRECONDITION_FAILED ) );
}
@Override
public OutcomeBuilder requestEntityTooLarge()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( REQUEST_ENTITY_TOO_LARGE ) );
}
@Override
public OutcomeBuilder requestUriTooLong()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( REQUEST_URI_TOO_LONG ) );
}
@Override
public OutcomeBuilder unsupportedMediaType()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( UNSUPPORTED_MEDIA_TYPE ) );
}
@Override
public OutcomeBuilder expectationFailed()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( EXPECTATION_FAILED ) );
}
@Override
public OutcomeBuilder unprocessableEntity()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( UNPROCESSABLE_ENTITY ) );
}
@Override
public OutcomeBuilder locked()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( LOCKED ) );
}
@Override
public OutcomeBuilder failedDependency()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( FAILED_DEPENDENCY ) );
}
@Override
public OutcomeBuilder tooManyRequest()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( TOO_MANY_REQUESTS ) );
}
@Override
public OutcomeBuilder internalServerError()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( INTERNAL_SERVER_ERROR ) );
}
@Override
public OutcomeBuilder notImplemented()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( NOT_IMPLEMENTED ) );
}
@Override
public OutcomeBuilder badGateway()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( BAD_GATEWAY ) );
}
@Override
public OutcomeBuilder serviceUnavailable()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( SERVICE_UNAVAILABLE ) );
}
@Override
public OutcomeBuilder gatewayTimeout()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( GATEWAY_TIMEOUT ) );
}
@Override
public OutcomeBuilder httpVersionNotSupported()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( HTTP_VERSION_NOT_SUPPORTED ) );
}
@Override
public OutcomeBuilder insufficientStorage()
{
return new OutcomeBuilderInstance( config, mimeTypes, response.withStatus( INSUFFICIENT_STORAGE ) );
}
private OutcomeBuilder redirect( String url, Map<String, List<String>> queryString, Status status )
{
OutcomeBuilder builder = new OutcomeBuilderInstance(
config,
mimeTypes,
response.withStatus( status )
);
return builder.withHeader(
LOCATION,
URLs.appendQueryString( url, queryString, config.charset( WERVAL_CHARACTER_ENCODING ) )
);
}
}