import java.util.Set;
+import org.opendaylight.yangtools.restconf.client.api.auth.AuthenticationHolder;
import org.opendaylight.yangtools.restconf.client.api.data.ConfigurationDatastore;
import org.opendaylight.yangtools.restconf.client.api.data.OperationalDatastore;
import org.opendaylight.yangtools.restconf.client.api.event.EventStreamInfo;
package org.opendaylight.yangtools.restconf.client.api;
import java.net.URL;
-
+import org.opendaylight.yangtools.restconf.client.api.auth.AuthenticationHolder;
import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService;
import org.opendaylight.yangtools.yang.model.api.SchemaContextHolder;
* @throws UnsupportedProtocolException if the factory cannot handle the protocol specified in the URL.
*/
RestconfClientContext getRestconfClientContext(URL baseUrl,BindingIndependentMappingService mappingService,SchemaContextHolder holder) throws UnsupportedProtocolException;
+ void setAuthentication(AuthenticationHolder authenticationHolder);
+
}
--- /dev/null
+package org.opendaylight.yangtools.restconf.client.api.auth;
+
+/**
+ * Created by mbobak on 2/14/14.
+ */
+public interface AuthenticationHolder {
+
+ public RestAuthType getAuthType();
+ public String getUserName();
+ public String getPassword();
+ public boolean authenticationRequired();
+}
--- /dev/null
+package org.opendaylight.yangtools.restconf.client.api.auth;
+
+/**
+ * Created by mbobak on 2/17/14.
+ */
+public enum RestAuthType {
+
+ DIGEST,BASIC;
+}
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
+import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import java.io.InputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public BindingToRestRpc(URI uri) {
ClientConfig config = new DefaultClientConfig();
this.client = Client.create(config);
+ this.client.addFilter(new HTTPBasicAuthFilter("admin", "admin"));
this.defaultUri = uri;
}
if (response.getStatus() != 200) {
- throw new IllegalStateException("Can't get data from restconf ");
+ throw new IllegalStateException("Can't get data from restconf. "+response.getClientResponseStatus());
}
return XmlTools.unmarshallXml(method.getReturnType(), response.getEntityInputStream());
}
package org.opendaylight.yangtools.restconf.client;
import java.net.URL;
-
import org.opendaylight.yangtools.restconf.client.api.RestconfClientContext;
import org.opendaylight.yangtools.restconf.client.api.RestconfClientContextFactory;
import org.opendaylight.yangtools.restconf.client.api.UnsupportedProtocolException;
+import org.opendaylight.yangtools.restconf.client.api.auth.AuthenticationHolder;
import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService;
import org.opendaylight.yangtools.yang.model.api.SchemaContextHolder;
import org.slf4j.Logger;
public class RestconfClientFactory implements RestconfClientContextFactory {
private static final Logger logger = LoggerFactory.getLogger(RestconfClientFactory.class);
+ private AuthenticationHolder authenticationHolder;
@Override
public RestconfClientContext getRestconfClientContext(URL baseUrl, BindingIndependentMappingService mappingService, SchemaContextHolder schemaContextHolder) throws UnsupportedProtocolException {
if (!baseUrl.getProtocol().equals("http")){
throw new UnsupportedProtocolException("Unsupported protocol "+baseUrl.getProtocol());
}
- return new RestconfClientImpl(baseUrl,mappingService,schemaContextHolder);
+ RestconfClientImpl restconfClient = new RestconfClientImpl(baseUrl,mappingService,schemaContextHolder);
+ if (null!=authenticationHolder){
+ restconfClient.setAuthenticationHolder(authenticationHolder);
+ }
+ return restconfClient;
+ }
+
+ @Override
+ public void setAuthentication(AuthenticationHolder authenticationHolder) {
+ this.authenticationHolder = authenticationHolder;
}
}
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
+import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
+import com.sun.jersey.api.client.filter.HTTPDigestAuthFilter;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import org.opendaylight.yangtools.restconf.client.api.RestconfClientContext;
+import org.opendaylight.yangtools.restconf.client.api.auth.AuthenticationHolder;
import org.opendaylight.yangtools.restconf.client.api.data.ConfigurationDatastore;
import org.opendaylight.yangtools.restconf.client.api.data.OperationalDatastore;
import org.opendaylight.yangtools.restconf.client.api.dto.RestEventStreamInfo;
private OperationalDataStoreImpl operationalDatastoreAccessor;
private ConfigurationDataStoreImpl configurationDatastoreAccessor;
-
- public RestconfClientImpl(URL url,BindingIndependentMappingService mappingService, SchemaContextHolder schemaContextHolder){
+ public RestconfClientImpl(URL url,BindingIndependentMappingService mappingService,
+ SchemaContextHolder schemaContextHolder){
Preconditions.checkArgument(url != null,"Restconf endpoint URL must be supplied.");
Preconditions.checkArgument(mappingService != null, "Mapping service must not be null.");
Preconditions.checkNotNull(schemaContextHolder, "Schema Context Holder must not be null.");
return operationalDatastoreAccessor;
}
+ public void setAuthenticationHolder(AuthenticationHolder authenticationHolder) {
+ if(authenticationHolder.authenticationRequired()){
+ switch (authenticationHolder.getAuthType()){
+ case DIGEST: restClient.addFilter(new HTTPDigestAuthFilter(authenticationHolder.getUserName(), authenticationHolder.getPassword()));
+ break;
+ default: restClient.addFilter(new HTTPBasicAuthFilter(authenticationHolder.getUserName(), authenticationHolder.getPassword()));
+ break;
+ }
+ }
+ }
+
@Override
public void close() {
this.pool.shutdown();
*/
package org.opendaylight.yangtools.restconf.client.to;
+import com.google.common.base.Charsets;
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
-
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
-
import javax.ws.rs.core.MediaType;
import javax.xml.bind.annotation.XmlRootElement;
-
import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.restconf.client.BindingToRestRpc;
import org.opendaylight.yangtools.restconf.client.api.event.EventStreamReplay;
import org.opendaylight.yangtools.restconf.client.api.event.ListenableEventStreamContext;
import org.opendaylight.yangtools.restconf.common.ResourceUri;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.base.Charsets;
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.api.client.config.ClientConfig;
-import com.sun.jersey.api.client.config.DefaultClientConfig;
-
@XmlRootElement
-public class RestListenableEventStreamContext<T extends NotificationListener> implements ListenableEventStreamContext,ClientMessageCallback {
+public class RestListenableEventStreamContext<L extends NotificationListener> implements ListenableEventStreamContext,ClientMessageCallback {
private final URI defaultUri;
private final Client client;
@Override
public <L extends NotificationListener> ListenerRegistration<L> registerNotificationListener(L listener) {
- try {
- this.streamName = BindingReflections.getModuleInfo(listener.getClass()).getName();
- } catch (Exception e) {
- logger.trace("Error resolving stream name form listener class.");
- throw new IllegalStateException("Error resolving stream name form listener class.");
- }
-
for (Method m:listener.getClass().getDeclaredMethods()){
if (BindingReflections.isNotificationCallback(m)){
this.listenerCallbackMethod = m;
break;
}
}
-
- final L listenerProxy = (L) BindingToRestRpc.getProxy(listener.getClass(), this.defaultUri);
- return new AbstractListenerRegistration<L>(listenerProxy) {
+ return new AbstractListenerRegistration<L>(listener) {
@Override
protected void removeRegistration() {
- // FIXME: implement this method
+ stopListening();
}
};
}
private void createWebsocketClient(URI websocketServerUri){
this.wsClient = new WebSocketIClient(websocketServerUri,this);
}
- private String getRpcInput(String path,String ns) {
- StringBuilder sb = new StringBuilder();
- sb.append("<input xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote\">");
- sb.append("<path xmlns:int=\""+ns+"\">"+path+"</path>");
- sb.append("</input>");
- return sb.toString();
- }
private String createUri(String prefix, String encodedPart) throws UnsupportedEncodingException {
return URI.create(prefix + URLEncoder.encode(encodedPart, Charsets.US_ASCII.name()).toString()).toASCIIString();
--- /dev/null
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. 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
+ */
+package org.opendaylight.yangtools.restconf.client;
+
+import org.opendaylight.yangtools.restconf.client.api.auth.AuthenticationHolder;
+import org.opendaylight.yangtools.restconf.client.api.auth.RestAuthType;
+
+public class AuthProvider implements AuthenticationHolder {
+
+
+ @Override
+ public RestAuthType getAuthType() {
+ return RestAuthType.BASIC;
+ }
+
+ @Override
+ public String getUserName() {
+ return "admin";
+ }
+
+ @Override
+ public String getPassword() {
+ return "admin";
+ }
+
+ @Override
+ public boolean authenticationRequired() {
+ return false;
+ }
+}