You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/01/06 17:46:15 UTC
[09/10] camel git commit: CAMEL-9486: Add support for alternative
syntax in Camel @UriEndpoint so we are aware of this.
CAMEL-9486: Add support for alternative syntax in Camel @UriEndpoint so we are aware of this.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/cc71a4b4
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/cc71a4b4
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/cc71a4b4
Branch: refs/heads/camel-2.16.x
Commit: cc71a4b4a25abd4c2f75d8d0341f2bc8f6529f3a
Parents: dfa5238
Author: Claus Ibsen <da...@apache.org>
Authored: Wed Jan 6 16:41:58 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Wed Jan 6 17:45:13 2016 +0100
----------------------------------------------------------------------
.../component/file/remote/FtpEndpoint.java | 3 +-
.../component/file/remote/FtpsEndpoint.java | 3 +-
.../apache/camel/component/ssh/SshEndpoint.java | 3 +-
.../camel/catalog/DefaultCamelCatalog.java | 52 +++++++++++++++++++-
.../apache/camel/catalog/CamelCatalogTest.java | 27 ++++++++++
.../tools/apt/EndpointAnnotationProcessor.java | 14 +++++-
.../camel/tools/apt/model/ComponentModel.java | 9 ++++
.../java/org/apache/camel/spi/UriEndpoint.java | 10 ++++
8 files changed, 116 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/cc71a4b4/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java
index 0646643..6f449c7 100644
--- a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java
+++ b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java
@@ -37,7 +37,8 @@ import org.apache.commons.net.ftp.FTPFile;
* FTP endpoint
*/
@UriEndpoint(scheme = "ftp", extendsScheme = "file", title = "FTP",
- syntax = "ftp:host:port/directoryName", consumerClass = FtpConsumer.class, label = "file")
+ syntax = "ftp:host:port/directoryName", alternativeSyntax = "ftp:username:password@host:port/directoryName",
+ consumerClass = FtpConsumer.class, label = "file")
public class FtpEndpoint<T extends FTPFile> extends RemoteFileEndpoint<FTPFile> {
protected int soTimeout;
protected int dataTimeout;
http://git-wip-us.apache.org/repos/asf/camel/blob/cc71a4b4/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java
index 8c9beb5..30ac135 100644
--- a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java
+++ b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java
@@ -42,7 +42,8 @@ import org.apache.commons.net.ftp.FTPSClient;
* @version
*/
@UriEndpoint(scheme = "ftps", extendsScheme = "file", title = "FTPS",
- syntax = "ftps:host:port/directoryName", consumerClass = FtpConsumer.class, label = "file")
+ syntax = "ftps:host:port/directoryName", alternativeSyntax = "ftps:username:password@host:port/directoryName",
+ consumerClass = FtpConsumer.class, label = "file")
public class FtpsEndpoint extends FtpEndpoint<FTPFile> {
@UriParam
protected FtpsConfiguration configuration;
http://git-wip-us.apache.org/repos/asf/camel/blob/cc71a4b4/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshEndpoint.java b/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshEndpoint.java
index af709f4..494348c 100644
--- a/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshEndpoint.java
+++ b/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshEndpoint.java
@@ -40,7 +40,8 @@ import org.slf4j.LoggerFactory;
/**
* Represents an SSH endpoint.
*/
-@UriEndpoint(scheme = "ssh", title = "SSH", syntax = "ssh:host:port", consumerClass = SshConsumer.class, label = "file")
+@UriEndpoint(scheme = "ssh", title = "SSH", syntax = "ssh:host:port", alternativeSyntax = "ssh:username:password@host:port",
+ consumerClass = SshConsumer.class, label = "file")
public class SshEndpoint extends ScheduledPollEndpoint {
protected final Logger log = LoggerFactory.getLogger(getClass());
http://git-wip-us.apache.org/repos/asf/camel/blob/cc71a4b4/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
----------------------------------------------------------------------
diff --git a/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java b/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
index db0f5ef..e106897 100644
--- a/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
+++ b/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
@@ -940,13 +940,34 @@ public class DefaultCamelCatalog implements CamelCatalog {
throw new IllegalArgumentException("Cannot find endpoint with scheme " + scheme);
}
+ Map<String, String> userInfoOptions = new LinkedHashMap<String, String>();
+
+ // do we have user info in authority?
+ boolean userInfo = false;
+ String username = null;
+ String password = null;
+ if (u.getUserInfo() != null) {
+ userInfo = true;
+ String[] parts = u.getUserInfo().split(":");
+ if (parts.length == 2) {
+ username = parts[0];
+ password = parts[1];
+ } else {
+ // only username
+ username = u.getUserInfo();
+ }
+ }
+
// grab the syntax
String syntax = null;
+ String alternativeSyntax = null;
List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
for (Map<String, String> row : rows) {
if (row.containsKey("syntax")) {
syntax = row.get("syntax");
- break;
+ }
+ if (row.containsKey("alternativeSyntax")) {
+ alternativeSyntax = row.get("alternativeSyntax");
}
}
if (syntax == null) {
@@ -955,11 +976,35 @@ public class DefaultCamelCatalog implements CamelCatalog {
// clip the scheme from the syntax
syntax = after(syntax, ":");
+ if (alternativeSyntax != null) {
+ alternativeSyntax = after(alternativeSyntax, ":");
+ }
// clip the scheme from the uri
uri = after(uri, ":");
String uriPath = stripQuery(uri);
+ // do the component support userinfo?
+ if (alternativeSyntax != null && alternativeSyntax.contains("@")) {
+ int idx = alternativeSyntax.indexOf("@");
+ String fields = alternativeSyntax.substring(0, idx);
+ String[] names = fields.split(":");
+ if (userInfo && names.length == 2) {
+ userInfoOptions.put(names[0], username);
+ if (password != null) {
+ // password is optional
+ userInfoOptions.put(names[1], password);
+ }
+ }
+ }
+ // strip user info from uri path
+ if (userInfo) {
+ int idx = uriPath.indexOf('@');
+ if (idx > -1) {
+ uriPath = uriPath.substring(idx + 1);
+ }
+ }
+
// strip double slash in the start
if (uriPath != null && uriPath.startsWith("//")) {
uriPath = uriPath.substring(2);
@@ -1016,6 +1061,11 @@ public class DefaultCamelCatalog implements CamelCatalog {
// now parse the uri to know which part isw what
Map<String, String> options = new LinkedHashMap<String, String>();
+ // include the username and password from the userinfo section
+ if (!userInfoOptions.isEmpty()) {
+ options.putAll(userInfoOptions);
+ }
+
// word contains the syntax path elements
Iterator<String> it = word2.iterator();
for (int i = 0; i < word.size(); i++) {
http://git-wip-us.apache.org/repos/asf/camel/blob/cc71a4b4/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
----------------------------------------------------------------------
diff --git a/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
index 16627ff..26b4788 100644
--- a/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
+++ b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
@@ -392,6 +392,25 @@ public class CamelCatalogTest {
}
@Test
+ public void testEndpointPropertiesSshWithUserInfo() throws Exception {
+ Map<String, String> map = catalog.endpointProperties("ssh:localhost:8101?username=scott&password=tiger");
+ assertNotNull(map);
+ assertEquals(4, map.size());
+ assertEquals("8101", map.get("port"));
+ assertEquals("localhost", map.get("host"));
+ assertEquals("scott", map.get("username"));
+ assertEquals("tiger", map.get("password"));
+
+ map = catalog.endpointProperties("ssh://scott:tiger@localhost:8101");
+ assertNotNull(map);
+ assertEquals(4, map.size());
+ assertEquals("8101", map.get("port"));
+ assertEquals("localhost", map.get("host"));
+ assertEquals("scott", map.get("username"));
+ assertEquals("tiger", map.get("password"));
+ }
+
+ @Test
public void validateProperties() throws Exception {
// valid
EndpointValidationResult result = catalog.validateEndpointProperties("log:mylog");
@@ -505,6 +524,14 @@ public class CamelCatalogTest {
// 2 slash after component name
result = catalog.validateEndpointProperties("atmos://put?remotePath=/dummy.txt");
assertTrue(result.isSuccess());
+
+ // userinfo in authority with username and password
+ result = catalog.validateEndpointProperties("ssh://karaf:karaf@localhost:8101");
+ assertTrue(result.isSuccess());
+
+ // userinfo in authority without password
+ result = catalog.validateEndpointProperties("ssh://scott@localhost:8101?certResource=classpath:test_rsa&useFixedDelay=true&delay=5000&pollCommand=features:list%0A");
+ assertTrue(result.isSuccess());
}
@Test
http://git-wip-us.apache.org/repos/asf/camel/blob/cc71a4b4/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
----------------------------------------------------------------------
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
index e63d57e..1e4a96b 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
@@ -135,6 +135,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
ComponentModel componentModel = findComponentProperties(roundEnv, uriEndpoint, title, scheme, extendsScheme, label);
String syntax = componentModel.getSyntax();
+ String alternativeSyntax = componentModel.getAlternativeSyntax();
String description = componentModel.getDescription();
writer.println("<html>");
@@ -143,9 +144,12 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
writer.println("</header>");
writer.println("<body>");
writer.println("<h1>" + title + "</h1>");
- writer.println("<b>Description:</b> " + description + "<br/>");
writer.println("<b>Scheme:</b> " + scheme + "<br/>");
writer.println("<b>Syntax:</b> " + syntax + "<br/>");
+ if (alternativeSyntax != null) {
+ writer.println("<b>Alternative Syntax:</b> " + alternativeSyntax + "<br/>");
+ }
+ writer.println("<b>Description:</b> " + description + "<br/>");
writer.println("<b>Maven:</b> " + componentModel.getGroupId() + "/" + componentModel.getArtifactId() + "/" + componentModel.getVersionId() + "<br/>");
writeHtmlDocumentationAndFieldInjections(writer, roundEnv, componentModel, classElement, "", uriEndpoint.excludeProperties());
@@ -209,6 +213,9 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
buffer.append("\n \"extendsScheme\": \"").append(componentModel.getExtendsScheme()).append("\",");
}
buffer.append("\n \"syntax\": \"").append(componentModel.getSyntax()).append("\",");
+ if (componentModel.getAlternativeSyntax() != null) {
+ buffer.append("\n \"alternativeSyntax\": \"").append(componentModel.getAlternativeSyntax()).append("\",");
+ }
buffer.append("\n \"title\": \"").append(componentModel.getTitle()).append("\",");
buffer.append("\n \"description\": \"").append(componentModel.getDescription()).append("\",");
buffer.append("\n \"label\": \"").append(getOrElse(componentModel.getLabel(), "")).append("\",");
@@ -433,6 +440,11 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
// if the scheme is an alias then replace the scheme name from the syntax with the alias
String syntax = scheme + ":" + Strings.after(uriEndpoint.syntax(), ":");
+ // alternative syntax is optional
+ if (!Strings.isNullOrEmpty(uriEndpoint.alternativeSyntax())) {
+ String alternativeSyntax = scheme + ":" + Strings.after(uriEndpoint.alternativeSyntax(), ":");
+ model.setAlternativeSyntax(alternativeSyntax);
+ }
model.setExtendsScheme(extendsScheme);
model.setSyntax(syntax);
http://git-wip-us.apache.org/repos/asf/camel/blob/cc71a4b4/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/ComponentModel.java
----------------------------------------------------------------------
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/ComponentModel.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/ComponentModel.java
index 2962e91..7efdbb7 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/ComponentModel.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/ComponentModel.java
@@ -21,6 +21,7 @@ public final class ComponentModel {
private String scheme;
private String extendsScheme;
private String syntax;
+ private String alternativeSyntax;
private String javaType;
private String title;
private String description;
@@ -57,6 +58,14 @@ public final class ComponentModel {
this.syntax = syntax;
}
+ public String getAlternativeSyntax() {
+ return alternativeSyntax;
+ }
+
+ public void setAlternativeSyntax(String alternativeSyntax) {
+ this.alternativeSyntax = alternativeSyntax;
+ }
+
public String getJavaType() {
return javaType;
}
http://git-wip-us.apache.org/repos/asf/camel/blob/cc71a4b4/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriEndpoint.java
----------------------------------------------------------------------
diff --git a/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriEndpoint.java b/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriEndpoint.java
index b557d51..2b116e1 100644
--- a/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriEndpoint.java
+++ b/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriEndpoint.java
@@ -74,6 +74,16 @@ public @interface UriEndpoint {
String syntax();
/**
+ * If the endpoint supports specifying username and/or password in the UserInfo part of the URI, then the
+ * alternative syntax can represent this such as:
+ * <ul>
+ * <li>ftp:userName:password@host:port/directoryName</li>
+ * <li>ssh:username:password@host:port</li>
+ * </ul>
+ */
+ String alternativeSyntax() default "";
+
+ /**
* Represents the consumer class which is injected and created by consumers
*/
Class<?> consumerClass() default Object.class;