QueryMapCache.java

package com.mycim.server.wip.manager.impl;

import com.mycim.framework.context.spring.SpringContext;
import com.mycim.framework.logging.Logger;
import com.mycim.framework.logging.LoggerFactory;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.framework.utils.lang.math.NumberUtils;
import com.mycim.server.base.manager.NamedObjectManager;
import com.mycim.server.spec.manager.ProcessSpecItemManager;
import com.mycim.server.system.manager.ReferenceFileManager;
import com.mycim.server.wip.dao.LotQueryDAO;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.prp.ProcessSpecItem;
import com.mycim.valueobject.prp.ProcessSpecItemDto;
import com.mycim.valueobject.sys.ReferenceFileDetail;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class QueryMapCache {

    private final long faciltiyRrn;

    private final long stepDescContext;

    private final long recipeContextRrn;

    private final long reticleContextRrn;

    private final LotQueryDAO lotQueryDAO = SpringContext.getBean(LotQueryDAO.class);

    private final NamedObjectManager namedObjectManager = SpringContext.getBean(NamedObjectManager.class);

    private final ReferenceFileManager referenceFileManager = SpringContext.getBean(ReferenceFileManager.class);

    private final ProcessSpecItemManager processSpecItemManager = SpringContext.getBean(ProcessSpecItemManager.class);

    private final static Logger logger = LoggerFactory.getLogger(QueryMapCache.class);

    public QueryMapCache(long facilityRrn, long stepDescContext, long recipeContextRrn, long reticleContextRrn) {
        this.faciltiyRrn = facilityRrn;
        this.stepDescContext = stepDescContext;
        this.recipeContextRrn = recipeContextRrn;
        this.reticleContextRrn = reticleContextRrn;
    }

    private final MapCache<String, Map<String, Object>> proContextCache = new MapCache<String, Map<String, Object>>() {

        @Override
        public Map<String, Object> load(String key) {
            String[] keys = StringUtils.splitPreserveAllTokens(key, ',');
            Map<String, Object> result = lotQueryDAO
                    .getProContextActiveDtl(Long.valueOf(keys[0]).longValue(), Long.valueOf(keys[1]).longValue(),
                                            Long.valueOf(keys[2]).longValue(), Integer.valueOf(keys[3]).intValue(),
                                            Long.valueOf(keys[4]).longValue(), Long.valueOf(keys[5]).longValue());
            if (MapUtils.isEmpty(result)) {
                result = new HashMap<String, Object>();
                String desc = lotQueryDAO.getStepDesc(stepDescContext, keys[0], keys[1], keys[2], keys[3], keys[4]);
                result.put("operation_description", StringUtils.isEmpty(desc) ? StringUtils.EMPTY : desc);

                Long rrn = lotQueryDAO.getRecipeByLot(recipeContextRrn, keys[0], keys[1], keys[2], keys[3], keys[4]);
                result.put("recipe_rrn", rrn != null ? rrn : 0L);
            }
            return result;
        }

    };

    private final MapCache<String, String> reticleCache = new MapCache<String, String>() {

        @Override
        public String load(String key) {
            String[] keys = StringUtils.splitPreserveAllTokens(key, ',');
            Long familyRrn = lotQueryDAO
                    .getReticleByLot(reticleContextRrn, keys[0], keys[1], keys[2], keys[3], keys[4]);
            if (familyRrn == null || familyRrn == 0) {
                return StringUtils.EMPTY;
            }
            List<Long> reticles = lotQueryDAO.getReticleByFamily(familyRrn);

            String reticleId = StringUtils.EMPTY;

            if (CollectionUtils.isNotEmpty(reticles)) {
                for (Long reticleRrn : reticles) {
                    reticleId += namedObjectManager.getInstanceId(reticleRrn);
                }
            }
            return reticleId;
        }

    };

    private final MapCache<Long, Map<String, String>> carrierCache = new MapCache<Long, Map<String, String>>() {

        @Override
        public Map<String, String> load(Long key) {
            Map<String, String> result = new HashMap<String, String>();
            Map<String, Object> carrierInfo = lotQueryDAO.queryCarrierInfo(key);
            if (MapUtils.isNotEmpty(carrierInfo)) {
                result.put("podID", namedObjectManager.getInstanceId(MapUtils.getLongValue(carrierInfo, "POD_RRN")));
            }
            return result;
        }

    };

    private final MapCache<Long, String> instanceIdCache = new MapCache<Long, String>() {

        @Override
        public String load(Long key) {
            return namedObjectManager.getInstanceId(key);
        }

    };

    private final MapCache<ProcessSpecItem, String> workAreaCache = new MapCache<ProcessSpecItem, String>() {

        @Override
        public String load(ProcessSpecItem key) {
            ProcessSpecItemDto processSpecItemDto = new ProcessSpecItemDto(key.getProcessRrn(), key.getProcessVersion(),
                                                                           key.getRouteRrn(), key.getOperationRrn());
            ProcessSpecItem processSpecItem = processSpecItemManager.getProcessSpecItemForActive(processSpecItemDto);
            if (processSpecItem != null) {
                return processSpecItem.getWorkArea();
            }
            // TODO Auto-generated method stub
            return "";
        }

    };

    private final MapCache<String, String> stepEqpGroupCache = new MapCache<String, String>() {

        @Override
        public String load(String key) {
            String[] keys = StringUtils.splitPreserveAllTokens(key, ',');
            return processSpecItemManager.getEqptGroupRrns(NumberUtils.toLong(keys[0]), NumberUtils.toInt(keys[1]),
                                                           NumberUtils.toLong(keys[2]), NumberUtils.toLong(keys[3]));
        }

    };

    private final MapCache<Long, String> eqpGroupEqpIds = new MapCache<Long, String>() {

        @Override
        public String load(Long key) {
            return lotQueryDAO.getEqpIds(key);
        }

    };

    private final MapCache<Long, String> locationCache = new MapCache<Long, String>() {

        @Override
        public String load(Long key) {
            String location = "";
            if (key != null && key > 0) {
                location = namedObjectManager.getInstanceId(key);
                if (StringUtils.isEmpty(location)) {
                    location = lotQueryDAO.getLocationId(key);
                }
            }
            return location;
        }

    };

    private final MapCache<String, String> namedSpaceCache = new MapCache<String, String>() {

        @Override
        public String load(String key) {
            return namedObjectManager.getNamedSpace(faciltiyRrn, key);
        }

    };

    //	private final MapCache<String, String> lotCategoryCache = new MapCache<String, String>() {
    //
    //		public String get(String key) {
    //			if (values.get(key) == null) {
    //				values.putAll(lotQueryDAO.getReferenceCategory());
    //			}
    //			return key;
    //		};
    //
    //		@Override
    //		public String load(String key) {
    //			// TODO Auto-generated method stub
    //			return null;
    //		}
    //
    //	};

    private final MapCache<String, String> mfgEqpGroupCache = new MapCache<String, String>() {

        @Override
        public String load(String key) {
            ReferenceFileDetail referenceFileDetail = new ReferenceFileDetail("$$MFGEQP_GROUP_ID", getNamedSpaceCache()
                    .get(ObjectList.REFERENCE_FILE_KEY), ObjectList.REFERENCE_FILE_KEY);
            if (!StringUtils.equals(key, "empty")) {
                referenceFileDetail.setKey1Value(key);
            }

            List<ReferenceFileDetail> referenceFileDetailList = referenceFileManager
                    .getReferenceFileDetails(referenceFileDetail.getInstanceRrn());
            if (CollectionUtils.isNotEmpty(referenceFileDetailList)) {
                return referenceFileDetailList.get(0).getData1Value();
            }

            return StringUtils.EMPTY;
        }

    };

    abstract class MapCache<K, V> {
        protected ConcurrentHashMap<K, V> values = new ConcurrentHashMap<K, V>(50);

        public V get(K key) {
            if (values.get(key) == null) {
                V value = load(key);
                if (value != null) {
                    values.put(key, value);
                }
            }
            return values.get(key);
        }

        public abstract V load(K key);

    }

    private final MapCache<ProcessSpecItem, String> stageIdCache = new MapCache<ProcessSpecItem, String>() {

        @Override
        public String load(ProcessSpecItem key) {
            ProcessSpecItemDto processSpecItemDto = new ProcessSpecItemDto(key.getProcessRrn(), key.getProcessVersion(),
                                                                           key.getRouteRrn(), key.getOperationRrn());
            ProcessSpecItem processSpecItem = processSpecItemManager.getProcessSpecItemForActive(processSpecItemDto);

            if (processSpecItem != null) {
                return processSpecItem.getStageId();
            }
            // TODO Auto-generated method stub
            return "";
        }

    };

    public MapCache<String, String> getMfgEqpGroupCache() {
        return mfgEqpGroupCache;
    }

    public MapCache<String, String> getNamedSpaceCache() {
        return namedSpaceCache;
    }

    public MapCache<Long, String> getLocationCache() {
        return locationCache;
    }

    public MapCache<Long, String> getInstanceIdCache() {
        return instanceIdCache;
    }

    public MapCache<String, Map<String, Object>> getProContextCache() {
        return proContextCache;
    }

    public MapCache<Long, Map<String, String>> getCarrierCache() {
        return carrierCache;
    }

    public MapCache<Long, String> getEqpGroupEqpIds() {
        return eqpGroupEqpIds;
    }

    public MapCache<String, String> getReticleCache() {
        return reticleCache;
    }

    public MapCache<String, String> getStepEqpGroupCache() {
        return stepEqpGroupCache;
    }

    public MapCache<ProcessSpecItem, String> getWorkAreaCache() {
        return workAreaCache;
    }

    public MapCache<ProcessSpecItem, String> getStageIdCache() {
        return stageIdCache;
    }

    //	public MapCache<String, String> getLotCategoryCache() {
    //		return lotCategoryCache;
    //	}

}