/******************************************************************************* * Copyright (c) 2011 Subgraph. * 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 * * Contributors: * Subgraph - initial API and implementation ******************************************************************************/ package com.subgraph.vega.internal.model.conditions; import java.util.ArrayList; import java.util.List; import com.db4o.ObjectContainer; import com.db4o.events.CancellableObjectEventArgs; import com.db4o.events.Event4; import com.db4o.events.EventListener4; import com.db4o.events.EventRegistry; import com.db4o.events.EventRegistryFactory; import com.subgraph.vega.api.events.NamedEventListenerManager; import com.subgraph.vega.api.model.conditions.ConditionSetChanged; import com.subgraph.vega.api.model.conditions.IHttpConditionManager; import com.subgraph.vega.api.model.conditions.IHttpConditionSet; import com.subgraph.vega.api.model.conditions.IHttpConditionType; public class HttpConditionManager implements IHttpConditionManager { private final ObjectContainer database; private final List<IHttpConditionType> conditionTypes; private final NamedEventListenerManager conditionSetChangedManager; public HttpConditionManager(ObjectContainer database, NamedEventListenerManager conditionSetChangedManager) { this.database = database; this.conditionTypes = createConditionTypes(); this.conditionSetChangedManager = conditionSetChangedManager; final EventRegistry registry = EventRegistryFactory.forObjectContainer(database); registry.activating().addListener(new EventListener4<CancellableObjectEventArgs>() { @Override public void onEvent(Event4<CancellableObjectEventArgs> e, CancellableObjectEventArgs args) { final Object ob = args.object(); if(ob instanceof HttpConditionSet) ((HttpConditionSet)ob).setConditionManager(HttpConditionManager.this); else if(ob instanceof HttpConditionSetMap) ((HttpConditionSetMap)ob).setConditionManager(HttpConditionManager.this); } }); notifyAllChanged(); } private List<IHttpConditionType> createConditionTypes() { final List<IHttpConditionType> types = new ArrayList<IHttpConditionType>(); types.add(ConditionHostname.getConditionType()); types.add(ConditionRequestMethod.getConditionType()); types.add(ConditionHeader.getRequestConditionType()); types.add(ConditionPath.getConditionType()); types.add(ConditionHeader.getResponseConditionType()); types.add(ConditionResponseLength.getConditionType()); types.add(ConditionResponseStatusCode.getConditionType()); return types; } public void notifyClosed() { synchronized(conditionSetChangedManager) { conditionSetChangedManager.fireAllKeys(new ConditionSetChanged(null)); } } private void notifyAllChanged() { synchronized(conditionSetChangedManager) { for(String conditionSetName: conditionSetChangedManager.getAllKeys()) { IHttpConditionSet conditionSet = getConditionSet(conditionSetName); conditionSetChangedManager.fireEvent(conditionSetName, new ConditionSetChanged(conditionSet)); } } } void notifyConditionSetChanged(IHttpConditionSet conditionSet) { conditionSetChangedManager.fireEvent(conditionSet.getName(), new ConditionSetChanged(conditionSet)); } @Override public IHttpConditionSet getConditionSet(String name) { return getConditionSetMap().getConditionSet(name); } @Override public IHttpConditionSet getConditionSetCopy(String name) { return getConditionSetMap().getConditionSetCopy(name); } @Override public void saveConditionSet(String name, IHttpConditionSet conditionSet) { synchronized(conditionSetChangedManager) { getConditionSetMap().saveConditionSet(name, conditionSet); conditionSetChangedManager.fireEvent(name, new ConditionSetChanged(conditionSet)); } } private HttpConditionSetMap getConditionSetMap() { synchronized(this) { final List<HttpConditionSetMap> result = database.query(HttpConditionSetMap.class); if(result.size() == 1) return result.get(0); else if(result.size() > 1) throw new IllegalStateException("Duplicate HttpConditionSetMap records in database"); HttpConditionSetMap map = new HttpConditionSetMap(this); database.store(map); return map; } } @Override public List<IHttpConditionType> getConditionTypes() { return new ArrayList<IHttpConditionType>(conditionTypes); } }