package com.github.ompc.greys.core.manager.impl; import com.github.ompc.greys.core.Advice; import com.github.ompc.greys.core.TimeFragment; import com.github.ompc.greys.core.exception.ExpressException; import com.github.ompc.greys.core.manager.TimeFragmentManager; import com.github.ompc.greys.core.util.Express; import java.util.ArrayList; import java.util.Date; import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; /** * 默认时间碎片实现 * Created by oldmanpushcart@gmail.com on 15/10/3. */ public class DefaultTimeFragmentManager implements TimeFragmentManager { // 时间碎片序列生成器 private final AtomicInteger TIME_FRAGMENT_SEQUENCER = new AtomicInteger(1000); private final AtomicInteger PROCESS_SEQUENCER = new AtomicInteger(1000); // 时间碎片存储 private final Map<Integer, TimeFragment> timeFragmentStore = new LinkedHashMap<Integer, TimeFragment>(); /* * 生成下一条序列 */ private int nextSequence() { return TIME_FRAGMENT_SEQUENCER.incrementAndGet(); } @Override public int generateProcessId() { return PROCESS_SEQUENCER.incrementAndGet(); } @Override public TimeFragment append(int processId, Advice advice, Date gmtCreate, long cost, String stack) { final int id = nextSequence(); final TimeFragment timeFragment = new TimeFragment( id, processId, advice, gmtCreate, cost, stack ); timeFragmentStore.put(id, timeFragment); return timeFragment; } @Override public ArrayList<TimeFragment> list() { return new ArrayList<TimeFragment>(timeFragmentStore.values()); } /* * 搜索匹配 */ private boolean is(final TimeFragment timeFragment, final String express) { try { return Express.ExpressFactory .newExpress(timeFragment.advice) .bind("processId", timeFragment.processId) .bind("index", timeFragment.id) .bind("cost", timeFragment.cost) .is(express); } catch (ExpressException e) { return false; } } @Override public ArrayList<TimeFragment> search(final String express) { final ArrayList<TimeFragment> timeFragments = new ArrayList<TimeFragment>(); for (TimeFragment timeFragment : timeFragmentStore.values()) { if (is(timeFragment, express)) { timeFragments.add(timeFragment); } } return timeFragments; } @Override public TimeFragment get(int id) { return timeFragmentStore.get(id); } @Override public TimeFragment delete(int id) { return timeFragmentStore.remove(id); } @Override public int clean() { final int size = timeFragmentStore.size(); timeFragmentStore.clear(); return size; } }