001    /** 
002     * 
003     * Copyright 2004 Protique Ltd
004     * Copyright 2004 Hiram Chirino
005     * 
006     * Licensed under the Apache License, Version 2.0 (the "License"); 
007     * you may not use this file except in compliance with the License. 
008     * You may obtain a copy of the License at 
009     * 
010     * http://www.apache.org/licenses/LICENSE-2.0
011     * 
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS, 
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
015     * See the License for the specific language governing permissions and 
016     * limitations under the License. 
017     * 
018     **/
019    
020    package org.activemq.io.util;
021    import java.util.HashSet;
022    import java.util.Iterator;
023    
024    import org.activemq.capacity.BasicCapacityMonitor;
025    
026    import EDU.oswego.cs.dl.util.concurrent.SynchronizedLong;
027    
028    /**
029     * Keeps track of MemoryBoundedObjects 
030     *  
031     * @version $Revision: 1.1.1.1 $
032     */
033    public class MemoryBoundedObjectManager extends BasicCapacityMonitor {
034        
035        private final SynchronizedLong totalMemoryUsedSize = new SynchronizedLong(0);
036        private final HashSet managedObjects = new HashSet();
037        boolean closed;
038        private boolean supportJMSPriority = false;
039    
040        /**
041         * @param name
042         * @param maxSize
043         */
044        public MemoryBoundedObjectManager(String name, long maxSize) {
045            this(name, maxSize, false);
046        }
047    
048        public MemoryBoundedObjectManager(String name, long maxSize, boolean supportJMSPriority) {
049            super(name, maxSize);
050            this.supportJMSPriority = supportJMSPriority;
051        }
052    
053        synchronized public void add(MemoryBoundedObject o) {
054            managedObjects.add(o);
055        }
056    
057        /**
058         * close this queue manager and all associated MemoryBoundedQueues
059         */
060        public void close() {        
061            HashSet copy;
062            synchronized (this) {
063                if(closed)
064                    return;
065                closed=true;
066                copy = new HashSet(managedObjects);
067            }        
068            for (Iterator i = copy.iterator(); i.hasNext();) {
069                MemoryBoundedObject o = (MemoryBoundedObject) i.next();
070                o.close();
071            }
072        }
073    
074        /**
075         * @param name
076         */
077        public synchronized void remove(MemoryBoundedObject o) {
078            managedObjects.remove(o);
079        }
080    
081        /**
082         * @return the calculated total memory usage assocated with all it's queues
083         */
084        public long getTotalMemoryUsedSize() {
085            return totalMemoryUsedSize.get();
086        }
087    
088        /**
089         * @return true if this MemoryBoundedObjectManager has reached it's predefined limit
090         */
091        public boolean isFull() {
092            boolean result = totalMemoryUsedSize.get() >= super.getValueLimit();
093            return result;
094        }
095    
096        /**
097         * @return true if this MemoryBoundedObjectManager has reached it's predefined limit
098         */
099        public float getPercentFull() {
100            return ( totalMemoryUsedSize.get() / super.getValueLimit() );
101        }
102    
103        public void incrementMemoryUsed(int size) {
104            totalMemoryUsedSize.add(size);
105            super.setCurrentValue(totalMemoryUsedSize.get());
106        }
107    
108        public void decrementMemoryUsed(int size) {
109            totalMemoryUsedSize.subtract(size);
110            super.setCurrentValue(totalMemoryUsedSize.get());
111        }
112    
113        protected void finalize() {
114            close();
115        }
116    
117            /**
118             * @return Returns the supportJMSPriority.
119             */
120            public boolean isSupportJMSPriority() {
121                    return supportJMSPriority;
122            }
123            /**
124             * @param supportJMSPriority The supportJMSPriority to set.
125             */
126            public void setSupportJMSPriority(boolean supportJMSPriority) {
127                    this.supportJMSPriority = supportJMSPriority;
128            }
129    }