/*******************************************************************************
* Copyright (c) 2014 EclipseSource and others.
* 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:
* EclipseSource - initial API and implementation
******************************************************************************/
package com.eclipsesource.tabris.passepartout.internal;
import static com.eclipsesource.tabris.passepartout.internal.Clauses.whenNull;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import com.eclipsesource.tabris.passepartout.Query;
import com.eclipsesource.tabris.passepartout.QueryListener;
import com.eclipsesource.tabris.passepartout.UIEnvironment;
public class QueryNotifier {
private final Map<Query, QueryListener> queryListeners;
private final Map<Query, QueryListener> activeQueryListeners;
public QueryNotifier() {
queryListeners = new HashMap<Query, QueryListener>();
activeQueryListeners = new HashMap<Query, QueryListener>();
}
public void addQueryListener( Query query, QueryListener listener ) {
whenNull( query ).throwIllegalArgument( "Query must not be null" );
whenNull( listener ).throwIllegalArgument( "QueryListener must not be null" );
queryListeners.put( query, listener );
}
public void removeQueryListener( Query query ) {
whenNull( query ).throwIllegalArgument( "Query must not be null" );
queryListeners.remove( query );
activeQueryListeners.remove( query );
}
public void notifyListeners( UIEnvironment environment ) {
whenNull( environment ).throwIllegalArgument( "UIEnvironment must not be null" );
QueryVerifier verifier = new QueryVerifier( environment );
for( Entry<Query, QueryListener> entry : queryListeners.entrySet() ) {
Query query = entry.getKey();
sortOutInvalidQueries( verifier );
if( verifier.complies( query ) && !activeQueryListeners.containsKey( query ) ) {
activeQueryListeners.put( query, entry.getValue() );
entry.getValue().activated( query );
}
}
}
private void sortOutInvalidQueries( QueryVerifier verifier ) {
Map<Query, QueryListener> oldListeners = new HashMap<Query, QueryListener>( activeQueryListeners );
for( Entry<Query, QueryListener> entry : oldListeners.entrySet() ) {
if( !verifier.complies( entry.getKey() ) ) {
activeQueryListeners.remove( entry.getKey() );
entry.getValue().deactivated( entry.getKey() );
}
}
}
}