/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.workbench.services.verifier.api.client.index.select;
import java.util.ArrayList;
import java.util.List;
import org.drools.workbench.services.verifier.api.client.index.keys.Value;
import org.drools.workbench.services.verifier.api.client.index.matchers.Matcher;
import org.drools.workbench.services.verifier.api.client.maps.MultiMap;
import org.drools.workbench.services.verifier.api.client.maps.MultiMapChangeHandler;
import org.uberfire.commons.validation.PortablePreconditions;
public class Listen<T>
extends Select<T> {
private final ArrayList<AllListener<T>> allListeners = new ArrayList<>();
private final ArrayList<FirstListener<T>> firstListeners = new ArrayList<>();
private final ArrayList<LastListener<T>> lastListeners = new ArrayList<>();
private Entry<T> first;
private Entry<T> last;
private MultiMap<Value, T, List<T>> all;
public Listen( final MultiMap<Value, T, List<T>> map,
final Matcher matcher ) {
super( map,
matcher );
PortablePreconditions.checkNotNull( "map",
map );
map.addChangeListener( new MultiMapChangeHandler<Value, T>() {
@Override
public void onChange( final ChangeSet<Value, T> changeSet ) {
if ( hasNoListeners() ) {
return;
}
final ChangeHelper<T> changeHelper = new ChangeHelper<T>( changeSet,
matcher );
if ( !firstListeners.isEmpty() ) {
if ( first == null || changeHelper.firstChanged( first ) ) {
first = firstEntry();
notifyFirstListeners();
}
}
if ( !lastListeners.isEmpty() ) {
if ( last == null || changeHelper.lastChanged( last ) ) {
last = lastEntry();
notifyLastListeners();
}
}
if ( !allListeners.isEmpty() ) {
all = asMap();
notifyAllListeners();
}
}
} );
}
/**
* Well not *all*, just the AllListeners.
*/
private void notifyAllListeners() {
for ( final AllListener<T> allListener : allListeners ) {
allListener.onAllChanged( all.allValues() );
}
}
private void notifyFirstListeners() {
for ( final FirstListener<T> firstListener : firstListeners ) {
firstListener.onFirstChanged( first.getValue() );
}
}
private void notifyLastListeners() {
for ( final LastListener<T> lastListener : lastListeners ) {
lastListener.onLastChanged( last.getValue() );
}
}
private boolean hasNoListeners() {
return allListeners.isEmpty() && firstListeners.isEmpty() && lastListeners.isEmpty();
}
public void first( final FirstListener<T> firstListener ) {
if ( first == null ) {
this.first = firstEntry();
}
firstListeners.add( firstListener );
}
public void last( final LastListener<T> lastListener ) {
if ( last == null ) {
this.last = lastEntry();
}
lastListeners.add( lastListener );
}
public void all( final AllListener<T> allListener ) {
if ( all == null ) {
this.all = asMap();
}
this.allListeners.add( allListener );
}
}