package com.mediafire.sdk.config; import com.mediafire.sdk.MFApiException; import com.mediafire.sdk.MFException; import com.mediafire.sdk.MFSessionNotStartedException; import com.mediafire.sdk.api.responses.ApiResponse; import com.mediafire.sdk.api.responses.UserGetActionTokenResponse; import com.mediafire.sdk.requests.*; import com.mediafire.sdk.token.ActionToken; import com.mediafire.sdk.util.ResponseUtil; import java.util.LinkedHashMap; public class DefaultActionRequester implements MFActionRequester { private static final int REQUESTED_IMAGE_TOKEN_LIFESPAN_MINUTES = 10; private final MFHttpRequester http; private final MFSessionRequester sessionRequester; private final MFStore<ActionToken> imageStore; private final MFStore<ActionToken> uploadStore; private boolean sessionStarted; public DefaultActionRequester(MFHttpRequester http, MFSessionRequester sessionRequester, MFStore<ActionToken> imageStore, MFStore<ActionToken> uploadStore) { this.http = http; this.sessionRequester = sessionRequester; this.imageStore = imageStore; this.uploadStore = uploadStore; } @Override public void endSession() { sessionStarted = false; imageStore.clear(); uploadStore.clear(); } @Override public void sessionStarted() { sessionStarted = true; } @Override public HttpApiResponse doConversionRequest(ImageRequest imageRequest) throws MFException, MFApiException, MFSessionNotStartedException { if (!sessionStarted) { throw new MFSessionNotStartedException(); } ActionToken imageToken; //borrow token if available synchronized (imageStore) { if (!imageStore.available()) { getNewImageTokenFromSessionRequester(); } imageToken = imageStore.get(); if (imageToken == null) { throw new MFException("could not get image token from store"); } } GetRequest getRequest = new GetRequest(imageRequest, imageToken); HttpApiResponse httpResponse = http.doApiRequest(getRequest); ResponseUtil.validateConversionHttpResponse(httpResponse); // return token synchronized (imageStore) { imageStore.put(imageToken); } return httpResponse; } @Override public HttpApiResponse doConversionRequest(DocumentRequest documentRequest) throws MFException, MFApiException, MFSessionNotStartedException { if (!sessionStarted) { throw new MFSessionNotStartedException(); } ActionToken imageToken; //borrow token if available synchronized (imageStore) { if (!imageStore.available()) { getNewImageTokenFromSessionRequester(); } imageToken = imageStore.get(); if (imageToken == null) { throw new MFException("could not get image action token from store"); } } GetRequest getRequest = new GetRequest(documentRequest, imageToken); HttpApiResponse httpResponse = http.doApiRequest(getRequest); ResponseUtil.validateConversionHttpResponse(httpResponse); // return token synchronized (imageStore) { imageStore.put(imageToken); } return httpResponse; } @Override public <T extends ApiResponse> T doUploadRequest(UploadPostRequest uploadRequest, Class<T> classOfT) throws MFException, MFApiException, MFSessionNotStartedException { if (!sessionStarted) { throw new MFSessionNotStartedException(); } ActionToken uploadToken; //borrow token if available synchronized (uploadStore) { if (!uploadStore.available()) { getNewUploadTokenFromSessionRequester(); } uploadToken = uploadStore.get(); if (uploadToken == null) { throw new MFException("could not get upload token from store"); } } uploadRequest.addSessionToken(uploadToken.getToken()); PostRequest postRequest = new PostRequest(uploadRequest, uploadRequest.getPayload()); HttpApiResponse httpResponse = http.doApiRequest(postRequest); ResponseUtil.validateHttpResponse(httpResponse); // return token synchronized (uploadStore) { uploadStore.put(uploadToken); } return ResponseUtil.makeApiResponseFromHttpResponse(httpResponse, classOfT); } @Override public ActionToken borrowImageToken() throws MFException, MFApiException, MFSessionNotStartedException { if (!sessionStarted) { throw new MFSessionNotStartedException(); } ActionToken imageToken; //borrow token if available synchronized (imageStore) { if (!imageStore.available()) { getNewImageTokenFromSessionRequester(); } imageToken = imageStore.get(); if (imageToken == null) { throw new MFException("could not get image action token from store"); } } return imageToken; } private void getNewUploadTokenFromSessionRequester() throws MFException, MFApiException { LinkedHashMap<String, Object> query = new LinkedHashMap<String, Object>(); query.put("type", "upload"); query.put("lifespan", REQUESTED_IMAGE_TOKEN_LIFESPAN_MINUTES); query.put("response_format", "json"); ApiPostRequest apiPostRequest = new ApiPostRequest("https", "www.mediafire.com", "/api/1.4/user/get_action_token.php", query); makeNewUploadTokenRequest(apiPostRequest); } private void makeNewUploadTokenRequest(ApiPostRequest apiPostRequest) throws MFApiException, MFException { UserGetActionTokenResponse apiResponse = sessionRequester.doApiRequest(apiPostRequest, UserGetActionTokenResponse.class); // handle the api response by notifying callback and (if successful) set session to started handleUploadTokenResponse(apiResponse); } private void handleUploadTokenResponse(UserGetActionTokenResponse apiResponse) throws MFApiException { // throw ApiException if request has api error if (apiResponse.hasError()) { throw new MFApiException(apiResponse.getError(), apiResponse.getMessage()); } // store token ActionToken sessionToken = ActionToken.makeActionTokenFromApiResponse(apiResponse, 1000 * 60 * REQUESTED_IMAGE_TOKEN_LIFESPAN_MINUTES + System.currentTimeMillis()); uploadStore.put(sessionToken); } private void getNewImageTokenFromSessionRequester() throws MFException, MFApiException { LinkedHashMap<String, Object> query = new LinkedHashMap<String, Object>(); query.put("type", "image"); query.put("lifespan", REQUESTED_IMAGE_TOKEN_LIFESPAN_MINUTES); query.put("response_format", "json"); ApiPostRequest apiPostRequest = new ApiPostRequest("https", "www.mediafire.com", "/api/1.4/user/get_action_token.php", query); makeNewImageTokenRequest(apiPostRequest); } private void makeNewImageTokenRequest(ApiPostRequest apiPostRequest) throws MFException, MFApiException { UserGetActionTokenResponse apiResponse = sessionRequester.doApiRequest(apiPostRequest, UserGetActionTokenResponse.class); handleImageTokenResponse(apiResponse); } private void handleImageTokenResponse(UserGetActionTokenResponse apiResponse) throws MFApiException { // throw ApiException if request has api error if (apiResponse.hasError()) { throw new MFApiException(apiResponse.getError(), apiResponse.getMessage()); } // store token ActionToken sessionToken = ActionToken.makeActionTokenFromApiResponse(apiResponse, 1000 * 60 * REQUESTED_IMAGE_TOKEN_LIFESPAN_MINUTES + System.currentTimeMillis()); imageStore.put(sessionToken); } }