/*
Copyright 2008-2010 Gephi
Authors : Mathieu Bastian <mathieu.bastian@gephi.org>
Website : http://www.gephi.org
This file is part of Gephi.
Gephi is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
Gephi is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Gephi. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gephi.filters;
import java.util.HashMap;
import java.util.Map;
import org.gephi.filters.api.FilterLibrary;
import org.gephi.filters.api.Query;
import org.gephi.filters.spi.Category;
import org.gephi.filters.spi.CategoryBuilder;
import org.gephi.filters.spi.Filter;
import org.gephi.filters.spi.FilterBuilder;
import org.gephi.filters.spi.FilterLibraryMask;
import org.gephi.graph.api.GraphController;
import org.gephi.graph.api.GraphModel;
import org.openide.util.Lookup;
import org.openide.util.lookup.AbstractLookup;
import org.openide.util.lookup.InstanceContent;
/**
*
* @author Mathieu Bastian
*/
public class FilterLibraryImpl implements FilterLibrary {
private AbstractLookup lookup;
private InstanceContent content;
private Map<Class<? extends Filter>, FilterBuilder> buildersMap;
public FilterLibraryImpl() {
content = new InstanceContent();
lookup = new AbstractLookup(content);
for (FilterBuilder builder : Lookup.getDefault().lookupAll(FilterBuilder.class)) {
content.add(builder);
}
for (Query query : Lookup.getDefault().lookupAll(Query.class)) {
content.add(query);
}
for (CategoryBuilder catBuilder : Lookup.getDefault().lookupAll(CategoryBuilder.class)) {
content.add(catBuilder);
}
content.add(new HierarchicalGraphMask());
}
private void buildBuildersMap() {
buildersMap = new HashMap<Class<? extends Filter>, FilterBuilder>();
for (FilterBuilder builder : lookup.lookupAll(FilterBuilder.class)) {
try {
Filter f = builder.getFilter();
buildersMap.put(f.getClass(), builder);
builder.destroy(f);
} catch (Exception e) {
}
}
for (CategoryBuilder catBuilder : Lookup.getDefault().lookupAll(CategoryBuilder.class)) {
for (FilterBuilder builder : catBuilder.getBuilders()) {
try {
Filter f = builder.getFilter();
buildersMap.put(f.getClass(), builder);
builder.destroy(f);
} catch (Exception e) {
}
}
}
}
public Lookup getLookup() {
return lookup;
}
public void addBuilder(FilterBuilder builder) {
content.add(builder);
}
public void removeBuilder(FilterBuilder builder) {
content.remove(builder);
}
public void registerMask(FilterLibraryMask mask) {
content.add(mask);
}
public void unregisterMask(FilterLibraryMask mask) {
content.remove(mask);
}
public FilterBuilder getBuilder(Filter filter) {
if (buildersMap == null) {
buildBuildersMap();
}
if (buildersMap.get(filter.getClass()) != null) {
return buildersMap.get(filter.getClass());
}
buildBuildersMap();
if (buildersMap.get(filter.getClass()) != null) {
return buildersMap.get(filter.getClass());
}
return null;
}
public void saveQuery(Query query) {
content.add(query);
}
public void deleteQuery(Query query) {
content.remove(query);
}
private static class HierarchicalGraphMask implements FilterLibraryMask {
public Category getCategory() {
return FilterLibrary.HIERARCHY;
}
public boolean isValid() {
GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel();
return graphModel.isHierarchical();
}
}
}