Java tutorial
/* * Copyright (C) 2012-2013 NS Solutions Corporation * * 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 com.htmlhifive.sync.ctrl; import java.util.HashMap; import java.util.Map; import java.util.UUID; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.context.request.WebRequest; import com.htmlhifive.resourcefw.ctrl.ResourceController; import com.htmlhifive.resourcefw.exception.AbstractResourceException; import com.htmlhifive.resourcefw.exception.BadRequestException; import com.htmlhifive.resourcefw.exception.GenericResourceException; import com.htmlhifive.resourcefw.message.MessageSource; import com.htmlhifive.resourcefw.message.RequestMessage; import com.htmlhifive.resourcefw.message.RequestMessageContainer; import com.htmlhifive.resourcefw.message.ResponseMessage; import com.htmlhifive.resourcefw.message.ResponseMessageContainer; import com.htmlhifive.sync.config.SyncConfigurationParameter; import com.htmlhifive.sync.exception.SyncUploadDuplicatedException; import com.htmlhifive.sync.service.SyncRequestCommonData; /** * sync??resource framework?Controller(Handler). * * @author kishigam */ public class SyncController extends ResourceController { /** * sync? */ private SyncConfigurationParameter syncConfigurationParameter; /** * ?.<br/> * sync???????????. */ @Override protected void editRequest(WebRequest webRequest, RequestMessageContainer requestMessages) { // syncRequestMessageContainer? SyncRequestCommonData requestCommon = createSyncRequestCommonData(requestMessages); requestMessages.putContextData(syncConfigurationParameter.REQUEST_COMMON_DATA, requestCommon, MessageSource.CONTROLLER); } /** * ?sync??????{@link SyncRequestCommonData SyncRequestCommonData}????????. * * @param requestMessages * @return sync */ private SyncRequestCommonData createSyncRequestCommonData(RequestMessageContainer requestMessages) { SyncRequestCommonData requestCommon = new SyncRequestCommonData(); try { // ????()?????????? if (requestMessages.isMultiplexed()) { // storageId? setUpStorageId(requestCommon, (String) requestMessages.getContextData(syncConfigurationParameter.STORAGE_ID), requestMessages); // ?? setUpLastUploadTime(requestCommon, (String) requestMessages.getContextData(syncConfigurationParameter.LAST_UPLOAD_TIME), requestMessages); } else { RequestMessage requestMessage = requestMessages.getMessages().get(0); // storageId? setUpStorageId(requestCommon, (String) requestMessage.get(syncConfigurationParameter.STORAGE_ID), requestMessages); // ?? setUpLastUploadTime(requestCommon, (String) requestMessage.get(syncConfigurationParameter.LAST_UPLOAD_TIME), requestMessages); } } catch (AbstractResourceException e) { // ???????resource framework?ResourceExceptionHandler??? throw new GenericResourceException(e); } // ??? requestCommon.setSyncTime(generateSyncTime(requestMessages)); return requestCommon; } /** * ???ID????.<br> * ?????????????. * * @param requestCommon sync * @param storageId ???ID * @param requestMessages */ private void setUpStorageId(SyncRequestCommonData requestCommon, String storageId, RequestMessageContainer requestMessages) { // storageId???????? if (storageId == null || storageId.isEmpty()) { storageId = generateStrageId(requestMessages); } requestCommon.setStorageId(storageId); } /** * ????????.<br> * ????????????(??????????????).<br> * * @param requestCommon sync * @param lastUploadTimeStr ??? * @param requestMessages * @throws BadRequestException ??????????? */ private void setUpLastUploadTime(SyncRequestCommonData requestCommon, String lastUploadTimeStr, RequestMessageContainer requestMessages) throws BadRequestException { if (lastUploadTimeStr == null) { return; } // ?????? try { requestCommon.setLastUploadTime(Long.parseLong(lastUploadTimeStr)); } catch (NumberFormatException e) { throw new BadRequestException("Upload request must include last upload time.", e, requestMessages.getMessages().get(0)); } } /** * ID????. * * @param requestMessages * @return ID */ protected String generateStrageId(RequestMessageContainer requestMessages) { return UUID.randomUUID().toString(); } /** * ??????. * * @param requestMessages * @return ? */ protected long generateSyncTime(RequestMessageContainer requestMessages) { return System.currentTimeMillis(); } /** * sync??????.<br/> * sync????HTTP????????????????. */ @Override @SuppressWarnings("unchecked") protected void editResponse(WebRequest webRequest, ResponseMessageContainer responseMessages, RequestMessageContainer requestMessages) { // ID???? Map<String, Object> headers; // ???ContextData?headerMap? if (responseMessages.isMultiplexed()) { headers = (Map<String, Object>) responseMessages.getContextData(getMessageMetadata().RESPONSE_HEADER); if (headers == null) { headers = new HashMap<>(); responseMessages.putContextData(getMessageMetadata().RESPONSE_HEADER, headers, MessageSource.CONTROLLER); } } else { // ?????ResponseMessage?headerMap? // ??getContext?Message?header???MethodProcessor?handleReturnValue??? // Container?getContextData/putContextData????????? // ???????????? ResponseMessage responseMessage = responseMessages.getMessages().get(0); headers = (Map<String, Object>) responseMessage.get(getMessageMetadata().RESPONSE_HEADER); if (headers == null) { headers = new HashMap<>(); responseMessage.put(getMessageMetadata().RESPONSE_HEADER, headers, MessageSource.CONTROLLER); } } headers.put(syncConfigurationParameter.STORAGE_ID, responseMessages.getContextData(syncConfigurationParameter.STORAGE_ID)); headers.put(syncConfigurationParameter.SYNC_TIME, responseMessages.getContextData(syncConfigurationParameter.SYNC_TIME)); } /** * ?????????.<br/> * ??????????. * * @param e {@link SyncUploadDuplicatedException} * @return {@link ResponseEntity} */ @ExceptionHandler protected ResponseEntity<?> handleSyncUploadDuplication(SyncUploadDuplicatedException e) { // ? // ?ResponseMessageContainer????MethodProcessor? // ?ResponseEntity??MethodProcessor?????????? // ResourceExceptionHandler? ResponseMessageContainer responseMessageContainer = e.getResponseMessageContainer(); SyncRequestCommonData lastUploadRequest = (SyncRequestCommonData) responseMessageContainer .getContextData(syncConfigurationParameter.REQUEST_COMMON_DATA); String storageIdKeyName = syncConfigurationParameter.STORAGE_ID .replaceFirst(getMessageMetadata().PREFIX_METADATA, getMessageMetadata().PREFIX_HTTP_HEADER); String syncTimeKeyName = syncConfigurationParameter.SYNC_TIME .replaceFirst(getMessageMetadata().PREFIX_METADATA, getMessageMetadata().PREFIX_HTTP_HEADER); HttpHeaders headers = new HttpHeaders(); headers.add(storageIdKeyName, lastUploadRequest.getStorageId()); headers.add(syncTimeKeyName, String.valueOf(lastUploadRequest.getLastUploadTime())); return new ResponseEntity<>(headers, HttpStatus.OK); } protected SyncConfigurationParameter getSyncConfigurationParameter() { return syncConfigurationParameter; } public void setSyncConfigurationParameter(SyncConfigurationParameter syncConfigurationParameter) { this.syncConfigurationParameter = syncConfigurationParameter; } }