/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.importer; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicLong; public class MemoryImportStore implements ImportStore { AtomicLong idseq = new AtomicLong(); Queue<ImportContext> imports = new ConcurrentLinkedQueue<ImportContext>(); @Override public String getName() { return "memory"; } @Override public void init() { } @Override public ImportContext get(long id) { for (ImportContext context : imports) { if (context.getId() == id) { return context; } } return null; } @Override public Long advanceId(Long id) { if (id <= idseq.longValue()) { id = idseq.getAndIncrement(); } else { idseq.set(id + 1); } return id; } @Override public void add(ImportContext context) { context.setId(idseq.getAndIncrement()); imports.add(context); if (imports.size() > 100) { clearCompletedImports(); } } void clearCompletedImports() { List<ImportContext> completed = collect(new ImportCollector() { @Override protected boolean capture(ImportContext context) { return context.getState() == ImportContext.State.COMPLETE; } }); imports.removeAll(completed); } @Override public void save(ImportContext context) { imports.remove(context); imports.add(context); } @Override public void remove(ImportContext importContext) { imports.remove(importContext); } @Override public void removeAll() { imports.clear(); } @Override public Iterator<ImportContext> iterator() { return imports.iterator(); } public Iterator<ImportContext> iterator(String sortBy) { if (sortBy == null) { return iterator(); } throw new UnsupportedOperationException(); } @Override public Iterator<ImportContext> allNonCompleteImports() { return collect(new ImportCollector() { @Override protected boolean capture(ImportContext context) { return context.getState() != ImportContext.State.COMPLETE; } }).iterator(); } @Override public Iterator<ImportContext> importsByUser(final String user) { return collect(new ImportCollector() { @Override protected boolean capture(ImportContext context) { return user.equals(context.getUser()); } }).iterator(); } @Override public void query(ImportVisitor visitor) { for (ImportContext context : imports) { visitor.visit(context); } } List<ImportContext> collect(ImportCollector collector) { query(collector); return collector.getCollected(); } @Override public void destroy() { idseq.set(0); imports.clear(); } static abstract class ImportCollector implements ImportVisitor { List<ImportContext> collected = new ArrayList(); @Override public final void visit(ImportContext context) { if (capture(context)) { collected.add(context); } } public List<ImportContext> getCollected() { return collected; } protected abstract boolean capture(ImportContext context); } }