/*
 * Copyright 2014-2017 Real Logic Ltd.
 *
 * 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 io.aeron;

import org.agrona.collections.Int2ObjectHashMap;

import java.util.*;

import static org.agrona.collections.CollectionUtil.getOrDefault;

/**
 * Map for navigating to active {@link Publication}s.
 */
class ActivePublications
{
    private final Map<String, Int2ObjectHashMap<Publication>> publicationsByChannelMap = new HashMap<>();

    public Publication get(final String channel, final int streamId)
    {
        final Int2ObjectHashMap<Publication> publicationByStreamIdMap = publicationsByChannelMap.get(channel);
        if (null == publicationByStreamIdMap)
        {
            return null;
        }

        return publicationByStreamIdMap.get(streamId);
    }

    public Publication put(final String channel, final int streamId, final Publication publication)
    {
        final Int2ObjectHashMap<Publication> publicationByStreamIdMap =
            getOrDefault(publicationsByChannelMap, channel, (ignore) -> new Int2ObjectHashMap<>());

        return publicationByStreamIdMap.put(streamId, publication);
    }

    public Publication remove(final String channel, final int streamId)
    {
        final Int2ObjectHashMap<Publication> publicationByStreamIdMap = publicationsByChannelMap.get(channel);
        if (null == publicationByStreamIdMap)
        {
            return null;
        }

        final Publication publication = publicationByStreamIdMap.remove(streamId);
        if (publicationByStreamIdMap.isEmpty())
        {
            publicationsByChannelMap.remove(channel);
        }

        return publication;
    }

    public void close()
    {
        for (final Int2ObjectHashMap<Publication> publications : publicationsByChannelMap.values())
        {
            for (final Publication publication : publications.values())
            {
                publication.forceClose();
            }
        }

        publicationsByChannelMap.clear();
    }
}

@@ -687,75 +687,8 @@
 *;%0A%0A
-import static org.agrona.collections.CollectionUtil.getOrDefault;%0A%0A
 /**%0A
@@ -790,16 +790,20 @@
 e final 
+Hash
 Map%3CStri
@@ -1215,32 +1215,69 @@
 reamId);%0A    %7D%0A%0A
+    @SuppressWarnings(%22Java8MapApi%22)%0A
     public Publi
@@ -1366,38 +1366,32 @@
 )%0A    %7B%0A        
-final 
 Int2ObjectHashMa
@@ -1435,34 +1435,9 @@
 ap =
-%0A            getOrDefault(
+ 
 publ
@@ -1460,58 +1460,231 @@
 lMap
-, 
+.get(
 channel
-, (ignore) -%3E new Int2ObjectHashMap%3C%3E());
+);%0A        if (null == publicationByStreamIdMap)%0A        %7B%0A            publicationByStreamIdMap = new Int2ObjectHashMap%3C%3E();%0A            publicationsByChannelMap.put(channel, publicationByStreamIdMap);%0A        %7D
 %0A%0A  

Improve the efficiency of ActivePublications.