From 60e0e7a12136b2f3d57b3715837c86c102d553af Mon Sep 17 00:00:00 2001 From: zhou Date: Tue, 4 Jul 2017 21:32:14 +0800 Subject: [PATCH] convert tab to 4 spaces --- .../protocol/restful/EmbedRestServer.java | 30 +- .../protocol/restful/EndpointFactory.java | 8 +- .../motan/protocol/restful/RestServer.java | 8 +- .../protocol/restful/RestfulProtocol.java | 150 +++++----- .../support/AbstractEndpointFactory.java | 190 ++++++------ .../restful/support/ProviderResource.java | 38 +-- .../support/RestfulClientResponse.java | 26 +- .../support/RestfulContainerRequest.java | 16 +- .../support/RestfulInjectorFactory.java | 68 ++--- .../protocol/restful/support/RestfulUtil.java | 158 +++++----- .../restful/support/RpcExceptionMapper.java | 20 +- .../support/netty/NettyEndpointFactory.java | 40 +-- .../support/proxy/RestfulClientInvoker.java | 38 +-- .../support/proxy/RestfulProxyBuilder.java | 132 ++++----- .../RestfulServletContainerListener.java | 26 +- .../servlet/ServletEndpointFactory.java | 12 +- .../support/servlet/ServletRestServer.java | 50 ++-- .../motan/protocol/restful/ClientFilter.java | 24 +- .../motan/protocol/restful/HelloResource.java | 62 ++-- .../protocol/restful/RestHelloResource.java | 40 +-- .../motan/protocol/restful/ServerFilter.java | 34 +-- .../motan/protocol/restful/TestRestful.java | 154 +++++----- .../restful/TestServletCotainerRestful.java | 270 +++++++++--------- 23 files changed, 798 insertions(+), 796 deletions(-) diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/EmbedRestServer.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/EmbedRestServer.java index 7a753e06e..62d97b7e2 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/EmbedRestServer.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/EmbedRestServer.java @@ -25,24 +25,24 @@ * */ public class EmbedRestServer implements RestServer { - private EmbeddedJaxrsServer server; + private EmbeddedJaxrsServer server; - public EmbedRestServer(EmbeddedJaxrsServer server) { - this.server = server; - } + public EmbedRestServer(EmbeddedJaxrsServer server) { + this.server = server; + } - @Override - public ResteasyDeployment getDeployment() { - return server.getDeployment(); - } + @Override + public ResteasyDeployment getDeployment() { + return server.getDeployment(); + } - @Override - public void start() { - server.start(); - } + @Override + public void start() { + server.start(); + } - public void stop() { - server.stop(); - } + public void stop() { + server.stop(); + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/EndpointFactory.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/EndpointFactory.java index ee3869a64..2d1827454 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/EndpointFactory.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/EndpointFactory.java @@ -24,12 +24,12 @@ @Spi(scope = Scope.SINGLETON) public interface EndpointFactory { - RestServer createServer(URL url); + RestServer createServer(URL url); - ResteasyWebTarget createClient(URL url); + ResteasyWebTarget createClient(URL url); - void safeReleaseResource(RestServer server, URL url); + void safeReleaseResource(RestServer server, URL url); - void safeReleaseResource(ResteasyWebTarget client, URL url); + void safeReleaseResource(ResteasyWebTarget client, URL url); } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/RestServer.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/RestServer.java index af7e9f28e..2cc1d99ef 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/RestServer.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/RestServer.java @@ -17,12 +17,12 @@ import org.jboss.resteasy.spi.ResteasyDeployment; -public interface RestServer{ +public interface RestServer { - void start(); + void start(); - ResteasyDeployment getDeployment(); + ResteasyDeployment getDeployment(); - void stop(); + void stop(); } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/RestfulProtocol.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/RestfulProtocol.java index 29d5216e6..d6cd7e381 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/RestfulProtocol.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/RestfulProtocol.java @@ -50,105 +50,105 @@ @SpiMeta(name = "restful") public class RestfulProtocol extends AbstractProtocol { - @Override - protected Exporter createExporter(Provider provider, URL url) { - return new RestfulExporter(provider, url); - } + @Override + protected Exporter createExporter(Provider provider, URL url) { + return new RestfulExporter(provider, url); + } - @Override - protected Referer createReferer(Class clz, URL url, URL serviceUrl) { - return new RestfulReferer(clz, serviceUrl); - } + @Override + protected Referer createReferer(Class clz, URL url, URL serviceUrl) { + return new RestfulReferer(clz, serviceUrl); + } - private class RestfulExporter extends AbstractExporter { - private RestServer server; - private EndpointFactory endpointFactory; + private class RestfulExporter extends AbstractExporter { + private RestServer server; + private EndpointFactory endpointFactory; - public RestfulExporter(Provider provider, URL url) { - super(provider, url); + public RestfulExporter(Provider provider, URL url) { + super(provider, url); - endpointFactory = ExtensionLoader.getExtensionLoader(EndpointFactory.class).getExtension( - url.getParameter(URLParamType.endpointFactory.getName(), URLParamType.endpointFactory.getValue())); - server = endpointFactory.createServer(url); - } + endpointFactory = ExtensionLoader.getExtensionLoader(EndpointFactory.class).getExtension( + url.getParameter(URLParamType.endpointFactory.getName(), URLParamType.endpointFactory.getValue())); + server = endpointFactory.createServer(url); + } - @Override - public void unexport() { - server.getDeployment().getRegistry().removeRegistrations(provider.getInterface()); + @Override + public void unexport() { + server.getDeployment().getRegistry().removeRegistrations(provider.getInterface()); - String protocolKey = MotanFrameworkUtil.getProtocolKey(url); + String protocolKey = MotanFrameworkUtil.getProtocolKey(url); - @SuppressWarnings("unchecked") - Exporter exporter = (Exporter) exporterMap.remove(protocolKey); + @SuppressWarnings("unchecked") + Exporter exporter = (Exporter) exporterMap.remove(protocolKey); - if (exporter != null) { - exporter.destroy(); - } + if (exporter != null) { + exporter.destroy(); + } - LoggerUtil.info("RestfulExporter unexport Success: url={}", url); - } + LoggerUtil.info("RestfulExporter unexport Success: url={}", url); + } - @Override - public void destroy() { - endpointFactory.safeReleaseResource(server, url); + @Override + public void destroy() { + endpointFactory.safeReleaseResource(server, url); - LoggerUtil.info("RestfulExporter destory Success: url={}", url); - } + LoggerUtil.info("RestfulExporter destory Success: url={}", url); + } - @Override - protected boolean doInit() { - server.getDeployment().getRegistry().addResourceFactory(new ProviderResource(provider)); - return true; - } - } + @Override + protected boolean doInit() { + server.getDeployment().getRegistry().addResourceFactory(new ProviderResource(provider)); + return true; + } + } - private static class RestfulReferer extends AbstractReferer { - private ResteasyWebTarget target; - private EndpointFactory endpointFactory; + private static class RestfulReferer extends AbstractReferer { + private ResteasyWebTarget target; + private EndpointFactory endpointFactory; - private Map delegate; + private Map delegate; - public RestfulReferer(Class clz, URL url) { - super(clz, url); + public RestfulReferer(Class clz, URL url) { + super(clz, url); - endpointFactory = ExtensionLoader.getExtensionLoader(EndpointFactory.class).getExtension( - url.getParameter(URLParamType.endpointFactory.getName(), URLParamType.endpointFactory.getValue())); - target = endpointFactory.createClient(url); - } + endpointFactory = ExtensionLoader.getExtensionLoader(EndpointFactory.class).getExtension( + url.getParameter(URLParamType.endpointFactory.getName(), URLParamType.endpointFactory.getValue())); + target = endpointFactory.createClient(url); + } - @Override - public void destroy() { - endpointFactory.safeReleaseResource(target, url); + @Override + public void destroy() { + endpointFactory.safeReleaseResource(target, url); - LoggerUtil.info("RestfulReferer destory client: url={}" + url); - } + LoggerUtil.info("RestfulReferer destory client: url={}" + url); + } - @Override - protected Response doCall(Request request) { - RestfulClientResponse response = new RestfulClientResponse(request.getRequestId()); - try { - Method method = getInterface().getMethod(request.getMethodName(), - ReflectUtil.forNames(request.getParamtersDesc())); + @Override + protected Response doCall(Request request) { + RestfulClientResponse response = new RestfulClientResponse(request.getRequestId()); + try { + Method method = getInterface().getMethod(request.getMethodName(), + ReflectUtil.forNames(request.getParamtersDesc())); - Object value = delegate.get(method).invoke(request.getArguments(), request, response); + Object value = delegate.get(method).invoke(request.getArguments(), request, response); - response.setValue(value); - } catch (Exception e) { - Exception cause = RestfulUtil.getCause(response.getHttpResponse()); - response.setException(cause != null ? cause : e); - } + response.setValue(value); + } catch (Exception e) { + Exception cause = RestfulUtil.getCause(response.getHttpResponse()); + response.setException(cause != null ? cause : e); + } - return response; - } + return response; + } - @Override - protected boolean doInit() { - // 此处不使用target.proxy(getInterface()),否则须使用filter方式来完成request/response中attachment的传递 - delegate = RestfulProxyBuilder.builder(getInterface(), target).build(); + @Override + protected boolean doInit() { + // 此处不使用target.proxy(getInterface()),否则须使用filter方式来完成request/response中attachment的传递 + delegate = RestfulProxyBuilder.builder(getInterface(), target).build(); - return true; - } + return true; + } - } + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/AbstractEndpointFactory.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/AbstractEndpointFactory.java index 7e9d9d714..063a2ba95 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/AbstractEndpointFactory.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/AbstractEndpointFactory.java @@ -31,132 +31,132 @@ import com.weibo.api.motan.util.MotanFrameworkUtil; public abstract class AbstractEndpointFactory implements EndpointFactory { - /** 维持share channel 的service列表 **/ - protected final Map ipPort2ServerShareChannel = new HashMap(); - // 维持share channel 的client列表 - protected final Map ipPort2ClientShareChannel = new HashMap(); + /** 维持share channel 的service列表 **/ + protected final Map ipPort2ServerShareChannel = new HashMap(); + // 维持share channel 的client列表 + protected final Map ipPort2ClientShareChannel = new HashMap(); - protected Map> server2UrlsShareChannel = new HashMap>(); - protected Map> client2UrlsShareChannel = new HashMap>(); + protected Map> server2UrlsShareChannel = new HashMap>(); + protected Map> client2UrlsShareChannel = new HashMap>(); - @Override - public RestServer createServer(URL url) { - String ipPort = url.getServerPortStr(); - String protocolKey = MotanFrameworkUtil.getProtocolKey(url); + @Override + public RestServer createServer(URL url) { + String ipPort = url.getServerPortStr(); + String protocolKey = MotanFrameworkUtil.getProtocolKey(url); - LoggerUtil.info(this.getClass().getSimpleName() + " create share_channel server: url={}", url); + LoggerUtil.info(this.getClass().getSimpleName() + " create share_channel server: url={}", url); - synchronized (ipPort2ServerShareChannel) { - RestServer server = ipPort2ServerShareChannel.get(ipPort); + synchronized (ipPort2ServerShareChannel) { + RestServer server = ipPort2ServerShareChannel.get(ipPort); - if (server != null) { - saveEndpoint2Urls(server2UrlsShareChannel, server, protocolKey); + if (server != null) { + saveEndpoint2Urls(server2UrlsShareChannel, server, protocolKey); - return server; - } + return server; + } - url = url.createCopy(); - url.setPath(""); // 共享server端口,由于有多个interfaces存在,所以把path设置为空 + url = url.createCopy(); + url.setPath(""); // 共享server端口,由于有多个interfaces存在,所以把path设置为空 - server = innerCreateServer(url); + server = innerCreateServer(url); - server.start(); + server.start(); - ipPort2ServerShareChannel.put(ipPort, server); - saveEndpoint2Urls(server2UrlsShareChannel, server, protocolKey); + ipPort2ServerShareChannel.put(ipPort, server); + saveEndpoint2Urls(server2UrlsShareChannel, server, protocolKey); - return server; - } - } + return server; + } + } - @Override - public ResteasyWebTarget createClient(URL url) { - String ipPort = url.getServerPortStr(); - String protocolKey = MotanFrameworkUtil.getProtocolKey(url); + @Override + public ResteasyWebTarget createClient(URL url) { + String ipPort = url.getServerPortStr(); + String protocolKey = MotanFrameworkUtil.getProtocolKey(url); - LoggerUtil.info(this.getClass().getSimpleName() + " create share_channel client: url={}", url); + LoggerUtil.info(this.getClass().getSimpleName() + " create share_channel client: url={}", url); - synchronized (ipPort2ClientShareChannel) { - ResteasyWebTarget client = ipPort2ClientShareChannel.get(ipPort); + synchronized (ipPort2ClientShareChannel) { + ResteasyWebTarget client = ipPort2ClientShareChannel.get(ipPort); - if (client != null) { - saveEndpoint2Urls(client2UrlsShareChannel, client, protocolKey); - return client; - } + if (client != null) { + saveEndpoint2Urls(client2UrlsShareChannel, client, protocolKey); + return client; + } - client = innerCreateClient(url); + client = innerCreateClient(url); - ipPort2ClientShareChannel.put(ipPort, client); - saveEndpoint2Urls(client2UrlsShareChannel, client, protocolKey); + ipPort2ClientShareChannel.put(ipPort, client); + saveEndpoint2Urls(client2UrlsShareChannel, client, protocolKey); - return client; - } - } + return client; + } + } - @Override - public void safeReleaseResource(RestServer server, URL url) { - String ipPort = url.getServerPortStr(); - String protocolKey = MotanFrameworkUtil.getProtocolKey(url); + @Override + public void safeReleaseResource(RestServer server, URL url) { + String ipPort = url.getServerPortStr(); + String protocolKey = MotanFrameworkUtil.getProtocolKey(url); - synchronized (ipPort2ServerShareChannel) { - if (server != ipPort2ServerShareChannel.get(ipPort)) { - server.stop(); - return; - } + synchronized (ipPort2ServerShareChannel) { + if (server != ipPort2ServerShareChannel.get(ipPort)) { + server.stop(); + return; + } - Set urls = server2UrlsShareChannel.get(server); - urls.remove(protocolKey); + Set urls = server2UrlsShareChannel.get(server); + urls.remove(protocolKey); - if (urls.isEmpty()) { - server.stop(); - ipPort2ServerShareChannel.remove(ipPort); - server2UrlsShareChannel.remove(server); - } - } - } + if (urls.isEmpty()) { + server.stop(); + ipPort2ServerShareChannel.remove(ipPort); + server2UrlsShareChannel.remove(server); + } + } + } - @Override - public void safeReleaseResource(ResteasyWebTarget client, URL url) { - String ipPort = url.getServerPortStr(); - String protocolKey = MotanFrameworkUtil.getProtocolKey(url); + @Override + public void safeReleaseResource(ResteasyWebTarget client, URL url) { + String ipPort = url.getServerPortStr(); + String protocolKey = MotanFrameworkUtil.getProtocolKey(url); - synchronized (ipPort2ClientShareChannel) { - if (client != ipPort2ClientShareChannel.get(ipPort)) { - client.getResteasyClient().close(); - return; - } + synchronized (ipPort2ClientShareChannel) { + if (client != ipPort2ClientShareChannel.get(ipPort)) { + client.getResteasyClient().close(); + return; + } - Set urls = client2UrlsShareChannel.get(client); - urls.remove(protocolKey); + Set urls = client2UrlsShareChannel.get(client); + urls.remove(protocolKey); - if (urls.isEmpty()) { - client.getResteasyClient().close(); - ipPort2ClientShareChannel.remove(ipPort); - client2UrlsShareChannel.remove(client); - } - } - } + if (urls.isEmpty()) { + client.getResteasyClient().close(); + ipPort2ClientShareChannel.remove(ipPort); + client2UrlsShareChannel.remove(client); + } + } + } - private void saveEndpoint2Urls(Map> map, T endpoint, String protocolKey) { - Set sets = map.get(endpoint); + private void saveEndpoint2Urls(Map> map, T endpoint, String protocolKey) { + Set sets = map.get(endpoint); - if (sets == null) { - sets = new HashSet(); - map.put(endpoint, sets); - } + if (sets == null) { + sets = new HashSet(); + map.put(endpoint, sets); + } - sets.add(protocolKey); - } + sets.add(protocolKey); + } - protected abstract RestServer innerCreateServer(URL url); + protected abstract RestServer innerCreateServer(URL url); - protected ResteasyWebTarget innerCreateClient(URL url) { - ResteasyClient client = new ResteasyClientBuilder().build(); - String contextpath = url.getParameter("contextpath", "/"); - if (!contextpath.startsWith("/")) - contextpath = "/" + contextpath; + protected ResteasyWebTarget innerCreateClient(URL url) { + ResteasyClient client = new ResteasyClientBuilder().build(); + String contextpath = url.getParameter("contextpath", "/"); + if (!contextpath.startsWith("/")) + contextpath = "/" + contextpath; - return client.target("http://" + url.getHost() + ":" + url.getPort() + contextpath); - } + return client.target("http://" + url.getHost() + ":" + url.getPort() + contextpath); + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/ProviderResource.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/ProviderResource.java index b688155b5..e1c7e2f2e 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/ProviderResource.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/ProviderResource.java @@ -32,30 +32,30 @@ * @param */ public class ProviderResource implements ResourceFactory { - private final Provider provider; - private final ResourceClass resourceClass; + private final Provider provider; + private final ResourceClass resourceClass; - public ProviderResource(Provider provider) { - this.provider = provider; - this.resourceClass = ResourceBuilder.rootResourceFromAnnotations(provider.getImpl().getClass()); - } + public ProviderResource(Provider provider) { + this.provider = provider; + this.resourceClass = ResourceBuilder.rootResourceFromAnnotations(provider.getImpl().getClass()); + } - public void registered(ResteasyProviderFactory factory) { - factory.getInjectorFactory().createPropertyInjector(resourceClass, factory).inject(provider.getImpl()); - } + public void registered(ResteasyProviderFactory factory) { + factory.getInjectorFactory().createPropertyInjector(resourceClass, factory).inject(provider.getImpl()); + } - public Object createResource(HttpRequest request, HttpResponse response, ResteasyProviderFactory factory) { - return provider; - } + public Object createResource(HttpRequest request, HttpResponse response, ResteasyProviderFactory factory) { + return provider; + } - public void unregistered() { - } + public void unregistered() { + } - public Class getScannableClass() { - return provider.getImpl().getClass(); - } + public Class getScannableClass() { + return provider.getImpl().getClass(); + } - public void requestFinished(HttpRequest request, HttpResponse response, Object resource) { - } + public void requestFinished(HttpRequest request, HttpResponse response, Object resource) { + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulClientResponse.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulClientResponse.java index 48c7115a8..b06c32ddb 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulClientResponse.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulClientResponse.java @@ -20,23 +20,23 @@ import com.weibo.api.motan.rpc.DefaultResponse; public class RestfulClientResponse extends DefaultResponse { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -2780120101690526109L; - private BuiltResponse httpResponse; + private BuiltResponse httpResponse; - public RestfulClientResponse() { - } + public RestfulClientResponse() { + } - public RestfulClientResponse(long requestId) { - super(requestId); - } + public RestfulClientResponse(long requestId) { + super(requestId); + } - public void setHttpResponse(BuiltResponse httpResponse) { - this.httpResponse = httpResponse; - } + public void setHttpResponse(BuiltResponse httpResponse) { + this.httpResponse = httpResponse; + } - public BuiltResponse getHttpResponse() { - return httpResponse; - } + public BuiltResponse getHttpResponse() { + return httpResponse; + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulContainerRequest.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulContainerRequest.java index ee889ea90..dc320d640 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulContainerRequest.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulContainerRequest.java @@ -26,16 +26,16 @@ * */ public class RestfulContainerRequest extends DefaultRequest { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 5226548801729702089L; - private HttpRequest httpRequest; + private HttpRequest httpRequest; - public void setHttpRequest(HttpRequest httpRequest) { - this.httpRequest = httpRequest; - } + public void setHttpRequest(HttpRequest httpRequest) { + this.httpRequest = httpRequest; + } - public HttpRequest getHttpRequest() { - return httpRequest; - } + public HttpRequest getHttpRequest() { + return httpRequest; + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulInjectorFactory.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulInjectorFactory.java index 686886eae..f989521e1 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulInjectorFactory.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulInjectorFactory.java @@ -31,52 +31,52 @@ import com.weibo.api.motan.rpc.Response; import com.weibo.api.motan.util.ReflectUtil; -public class RestfulInjectorFactory extends InjectorFactoryImpl{ +public class RestfulInjectorFactory extends InjectorFactoryImpl { - @Override - public MethodInjector createMethodInjector(ResourceLocator method, ResteasyProviderFactory factory){ - return new RestfulMethodInjector(method, factory); - } + @Override + public MethodInjector createMethodInjector(ResourceLocator method, ResteasyProviderFactory factory) { + return new RestfulMethodInjector(method, factory); + } - private static class RestfulMethodInjector extends MethodInjectorImpl{ + private static class RestfulMethodInjector extends MethodInjectorImpl { - public RestfulMethodInjector(ResourceLocator resourceMethod, ResteasyProviderFactory factory){ - super(resourceMethod, factory); - } + public RestfulMethodInjector(ResourceLocator resourceMethod, ResteasyProviderFactory factory) { + super(resourceMethod, factory); + } - @Override - public Object invoke(HttpRequest request, HttpResponse httpResponse, Object resource) - throws Failure, ApplicationException{ - if(!Provider.class.isInstance(resource)){ - return super.invoke(request, httpResponse, resource); - } + @Override + public Object invoke(HttpRequest request, HttpResponse httpResponse, Object resource) + throws Failure, ApplicationException { + if (!Provider.class.isInstance(resource)) { + return super.invoke(request, httpResponse, resource); + } + + Object[] args = injectArguments(request, httpResponse); - Object[] args = injectArguments(request, httpResponse); + RestfulContainerRequest req = new RestfulContainerRequest(); + req.setInterfaceName(method.getResourceClass().getClazz().getName()); + req.setMethodName(method.getMethod().getName()); + req.setParamtersDesc(ReflectUtil.getMethodParamDesc(method.getMethod())); + req.setArguments(args); - RestfulContainerRequest req = new RestfulContainerRequest(); - req.setInterfaceName(method.getResourceClass().getClazz().getName()); - req.setMethodName(method.getMethod().getName()); - req.setParamtersDesc(ReflectUtil.getMethodParamDesc(method.getMethod())); - req.setArguments(args); + req.setHttpRequest(request); + req.setAttachments(RestfulUtil.decodeAttachments(request.getMutableHeaders())); - req.setHttpRequest(request); - req.setAttachments(RestfulUtil.decodeAttachments(request.getMutableHeaders())); + try { + Response resp = Provider.class.cast(resource).call(req); - try{ - Response resp = Provider.class.cast(resource).call(req); + RestfulUtil.encodeAttachments(httpResponse.getOutputHeaders(), resp.getAttachments()); - RestfulUtil.encodeAttachments(httpResponse.getOutputHeaders(), resp.getAttachments()); + return resp.getValue(); + } catch (Exception e) { + if (e != null && e instanceof RuntimeException) { + throw (RuntimeException) e; + } - return resp.getValue(); - }catch(Exception e){ - if(e != null && e instanceof RuntimeException){ - throw (RuntimeException) e; + throw new InternalServerErrorException("provider call process error:" + e.getMessage(), e); + } } - throw new InternalServerErrorException("provider call process error:" + e.getMessage(), e); - } } - } - } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulUtil.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulUtil.java index 1967c4a5a..0a88e96df 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulUtil.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RestfulUtil.java @@ -37,84 +37,84 @@ import com.weibo.api.motan.util.StringTools; public class RestfulUtil { - public static final String ATTACHMENT_HEADER = "X-Attach"; - public static final String EXCEPTION_HEADER = "X-Exception"; - - public static boolean isRpcRequest(MultivaluedMap headers) { - return headers != null && headers.containsKey(ATTACHMENT_HEADER); - } - - public static void encodeAttachments(MultivaluedMap headers, Map attachments) { - if (attachments == null || attachments.isEmpty()) - return; - - StringBuilder value = new StringBuilder(); - for (Map.Entry entry : attachments.entrySet()) { - value.append(StringTools.urlEncode(entry.getKey())).append("=") - .append(StringTools.urlEncode(entry.getValue())).append(";"); - } - - if (value.length() > 1) - value.deleteCharAt(value.length() - 1); - - headers.add(ATTACHMENT_HEADER, value.toString()); - } - - public static Map decodeAttachments(MultivaluedMap headers) { - String value = headers.getFirst(ATTACHMENT_HEADER); - - Map result = Collections.emptyMap(); - if (value != null && !value.isEmpty()) { - result = new HashMap(); - for (String kv : value.split(";")) { - String[] pair = kv.split("="); - if (pair.length == 2) { - result.put(StringTools.urlDecode(pair[0]), StringTools.urlDecode(pair[1])); - } - } - } - - return result; - } - - public static Response serializeError(Exception ex) { - try { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(ex); - oos.flush(); - - String info = new String(Base64.encodeBytesToBytes(baos.toByteArray()), MotanConstants.DEFAULT_CHARACTER); - return Response.status(Status.EXPECTATION_FAILED).header(EXCEPTION_HEADER, ex.getClass()).entity(info) - .build(); - } catch (IOException e) { - LoggerUtil.error("serialize " + ex.getClass() + " error", e); - - return Response.status(Status.INTERNAL_SERVER_ERROR).entity("serialization " + ex.getClass() + " error") - .build(); - } - } - - public static Exception getCause(BuiltResponse resp) { - if (resp == null || resp.getStatus() != Status.EXPECTATION_FAILED.getStatusCode()) - return null; - - String exceptionClass = resp.getHeaderString(EXCEPTION_HEADER); - if (!StringUtils.isBlank(exceptionClass)) { - String body = resp.readEntity(String.class); - resp.close(); - - try { - ByteArrayInputStream bais = new ByteArrayInputStream( - Base64.decode(body.getBytes(MotanConstants.DEFAULT_CHARACTER))); - ObjectInputStream ois = new ObjectInputStream(bais); - return (Exception) ois.readObject(); - } catch (Exception e) { - LoggerUtil.error("deserialize " + exceptionClass + " error", e); - } - } - - return null; - } + public static final String ATTACHMENT_HEADER = "X-Attach"; + public static final String EXCEPTION_HEADER = "X-Exception"; + + public static boolean isRpcRequest(MultivaluedMap headers) { + return headers != null && headers.containsKey(ATTACHMENT_HEADER); + } + + public static void encodeAttachments(MultivaluedMap headers, Map attachments) { + if (attachments == null || attachments.isEmpty()) + return; + + StringBuilder value = new StringBuilder(); + for (Map.Entry entry : attachments.entrySet()) { + value.append(StringTools.urlEncode(entry.getKey())).append("=") + .append(StringTools.urlEncode(entry.getValue())).append(";"); + } + + if (value.length() > 1) + value.deleteCharAt(value.length() - 1); + + headers.add(ATTACHMENT_HEADER, value.toString()); + } + + public static Map decodeAttachments(MultivaluedMap headers) { + String value = headers.getFirst(ATTACHMENT_HEADER); + + Map result = Collections.emptyMap(); + if (value != null && !value.isEmpty()) { + result = new HashMap(); + for (String kv : value.split(";")) { + String[] pair = kv.split("="); + if (pair.length == 2) { + result.put(StringTools.urlDecode(pair[0]), StringTools.urlDecode(pair[1])); + } + } + } + + return result; + } + + public static Response serializeError(Exception ex) { + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(ex); + oos.flush(); + + String info = new String(Base64.encodeBytesToBytes(baos.toByteArray()), MotanConstants.DEFAULT_CHARACTER); + return Response.status(Status.EXPECTATION_FAILED).header(EXCEPTION_HEADER, ex.getClass()).entity(info) + .build(); + } catch (IOException e) { + LoggerUtil.error("serialize " + ex.getClass() + " error", e); + + return Response.status(Status.INTERNAL_SERVER_ERROR).entity("serialization " + ex.getClass() + " error") + .build(); + } + } + + public static Exception getCause(BuiltResponse resp) { + if (resp == null || resp.getStatus() != Status.EXPECTATION_FAILED.getStatusCode()) + return null; + + String exceptionClass = resp.getHeaderString(EXCEPTION_HEADER); + if (!StringUtils.isBlank(exceptionClass)) { + String body = resp.readEntity(String.class); + resp.close(); + + try { + ByteArrayInputStream bais = new ByteArrayInputStream( + Base64.decode(body.getBytes(MotanConstants.DEFAULT_CHARACTER))); + ObjectInputStream ois = new ObjectInputStream(bais); + return (Exception) ois.readObject(); + } catch (Exception e) { + LoggerUtil.error("deserialize " + exceptionClass + " error", e); + } + } + + return null; + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RpcExceptionMapper.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RpcExceptionMapper.java index 869b3705b..e80391ad3 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RpcExceptionMapper.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/RpcExceptionMapper.java @@ -22,17 +22,17 @@ import org.jboss.resteasy.spi.HttpRequest; import org.jboss.resteasy.spi.ResteasyProviderFactory; -public class RpcExceptionMapper implements ExceptionMapper{ +public class RpcExceptionMapper implements ExceptionMapper { - @Override - public Response toResponse(Exception exception){ - HttpRequest httpRequest = ResteasyProviderFactory.getContextData(HttpRequest.class); - // 当为rpc调用时,序列化异常 - if(httpRequest != null & RestfulUtil.isRpcRequest(httpRequest.getMutableHeaders())){ - return RestfulUtil.serializeError(exception); - } + @Override + public Response toResponse(Exception exception) { + HttpRequest httpRequest = ResteasyProviderFactory.getContextData(HttpRequest.class); + // 当为rpc调用时,序列化异常 + if (httpRequest != null && RestfulUtil.isRpcRequest(httpRequest.getMutableHeaders())) { + return RestfulUtil.serializeError(exception); + } - return Response.status(Status.INTERNAL_SERVER_ERROR).entity(exception.getMessage()).build(); - } + return Response.status(Status.INTERNAL_SERVER_ERROR).entity(exception.getMessage()).build(); + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/netty/NettyEndpointFactory.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/netty/NettyEndpointFactory.java index b5fc3bfd9..5e67e36bf 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/netty/NettyEndpointFactory.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/netty/NettyEndpointFactory.java @@ -30,25 +30,25 @@ @SpiMeta(name = "netty") public class NettyEndpointFactory extends AbstractEndpointFactory { - @Override - protected RestServer innerCreateServer(URL url) { - NettyJaxrsServer server = new NettyJaxrsServer(); - server.setMaxRequestSize(url.getIntParameter(URLParamType.maxContentLength.getName(), - URLParamType.maxContentLength.getIntValue())); - - ResteasyDeployment deployment = new ResteasyDeployment(); - - server.setDeployment(deployment); - server.setExecutorThreadCount( - url.getIntParameter(URLParamType.maxWorkerThread.getName(), URLParamType.maxWorkerThread.getIntValue())); - server.setPort(url.getPort()); - server.setRootResourcePath(""); - server.setSecurityDomain(null); - - deployment.setInjectorFactoryClass(RestfulInjectorFactory.class.getName()); - deployment.getProviderClasses().add(RpcExceptionMapper.class.getName()); - - return new EmbedRestServer(server); - } + @Override + protected RestServer innerCreateServer(URL url) { + NettyJaxrsServer server = new NettyJaxrsServer(); + server.setMaxRequestSize(url.getIntParameter(URLParamType.maxContentLength.getName(), + URLParamType.maxContentLength.getIntValue())); + + ResteasyDeployment deployment = new ResteasyDeployment(); + + server.setDeployment(deployment); + server.setExecutorThreadCount(url.getIntParameter(URLParamType.maxWorkerThread.getName(), + URLParamType.maxWorkerThread.getIntValue())); + server.setPort(url.getPort()); + server.setRootResourcePath(""); + server.setSecurityDomain(null); + + deployment.setInjectorFactoryClass(RestfulInjectorFactory.class.getName()); + deployment.getProviderClasses().add(RpcExceptionMapper.class.getName()); + + return new EmbedRestServer(server); + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/proxy/RestfulClientInvoker.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/proxy/RestfulClientInvoker.java index c50a53ef3..447cfd5f5 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/proxy/RestfulClientInvoker.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/proxy/RestfulClientInvoker.java @@ -30,24 +30,24 @@ public class RestfulClientInvoker extends ClientInvoker { - public RestfulClientInvoker(ResteasyWebTarget parent, Class declaring, Method method, ProxyConfig config) { - super(parent, declaring, method, config); - } - - public Object invoke(Object[] args, Request req, RestfulClientResponse resp) { - ClientInvocation request = createRequest(args, req); - ClientResponse response = (ClientResponse) request.invoke(); - resp.setAttachments(RestfulUtil.decodeAttachments(response.getStringHeaders())); - resp.setHttpResponse(response); - - ClientContext context = new ClientContext(request, response, entityExtractorFactory); - return extractor.extractEntity(context); - } - - protected ClientInvocation createRequest(Object[] args, Request request) { - ClientInvocation inv = super.createRequest(args); - RestfulUtil.encodeAttachments(inv.getHeaders().getHeaders(), request.getAttachments()); - return inv; - } + public RestfulClientInvoker(ResteasyWebTarget parent, Class declaring, Method method, ProxyConfig config) { + super(parent, declaring, method, config); + } + + public Object invoke(Object[] args, Request req, RestfulClientResponse resp) { + ClientInvocation request = createRequest(args, req); + ClientResponse response = (ClientResponse) request.invoke(); + resp.setAttachments(RestfulUtil.decodeAttachments(response.getStringHeaders())); + resp.setHttpResponse(response); + + ClientContext context = new ClientContext(request, response, entityExtractorFactory); + return extractor.extractEntity(context); + } + + protected ClientInvocation createRequest(Object[] args, Request request) { + ClientInvocation inv = super.createRequest(args); + RestfulUtil.encodeAttachments(inv.getHeaders().getHeaders(), request.getAttachments()); + return inv; + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/proxy/RestfulProxyBuilder.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/proxy/RestfulProxyBuilder.java index ec4985d45..ea6514f93 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/proxy/RestfulProxyBuilder.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/proxy/RestfulProxyBuilder.java @@ -29,77 +29,79 @@ import org.jboss.resteasy.util.IsHttpMethod; public class RestfulProxyBuilder { - private final Class iface; - private final ResteasyWebTarget webTarget; - private ClassLoader loader = Thread.currentThread().getContextClassLoader(); - private MediaType serverConsumes; - private MediaType serverProduces; - - public static RestfulProxyBuilder builder(Class iface, WebTarget webTarget){ - return new RestfulProxyBuilder(iface, (ResteasyWebTarget) webTarget); - } - - public static Map proxy(final Class iface, WebTarget base, final ProxyConfig config){ - if(iface.isAnnotationPresent(Path.class)){ - Path path = iface.getAnnotation(Path.class); - if(!path.value().equals("") && !path.value().equals("/")){ - base = base.path(path.value()); - } + private final Class iface; + private final ResteasyWebTarget webTarget; + private ClassLoader loader = Thread.currentThread().getContextClassLoader(); + private MediaType serverConsumes; + private MediaType serverProduces; + + public static RestfulProxyBuilder builder(Class iface, WebTarget webTarget) { + return new RestfulProxyBuilder(iface, (ResteasyWebTarget) webTarget); } - HashMap methodMap = new HashMap(); - for(Method method : iface.getMethods()){ - RestfulClientInvoker invoker = createClientInvoker(iface, method, (ResteasyWebTarget) base, config); - methodMap.put(method, invoker); + public static Map proxy(final Class iface, WebTarget base, + final ProxyConfig config) { + if (iface.isAnnotationPresent(Path.class)) { + Path path = iface.getAnnotation(Path.class); + if (!path.value().equals("") && !path.value().equals("/")) { + base = base.path(path.value()); + } + } + + HashMap methodMap = new HashMap(); + for (Method method : iface.getMethods()) { + RestfulClientInvoker invoker = createClientInvoker(iface, method, (ResteasyWebTarget) base, config); + methodMap.put(method, invoker); + } + + return methodMap; } - return methodMap; - } + private static RestfulClientInvoker createClientInvoker(Class clazz, Method method, ResteasyWebTarget base, + ProxyConfig config) { + Set httpMethods = IsHttpMethod.getHttpMethods(method); + if (httpMethods == null || httpMethods.size() != 1) { + throw new RuntimeException( + "You must use at least one, but no more than one http method annotation on: " + method.toString()); + } + + RestfulClientInvoker invoker = new RestfulClientInvoker(base, clazz, method, config); + invoker.setHttpMethod(httpMethods.iterator().next()); + return invoker; + } + + private RestfulProxyBuilder(Class iface, ResteasyWebTarget webTarget) { + this.iface = iface; + this.webTarget = webTarget; + } + + public RestfulProxyBuilder classloader(ClassLoader cl) { + this.loader = cl; + return this; + } + + public RestfulProxyBuilder defaultProduces(MediaType type) { + this.serverProduces = type; + return this; + } + + public RestfulProxyBuilder defaultConsumes(MediaType type) { + this.serverConsumes = type; + return this; + } - private static RestfulClientInvoker createClientInvoker(Class clazz, Method method, ResteasyWebTarget base, - ProxyConfig config){ - Set httpMethods = IsHttpMethod.getHttpMethods(method); - if(httpMethods == null || httpMethods.size() != 1){ - throw new RuntimeException("You must use at least one, but no more than one http method annotation on: " + method.toString()); + public RestfulProxyBuilder defaultProduces(String type) { + this.serverProduces = MediaType.valueOf(type); + return this; } - RestfulClientInvoker invoker = new RestfulClientInvoker(base, clazz, method, config); - invoker.setHttpMethod(httpMethods.iterator().next()); - return invoker; - } - - private RestfulProxyBuilder(Class iface, ResteasyWebTarget webTarget){ - this.iface = iface; - this.webTarget = webTarget; - } - - public RestfulProxyBuilder classloader(ClassLoader cl){ - this.loader = cl; - return this; - } - - public RestfulProxyBuilder defaultProduces(MediaType type){ - this.serverProduces = type; - return this; - } - - public RestfulProxyBuilder defaultConsumes(MediaType type){ - this.serverConsumes = type; - return this; - } - - public RestfulProxyBuilder defaultProduces(String type){ - this.serverProduces = MediaType.valueOf(type); - return this; - } - - public RestfulProxyBuilder defaultConsumes(String type){ - this.serverConsumes = MediaType.valueOf(type); - return this; - } - - public Map build(){ - return proxy(iface, webTarget, new ProxyConfig(loader, serverConsumes, serverProduces)); - } + public RestfulProxyBuilder defaultConsumes(String type) { + this.serverConsumes = MediaType.valueOf(type); + return this; + } + + public Map build() { + return proxy(iface, webTarget, new ProxyConfig(loader, serverConsumes, serverProduces)); + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/servlet/RestfulServletContainerListener.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/servlet/RestfulServletContainerListener.java index 5d262eee1..049054f2c 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/servlet/RestfulServletContainerListener.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/servlet/RestfulServletContainerListener.java @@ -27,22 +27,22 @@ public class RestfulServletContainerListener extends ResteasyBootstrap implements ServletContextListener { - @Override - public void contextInitialized(ServletContextEvent sce) { - ServletContext servletContext = sce.getServletContext(); + @Override + public void contextInitialized(ServletContextEvent sce) { + ServletContext servletContext = sce.getServletContext(); - servletContext.setInitParameter("resteasy.injector.factory", RestfulInjectorFactory.class.getName()); - servletContext.setInitParameter(ResteasyContextParameters.RESTEASY_PROVIDERS, - RpcExceptionMapper.class.getName()); + servletContext.setInitParameter("resteasy.injector.factory", RestfulInjectorFactory.class.getName()); + servletContext.setInitParameter(ResteasyContextParameters.RESTEASY_PROVIDERS, + RpcExceptionMapper.class.getName()); - super.contextInitialized(sce); + super.contextInitialized(sce); - ServletRestServer.setResteasyDeployment(deployment); - } + ServletRestServer.setResteasyDeployment(deployment); + } - @Override - public void contextDestroyed(ServletContextEvent sce) { - super.contextDestroyed(sce); - } + @Override + public void contextDestroyed(ServletContextEvent sce) { + super.contextDestroyed(sce); + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/servlet/ServletEndpointFactory.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/servlet/ServletEndpointFactory.java index b6d29bf85..0286b709c 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/servlet/ServletEndpointFactory.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/servlet/ServletEndpointFactory.java @@ -23,11 +23,11 @@ @SpiMeta(name = "servlet") public class ServletEndpointFactory extends AbstractEndpointFactory { - @Override - protected RestServer innerCreateServer(URL url) { - ServletRestServer server = new ServletRestServer(); - server.checkEnv(); - return server; - } + @Override + protected RestServer innerCreateServer(URL url) { + ServletRestServer server = new ServletRestServer(); + server.checkEnv(); + return server; + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/servlet/ServletRestServer.java b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/servlet/ServletRestServer.java index 8182eb457..2aeee84c3 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/servlet/ServletRestServer.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/main/java/com/weibo/api/motan/protocol/restful/support/servlet/ServletRestServer.java @@ -21,30 +21,30 @@ import com.weibo.api.motan.protocol.restful.RestServer; public class ServletRestServer implements RestServer { - private static ResteasyDeployment deployment; - - public static void setResteasyDeployment(ResteasyDeployment deployment) { - ServletRestServer.deployment = deployment; - } - - public void checkEnv() { - if (deployment == null) { - throw new MotanFrameworkException("please config " - + RestfulServletContainerListener.class.getName() + " in your web.xml file"); - } - } - - @Override - public void start() { - } - - @Override - public ResteasyDeployment getDeployment() { - return deployment; - } - - @Override - public void stop() { - } + private static ResteasyDeployment deployment; + + public static void setResteasyDeployment(ResteasyDeployment deployment) { + ServletRestServer.deployment = deployment; + } + + public void checkEnv() { + if (deployment == null) { + throw new MotanFrameworkException("please config " + + RestfulServletContainerListener.class.getName() + " in your web.xml file"); + } + } + + @Override + public void start() { + } + + @Override + public ResteasyDeployment getDeployment() { + return deployment; + } + + @Override + public void stop() { + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/ClientFilter.java b/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/ClientFilter.java index 3f954e288..b7c299712 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/ClientFilter.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/ClientFilter.java @@ -23,22 +23,22 @@ import com.weibo.api.motan.rpc.Response; @SpiMeta(name = "clientf") -public class ClientFilter implements Filter{ +public class ClientFilter implements Filter { - @Override - public Response filter(Caller caller, Request request){ - // pass attachment - request.setAttachment("testName", "testName"); + @Override + public Response filter(Caller caller, Request request) { + // pass attachment + request.setAttachment("testName", "testName"); - Response response = caller.call(request); + Response response = caller.call(request); - assert response instanceof RestfulClientResponse; + assert response instanceof RestfulClientResponse; - RestfulClientResponse rfr = (RestfulClientResponse) response; - // obtain httpResponse 、 responseStatus、responseHeader and so on - rfr.getHttpResponse(); + RestfulClientResponse rfr = (RestfulClientResponse) response; + // obtain httpResponse 、 responseStatus、responseHeader and so on + rfr.getHttpResponse(); - return response; - } + return response; + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/HelloResource.java b/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/HelloResource.java index e0f65bd9e..68f0f9e32 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/HelloResource.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/HelloResource.java @@ -28,46 +28,46 @@ import javax.ws.rs.core.Response; @Path("/rest") -public interface HelloResource{ +public interface HelloResource { - @GET - @Produces(MediaType.APPLICATION_JSON) - List hello(@CookieParam("uid") int uid); + @GET + @Produces(MediaType.APPLICATION_JSON) + List hello(@CookieParam("uid") int uid); - @GET - @Path("/primitive") - @Produces(MediaType.TEXT_PLAIN) - String testPrimitiveType(); + @GET + @Path("/primitive") + @Produces(MediaType.TEXT_PLAIN) + String testPrimitiveType(); - @POST - @Consumes(MediaType.APPLICATION_FORM_URLENCODED) - @Produces(MediaType.APPLICATION_JSON) - Response add(@FormParam("id") int id, @FormParam("name") String name); + @POST + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + @Produces(MediaType.APPLICATION_JSON) + Response add(@FormParam("id") int id, @FormParam("name") String name); - @GET - @Path("/exception") - @Produces(MediaType.APPLICATION_JSON) - void testException(); + @GET + @Path("/exception") + @Produces(MediaType.APPLICATION_JSON) + void testException(); - public static class User{ - private int id; - private String name; + public static class User { + private int id; + private String name; - public User(){ - } + public User() { + } - public User(int id, String name){ - this.id = id; - this.name = name; - } + public User(int id, String name) { + this.id = id; + this.name = name; + } - public int getId(){ - return id; - } + public int getId() { + return id; + } - public String getName(){ - return name; + public String getName() { + return name; + } } - } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/RestHelloResource.java b/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/RestHelloResource.java index b0d4f3e6a..6e9d1e99a 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/RestHelloResource.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/RestHelloResource.java @@ -21,25 +21,25 @@ import javax.ws.rs.core.NewCookie; import javax.ws.rs.core.Response; -public class RestHelloResource implements HelloResource{ - - public List hello(int id){ - return Arrays.asList(new User(id, "de")); - } - - @Override - public String testPrimitiveType(){ - return "helloworld"; - } - - @Override - public Response add(int id, String name){ - return Response.ok().cookie(new NewCookie("ck", String.valueOf(id))).entity(new User(id, name)).build(); - } - - @Override - public void testException(){ - throw new UnsupportedOperationException("unsupport"); - } +public class RestHelloResource implements HelloResource { + + public List hello(int id) { + return Arrays.asList(new User(id, "de")); + } + + @Override + public String testPrimitiveType() { + return "helloworld"; + } + + @Override + public Response add(int id, String name) { + return Response.ok().cookie(new NewCookie("ck", String.valueOf(id))).entity(new User(id, name)).build(); + } + + @Override + public void testException() { + throw new UnsupportedOperationException("unsupport"); + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/ServerFilter.java b/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/ServerFilter.java index 9b43725bf..84989ec79 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/ServerFilter.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/ServerFilter.java @@ -24,27 +24,27 @@ import com.weibo.api.motan.rpc.Response; @SpiMeta(name = "serverf") -public class ServerFilter implements Filter{ +public class ServerFilter implements Filter { - @Override - public Response filter(Caller caller, Request request){ - assert request instanceof RestfulContainerRequest; + @Override + public Response filter(Caller caller, Request request) { + assert request instanceof RestfulContainerRequest; - RestfulContainerRequest req = (RestfulContainerRequest) request; - if(!"testName".equals(req.getAttachments().get("testName"))){ - DefaultResponse resp = new DefaultResponse(request.getRequestId()); - resp.setException(new IllegalStateException("must contain testName attachment")); - return resp; - } + RestfulContainerRequest req = (RestfulContainerRequest) request; + if (!"testName".equals(req.getAttachments().get("testName"))) { + DefaultResponse resp = new DefaultResponse(request.getRequestId()); + resp.setException(new IllegalStateException("must contain testName attachment")); + return resp; + } - assert request.getInterfaceName() != null; - assert request.getMethodName() != null; - assert request.getParamtersDesc() != null; + assert request.getInterfaceName() != null; + assert request.getMethodName() != null; + assert request.getParamtersDesc() != null; - // obtain httpRequest、 requestUri、httpMethod and so on - req.getHttpRequest(); + // obtain httpRequest、 requestUri、httpMethod and so on + req.getHttpRequest(); - return caller.call(request); - } + return caller.call(request); + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/TestRestful.java b/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/TestRestful.java index dec3ad036..cd729c0c9 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/TestRestful.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/TestRestful.java @@ -32,82 +32,82 @@ import com.weibo.api.motan.protocol.restful.HelloResource.User; public class TestRestful { - private ServiceConfig serviceConfig; - private RefererConfig refererConfig; - private HelloResource resource; - - @Before - public void setUp() { - ProtocolConfig protocolConfig = new ProtocolConfig(); - protocolConfig.setId("testRpc"); - protocolConfig.setName("restful"); - protocolConfig.setEndpointFactory("netty"); - - RegistryConfig registryConfig = new RegistryConfig(); - registryConfig.setName("local"); - registryConfig.setAddress("127.0.0.1"); - registryConfig.setPort(0); - - serviceConfig = new ServiceConfig(); - serviceConfig.setRef(new RestHelloResource()); - serviceConfig.setInterface(HelloResource.class); - serviceConfig.setProtocol(protocolConfig); - serviceConfig.setExport("testRpc:8002"); - serviceConfig.setFilter("serverf"); - serviceConfig.setGroup("test-group"); - serviceConfig.setVersion("0.0.3"); - serviceConfig.setRegistry(registryConfig); - - serviceConfig.export(); - - refererConfig = new RefererConfig(); - refererConfig.setDirectUrl("127.0.0.1:8002"); - refererConfig.setGroup("test-group"); - refererConfig.setVersion("0.0.3"); - refererConfig.setFilter("clientf"); - refererConfig.setProtocol(protocolConfig); - refererConfig.setInterface(HelloResource.class); - - resource = refererConfig.getRef(); - } - - @Test - public void testPrimitiveType() { - Assert.assertEquals("helloworld", resource.testPrimitiveType()); - } - - @Test - public void testCookie() { - List users = resource.hello(23); - Assert.assertEquals(users.size(), 1); - Assert.assertEquals(users.get(0).getId(), 23); - Assert.assertEquals(users.get(0).getName(), "de"); - } - - @Test - public void testReturnResponse() { - Response resp = resource.add(2, "de"); - Assert.assertEquals(resp.getStatus(), Status.OK.getStatusCode()); - Assert.assertEquals(resp.getCookies().size(), 1); - Assert.assertEquals(resp.getCookies().get("ck").getName(), "ck"); - Assert.assertEquals(resp.getCookies().get("ck").getValue(), "2"); - - User user = resp.readEntity(User.class); - resp.close(); - - Assert.assertEquals(user.getId(), 2); - Assert.assertEquals(user.getName(), "de"); - } - - @Test(expected = UnsupportedOperationException.class) - public void testException() { - resource.testException(); - } - - @After - public void tearDown() { - refererConfig.destroy(); - serviceConfig.unexport(); - } + private ServiceConfig serviceConfig; + private RefererConfig refererConfig; + private HelloResource resource; + + @Before + public void setUp() { + ProtocolConfig protocolConfig = new ProtocolConfig(); + protocolConfig.setId("testRpc"); + protocolConfig.setName("restful"); + protocolConfig.setEndpointFactory("netty"); + + RegistryConfig registryConfig = new RegistryConfig(); + registryConfig.setName("local"); + registryConfig.setAddress("127.0.0.1"); + registryConfig.setPort(0); + + serviceConfig = new ServiceConfig(); + serviceConfig.setRef(new RestHelloResource()); + serviceConfig.setInterface(HelloResource.class); + serviceConfig.setProtocol(protocolConfig); + serviceConfig.setExport("testRpc:8002"); + serviceConfig.setFilter("serverf"); + serviceConfig.setGroup("test-group"); + serviceConfig.setVersion("0.0.3"); + serviceConfig.setRegistry(registryConfig); + + serviceConfig.export(); + + refererConfig = new RefererConfig(); + refererConfig.setDirectUrl("127.0.0.1:8002"); + refererConfig.setGroup("test-group"); + refererConfig.setVersion("0.0.3"); + refererConfig.setFilter("clientf"); + refererConfig.setProtocol(protocolConfig); + refererConfig.setInterface(HelloResource.class); + + resource = refererConfig.getRef(); + } + + @Test + public void testPrimitiveType() { + Assert.assertEquals("helloworld", resource.testPrimitiveType()); + } + + @Test + public void testCookie() { + List users = resource.hello(23); + Assert.assertEquals(users.size(), 1); + Assert.assertEquals(users.get(0).getId(), 23); + Assert.assertEquals(users.get(0).getName(), "de"); + } + + @Test + public void testReturnResponse() { + Response resp = resource.add(2, "de"); + Assert.assertEquals(resp.getStatus(), Status.OK.getStatusCode()); + Assert.assertEquals(resp.getCookies().size(), 1); + Assert.assertEquals(resp.getCookies().get("ck").getName(), "ck"); + Assert.assertEquals(resp.getCookies().get("ck").getValue(), "2"); + + User user = resp.readEntity(User.class); + resp.close(); + + Assert.assertEquals(user.getId(), 2); + Assert.assertEquals(user.getName(), "de"); + } + + @Test(expected = UnsupportedOperationException.class) + public void testException() { + resource.testException(); + } + + @After + public void tearDown() { + refererConfig.destroy(); + serviceConfig.unexport(); + } } diff --git a/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/TestServletCotainerRestful.java b/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/TestServletCotainerRestful.java index cf9f5b7bb..d6ad62a34 100644 --- a/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/TestServletCotainerRestful.java +++ b/motan-extension/protocol-extension/motan-protocol-restful/src/test/java/com/weibo/api/motan/protocol/restful/TestServletCotainerRestful.java @@ -47,140 +47,140 @@ * */ public class TestServletCotainerRestful { - private Tomcat tomcat; - - private ServiceConfig serviceConfig; - private RefererConfig refererConfig; - private HelloResource resource; - - @Before - public void setUp() throws Exception { - tomcat = new Tomcat(); - String baseDir = new File(System.getProperty("java.io.tmpdir")).getAbsolutePath(); - tomcat.setBaseDir(baseDir); - tomcat.setPort(8002); - - tomcat.getConnector().setProperty("URIEncoding", "UTF-8"); - tomcat.getConnector().setProperty("socket.soReuseAddress", "true"); - tomcat.getConnector().setProperty("connectionTimeout", "20000"); - - String contextpath = "/cp"; - - String servletPrefix = "/servlet"; - - /** - *
-		 *
-		 * 
-		 *  dispatcher
-		 *  org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
-		 *  1
-		 *  
-		 *    resteasy.servlet.mapping.prefix
-		 *    /servlet  
-		 *  
-		 * 
-		 *
-		 * 
-		 *   dispatcher
-		 *   /servlet/*
-		 * 
-		 *
-		 * 
- */ - Context context = tomcat.addContext(contextpath, baseDir); - Wrapper wrapper = Tomcat.addServlet(context, "dispatcher", HttpServletDispatcher.class.getName()); - wrapper.addInitParameter(ResteasyContextParameters.RESTEASY_SERVLET_MAPPING_PREFIX, servletPrefix); - wrapper.setLoadOnStartup(1); - context.addServletMapping(servletPrefix + "/*", "dispatcher"); - - /** - * - * com.weibo.api.motan.protocol.restful.support.servlet.RestfulServletContainerListener - * - */ - context.addApplicationListener(RestfulServletContainerListener.class.getName()); - - tomcat.start(); - - ProtocolConfig protocolConfig = new ProtocolConfig(); - protocolConfig.setId("testRpc"); - protocolConfig.setName("restful"); - protocolConfig.setEndpointFactory("servlet"); - - Map ext = new HashMap(); - ext.put("contextpath", contextpath + servletPrefix); - protocolConfig.setParameters(ext); - - RegistryConfig registryConfig = new RegistryConfig(); - registryConfig.setName("local"); - registryConfig.setAddress("127.0.0.1"); - registryConfig.setPort(0); - - serviceConfig = new ServiceConfig(); - serviceConfig.setRef(new RestHelloResource()); - serviceConfig.setInterface(HelloResource.class); - serviceConfig.setProtocol(protocolConfig); - // 注意此处配置的端口并不会被使用,建议配置servlet服务器端口 - serviceConfig.setExport("testRpc:8003"); - serviceConfig.setFilter("serverf"); - serviceConfig.setGroup("test-group"); - serviceConfig.setVersion("0.0.3"); - serviceConfig.setRegistry(registryConfig); - - serviceConfig.export(); - - refererConfig = new RefererConfig(); - refererConfig.setDirectUrl("127.0.0.1:8002"); - refererConfig.setGroup("test-group"); - refererConfig.setVersion("0.0.3"); - refererConfig.setFilter("clientf"); - refererConfig.setProtocol(protocolConfig); - refererConfig.setInterface(HelloResource.class); - - resource = refererConfig.getRef(); - } - - @Test - public void testPrimitiveType() { - Assert.assertEquals("helloworld", resource.testPrimitiveType()); - } - - @Test - public void testCookie() { - List users = resource.hello(23); - Assert.assertEquals(users.size(), 1); - Assert.assertEquals(users.get(0).getId(), 23); - Assert.assertEquals(users.get(0).getName(), "de"); - } - - @Test - public void testReturnResponse() { - Response resp = resource.add(2, "de"); - Assert.assertEquals(resp.getStatus(), Status.OK.getStatusCode()); - Assert.assertEquals(resp.getCookies().size(), 1); - Assert.assertEquals(resp.getCookies().get("ck").getName(), "ck"); - Assert.assertEquals(resp.getCookies().get("ck").getValue(), "2"); - - User user = resp.readEntity(User.class); - resp.close(); - - Assert.assertEquals(user.getId(), 2); - Assert.assertEquals(user.getName(), "de"); - } - - @Test(expected = UnsupportedOperationException.class) - public void testException() { - resource.testException(); - } - - @After - public void tearDown() throws Exception { - serviceConfig.unexport(); - refererConfig.destroy(); - - tomcat.stop(); - tomcat.destroy(); - } + private Tomcat tomcat; + + private ServiceConfig serviceConfig; + private RefererConfig refererConfig; + private HelloResource resource; + + @Before + public void setUp() throws Exception { + tomcat = new Tomcat(); + String baseDir = new File(System.getProperty("java.io.tmpdir")).getAbsolutePath(); + tomcat.setBaseDir(baseDir); + tomcat.setPort(8002); + + tomcat.getConnector().setProperty("URIEncoding", "UTF-8"); + tomcat.getConnector().setProperty("socket.soReuseAddress", "true"); + tomcat.getConnector().setProperty("connectionTimeout", "20000"); + + String contextpath = "/cp"; + + String servletPrefix = "/servlet"; + + /** + *
+         *
+         * 
+         *  dispatcher
+         *  org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
+         *  1
+         *  
+         *    resteasy.servlet.mapping.prefix
+         *    /servlet  
+         *  
+         * 
+         *
+         * 
+         *   dispatcher
+         *   /servlet/*
+         * 
+         *
+         * 
+ */ + Context context = tomcat.addContext(contextpath, baseDir); + Wrapper wrapper = Tomcat.addServlet(context, "dispatcher", HttpServletDispatcher.class.getName()); + wrapper.addInitParameter(ResteasyContextParameters.RESTEASY_SERVLET_MAPPING_PREFIX, servletPrefix); + wrapper.setLoadOnStartup(1); + context.addServletMapping(servletPrefix + "/*", "dispatcher"); + + /** + * + * com.weibo.api.motan.protocol.restful.support.servlet.RestfulServletContainerListener + * + */ + context.addApplicationListener(RestfulServletContainerListener.class.getName()); + + tomcat.start(); + + ProtocolConfig protocolConfig = new ProtocolConfig(); + protocolConfig.setId("testRpc"); + protocolConfig.setName("restful"); + protocolConfig.setEndpointFactory("servlet"); + + Map ext = new HashMap(); + ext.put("contextpath", contextpath + servletPrefix); + protocolConfig.setParameters(ext); + + RegistryConfig registryConfig = new RegistryConfig(); + registryConfig.setName("local"); + registryConfig.setAddress("127.0.0.1"); + registryConfig.setPort(0); + + serviceConfig = new ServiceConfig(); + serviceConfig.setRef(new RestHelloResource()); + serviceConfig.setInterface(HelloResource.class); + serviceConfig.setProtocol(protocolConfig); + // 注意此处配置的端口并不会被使用,建议配置servlet服务器端口 + serviceConfig.setExport("testRpc:8003"); + serviceConfig.setFilter("serverf"); + serviceConfig.setGroup("test-group"); + serviceConfig.setVersion("0.0.3"); + serviceConfig.setRegistry(registryConfig); + + serviceConfig.export(); + + refererConfig = new RefererConfig(); + refererConfig.setDirectUrl("127.0.0.1:8002"); + refererConfig.setGroup("test-group"); + refererConfig.setVersion("0.0.3"); + refererConfig.setFilter("clientf"); + refererConfig.setProtocol(protocolConfig); + refererConfig.setInterface(HelloResource.class); + + resource = refererConfig.getRef(); + } + + @Test + public void testPrimitiveType() { + Assert.assertEquals("helloworld", resource.testPrimitiveType()); + } + + @Test + public void testCookie() { + List users = resource.hello(23); + Assert.assertEquals(users.size(), 1); + Assert.assertEquals(users.get(0).getId(), 23); + Assert.assertEquals(users.get(0).getName(), "de"); + } + + @Test + public void testReturnResponse() { + Response resp = resource.add(2, "de"); + Assert.assertEquals(resp.getStatus(), Status.OK.getStatusCode()); + Assert.assertEquals(resp.getCookies().size(), 1); + Assert.assertEquals(resp.getCookies().get("ck").getName(), "ck"); + Assert.assertEquals(resp.getCookies().get("ck").getValue(), "2"); + + User user = resp.readEntity(User.class); + resp.close(); + + Assert.assertEquals(user.getId(), 2); + Assert.assertEquals(user.getName(), "de"); + } + + @Test(expected = UnsupportedOperationException.class) + public void testException() { + resource.testException(); + } + + @After + public void tearDown() throws Exception { + serviceConfig.unexport(); + refererConfig.destroy(); + + tomcat.stop(); + tomcat.destroy(); + } }