/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you 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.apache.airavata.datacat.agent.dispatcher;

import org.apache.airavata.datacat.models.OutputMetadataDTO;

import java.util.LinkedList;

public class MetadataDispatcherQueue {
    public static MetadataDispatcherQueue instance;
    private LinkedList<OutputMetadataDTO> queue;

    private MetadataDispatcherQueue() {
        queue = new LinkedList<OutputMetadataDTO>();
    }

    /**
     * Returns a singleton dispatch queue object
     *
     * @return Dispatch queue object
     */
    public static MetadataDispatcherQueue getInstance() {
        if (instance == null) {
            instance = new MetadataDispatcherQueue();
        }
        return instance;
    }

    /**
     * Put a message into the dispatch queue
     *
     * @param outputMetadataDTO
     */
    public synchronized void addMetadataToQueue(OutputMetadataDTO outputMetadataDTO) {
        queue.add(outputMetadataDTO);
        notifyAll();
    }

    /**
     * Returns a FileMetadata object from the dispatcher queue
     *
     * @return FileMetadata object
     */
    public synchronized OutputMetadataDTO getMetadataFromQueue() {
        OutputMetadataDTO outputMetadataDTO = queue.pollFirst();
        while (outputMetadataDTO == null) {

            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            outputMetadataDTO = queue.pollFirst();
        }
        return outputMetadataDTO;
    }

    /**
     * Returns dispatch queue size
     *
     * @return queue size
     */
    public long getQueueSize() {
        return queue.size();
    }
}
