/**
* Oshi (https://github.com/oshi/oshi)
*
* Copyright (c) 2010 - 2017 The Oshi Project Team
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Maintainers:
* dblock[at]dblock[dot]org
* widdis[at]gmail[dot]com
* enrico.bianchi[at]gmail[dot]com
*
* Contributors:
* https://github.com/oshi/oshi/graphs/contributors
*/
package oshi.json.hardware.impl;
import java.util.Properties;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonBuilderFactory;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import oshi.json.hardware.CentralProcessor;
import oshi.json.hardware.ComputerSystem;
import oshi.json.hardware.Display;
import oshi.json.hardware.GlobalMemory;
import oshi.json.hardware.HWDiskStore;
import oshi.json.hardware.HWPartition;
import oshi.json.hardware.HardwareAbstractionLayer;
import oshi.json.hardware.NetworkIF;
import oshi.json.hardware.PowerSource;
import oshi.json.hardware.Sensors;
import oshi.json.hardware.UsbDevice;
import oshi.json.json.AbstractOshiJsonObject;
import oshi.json.json.NullAwareJsonObjectBuilder;
import oshi.json.util.PropertiesUtil;
/**
* Wrapper class to implement HardwareAbstractionLayer interface with
* platform-specific objects
*/
public class HardwareAbstractionLayerImpl extends AbstractOshiJsonObject implements HardwareAbstractionLayer {
private static final long serialVersionUID = 1L;
private transient JsonBuilderFactory jsonFactory = Json.createBuilderFactory(null);
private oshi.hardware.HardwareAbstractionLayer hal;
private ComputerSystem computerSystem;
private CentralProcessor processor;
private GlobalMemory memory;
private Sensors sensors;
/**
* Creates a new platform-specific HardwareAbstractionLayer object wrapping
* the provided argument
*
* @param hardware
* a platform-specific HardwareAbstractionLayer object
*/
public HardwareAbstractionLayerImpl(oshi.hardware.HardwareAbstractionLayer hardware) {
this.hal = hardware;
}
/**
* {@inheritDoc}
*/
@Override
public ComputerSystem getComputerSystem() {
if (this.computerSystem == null) {
this.computerSystem = new ComputerSystemImpl(this.hal.getComputerSystem());
}
return this.computerSystem;
}
/**
* {@inheritDoc}
*/
@Override
public CentralProcessor getProcessor() {
if (this.processor == null) {
this.processor = new CentralProcessorImpl(this.hal.getProcessor());
}
return this.processor;
}
/**
* {@inheritDoc}
*/
@Override
public GlobalMemory getMemory() {
if (this.memory == null) {
this.memory = new GlobalMemoryImpl(this.hal.getMemory());
}
return this.memory;
}
/**
* {@inheritDoc}
*/
@Override
public PowerSource[] getPowerSources() {
oshi.hardware.PowerSource[] ps = this.hal.getPowerSources();
PowerSource[] powerSources = new PowerSource[ps.length];
for (int i = 0; i < ps.length; i++) {
powerSources[i] = new PowerSourceImpl(ps[i]);
}
return powerSources;
}
/**
* {@inheritDoc}
*/
@Override
public HWDiskStore[] getDiskStores() {
oshi.hardware.HWDiskStore[] ds = this.hal.getDiskStores();
HWDiskStore[] diskStores = new HWDiskStore[ds.length];
for (int i = 0; i < ds.length; i++) {
HWPartition[] partitions = new HWPartition[ds[i].getPartitions().length];
for (int j = 0; j < partitions.length; j++) {
partitions[j] = new HWPartition(ds[i].getPartitions()[j].getIdentification(),
ds[i].getPartitions()[j].getName(), ds[i].getPartitions()[j].getType(),
ds[i].getPartitions()[j].getUuid(), ds[i].getPartitions()[j].getSize(),
ds[i].getPartitions()[j].getMajor(), ds[i].getPartitions()[j].getMinor(),
ds[i].getPartitions()[j].getMountPoint());
}
diskStores[i] = new HWDiskStore(ds[i].getName(), ds[i].getModel(), ds[i].getSerial(), ds[i].getSize(),
ds[i].getReads(), ds[i].getReadBytes(), ds[i].getWrites(), ds[i].getWriteBytes(),
ds[i].getTransferTime(), partitions, ds[i].getTimeStamp());
}
return diskStores;
}
/**
* {@inheritDoc}
*/
@Override
public NetworkIF[] getNetworkIFs() {
oshi.hardware.NetworkIF[] ifs = this.hal.getNetworkIFs();
NetworkIF[] networkIFs = new NetworkIF[ifs.length];
for (int i = 0; i < ifs.length; i++) {
networkIFs[i] = new NetworkIF();
networkIFs[i].setNetworkInterface(ifs[i].getNetworkInterface());
networkIFs[i].setBytesRecv(ifs[i].getBytesRecv());
networkIFs[i].setBytesSent(ifs[i].getBytesSent());
networkIFs[i].setPacketsRecv(ifs[i].getPacketsRecv());
networkIFs[i].setPacketsSent(ifs[i].getPacketsSent());
networkIFs[i].setSpeed(ifs[i].getSpeed());
networkIFs[i].setTimeStamp(ifs[i].getTimeStamp());
}
return networkIFs;
}
/**
* {@inheritDoc}
*/
@Override
public Display[] getDisplays() {
oshi.hardware.Display[] ds = this.hal.getDisplays();
Display[] displays = new Display[ds.length];
for (int i = 0; i < ds.length; i++) {
displays[i] = new DisplayImpl(ds[i]);
}
return displays;
}
/**
* {@inheritDoc}
*/
@Override
public Sensors getSensors() {
if (this.sensors == null) {
this.sensors = new SensorsImpl(this.hal.getSensors());
}
return this.sensors;
}
/**
* {@inheritDoc}
*/
@Override
public UsbDevice[] getUsbDevices(boolean tree) {
oshi.hardware.UsbDevice[] usbs = this.hal.getUsbDevices(tree);
UsbDevice[] usbDevices = new UsbDevice[usbs.length];
for (int i = 0; i < usbs.length; i++) {
usbDevices[i] = new UsbDeviceImpl(usbs[i]);
}
return usbDevices;
}
/**
* {@inheritDoc}
*/
@Override
public JsonObject toJSON(Properties properties) {
JsonObjectBuilder json = NullAwareJsonObjectBuilder.wrap(this.jsonFactory.createObjectBuilder());
if (PropertiesUtil.getBoolean(properties, "hardware.computerSystem")) {
json.add("computerSystem", getComputerSystem().toJSON(properties));
}
if (PropertiesUtil.getBoolean(properties, "hardware.processor")) {
json.add("processor", getProcessor().toJSON(properties));
}
if (PropertiesUtil.getBoolean(properties, "hardware.memory")) {
json.add("memory", getMemory().toJSON(properties));
}
if (PropertiesUtil.getBoolean(properties, "hardware.powerSources")) {
JsonArrayBuilder powerSourceArrayBuilder = this.jsonFactory.createArrayBuilder();
for (PowerSource powerSource : getPowerSources()) {
powerSourceArrayBuilder.add(powerSource.toJSON(properties));
}
json.add("powerSources", powerSourceArrayBuilder.build());
}
if (PropertiesUtil.getBoolean(properties, "hardware.disks")) {
JsonArrayBuilder diskStoreArrayBuilder = this.jsonFactory.createArrayBuilder();
for (HWDiskStore diskStore : getDiskStores()) {
diskStoreArrayBuilder.add(diskStore.toJSON(properties));
}
json.add("disks", diskStoreArrayBuilder.build());
}
if (PropertiesUtil.getBoolean(properties, "hardware.networks")) {
JsonArrayBuilder networkIFArrayBuilder = this.jsonFactory.createArrayBuilder();
for (NetworkIF netStore : getNetworkIFs()) {
networkIFArrayBuilder.add(netStore.toJSON(properties));
}
json.add("networks", networkIFArrayBuilder.build());
}
if (PropertiesUtil.getBoolean(properties, "hardware.displays")) {
JsonArrayBuilder displayArrayBuilder = this.jsonFactory.createArrayBuilder();
for (Display display : getDisplays()) {
displayArrayBuilder.add(display.toJSON(properties));
}
json.add("displays", displayArrayBuilder.build());
}
if (PropertiesUtil.getBoolean(properties, "hardware.sensors")) {
json.add("sensors", getSensors().toJSON(properties));
}
if (PropertiesUtil.getBoolean(properties, "hardware.usbDevices")) {
JsonArrayBuilder usbDeviceArrayBuilder = this.jsonFactory.createArrayBuilder();
for (UsbDevice usbDevice : getUsbDevices(
PropertiesUtil.getBoolean(properties, "hardware.usbDevices.tree"))) {
usbDeviceArrayBuilder.add(usbDevice.toJSON(properties));
}
json.add("usbDevices", usbDeviceArrayBuilder.build());
}
return json.build();
}
}