org.openanzo.combus.realtime.TrackerManager.java Source code

Java tutorial

Introduction

Here is the source code for org.openanzo.combus.realtime.TrackerManager.java

Source

/*******************************************************************************
 * Copyright (g) 2004, 2007 IBM Corporation and Cambridge Semantics Incorporated.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * File:        $Source: /cvsroot/slrp/boca/com.ibm.adtech.boca.client/src/com/ibm/adtech/boca/client/Attic/TrackerManager.java,v $
 * Created by:  Matthew Roy ( <a href="mailto:mroy@us.ibm.com">mroy@us.ibm.com </a>)
 * Created on:  Apr 16, 2007
 * Revision:   $Id: TrackerManager.java 179 2007-07-31 14:22:34Z mroy $
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Cambridge Semantics Incorporated - Fork to Anzo
 *******************************************************************************/
package org.openanzo.combus.realtime;

import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;

import org.apache.commons.collections15.MultiMap;
import org.openanzo.rdf.Resource;
import org.openanzo.rdf.URI;
import org.openanzo.rdf.Value;
import org.openanzo.rdf.utils.CopyOnWriteMultiHashMap;
import org.openanzo.services.impl.SelectorTracker;

/**
 * The trackerManager keeps track of trackers, and provides indexer matching to find trackers that match statements.
 * 
 * @param <T>
 *            Type of tracker
 * @author Matthew Roy ( <a href="mailto:mroy@cambridgesemantics.com">mroy@cambridgesemantics.com </a>)
 * 
 */
public class TrackerManager<T extends SelectorTracker> {

    protected final List<T> trackers;

    protected final MultiMap<URI, T> namedGraphMap;

    protected final MultiMap<Resource, T> subjectMap;

    protected final MultiMap<URI, T> propMap;

    protected final MultiMap<Value, T> objMap;

    protected final List<T> allWildTrackers;

    /**
     * Create a new TrackerManager
     */
    public TrackerManager() {
        trackers = new CopyOnWriteArrayList<T>();
        subjectMap = new CopyOnWriteMultiHashMap<Resource, T>();
        propMap = new CopyOnWriteMultiHashMap<URI, T>();
        objMap = new CopyOnWriteMultiHashMap<Value, T>();
        namedGraphMap = new CopyOnWriteMultiHashMap<URI, T>();
        allWildTrackers = new CopyOnWriteArrayList<T>();
    }

    /**
     * Clear the contents of trackers and all indexes.
     */
    public void clear() {
        trackers.clear();
        namedGraphMap.clear();
        subjectMap.clear();
        propMap.clear();
        objMap.clear();
        allWildTrackers.clear();
    }

    /**
     * Get the size of the trackers
     * 
     * @return the size of the trackers
     */
    public int size() {
        return trackers.size();
    }

    /**
     * @return true if empty
     */
    public boolean isEmpty() {
        return trackers.isEmpty();
    }

    /**
     * Add a new tracker and index it
     * 
     * @param tracker
     *            to add
     */
    public void addTracker(T tracker) {
        trackers.add(tracker);
        addMaps(tracker);
    }

    /**
     * Remove a tracker and remove it from the indexes
     * 
     * @param tracker
     *            tracker to remove
     */
    public void removeTracker(T tracker) {
        trackers.remove(tracker);
        removeMaps(tracker);
    }

    protected void addMaps(T tracker) {
        Set<URI> g = tracker.getNamedGraphUri();
        Set<Resource> s = tracker.getSubject();
        Set<URI> p = tracker.getPredicate();
        Set<Value> o = tracker.getObject();
        if (s != null && !s.isEmpty()) {
            for (Resource _s : s) {
                subjectMap.put(_s, tracker);
            }
        }
        if (p != null && !p.isEmpty()) {
            for (URI _p : p) {
                propMap.put(_p, tracker);
            }
        }
        if (o != null && !o.isEmpty()) {
            for (Value _o : o) {
                objMap.put(_o, tracker);
            }
        }
        if (g != null && !g.isEmpty()) {
            for (URI ng : g) {
                namedGraphMap.put(ng, tracker);
            }
        }

        if ((s == null || s.isEmpty()) && (p == null || p.isEmpty()) && (o == null || o.isEmpty())
                && (g == null || g.isEmpty())) {
            allWildTrackers.add(tracker);
        }
    }

    protected void removeMaps(T tracker) {
        Set<URI> g = tracker.getNamedGraphUri();
        Set<Resource> s = tracker.getSubject();
        Set<URI> p = tracker.getPredicate();
        Set<Value> o = tracker.getObject();
        if (s != null && !s.isEmpty()) {
            for (Resource _s : s) {
                subjectMap.remove(_s, tracker);
            }
        }
        if (p != null && !p.isEmpty()) {
            for (URI _p : p) {
                propMap.remove(_p, tracker);
            }
        }
        if (o != null && !o.isEmpty()) {
            for (Value _o : o) {
                objMap.remove(_o, tracker);
            }
        }
        if (g != null && !g.isEmpty()) {
            for (URI ng : g) {
                namedGraphMap.remove(ng, tracker);
            }
        }
        if ((s == null || s.isEmpty()) && (p == null || p.isEmpty()) && (o == null || o.isEmpty())
                && (g == null || g.isEmpty())) {
            allWildTrackers.remove(tracker);
        }
    }

    static class StmtSetComp implements Comparator<Collection<?>> {

        public int compare(Collection<?> o1, Collection<?> o2) {
            int result = 0;
            if (o1.size() == o2.size())
                return result;
            return (o1.size() < o2.size()) ? -1 : 1;
        }
    }
}