com.greenline.guahao.biz.manager.cache.hrs.HospitalCacheManager.java Source code

Java tutorial

Introduction

Here is the source code for com.greenline.guahao.biz.manager.cache.hrs.HospitalCacheManager.java

Source

/*
 * Project: guahao-portal-biz-core
 * 
 * File Created at 2012-5-17
 * 
 * Copyright 2012 Greenline.com Corporation Limited.
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of
 * Greenline Company. ("Confidential Information").  You shall not
 * disclose such Confidential Information and shall use it only in
 * accordance with the terms of the license agreement you entered into
 * with Greenline.com.
 */
package com.greenline.guahao.biz.manager.cache.hrs;

import java.util.Iterator;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.BulkMapper;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.query.SortQuery;
import org.springframework.data.redis.core.query.SortQueryBuilder;
import org.springframework.data.redis.support.collections.DefaultRedisList;
import org.springframework.data.redis.support.collections.RedisList;

import com.greenline.guahao.biz.manager.cache.CacheBase;
import com.greenline.guahao.biz.manager.hrs.dataobject.ClinicTypeDO;
import com.greenline.guahao.biz.manager.hrs.dataobject.HospitalDO;
import com.greenline.guahao.biz.manager.hrs.dataobject.HospitalLevelDO;
import com.greenline.guahao.biz.manager.hrs.dataobject.HospitalRuleDO;

/**
 * @Type HospitalCacheManager
 * @Desc ?
 *       <ul>
 *       <li>hosp:levels ---id--json</li>
 *       <li>hosp:{id}----?json</li>
 *       </ul>
 * @author weirui.shenwr
 * @date 2012-5-17
 * @Version V1.0
 */
public class HospitalCacheManager extends CacheBase {

    /**
     * KEY?
     */
    public static final String HOSPITAL = "hosp:";

    public static final String HOSPITAL_LEVEL = HOSPITAL + "levels";
    /**
     * key?
     */
    public static final String CLINIC_TYPE = HOSPITAL + "ctype:";
    public static final String HOSPITAL_RULE = "hospRule:";

    /**
     * @param template
     */
    public HospitalCacheManager(StringRedisTemplate template) {
        super(template);
    }

    /**
     * hospital KEY
     * 
     * @param id
     * @return
     */
    public String hospitalKey(String id) {
        return HOSPITAL + id;
    }

    public String hospitalRuleKey(String id) {
        return HOSPITAL_RULE + id;
    }

    public String hospPlatKey(String id) {
        return HOSPITAL + id + ":plat";
    }

    public BoundHashOperations<String, String, String> hospPlat(String id) {
        BoundHashOperations<String, String, String> ops = template.boundHashOps(hospPlatKey(id));
        return ops;
    }

    /**
     * 
     * 
     * @param parentId
     * @return
     */
    private RedisList<String> hospitallevels() {
        return new DefaultRedisList<String>(HOSPITAL_LEVEL, template);
    }

    /**
     * 
     * 
     * @param list
     */
    public void setHospLevels(final List<HospitalLevelDO> list) {
        if (list == null || list.isEmpty()) {
            return;
        }

        final RedisList<String> leveList = hospitallevels();
        leveList.clear();
        leveList.getOperations().execute(new SessionCallback<Object>() {
            @SuppressWarnings({ "unchecked", "rawtypes" })
            public Object execute(RedisOperations operations) throws DataAccessException {
                operations.watch(leveList.getKey());
                operations.multi();
                for (HospitalLevelDO obj : list) {
                    leveList.add(jackjson.writeString(obj));
                }
                operations.exec();
                return null;
            }
        });
        // 
        setExpire(leveList);
    }

    // ================================================================================//
    /**
     * key
     * 
     * @param hospitalId
     * @return
     */
    public String clinicTypesKey(String hospitalId) {
        return "hid:" + hospitalId + ":cTypes";
    }

    /**
     * ??
     * 
     * @param hospitalId
     * @return
     */
    private RedisList<String> clinicTypes(String hospitalId) {
        return new DefaultRedisList<String>(clinicTypesKey(hospitalId), template);
    }

    /**
     * ?
     * 
     * @param hospitalId
     * @param list
     */
    public void setClinicTypes(String hospitalId, final List<ClinicTypeDO> list) {
        if (StringUtils.isEmpty(hospitalId) || list == null || list.isEmpty()) {
            return;
        }
        final RedisList<String> clinicTypes = clinicTypes(hospitalId);
        clinicTypes.clear();
        clinicTypes.getOperations().execute(new SessionCallback<Object>() {
            @SuppressWarnings({ "unchecked", "rawtypes" })
            public Object execute(RedisOperations operations) throws DataAccessException {
                operations.watch(clinicTypes.getKey());
                operations.multi();
                for (ClinicTypeDO obj : list) {
                    clinicTypes.add(obj.getId());
                }
                operations.exec();
                return null;
            }
        });

        for (ClinicTypeDO obj : list) {
            setClinicType(obj.getId(), obj);
        }
        setExpire(clinicTypes);
    }

    /**
     * ?
     * 
     * @param id
     * @param clinicType
     */
    private void setClinicType(String id, ClinicTypeDO clinicType) {
        if (StringUtils.isEmpty(id) || clinicType == null) {
            return;
        }
        String json = jackjson.writeString(clinicType);
        setExpire(clinicTypeKey(clinicType.getId()), json);
    }

    /**
     * key
     * 
     * @param id
     * @return
     */
    private String clinicTypeKey(String id) {
        return CLINIC_TYPE + id;
    }

    /**
     * ??
     * 
     * @return
     */
    public List<ClinicTypeDO> listClinicTypes(String hospitalId) {
        if (StringUtils.isEmpty(hospitalId)) {
            return null;
        }
        String key = clinicTypesKey(hospitalId);
        return listClinicTypeByKey(key);
    }

    /**
     * ??
     * 
     * @param key
     * @return
     */
    private List<ClinicTypeDO> listClinicTypeByKey(String key) {
        SortQuery<String> query = SortQueryBuilder.sort(key).noSort().get(CLINIC_TYPE + "*").build();

        BulkMapper<ClinicTypeDO, String> hm = new BulkMapper<ClinicTypeDO, String>() {
            @Override
            public ClinicTypeDO mapBulk(List<String> bulk) {
                Iterator<String> iterator = bulk.iterator();
                ClinicTypeDO c = jackjson.read(iterator.next(), ClinicTypeDO.class);
                return c;
            }
        };
        return cleanExpireData(key, template.sort(query, hm));
    }

    // ================================================================================//

    /**
     * ?
     * 
     * @return
     */
    public List<HospitalLevelDO> listHospLevels() {
        SortQuery<String> query = SortQueryBuilder.sort(HOSPITAL_LEVEL).noSort().get("#").build();
        BulkMapper<HospitalLevelDO, String> hm = new BulkMapper<HospitalLevelDO, String>() {
            @Override
            public HospitalLevelDO mapBulk(List<String> bulk) {
                Iterator<String> iterator = bulk.iterator();
                return jackjson.read(iterator.next(), HospitalLevelDO.class);
            }
        };
        return template.sort(query, hm);
    }

    /**
     * DO
     * 
     * @param hosp
     */
    public void setHospital(String id, HospitalDO hosp) {
        if (StringUtils.isEmpty(id) || hosp == null) {
            return;
        }

        String json = jackjson.writeString(hosp);
        String key = hospitalKey(hosp.getId());
        setExpire(key, json);
    }

    /**
     * ?DO
     * 
     * @param id
     * @return
     */
    public HospitalDO getHospital(String id) {
        return jackjson.read(template.opsForValue().get(hospitalKey(id)), HospitalDO.class);
    }

    /**
     * ?DO
     * 
     * @param id uuid
     * @return
     */
    public HospitalRuleDO getHospitalRule(String id) {
        return jackjson.read(template.opsForValue().get(hospitalRuleKey(id)), HospitalRuleDO.class);
    }

    /**
     * 
     * 
     * @param id uuid
     * @param hospRuleDo
     */
    public void setHospitalRule(String id, HospitalRuleDO hospRuleDo) {
        if (StringUtils.isEmpty(id) || hospRuleDo == null) {
            return;
        }
        String json = jackjson.writeString(hospRuleDo);
        String key = hospitalRuleKey(hospRuleDo.getHospitaluuid());
        setExpire(key, json);
    }
}