content: package com.ctrip.framework.apollo.adminservice.controller;
  
  import com.google.gson.Gson;
  import com.google.gson.reflect.TypeToken;
  
  import com.ctrip.framework.apollo.biz.entity.ReleaseHistory;
  import com.ctrip.framework.apollo.biz.service.ReleaseHistoryService;
  import com.ctrip.framework.apollo.common.dto.PageDTO;
  import com.ctrip.framework.apollo.common.dto.ReleaseHistoryDTO;
  import com.ctrip.framework.apollo.common.utils.BeanUtils;
  
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.data.domain.Page;
  import org.springframework.data.domain.Pageable;
  import org.springframework.web.bind.annotation.PathVariable;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.bind.annotation.RequestMethod;
  import org.springframework.web.bind.annotation.RequestParam;
  import org.springframework.web.bind.annotation.RestController;
  
  import java.lang.reflect.Type;
  import java.util.ArrayList;
  import java.util.List;
  import java.util.Map;
  
  /**
   * @author Jason Song(song_s@ctrip.com)
   */
  @RestController
  public class ReleaseHistoryController {
  
    private Gson gson = new Gson();
    private Type configurationTypeReference = new TypeToken<Map<String, Object>>() {
    }.getType();
  
    @Autowired
    private ReleaseHistoryService releaseHistoryService;
  
    @RequestMapping(value = "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases/histories",
        method = RequestMethod.GET)
    public PageDTO<ReleaseHistoryDTO> findReleaseHistoriesByNamespace(
        @PathVariable String appId, @PathVariable String clusterName,
        @PathVariable String namespaceName,
        Pageable pageable) {
  
      Page<ReleaseHistory> result = releaseHistoryService.findReleaseHistoriesByNamespace(appId, clusterName,
                                                                                          namespaceName, pageable);
      return transform2PageDTO(result, pageable);
    }
  
  
    @RequestMapping(value = "/releases/histories/by_release_id_and_operation", method = RequestMethod.GET)
    public PageDTO<ReleaseHistoryDTO> findReleaseHistoryByReleaseIdAndOperation(
        @RequestParam("releaseId") long releaseId,
        @RequestParam("operation") int operation,
        Pageable pageable) {
  
      Page<ReleaseHistory> result = releaseHistoryService.findByReleaseIdAndOperation(releaseId, operation, pageable);
  
      return transform2PageDTO(result, pageable);
    }
  
    @RequestMapping(value = "/releases/histories/by_previous_release_id_and_operation", method = RequestMethod.GET)
    public PageDTO<ReleaseHistoryDTO> findReleaseHistoryByPreviousReleaseIdAndOperation(
        @RequestParam("previousReleaseId") long previousReleaseId,
        @RequestParam("operation") int operation,
        Pageable pageable) {
  
      Page<ReleaseHistory> result = releaseHistoryService.findByPreviousReleaseIdAndOperation(previousReleaseId, operation, pageable);
  
      return transform2PageDTO(result, pageable);
  
    }
  
    private PageDTO<ReleaseHistoryDTO> transform2PageDTO(Page<ReleaseHistory> releaseHistoriesPage, Pageable pageable){
      if (!releaseHistoriesPage.hasContent()) {
        return null;
      }
  
      List<ReleaseHistory> releaseHistories = releaseHistoriesPage.getContent();
      List<ReleaseHistoryDTO> releaseHistoryDTOs = new ArrayList<>(releaseHistories.size());
      for (ReleaseHistory releaseHistory : releaseHistories) {
        releaseHistoryDTOs.add(transformReleaseHistory2DTO(releaseHistory));
      }
  
      return new PageDTO<>(releaseHistoryDTOs, pageable, releaseHistoriesPage.getTotalElements());
    }
  
    private ReleaseHistoryDTO transformReleaseHistory2DTO(ReleaseHistory releaseHistory) {
      ReleaseHistoryDTO dto = new ReleaseHistoryDTO();
      BeanUtils.copyProperties(releaseHistory, dto, "operationContext");
      dto.setOperationContext(gson.fromJson(releaseHistory.getOperationContext(),
                                            configurationTypeReference));
  
      return dto;
    }
  }
  