<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>NotificationList.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">jUDDI Core Services</a> &gt; <a href="index.source.html" class="el_package">org.apache.juddi.subscription</a> &gt; <span class="el_source">NotificationList.java</span></div><h1>NotificationList.java</h1><pre class="source lang-java linenums">/*
 * Copyright 2001-2008 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
 * 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 &quot;AS IS&quot; 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.juddi.subscription;

import org.apache.commons.collections.buffer.CircularFifoBuffer;
import org.apache.commons.collections.Buffer;
import org.apache.commons.collections.BufferUtils;

public class NotificationList&lt;T&gt;  {
<span class="nc" id="L24">	private static NotificationList&lt;String&gt; nl = null;</span>
<span class="nc" id="L25">	private static Buffer list = null;</span>
	
<span class="nc" id="L27">	private NotificationList() {	</span>
<span class="nc" id="L28">		list = BufferUtils.synchronizedBuffer(new CircularFifoBuffer(10));</span>
<span class="nc" id="L29">	}</span>
	
	public static NotificationList&lt;String&gt; getInstance() {
<span class="nc bnc" id="L32" title="All 2 branches missed.">		if (nl == null) {</span>
<span class="nc" id="L33">			nl = new NotificationList&lt;String&gt;();</span>
		}
<span class="nc" id="L35">		return nl;	</span>
	}
	
	public Buffer getNotifications() {
<span class="nc" id="L39">		return list;</span>
	}
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.7.9.201702052155</span></div></body></html>