blob: 19611461881a0d8fc1f00aac6238011a754179a2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.tuscany.sca.binding.atom.provider;
import java.net.URI;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpConnectionManager;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.tuscany.sca.binding.atom.AtomBinding;
import org.apache.tuscany.sca.databinding.Mediator;
import org.apache.tuscany.sca.interfacedef.DataType;
import org.apache.tuscany.sca.interfacedef.InterfaceContract;
import org.apache.tuscany.sca.interfacedef.Operation;
import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
import org.apache.tuscany.sca.interfacedef.util.XMLType;
import org.apache.tuscany.sca.invocation.Invoker;
import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
import org.apache.tuscany.sca.runtime.RuntimeComponent;
import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
/**
* Implementation of the Atom binding provider.
*
* @version $Rev$ $Date$
*/
class AtomReferenceBindingProvider implements ReferenceBindingProvider {
private RuntimeComponentReference reference;
private AtomBinding binding;
private String authorizationHeader = null;
private HttpClient httpClient;
private Mediator mediator;
private DataType<?> itemClassType;
private DataType<?> itemXMLType;
private boolean supportsFeedEntries;
/**
* Constructs a new AtomReferenceBindingProvider
* @param component
* @param reference
* @param binding
* @param mediator
*/
AtomReferenceBindingProvider(RuntimeComponent component,
RuntimeComponentReference reference,
AtomBinding binding,
Mediator mediator) {
this.reference = reference;
this.binding = binding;
this.mediator = mediator;
// Prepare authorization header
// TUSCANY-3735: Don't send authorization header by default as this can cause problems.
// Commented out the following two lines until we have a better way to control this.
//String authorization = "admin" + ":" + "admin";
//authorizationHeader = "Basic " + new String(Base64.encodeBase64(authorization.getBytes()));
// Create an HTTP client
HttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
connectionManager.getParams().setDefaultMaxConnectionsPerHost(10);
connectionManager.getParams().setConnectionTimeout(60000);
httpClient = new HttpClient(connectionManager);
}
public Invoker createInvoker(Operation operation) {
String operationName = operation.getName();
if (operationName.equals("get")) {
// Determine the collection item type
itemXMLType = new DataTypeImpl<Class<?>>(String.class.getName(), String.class, String.class);
Class<?> itemClass = operation.getOutputType().getPhysical();
DataType<XMLType> outputType = operation.getOutputType();
itemClassType = outputType;
if (itemClassType.getPhysical() == org.apache.abdera.model.Entry.class) {
supportsFeedEntries = true;
}
return new AtomBindingInvoker.GetInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this);
} else if (operationName.equals("post")) {
return new AtomBindingInvoker.PostInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this);
} else if (operationName.equals("put")) {
return new AtomBindingInvoker.PutInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this);
} else if (operationName.equals("delete")) {
return new AtomBindingInvoker.DeleteInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this);
} else if (operationName.equals("getFeed") || operationName.equals("getAll")) {
return new AtomBindingInvoker.GetAllInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this);
} else if (operationName.equals("postMedia")) {
return new AtomBindingInvoker.PostMediaInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this);
} else if (operationName.equals("putMedia")) {
return new AtomBindingInvoker.PutMediaInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this);
} else if (operationName.equals("query")) {
return new AtomBindingInvoker.QueryInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this);
}
return new AtomBindingInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this);
}
public InterfaceContract getBindingInterfaceContract() {
return reference.getInterfaceContract();
}
public void start() {
// Configure the HTTP client credentials
// TUSCANY-3735: Don't use authentication by default as this can cause problems.
// Commented out the following four lines until we have a better way to control this.
//Credentials credentials = new UsernamePasswordCredentials("admin", "admin");
//httpClient.getParams().setAuthenticationPreemptive(true);
//URI uri = URI.create(binding.getURI());
//httpClient.getState().setCredentials(new AuthScope(uri.getHost(), uri.getPort()), credentials);
// Find the get operation on the reference interface
if (true) {
return;
}
}
public void stop() {
}
public boolean supportsOneWayInvocation() {
return false;
}
/**
* Returns the mediator.
* @return
*/
Mediator getMediator() {
return mediator;
}
/**
* Returns the item class type.
* @return
*/
DataType<?> getItemClassType() {
return itemClassType;
}
/**
* Returns the item XML type.
* @return
*/
DataType<?> getItemXMLType() {
return itemXMLType;
}
/**
* Returns true if the invoker should work with Atom
* feed entries.
* @return
*/
boolean supportsFeedEntries() {
return supportsFeedEntries;
}
}