/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* 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
*/
package org.openhab.binding.ihc.ws;
import org.openhab.binding.ihc.ws.datatypes.WSBaseDataType;
import org.openhab.binding.ihc.ws.datatypes.WSControllerState;
import org.openhab.binding.ihc.ws.datatypes.WSFile;
import org.openhab.binding.ihc.ws.datatypes.WSProjectInfo;
/**
* Class to handle IHC / ELKO LS Controller's controller service.
*
* Controller service is used to fetch information from the controller.
* E.g. Project file or controller status.
*
* @author Pauli Anttila
* @since 1.5.0
*/
public class IhcControllerService extends IhcHttpsClient {
private static String emptyQuery = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<soapenv:Body>"
+ "</soapenv:Body>" + "</soapenv:Envelope>";
private String url;
private int timeout;
IhcControllerService(String host, int timeout) {
url = "https://" + host + "/ws/ControllerService";
this.timeout = timeout;
super.setConnectTimeout(timeout);
}
/**
* Query project information from the controller.
*
* @return project information.
* @throws IhcExecption
*/
public synchronized WSProjectInfo getProjectInfo() throws IhcExecption {
openConnection(url);
setRequestProperty("SOAPAction", "getProjectInfo");
String response = sendQuery(emptyQuery, timeout);
closeConnection();
WSProjectInfo projectInfo = new WSProjectInfo();
projectInfo.encodeData(response);
return projectInfo;
}
/**
* Query number of segments project contains.
*
* @return number of segments.
*/
public synchronized int getProjectNumberOfSegments() throws IhcExecption {
openConnection(url);
setRequestProperty("SOAPAction", "getIHCProjectNumberOfSegments");
String response = sendQuery(emptyQuery, timeout);
closeConnection();
String numberOfSegments = WSBaseDataType.parseValue(response,
"/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:getIHCProjectNumberOfSegments1");
return Integer.parseInt(numberOfSegments);
}
/**
* Query segmentation size.
*
* @return segmentation size in bytes.
*/
public synchronized int getProjectSegmentationSize() throws IhcExecption {
openConnection(url);
setRequestProperty("SOAPAction", "getIHCProjectSegmentationSize");
String response = sendQuery(emptyQuery, timeout);
closeConnection();
String segmentationSize = WSBaseDataType.parseValue(response,
"/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:getIHCProjectSegmentationSize1");
return Integer.parseInt(segmentationSize);
}
/**
* Query project segment data.
*
* @param index
* segments index.
* @param major
* project major revision number.
* @param minor
* project minor revision number.
* @return segments data.
*/
public synchronized WSFile getProjectSegment(int index, int major, int minor) throws IhcExecption {
final String soapQuery = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+ "<soap:Body>"
+ " <ns1:getIHCProjectSegment1 xmlns:ns1=\"utcs\" xsi:type=\"xsd:int\">%s</ns1:getIHCProjectSegment1>"
+ " <ns2:getIHCProjectSegment2 xmlns:ns2=\"utcs\" xsi:type=\"xsd:int\">%s</ns2:getIHCProjectSegment2>"
+ " <ns3:getIHCProjectSegment3 xmlns:ns3=\"utcs\" xsi:type=\"xsd:int\">%s</ns3:getIHCProjectSegment3>"
+ "</soap:Body>" + "</soap:Envelope>";
String query = String.format(soapQuery, index, major, minor);
openConnection(url);
setRequestProperty("SOAPAction", "getIHCProjectSegment");
String response = sendQuery(query, timeout);
closeConnection();
WSFile file = new WSFile();
file.encodeData(response);
return file;
}
/**
* Query controller current state.
*
* @return controller's current state.
*/
public synchronized WSControllerState getControllerState() throws IhcExecption {
openConnection(url);
setRequestProperty("SOAPAction", "getState");
String response = sendQuery(emptyQuery, timeout);
closeConnection();
WSControllerState controllerState = new WSControllerState();
controllerState.encodeData(response);
return controllerState;
}
/**
* Wait controller state change notification.
*
* @param previousState
* Previous controller state.
* @param timeoutInSeconds
* How many seconds to wait notifications.
* @return current controller state.
*/
public synchronized WSControllerState waitStateChangeNotifications(WSControllerState previousState,
int timeoutInSeconds) throws IhcExecption {
final String soapQuery = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+ "<soapenv:Header/>" + "<soapenv:Body>"
+ " <ns1:waitForControllerStateChange1 xmlns:ns1=\"utcs\" xsi:type=\"ns1:WSControllerState\">"
+ " <ns1:state xsi:type=\"xsd:string\">%s</ns1:state>" + " </ns1:waitForControllerStateChange1>"
+ " <ns2:waitForControllerStateChange2 xmlns:ns2=\"utcs\" xsi:type=\"xsd:int\">%s</ns2:waitForControllerStateChange2>"
+ "</soapenv:Body>" + "</soapenv:Envelope>";
String query = String.format(soapQuery, previousState.getState(), timeoutInSeconds);
openConnection(url);
setRequestProperty("SOAPAction", "waitForControllerStateChange");
String response = sendQuery(query, timeout + timeoutInSeconds * 1000);
closeConnection();
WSControllerState controllerState = new WSControllerState();
controllerState.encodeData(response);
return controllerState;
}
}