001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.fabric.status;
016    
017    import com.liferay.portal.fabric.status.JMXProxyUtil.ProcessCallableExecutor;
018    import com.liferay.portal.kernel.concurrent.DefaultNoticeableFuture;
019    import com.liferay.portal.kernel.concurrent.NoticeableFuture;
020    import com.liferay.portal.kernel.process.ProcessCallable;
021    import com.liferay.portal.kernel.process.ProcessException;
022    
023    import java.io.Serializable;
024    
025    import java.lang.management.BufferPoolMXBean;
026    import java.lang.management.ClassLoadingMXBean;
027    import java.lang.management.CompilationMXBean;
028    import java.lang.management.GarbageCollectorMXBean;
029    import java.lang.management.ManagementFactory;
030    import java.lang.management.MemoryMXBean;
031    import java.lang.management.MemoryManagerMXBean;
032    import java.lang.management.MemoryPoolMXBean;
033    import java.lang.management.OperatingSystemMXBean;
034    import java.lang.management.PlatformLoggingMXBean;
035    import java.lang.management.RuntimeMXBean;
036    import java.lang.management.ThreadMXBean;
037    
038    import java.util.List;
039    
040    /**
041     * @author Shuyang Zhou
042     */
043    public class LocalFabricStatus implements FabricStatus {
044    
045            public static final FabricStatus INSTANCE = new LocalFabricStatus();
046    
047            @Override
048            public AdvancedOperatingSystemMXBean getAdvancedOperatingSystemMXBean() {
049                    OperatingSystemMXBean operatingSystemMXBean =
050                            ManagementFactory.getOperatingSystemMXBean();
051    
052                    return JMXProxyUtil.newProxy(
053                            operatingSystemMXBean.getObjectName(),
054                            AdvancedOperatingSystemMXBean.class, processCallableExecutor);
055            }
056    
057            @Override
058            public List<BufferPoolMXBean> getBufferPoolMXBeans() {
059                    return ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class);
060            }
061    
062            @Override
063            public ClassLoadingMXBean getClassLoadingMXBean() {
064                    return ManagementFactory.getClassLoadingMXBean();
065            }
066    
067            @Override
068            public CompilationMXBean getCompilationMXBean() {
069                    return ManagementFactory.getCompilationMXBean();
070            }
071    
072            @Override
073            public List<GarbageCollectorMXBean> getGarbageCollectorMXBeans() {
074                    return ManagementFactory.getPlatformMXBeans(
075                            GarbageCollectorMXBean.class);
076            }
077    
078            @Override
079            public List<MemoryManagerMXBean> getMemoryManagerMXBeans() {
080                    return ManagementFactory.getPlatformMXBeans(MemoryManagerMXBean.class);
081            }
082    
083            @Override
084            public MemoryMXBean getMemoryMXBean() {
085                    return ManagementFactory.getMemoryMXBean();
086            }
087    
088            @Override
089            public List<MemoryPoolMXBean> getMemoryPoolMXBeans() {
090                    return ManagementFactory.getPlatformMXBeans(MemoryPoolMXBean.class);
091            }
092    
093            @Override
094            public PlatformLoggingMXBean getPlatformLoggingMXBean() {
095                    return ManagementFactory.getPlatformMXBean(PlatformLoggingMXBean.class);
096            }
097    
098            @Override
099            public RuntimeMXBean getRuntimeMXBean() {
100                    return ManagementFactory.getRuntimeMXBean();
101            }
102    
103            @Override
104            public ThreadMXBean getThreadMXBean() {
105                    return ManagementFactory.getThreadMXBean();
106            }
107    
108            protected static final ProcessCallableExecutor processCallableExecutor =
109                    new ProcessCallableExecutor() {
110    
111                            @Override
112                            public <V extends Serializable> NoticeableFuture<V> execute(
113                                    ProcessCallable<V> processCallable) {
114    
115                                    DefaultNoticeableFuture<V> defaultNoticeableFuture =
116                                            new DefaultNoticeableFuture<>();
117    
118                                    try {
119                                            defaultNoticeableFuture.set(processCallable.call());
120                                    }
121                                    catch (ProcessException pe) {
122                                            defaultNoticeableFuture.setException(pe);
123                                    }
124    
125                                    return defaultNoticeableFuture;
126                            }
127    
128                    };
129    
130            private LocalFabricStatus() {
131            }
132    
133    }