package cn.edu.zju.acm.onlinejudge.judgeservice; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; import cn.edu.zju.acm.onlinejudge.bean.Reference; import cn.edu.zju.acm.onlinejudge.bean.enumeration.ReferenceType; import cn.edu.zju.acm.onlinejudge.dao.ReferenceDAO; import cn.edu.zju.acm.onlinejudge.persistence.PersistenceCreationException; import cn.edu.zju.acm.onlinejudge.persistence.PersistenceException; public class MockReferenceDAO extends MockDAO implements ReferenceDAO { private AtomicLong id = new AtomicLong(); private Map<Long, List<Reference>> referenceMap = new HashMap<Long, List<Reference>>(); public synchronized void save(Reference reference, long problemId) { reference.setId(id.getAndIncrement()); update(reference, problemId); } public synchronized void update(Reference reference, long problemId) { List<Reference> references = referenceMap.get(problemId); if (references == null) { references = new ArrayList<Reference>(); referenceMap.put(problemId, references); } references.add(cloneReference(reference)); } public synchronized List<Reference> getProblemReferences(long problemId, ReferenceType referenceType) throws PersistenceCreationException, PersistenceException { List<Reference> ret = new ArrayList<Reference>(); List<Reference> references = referenceMap.get(problemId); if (references != null) { for (Reference reference : references) { if (reference.getReferenceType().equals(referenceType)) { ret.add(reference); } } } return ret; } private Reference cloneReference(Reference reference) { Reference ret = new Reference(); ret.setId(reference.getId()); byte[] content = new byte[reference.getContent().length]; System.arraycopy(reference.getContent(), 0, content, 0, content.length); ret.setContent(content); ret.setContentType(reference.getContentType()); ret.setName(reference.getName()); ret.setReferenceType(reference.getReferenceType()); ret.setCompressed(reference.isCompressed()); return ret; } }