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.process.ProcessCallable;
019    import com.liferay.portal.kernel.util.ReflectionUtil;
020    
021    import java.lang.management.BufferPoolMXBean;
022    import java.lang.management.ClassLoadingMXBean;
023    import java.lang.management.CompilationMXBean;
024    import java.lang.management.GarbageCollectorMXBean;
025    import java.lang.management.ManagementFactory;
026    import java.lang.management.MemoryMXBean;
027    import java.lang.management.MemoryManagerMXBean;
028    import java.lang.management.MemoryPoolMXBean;
029    import java.lang.management.OperatingSystemMXBean;
030    import java.lang.management.PlatformLoggingMXBean;
031    import java.lang.management.PlatformManagedObject;
032    import java.lang.management.RuntimeMXBean;
033    import java.lang.management.ThreadMXBean;
034    
035    import java.util.ArrayList;
036    import java.util.List;
037    import java.util.concurrent.Future;
038    
039    import javax.management.ObjectName;
040    
041    /**
042     * @author Shuyang Zhou
043     */
044    public class RemoteFabricStatus implements FabricStatus {
045    
046            public RemoteFabricStatus(ProcessCallableExecutor processCallableExecutor) {
047                    this.processCallableExecutor = processCallableExecutor;
048            }
049    
050            @Override
051            public AdvancedOperatingSystemMXBean getAdvancedOperatingSystemMXBean() {
052                    OperatingSystemMXBean operatingSystemMXBean =
053                            ManagementFactory.getOperatingSystemMXBean();
054    
055                    return JMXProxyUtil.newProxy(
056                            operatingSystemMXBean.getObjectName(),
057                            AdvancedOperatingSystemMXBean.class, processCallableExecutor);
058            }
059    
060            @Override
061            public List<BufferPoolMXBean> getBufferPoolMXBeans() {
062                    return getPlatformMXBeans(
063                            BufferPoolMXBean.class, processCallableExecutor);
064            }
065    
066            @Override
067            public ClassLoadingMXBean getClassLoadingMXBean() {
068                    ClassLoadingMXBean classLoadingMXBean =
069                            ManagementFactory.getClassLoadingMXBean();
070    
071                    return JMXProxyUtil.newProxy(
072                            classLoadingMXBean.getObjectName(), ClassLoadingMXBean.class,
073                            processCallableExecutor);
074            }
075    
076            @Override
077            public CompilationMXBean getCompilationMXBean() {
078                    CompilationMXBean compilationMXBean =
079                            ManagementFactory.getCompilationMXBean();
080    
081                    return JMXProxyUtil.newProxy(
082                            compilationMXBean.getObjectName(), CompilationMXBean.class,
083                            processCallableExecutor);
084            }
085    
086            @Override
087            public List<GarbageCollectorMXBean> getGarbageCollectorMXBeans() {
088                    return getPlatformMXBeans(
089                            GarbageCollectorMXBean.class, processCallableExecutor);
090            }
091    
092            @Override
093            public List<MemoryManagerMXBean> getMemoryManagerMXBeans() {
094                    return getPlatformMXBeans(
095                            MemoryManagerMXBean.class, processCallableExecutor);
096            }
097    
098            @Override
099            public MemoryMXBean getMemoryMXBean() {
100                    MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
101    
102                    return JMXProxyUtil.newProxy(
103                            memoryMXBean.getObjectName(), MemoryMXBean.class,
104                            processCallableExecutor);
105            }
106    
107            @Override
108            public List<MemoryPoolMXBean> getMemoryPoolMXBeans() {
109                    return getPlatformMXBeans(
110                            MemoryPoolMXBean.class, processCallableExecutor);
111            }
112    
113            @Override
114            public PlatformLoggingMXBean getPlatformLoggingMXBean() {
115                    PlatformLoggingMXBean platformLoggingMXBean =
116                            ManagementFactory.getPlatformMXBean(PlatformLoggingMXBean.class);
117    
118                    return JMXProxyUtil.newProxy(
119                            platformLoggingMXBean.getObjectName(), PlatformLoggingMXBean.class,
120                            processCallableExecutor);
121            }
122    
123            @Override
124            public RuntimeMXBean getRuntimeMXBean() {
125                    RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
126    
127                    return JMXProxyUtil.newProxy(
128                            runtimeMXBean.getObjectName(), RuntimeMXBean.class,
129                            processCallableExecutor);
130            }
131    
132            @Override
133            public ThreadMXBean getThreadMXBean() {
134                    ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
135    
136                    return JMXProxyUtil.newProxy(
137                            threadMXBean.getObjectName(), ThreadMXBean.class,
138                            processCallableExecutor);
139            }
140    
141            protected static <T extends PlatformManagedObject> List<T>
142                    getPlatformMXBeans(
143                            Class<T> mxBeanInterface,
144                            ProcessCallableExecutor processCallableExecutor) {
145    
146                    List<T> list = new ArrayList<>();
147    
148                    try {
149                            Future<ArrayList<ObjectName>> future =
150                                    processCallableExecutor.execute(
151                                            new GetPlatformMXBeanObjectNamesProcessCallable(
152                                                    mxBeanInterface));
153    
154                            for (ObjectName objectName : future.get()) {
155                                    list.add(
156                                            JMXProxyUtil.newProxy(
157                                                    objectName, mxBeanInterface, processCallableExecutor));
158                            }
159                    }
160                    catch (Exception e) {
161                            return ReflectionUtil.throwException(e);
162                    }
163    
164                    return list;
165            }
166    
167            protected final ProcessCallableExecutor processCallableExecutor;
168    
169            protected static class GetPlatformMXBeanObjectNamesProcessCallable
170                    implements ProcessCallable<ArrayList<ObjectName>> {
171    
172                    public GetPlatformMXBeanObjectNamesProcessCallable(
173                            Class<? extends PlatformManagedObject> clazz) {
174    
175                            _clazz = clazz;
176                    }
177    
178                    @Override
179                    public ArrayList<ObjectName> call() {
180                            ArrayList<ObjectName> objectNames = new ArrayList<>();
181    
182                            for (PlatformManagedObject platformManagedObject :
183                                            ManagementFactory.getPlatformMXBeans(_clazz)) {
184    
185                                    objectNames.add(platformManagedObject.getObjectName());
186                            }
187    
188                            return objectNames;
189                    }
190    
191                    private static final long serialVersionUID = 1L;
192    
193                    private final Class<? extends PlatformManagedObject> _clazz;
194    
195            }
196    
197    }