Skip to content

Commit

Permalink
WebDispatcherImpl implementation issues #7523
Browse files Browse the repository at this point in the history
keep elements with same order
avoid copying on every dispatch
  • Loading branch information
rymsha committed Oct 10, 2019
1 parent a79d359 commit 6290fda
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@

import java.util.Comparator;
import java.util.Iterator;
import java.util.NavigableSet;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Predicate;
import java.util.stream.Stream;

import org.osgi.service.component.annotations.Component;

import com.google.common.collect.ImmutableList;

import com.enonic.xp.web.WebRequest;
import com.enonic.xp.web.WebResponse;
import com.enonic.xp.web.handler.WebHandler;
Expand All @@ -16,31 +19,35 @@
public final class WebDispatcherImpl
implements WebDispatcher
{
private final NavigableSet<WebHandler> webHandlerList = new ConcurrentSkipListSet<>( Comparator.comparingInt( WebHandler::getOrder ) );
private final AtomicReference<ImmutableList<WebHandler>> webHandlerListRef = new AtomicReference<>( ImmutableList.of() );

@Override
public void add( final WebHandler webHandler )
{
this.webHandlerList.add( webHandler );
webHandlerListRef.updateAndGet( oldWebHandlers -> Stream.concat( oldWebHandlers.stream(), Stream.of( webHandler ) ).
sorted( Comparator.comparingInt( WebHandler::getOrder ) ).
collect( ImmutableList.toImmutableList() ) );
}

@Override
public void remove( final WebHandler webHandler )
{
this.webHandlerList.remove( webHandler );
webHandlerListRef.updateAndGet( oldWebHandlers -> oldWebHandlers.stream().filter( Predicate.not( w -> w != webHandler ) ).
sorted( Comparator.comparingInt( WebHandler::getOrder ) ).
collect( ImmutableList.toImmutableList() ) );
}

@Override
public WebResponse dispatch( final WebRequest req, final WebResponse res )
throws Exception
{
ServletRequestHolder.setRequest( req.getRawRequest() );
return new WebHandlerChainImpl( this.webHandlerList ).handle( req, res );
return new WebHandlerChainImpl( this.webHandlerListRef.get() ).handle( req, res );
}

@Override
public Iterator<WebHandler> iterator()
{
return this.webHandlerList.iterator();
return this.webHandlerListRef.get().iterator();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,18 @@ void orderedProperly()
assertSame( webHandler1, list.get( 2 ) );
assertSame( webHandlerMax, list.get( 3 ) );
}

@Test
void supportsEqualOderElements()
{
final WebDispatcherImpl dispatcher = new WebDispatcherImpl();
TestWebHandler webHandler0 = new TestWebHandler( 0 );
dispatcher.add( webHandler0 );
TestWebHandler webHandlerAlso0 = new TestWebHandler( 0 );
dispatcher.add( webHandlerAlso0 );

List<WebHandler> list = StreamSupport.stream( dispatcher.spliterator(), false ).collect( Collectors.toList() );
assertSame( webHandler0, list.get( 0 ) );
assertSame( webHandlerAlso0, list.get( 1 ) );
}
}

0 comments on commit 6290fda

Please sign in to comment.