From 220e337d0884f13bed81660b8a3733189d3e6f72 Mon Sep 17 00:00:00 2001 From: Admin Date: Mon, 19 Jun 2017 15:00:10 -0500 Subject: [PATCH] Fixed Hue bulk build and save hue registration --- .../HABridge/BridgeSettingsDescriptor.java | 11 +++ .../HABridge/plugins/http/HTTPHandler.java | 99 +++++++++---------- .../HABridge/plugins/hue/HueHome.java | 11 ++- .../HABridge/plugins/hue/HueInfo.java | 7 +- .../HABridge/plugins/hue/HueUtil.java | 56 ----------- 5 files changed, 73 insertions(+), 111 deletions(-) delete mode 100644 src/main/java/com/bwssystems/HABridge/plugins/hue/HueUtil.java diff --git a/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java b/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java index 3daf54c..47be8a7 100644 --- a/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java +++ b/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java @@ -440,4 +440,15 @@ public class BridgeSettingsDescriptor { public Boolean isValidLifx() { return this.isLifxconfigured(); } + public void updateHue(NamedIP aHue) { + int indexHue = -1; + for( int i = 0; i < hueaddress.getDevices().size(); i++) { + if(hueaddress.getDevices().get(i).getName().equals(aHue.getName())) + indexHue = i; + } + if(indexHue >= 0) { + hueaddress.getDevices().set(indexHue, aHue); + this.setSettingsChanged(true); + } + } } diff --git a/src/main/java/com/bwssystems/HABridge/plugins/http/HTTPHandler.java b/src/main/java/com/bwssystems/HABridge/plugins/http/HTTPHandler.java index 7c6ef96..cc1f0dd 100644 --- a/src/main/java/com/bwssystems/HABridge/plugins/http/HTTPHandler.java +++ b/src/main/java/com/bwssystems/HABridge/plugins/http/HTTPHandler.java @@ -6,6 +6,7 @@ import java.net.URISyntaxException; import java.nio.charset.Charset; import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.CookieSpecs; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpGet; @@ -67,73 +68,67 @@ public class HTTPHandler { if (requestBody != null) putRequest.setEntity(requestBody); request = putRequest; - } - else + } else request = new HttpGet(theURI); } catch (IllegalArgumentException e) { log.warn("Error creating outbound http request: IllegalArgumentException in log", e); return null; } - log.debug("Making outbound call in doHttpRequest: " + request); + log.debug("Making outbound call in doHttpRequest: <<<" + request.toString() + ">>>"); if (headers != null && headers.length > 0) { for (int i = 0; i < headers.length; i++) { request.setHeader(headers[i].getName(), headers[i].getValue()); } } - HttpResponse response; - try { - for(int retryCount = 0; retryCount < 2; retryCount++) { + HttpResponse response = null; + for (int retryCount = 0; retryCount < 2; retryCount++) { + try { response = httpClient.execute(request); - log.debug((httpVerb == null ? "GET" : httpVerb) + " execute (" + retryCount + ") on URL responded: " - + response.getStatusLine().getStatusCode()); - if (response.getStatusLine().getStatusCode() >= 200 && response.getStatusLine().getStatusCode() < 300) { - if (response.getEntity() != null) { - try { - theContent = EntityUtils.toString(response.getEntity(), Charset.forName("UTF-8")); // read - // content - // for - // data - EntityUtils.consume(response.getEntity()); // close out - // inputstream - // ignore - // content - } catch (Exception e) { - log.debug("Error ocurred in handling response entity after successful call, still responding success. " - + e.getMessage(), e); - } - log.debug("Successfull response - The http response is <<<" + theContent + ">>>"); - } + } catch (ClientProtocolException e) { + log.warn("Client Protocol Exception received, retyring...."); + } catch (IOException e) { + log.warn("Error calling out to HA gateway: IOException in log", e); + retryCount = 2; + } + log.debug((httpVerb == null ? "GET" : httpVerb) + " execute (" + retryCount + ") on URL responded: " + + response.getStatusLine().getStatusCode()); + if (response != null && response.getStatusLine().getStatusCode() >= 200 && response.getStatusLine().getStatusCode() < 300) { + log.debug("Successfull response - The http response is <<<" + theContent + ">>>"); + retryCount = 2; + } else if (response != null) { + log.warn("HTTP response code was not an expected successful response of between 200 - 299, the code was: " + + response.getStatusLine()); + if (response.getStatusLine().getStatusCode() == 504) { + log.warn("HTTP response code was 504, retrying..."); + } else retryCount = 2; - } else { - log.warn("HTTP response code was not an expected successful response of between 200 - 299, the code was: " + response.getStatusLine()); - try { - String someContent = EntityUtils.toString(response.getEntity(), Charset.forName("UTF-8")); // read - // content - // for - // data - EntityUtils.consume(response.getEntity()); // close out - // inputstream - // ignore - // content - log.debug("Unsuccessfull response - The http response is <<<" + someContent + ">>>"); - } catch (Exception e) { - //noop - } - if (response.getStatusLine().getStatusCode() == 504) { - log.warn("HTTP response code was 504, retrying..."); - try { - Thread.sleep(1000); - } catch (InterruptedException e1) { - // noop - } - } - else - retryCount = 2; + } + + if (response != null && response.getEntity() != null) { + try { + theContent = EntityUtils.toString(response.getEntity(), Charset.forName("UTF-8")); // read + // content + // for + // data + EntityUtils.consume(response.getEntity()); // close out + // inputstream + // ignore + // content + } catch (Exception e) { + log.debug("Error ocurred in handling response entity after successful call, still responding success. " + + e.getMessage(), e); + } + } + + if(retryCount < 2) { + theContent = null; + try { + Thread.sleep(1000); + } catch (InterruptedException e1) { + // noop } } - } catch (IOException e) { - log.warn("Error calling out to HA gateway: IOException in log", e); } return theContent; } diff --git a/src/main/java/com/bwssystems/HABridge/plugins/hue/HueHome.java b/src/main/java/com/bwssystems/HABridge/plugins/hue/HueHome.java index a3b707e..be33059 100644 --- a/src/main/java/com/bwssystems/HABridge/plugins/hue/HueHome.java +++ b/src/main/java/com/bwssystems/HABridge/plugins/hue/HueHome.java @@ -24,9 +24,11 @@ public class HueHome implements Home { private Map hues; private Boolean validHue; private Gson aGsonHandler; + private BridgeSettings theBridgeSettings; public HueHome(BridgeSettings bridgeSettings) { super(); + theBridgeSettings = bridgeSettings; createHome(bridgeSettings); } @@ -113,12 +115,19 @@ public class HueHome implements Home { Iterator theList = bridgeSettings.getBridgeSettingsDescriptor().getHueaddress().getDevices().iterator(); while(theList.hasNext()) { NamedIP aHue = theList.next(); - hues.put(aHue.getName(), new HueInfo(aHue)); + hues.put(aHue.getName(), new HueInfo(aHue, this)); } aGsonHandler = new GsonBuilder().create(); } return this; } + + protected void updateHue(NamedIP aHue) { + theBridgeSettings.getBridgeSettingsDescriptor().updateHue(aHue); + if(theBridgeSettings.getBridgeSettingsDescriptor().isSettingsChanged()) { + theBridgeSettings.updateConfigFile(); + } + } @Override public void closeHome() { diff --git a/src/main/java/com/bwssystems/HABridge/plugins/hue/HueInfo.java b/src/main/java/com/bwssystems/HABridge/plugins/hue/HueInfo.java index 83604f0..7c2fcc6 100644 --- a/src/main/java/com/bwssystems/HABridge/plugins/hue/HueInfo.java +++ b/src/main/java/com/bwssystems/HABridge/plugins/hue/HueInfo.java @@ -27,12 +27,14 @@ public class HueInfo { private static final Logger log = LoggerFactory.getLogger(HueInfo.class); private HTTPHandler httpClient; private NamedIP hueAddress; + private HueHome myHome; public static final String HUE_REQUEST = "/api"; - public HueInfo(NamedIP addressName) { + public HueInfo(NamedIP addressName, HueHome theHome) { super(); httpClient = new HTTPHandler(); hueAddress = addressName; + myHome = theHome; } public HueApiResponse getHueApiResponse() { @@ -62,7 +64,7 @@ public class HueInfo { // ignore } } - theUrl = "http://" + hueAddress.getIp() + HueUtil.HUE_REQUEST + "/" + hueAddress.getUsername(); + theUrl = "http://" + hueAddress.getIp() + HUE_REQUEST + "/" + hueAddress.getUsername(); theData = httpClient.doHttpRequest(theUrl, null, null, null, null); if(theData != null) { log.debug("GET HueApiResponse - data: " + theData); @@ -118,6 +120,7 @@ public class HueInfo { else { SuccessUserResponse[] theResponses = new Gson().fromJson(theBody, SuccessUserResponse[].class); //read content for data, SuccessUserResponse[].class); hueAddress.setUsername(theResponses[0].getSuccess().getUsername()); + myHome.updateHue(hueAddress); } } EntityUtils.consume(response.getEntity()); //close out inputstream ignore content diff --git a/src/main/java/com/bwssystems/HABridge/plugins/hue/HueUtil.java b/src/main/java/com/bwssystems/HABridge/plugins/hue/HueUtil.java deleted file mode 100644 index b28a260..0000000 --- a/src/main/java/com/bwssystems/HABridge/plugins/hue/HueUtil.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.bwssystems.HABridge.plugins.hue; - -import java.io.IOException; - -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.StringEntity; -import org.apache.http.util.EntityUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.bwssystems.HABridge.api.SuccessUserResponse; -import com.bwssystems.HABridge.api.UserCreateRequest; -import com.bwssystems.HABridge.plugins.http.HTTPHandler; -import com.google.gson.Gson; - -public class HueUtil { - private static final Logger log = LoggerFactory.getLogger(HueUtil.class); - public static final String HUE_REQUEST = "/api"; - - public static final String registerWithHue(HTTPHandler anHttpHandler, String ipAddress, String aName, String theUser) { - UserCreateRequest theLogin = new UserCreateRequest(); - theLogin.setDevicetype("HABridge#MyMachine"); - HttpPost postRequest = new HttpPost("http://" + ipAddress + HUE_REQUEST); - ContentType parsedContentType = ContentType.parse("application/json"); - StringEntity requestBody = new StringEntity(new Gson().toJson(theLogin), parsedContentType); - HttpResponse response = null; - postRequest.setEntity(requestBody); - HttpClient anHttpClient = anHttpHandler.getHttpClient(); - try { - response = anHttpClient.execute(postRequest); - log.debug("POST execute on URL responded: " + response.getStatusLine().getStatusCode()); - if(response.getStatusLine().getStatusCode() >= 200 && response.getStatusLine().getStatusCode() < 300){ - String theBody = EntityUtils.toString(response.getEntity()); - log.debug("registerWithHue response data: " + theBody); - if(theBody.contains("[{\"error\":")) { - if(theBody.contains("link button not")) { - log.warn("registerWithHue needs link button pressed on HUE bridge: " + aName); - } - else - log.warn("registerWithHue returned an unexpected error: " + theBody); - } - else { - SuccessUserResponse[] theResponses = new Gson().fromJson(theBody, SuccessUserResponse[].class); //read content for data, SuccessUserResponse[].class); - theUser = theResponses[0].getSuccess().getUsername(); - } - } - EntityUtils.consume(response.getEntity()); //close out inputstream ignore content - } catch (IOException e) { - log.warn("Error logging into HUE: IOException in log", e); - } - return theUser; - } -}