/* * Copyright (c) 2012-2015 iWave Software LLC * All Rights Reserved */ package com.iwave.ext.windows.winrm.wmi; import java.util.List; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathExpression; import org.w3c.dom.Element; import com.google.common.collect.Lists; import com.iwave.ext.windows.model.wmi.IScsiDevice; import com.iwave.ext.windows.model.wmi.IScsiSession; import com.iwave.ext.windows.winrm.WinRMConstants; import com.iwave.ext.windows.winrm.WinRMEnumerateOperation; import com.iwave.ext.windows.winrm.WinRMTarget; import com.iwave.ext.xml.XmlUtils; public class ListIScsiSessionsQuery extends WinRMEnumerateOperation<IScsiSession> { public static final String ISCSI_SESSION_URI = WinRMConstants.WMI_BASE_URI + "root/wmi/MSiSCSIInitiator_SessionClass"; public static final String ISCSI_CONNECTION_INFORMATION_URI = WinRMConstants.WMI_BASE_URI + "root/wmi/MSiSCSIInitiator_ConnectionInformation"; public static final String ISCSI_DEVICE_URI = WinRMConstants.WMI_BASE_URI + "root/wmi/MSiSCSIInitiator_DeviceOnSession"; private static final XPath XPATH = XmlUtils.createXPath( String.format("ns=%s", ISCSI_SESSION_URI), String.format("ns1=%s", ISCSI_CONNECTION_INFORMATION_URI), String.format("ns2=%s", ISCSI_DEVICE_URI)); private static final XPathExpression SESSIONS_EXPR = XmlUtils.compileXPath(XPATH, "ns:MSiSCSIInitiator_SessionClass"); private static final XPathExpression TARGET_ADDRESS_EXPR = XmlUtils.compileXPath(XPATH, "ns:ConnectionInformation/ns1:TargetAddress"); private static final XPathExpression TARGET_PORT_EXPR = XmlUtils.compileXPath(XPATH, "ns:ConnectionInformation/ns1:TargetPort"); private static final XPathExpression INITIATOR_NAME_EXPR = XmlUtils.compileXPath(XPATH, "ns:InitiatorName"); private static final XPathExpression SESSION_ID_EXPR = XmlUtils.compileXPath(XPATH, "ns:SessionId"); private static final XPathExpression TARGET_NAME_EXPR = XmlUtils.compileXPath(XPATH, "ns:TargetName"); private static final XPathExpression DEVICES_EXPR = XmlUtils.compileXPath(XPATH, "ns:Devices"); private static final XPathExpression DEVICE_INTERFACE_GUID_EXPR = XmlUtils.compileXPath(XPATH, "ns2:DeviceInterfaceGuid"); private static final XPathExpression DEVICE_INTERFACE_NAME_EXPR = XmlUtils.compileXPath(XPATH, "ns2:DeviceInterfaceName"); private static final XPathExpression DEVICE_NUMBER_EXPR = XmlUtils.compileXPath(XPATH, "ns2:DeviceNumber"); private static final XPathExpression DEVICE_INITIATOR_NAME_EXPR = XmlUtils.compileXPath(XPATH, "ns2:InitiatorName"); private static final XPathExpression DEVICE_PARTITION_NUMBER_EXPR = XmlUtils.compileXPath( XPATH, "ns2:PartitionNumber"); private static final XPathExpression DEVICE_SCSI_LUN_EXPR = XmlUtils.compileXPath(XPATH, "ns2:ScsiLun"); private static final XPathExpression DEVICE_SCSI_BUS_EXPR = XmlUtils.compileXPath(XPATH, "ns2:ScsiPathId"); private static final XPathExpression DEVICE_SCSI_PORT_EXPR = XmlUtils.compileXPath(XPATH, "ns2:ScsiPortNumber"); private static final XPathExpression DEVICE_SCSI_TARGET_EXPR = XmlUtils.compileXPath(XPATH, "ns2:ScsiTargetId"); private static final XPathExpression DEVICE_TARGET_NAME_EXPR = XmlUtils.compileXPath(XPATH, "ns2:TargetName"); public ListIScsiSessionsQuery(WinRMTarget target) { super(target, ISCSI_SESSION_URI); } @Override protected void processItems(Element items, List<IScsiSession> results) { for (Element item : XmlUtils.selectElements(SESSIONS_EXPR, items)) { IScsiSession session = new IScsiSession(); session.setTargetName(getTargetName(item)); session.setTargetAddress(getTargetAddress(item)); session.setTargetPort(getTargetPort(item)); session.setInitiatorName(getInitiatorName(item)); session.setSessionId(getSessionId(item)); session.setDevices(getDevices(item)); results.add(session); } } protected String getTargetName(Element item) { return XmlUtils.selectText(TARGET_NAME_EXPR, item); } protected String getTargetAddress(Element item) { return XmlUtils.selectText(TARGET_ADDRESS_EXPR, item); } protected int getTargetPort(Element item) { return Integer.parseInt(XmlUtils.selectText(TARGET_PORT_EXPR, item)); } protected String getInitiatorName(Element item) { return XmlUtils.selectText(INITIATOR_NAME_EXPR, item); } protected String getSessionId(Element item) { return XmlUtils.selectText(SESSION_ID_EXPR, item); } protected List<IScsiDevice> getDevices(Element item) { List<IScsiDevice> results = Lists.newArrayList(); for (Element e : XmlUtils.selectElements(DEVICES_EXPR, item)) { IScsiDevice device = new IScsiDevice(); device.setDeviceInterfaceGuid(getDeviceInterfaceGuid(e)); device.setDeviceInterfaceName(getDeviceInterfaceName(e)); device.setDeviceNumber(getDeviceNumber(e)); device.setInitiatorName(getDeviceInterfaceGuid(e)); device.setPartitionNumber(getDevicePartitionNumber(e)); device.setScsiBus(getDeviceScsiBus(e)); device.setScsiTarget(getDeviceScsiTarget(e)); device.setScsiPort(getDeviceScsiPort(e)); device.setScsiLun(getDeviceScsiLun(e)); device.setTargetName(getDeviceTargetName(e)); results.add(device); } return results; } protected String getDeviceInterfaceGuid(Element item) { return XmlUtils.selectText(DEVICE_INTERFACE_GUID_EXPR, item); } protected String getDeviceInterfaceName(Element item) { return XmlUtils.selectText(DEVICE_INTERFACE_NAME_EXPR, item); } protected int getDeviceNumber(Element item) { Integer number = XmlUtils.selectInteger(DEVICE_NUMBER_EXPR, item); return number != null ? number : -1; } protected String getDeviceInitiatorName(Element item) { return XmlUtils.selectText(DEVICE_INITIATOR_NAME_EXPR, item); } protected int getDevicePartitionNumber(Element item) { Integer number = XmlUtils.selectInteger(DEVICE_PARTITION_NUMBER_EXPR, item); return number != null ? number : -1; } protected int getDeviceScsiBus(Element item) { Integer number = XmlUtils.selectInteger(DEVICE_SCSI_BUS_EXPR, item); return number != null ? number : -1; } protected int getDeviceScsiTarget(Element item) { Integer number = XmlUtils.selectInteger(DEVICE_SCSI_TARGET_EXPR, item); return number != null ? number : -1; } protected int getDeviceScsiPort(Element item) { Integer number = XmlUtils.selectInteger(DEVICE_SCSI_PORT_EXPR, item); return number != null ? number : -1; } protected int getDeviceScsiLun(Element item) { Integer number = XmlUtils.selectInteger(DEVICE_SCSI_LUN_EXPR, item); return number != null ? number : -1; } protected String getDeviceTargetName(Element item) { return XmlUtils.selectText(DEVICE_TARGET_NAME_EXPR, item); } }