001    /**
002     *  Licensed to the Apache Software Foundation (ASF) under one or more
003     *  contributor license agreements.  See the NOTICE file distributed with
004     *  this work for additional information regarding copyright ownership.
005     *  The ASF licenses this file to You under the Apache License, Version 2.0
006     *  (the "License"); you may not use this file except in compliance with
007     *  the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    package org.apache.geronimo.console.jsr77;
018    
019    import java.io.Serializable;
020    import java.text.NumberFormat;
021    
022    import org.directwebremoting.annotations.DataTransferObject;
023    import org.directwebremoting.annotations.RemoteProperty;
024    
025    /**
026     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
027     */
028    @DataTransferObject
029    public class DynamicServerInfo implements Serializable {
030        private final static long BYTES_MAX = 2048;
031        private final static long KB_MAX = BYTES_MAX * 1024l;
032        private final static long MB_MAX = KB_MAX * 1024l;
033        private final static long GB_MAX = MB_MAX * 1024l;
034        private final static long TB_MAX = GB_MAX * 1024l;
035        private final static double KB_DIV = 1024;
036        private final static double MB_DIV = KB_DIV*1024d;
037        private final static double GB_DIV = MB_DIV*1024d;
038        private final static double TB_DIV = GB_DIV*1024d;
039        private NumberFormat dec2Format;
040        private String memoryCurrent;
041        private String memoryMost;
042        private String memoryAllocated;
043        private String upTime;
044        private long bytesCurrent, bytesMost, bytesAllocated;
045    
046        public DynamicServerInfo(long upTime) {
047            this.upTime = calculateTime(upTime);
048            memoryAllocated = memoryCurrent = memoryMost = "Unknown";
049        }
050    
051        public DynamicServerInfo(long memoryCurrent, long memoryMost, long memoryAllocated, long upTime) {
052            dec2Format = NumberFormat.getNumberInstance();
053            dec2Format.setMaximumFractionDigits(2);
054            bytesCurrent = memoryCurrent;
055            bytesMost = memoryMost;
056            bytesAllocated = memoryAllocated;
057            this.memoryCurrent = calculateMemory(memoryCurrent);
058            this.memoryMost = calculateMemory(memoryMost);
059            this.memoryAllocated = calculateMemory(memoryAllocated);
060            this.upTime = calculateTime(upTime);
061        }
062    
063        private String calculateMemory(long bytes) {
064            if(bytes < BYTES_MAX) {
065                return bytes+" B";
066            } else if(bytes < KB_MAX) {
067                return dec2Format.format((double)bytes/KB_DIV)+" kB";
068            } else if(bytes < MB_MAX) {
069                return dec2Format.format((double)bytes/MB_DIV)+" MB";
070            } else if(bytes < GB_MAX) {
071                return dec2Format.format((double)bytes/GB_DIV)+" GB";
072            } else if(bytes < TB_MAX) {
073                return dec2Format.format((double)bytes/TB_DIV)+" TB";
074            } else {
075                return "Out of range";
076            }
077        }
078    
079        private String calculateTime(long millis) {
080            int secs = (int)(millis/1000L);
081            int days = secs/86400;
082            secs = secs % 86400;
083            int hours = secs/3600;
084            secs = secs % 3600;
085            int minutes = secs / 60;
086            secs = secs % 60;
087            StringBuffer buf = new StringBuffer();
088            if(days > 1) {
089                buf.append(' ').append(days).append(" days");
090            } else if(days > 0) {
091                buf.append(' ').append(days).append(" day");
092            }
093            if(hours > 1) {
094                buf.append(' ').append(hours).append(" hours");
095            } else if(hours > 0) {
096                buf.append(' ').append(hours).append(" hour");
097            }
098            if(minutes > 1) {
099                buf.append(' ').append(minutes).append(" minutes");
100            } else if(minutes > 0) {
101                buf.append(' ').append(minutes).append(" minute");
102            }
103            if(secs > 1) {
104                buf.append(' ').append(secs).append(" seconds");
105            } else if(secs > 0) {
106                buf.append(' ').append(secs).append(" second");
107            }
108            buf.delete(0,1);
109            return buf.toString();
110        }
111    
112        @RemoteProperty
113        public String getMemoryCurrent() {
114            return memoryCurrent;
115        }
116    
117        @RemoteProperty
118        public String getMemoryMost() {
119            return memoryMost;
120        }
121    
122        @RemoteProperty
123        public String getMemoryAllocated() {
124            return memoryAllocated;
125        }
126    
127        @RemoteProperty
128        public String getUpTime() {
129            return upTime;
130        }
131    
132        @RemoteProperty
133        public long getBytesCurrent() {
134            return bytesCurrent;
135        }
136    
137        @RemoteProperty
138        public long getBytesMost() {
139            return bytesMost;
140        }
141    
142        @RemoteProperty
143        public long getBytesAllocated() {
144            return bytesAllocated;
145        }
146    }