com.htmlhifive.sync.ctrl.SyncController.java Source code

Java tutorial

Introduction

Here is the source code for com.htmlhifive.sync.ctrl.SyncController.java

Source

/*
 * 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;
    }
}