All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.flyfish.oauth.common.sync.methods.PatchSyncRequestAcceptor Maven / Gradle / Ivy

There is a newer version: 1.0.7
Show newest version
package com.flyfish.oauth.common.sync.methods;

import com.flyfish.oauth.client.RestClient;
import com.flyfish.oauth.common.Function;
import com.flyfish.oauth.common.sync.AbstractSyncRequestAcceptor;
import com.flyfish.oauth.common.sync.support.CollectionComparator;
import com.flyfish.oauth.configuration.sync.SyncDomainService;
import com.flyfish.oauth.utils.ContainUtils;
import com.flyfish.oauth.utils.CopyUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 接收patch请求的同步操作
 * 打补丁的方式进行同步,同步会保留原来的数据,填充空字段。对于新增的数据,直接插入
 *
 * @author wangyu
 */
public class PatchSyncRequestAcceptor extends AbstractSyncRequestAcceptor {

    /**
     * 比较并返回比较结果,根据不同实现策略进行不同的比较
     *
     * @param originList    原数据
     * @param domainService 数据service
     * @return 结果
     */
    @Override
    protected  CollectionComparator compare(List originList, final SyncDomainService domainService) throws Exception {
        Function keyFunction = identifierFunction(domainService);
        List identifiers = ContainUtils.getIdentifiers(originList, keyFunction);
        // 查询出本批次存在的数据
        List saved = domainService.getList(identifiers);
        // 移除本次冲突的部分
        CollectionComparator comparator = CollectionComparator.newInstance(saved, originList, keyFunction);
        // 新增的部分
        List added = comparator.added();
        // 更新的部分
        List changed = change(comparator);
        // 写入
        domainService.saveAll(added);
        domainService.updateAll(changed);
        return comparator;
    }

    private  List change(CollectionComparator comparator) {
        Map originMap = comparator.changedOriginMap();
        Map currentMap = comparator.changedNewMap();
        List changed = new ArrayList<>();
        for (Object changedKey : comparator.changedKeys()) {
            T origin = originMap.get(changedKey);
            T current = currentMap.get(changedKey);
            if (origin != null && current != null) {
                // 赋值 (自动跳过空值)
                changed.add(CopyUtils.copyProps(current, origin));
            }
        }
        return changed;
    }

    /**
     * 匹配
     *
     * @param request 请求
     * @return 结果
     */
    @Override
    public boolean accept(HttpServletRequest request) {
        return request.getMethod().equalsIgnoreCase(RestClient.HttpMethod.PATCH.name());
    }
}