/** * Copyright (c) <2013> <Radware Ltd.> and others. 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 * @author Kobi Samoray * @author Gera Goft * @version 0.1 */ package org.opendaylight.defense4all.framework.cli; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.impl.client.DefaultHttpClient; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.DeserializationConfig; import org.codehaus.jackson.type.TypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; public class ControlappsConnector { /* Example post request: http://localhost:8086/rest/general/hostaddress -d '10.206.167.31' */ public static final int RESTSERVICE_PORT = 8086; public static final String RESTSERVICE_HOSTNAME = "localhost"; public String username; public String password; protected ObjectMapper objMapper; protected RestTemplate restTemplate; protected String restPrefix; public ControlappsConnector(String username, String password, String restSubPath) throws Exception { this.username = username; this.password = password; restPrefix = "http://" + RESTSERVICE_HOSTNAME + ":" + RESTSERVICE_PORT + restSubPath; try { objMapper = new ObjectMapper(); objMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); // Ignore unknown fields // set authentication for rest template AuthScope authScope = new AuthScope(RESTSERVICE_HOSTNAME, RESTSERVICE_PORT, AuthScope.ANY_REALM); UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username, password); DefaultHttpClient client = new DefaultHttpClient(); client.getCredentialsProvider().setCredentials(authScope, credentials); HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(client); restTemplate = new RestTemplate(factory); if(restTemplate == null) throw new Exception(""); } catch (Throwable e) { throw new Exception("Failed to initialize connection with controlapps. Is it up?"); } } public synchronized <T> T getFromControlApps(String urlPrefix, TypeReference<?> typeRef) throws Exception { String result; try { String url = mkUrl(urlPrefix); result = restTemplate.getForObject(url, String.class); if(result == null) return null; } catch (Throwable e) { throw new Exception("Failed to communicate with controlapps. Is it up?"); } try { T t = objMapper.readValue(result, typeRef); return t; } catch (Throwable e) { throw new RestClientException("Internal error parsing the result. Please try again later or restart controlapps."); } } public synchronized String getStringFromControlApps(String urlPrefix) throws Exception { String result; try { String url = mkUrl(urlPrefix); result = restTemplate.getForObject(url, String.class); if(result == null) return null; } catch (Throwable e) { throw new Exception("Failed to communicate with controlapps. Is it up?"); } return result; } public synchronized void postToControlApps(String urlPrefix, Object object) throws RestClientException { try { String url = mkUrl(urlPrefix); HttpEntity<String> entity = buildHttpEntityFromObject( object ); restTemplate.postForLocation(url, entity); } catch (Throwable e) { throw new RestClientException("Failed to post to controller " + RESTSERVICE_HOSTNAME, e); } } public synchronized void putToControlApps(String urlPrefix, Object object) throws RestClientException { try { String url = mkUrl(urlPrefix); HttpEntity<String> entity = buildHttpEntityFromObject( object ); restTemplate.put(url, entity); } catch (Throwable e) { throw new RestClientException("Failed to put to controller " + object + " to " + RESTSERVICE_HOSTNAME, e); } } private HttpEntity<String> buildHttpEntityFromObject( Object object) throws RestClientException { String jsonStr; try { if(String.class.isInstance(object)) jsonStr = (String) object; else jsonStr = objMapper.writeValueAsString(object); } catch (Throwable e) { String msg = "Failed to writeValueAsString "; throw new RestClientException(msg, e); } HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<String> entity = new HttpEntity<String>(jsonStr,headers); return entity; } public synchronized void putToControlApps(String urlPrefix) throws RestClientException { try { String url = mkUrl(urlPrefix); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); restTemplate.put(url, null); } catch (Throwable e) { throw new RestClientException("Failed to put to controller " + RESTSERVICE_HOSTNAME, e); } } public synchronized void delFromControlApps(String urlPrefix) throws RestClientException { try { String url = mkUrl(urlPrefix); restTemplate.delete(url); } catch (Throwable e) { throw new RestClientException("Failed to put to controller " + RESTSERVICE_HOSTNAME, e); } } protected String mkUrl(String path) {return restPrefix + path;} }