/*
 * Copyright 2015 Open Networking Laboratory
 *
 * 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.onosproject.driver.query;

import org.onlab.util.GuavaCollectors;
import org.onosproject.net.OchPort;
import org.onosproject.net.OduSignalType;
import org.onosproject.net.Port;
import org.onosproject.net.PortNumber;
import org.onosproject.net.TributarySlot;
import org.onosproject.net.device.DeviceService;
import org.onosproject.net.driver.AbstractHandlerBehaviour;
import org.onosproject.net.behaviour.TributarySlotQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collections;
import java.util.Set;
import java.util.stream.IntStream;

/**
 * TributarySlotQuery implementation which responds that all slots of ODU2 or ODU4 are available for the port.
 */
public class DefaultTributarySlotQuery extends AbstractHandlerBehaviour implements TributarySlotQuery {

    private static final Logger log = LoggerFactory.getLogger(DefaultTributarySlotQuery.class);

    private static final int TOTAL_ODU2_TRIBUTARY_SLOTS = 8;
    private static final int TOTAL_ODU4_TRIBUTARY_SLOTS = 80;

    private static Set<TributarySlot> getEntireOdu2TributarySlots() {
        return IntStream.rangeClosed(1, TOTAL_ODU2_TRIBUTARY_SLOTS)
                .mapToObj(TributarySlot::of)
                .collect(GuavaCollectors.toImmutableSet());
    }

    private static Set<TributarySlot> getEntireOdu4TributarySlots() {
        return IntStream.rangeClosed(1, TOTAL_ODU4_TRIBUTARY_SLOTS)
                .mapToObj(TributarySlot::of)
                .collect(GuavaCollectors.toImmutableSet());
    }

    private static final Set<TributarySlot> ENTIRE_ODU2_TRIBUTARY_SLOTS = getEntireOdu2TributarySlots();
    private static final Set<TributarySlot> ENTIRE_ODU4_TRIBUTARY_SLOTS = getEntireOdu4TributarySlots();

    @Override
    public Set<TributarySlot> queryTributarySlots(PortNumber port) {
        // currently return all slots by default.
        DeviceService deviceService = this.handler().get(DeviceService.class);
        Port p = deviceService.getPort(this.data().deviceId(), port);

        if (!(p instanceof OchPort)) {
            return Collections.emptySet();
        }
        OduSignalType signalType = ((OchPort) p).signalType();
        switch (signalType) {
            case ODU2:
                return ENTIRE_ODU2_TRIBUTARY_SLOTS;
            case ODU4:
                return ENTIRE_ODU4_TRIBUTARY_SLOTS;
            default:
                log.error("Unsupported signal type {}", signalType);
                return Collections.emptySet();
        }
    }
}
@@ -759,16 +759,94 @@
 alType;%0A
+import org.onosproject.net.OtuPort;%0Aimport org.onosproject.net.OtuSignalType;%0A
 import o
@@ -2714,140 +2714,872 @@
     
-if (!(p instanceof OchPort)) %7B%0A            return Collections.emptySet();%0A        %7D%0A        OduSignalType signalType = ((OchPort) p)
+switch (p.type()) %7B%0A            case OCH:%0A                return queryOchTributarySlots((OchPort) p);%0A            case OTU:%0A                return queryOtuTributarySlots((OtuPort) p);%0A            default:%0A                return Collections.emptySet();%0A        %7D%0A    %7D%0A%0A    private Set%3CTributarySlot%3E queryOchTributarySlots(OchPort ochPort) %7B%0A        OduSignalType signalType = ochPort.signalType();%0A        switch (signalType) %7B%0A            case ODU2:%0A                return ENTIRE_ODU2_TRIBUTARY_SLOTS;%0A            case ODU4:%0A                return ENTIRE_ODU4_TRIBUTARY_SLOTS;%0A            default:%0A                log.error(%22Unsupported signal type %7B%7D for %7B%7D%22, signalType, ochPort);%0A                return Collections.emptySet();%0A        %7D%0A    %7D%0A%0A    private Set%3CTributarySlot%3E queryOtuTributarySlots(OtuPort otuPort) %7B%0A        OtuSignalType signalType = otuPort
 .sig
@@ -3629,33 +3629,33 @@
           case O
-D
+T
 U2:%0A            
@@ -3704,33 +3704,33 @@
           case O
-D
+T
 U4:%0A            
@@ -3843,16 +3843,23 @@
  type %7B%7D
+ for %7B%7D
 %22, signa
@@ -3863,16 +3863,25 @@
 gnalType
+, otuPort
 );%0A     

Add support for OTU ports in TributarySlotQuery