package eu.fbk.knowledgestore; import java.util.List; import javax.annotation.Nullable; import com.google.common.collect.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class AbstractKnowledgeStore implements KnowledgeStore { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractKnowledgeStore.class); private final List<Session> sessions; private boolean closed; protected AbstractKnowledgeStore() { this.sessions = Lists.newLinkedList(); this.closed = false; } @Override public final synchronized Session newSession() throws IllegalStateException { return newSession(null, null); } @Override public final synchronized Session newSession(@Nullable final String username, @Nullable final String password) throws IllegalStateException { synchronized (this.sessions) { evictClosedSessions(); final Session session = doNewSession(username, password); this.sessions.add(session); return session; } } @Override public final synchronized void close() { if (!this.closed) { for (final Session session : this.sessions) { try { session.close(); } catch (final Throwable ex) { LOGGER.error("Error closing session: " + ex.getMessage(), ex); } } try { doClose(); } finally { this.closed = true; } } } @Override public String toString() { return getClass().getSimpleName() + "[" + (this.closed ? "closed" : "open") + ", " + this.sessions.size() + " sessions]"; } @Override public final synchronized boolean isClosed() { return this.closed; } protected final void checkNotClosed() { if (this.closed) { throw new IllegalStateException("KnowledgeStore has been closed"); } } protected final void evictClosedSessions() { synchronized (this.sessions) { for (int i = this.sessions.size() - 1; i >= 0; --i) { if (this.sessions.get(i).isClosed()) { this.sessions.remove(i); } } } } protected abstract Session doNewSession(@Nullable String username, @Nullable String password); protected void doClose() { } }