package org.croudtrip; import com.google.common.base.Optional; import org.croudtrip.api.AvatarsUploadResource; import org.croudtrip.api.GcmRegistrationResource; import org.croudtrip.api.TripsResource; import org.croudtrip.api.UsersHeadResource; import org.croudtrip.api.UsersResource; import org.croudtrip.api.VehicleResource; import org.croudtrip.api.account.UserDescription; import org.glassfish.jersey.internal.util.Base64; import java.io.IOException; import java.net.HttpURLConnection; import retrofit.RequestInterceptor; import retrofit.RestAdapter; import retrofit.client.Request; import retrofit.client.UrlConnectionClient; import retrofit.converter.JacksonConverter; public class ApiFactory { private Optional<UserDescription> authenticatedUser = Optional.absent(); public void setUser(UserDescription user) { authenticatedUser = Optional.fromNullable(user); } public UsersResource getUsersResource() { return getRestAdapter().create(UsersResource.class); } public AvatarsUploadResource getAvatarsUploadResource() { return getRestAdapter().create(AvatarsUploadResource.class); } public VehicleResource getVehicleResource() { return getRestAdapter().create(VehicleResource.class); } public UsersHeadResource getUsersHeadResource() { return getRestAdapter().create(UsersHeadResource.class); } public TripsResource getTripsResource() { return getRestAdapter().create(TripsResource.class); } public GcmRegistrationResource getGcmRegistrationResource() { return getRestAdapter().create(GcmRegistrationResource.class); } private RestAdapter getRestAdapter() { return new RestAdapter.Builder() .setEndpoint("http://localhost:8080") .setRequestInterceptor(new RequestInterceptor() { @Override public void intercept(RequestFacade request) { if (!authenticatedUser.isPresent()) return; String credentials = authenticatedUser.get().getEmail() + ":" + authenticatedUser.get().getPassword(); String base64EncodedCredentials = Base64.encodeAsString(credentials.getBytes()); request.addHeader("Authorization", "Basic " + base64EncodedCredentials); } }) .setClient(new LongTimeoutUrlConnectionClient()) .setConverter(new JacksonConverter()) .build(); } /** * Increases default HTTP timeout length. */ public static class LongTimeoutUrlConnectionClient extends UrlConnectionClient { @Override protected HttpURLConnection openConnection(Request request) throws IOException { HttpURLConnection connection = super.openConnection(request); connection.setConnectTimeout(10 * 1000); // 10 seconds connection.setReadTimeout(90 * 1000); // 90 seconds return connection; } } }