CAMEL-10774: Add others to spring-boot runtime provider for camel-catalog
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/fd457a40 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/fd457a40 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/fd457a40 Branch: refs/heads/master Commit: fd457a400691798fce82768eeb3871538b6cd91c Parents: bfe4fec Author: Claus Ibsen <davscl...@apache.org> Authored: Fri Feb 3 18:43:52 2017 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Feb 3 20:31:28 2017 +0100 ---------------------------------------------------------------------- .../springboot/SpringBootRuntimeProvider.java | 21 +++ .../SpringBootRuntimeProviderTest.java | 22 +++ .../packaging/PrepareCatalogSpringBootMojo.java | 144 ++++++++++++++++++- 3 files changed, 185 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/fd457a40/platforms/catalog-provider-springboot/src/main/java/org/apache/camel/catalog/springboot/SpringBootRuntimeProvider.java ---------------------------------------------------------------------- diff --git a/platforms/catalog-provider-springboot/src/main/java/org/apache/camel/catalog/springboot/SpringBootRuntimeProvider.java b/platforms/catalog-provider-springboot/src/main/java/org/apache/camel/catalog/springboot/SpringBootRuntimeProvider.java index 8e06e86..7fe2117 100644 --- a/platforms/catalog-provider-springboot/src/main/java/org/apache/camel/catalog/springboot/SpringBootRuntimeProvider.java +++ b/platforms/catalog-provider-springboot/src/main/java/org/apache/camel/catalog/springboot/SpringBootRuntimeProvider.java @@ -34,9 +34,11 @@ public class SpringBootRuntimeProvider implements RuntimeProvider { private static final String COMPONENT_DIR = "org/apache/camel/catalog/springboot/components"; private static final String DATAFORMAT_DIR = "org/apache/camel/catalog/springboot/dataformats"; private static final String LANGUAGE_DIR = "org/apache/camel/catalog/springboot/languages"; + private static final String OTHER_DIR = "org/apache/camel/catalog/springboot/others"; private static final String COMPONENTS_CATALOG = "org/apache/camel/catalog/springboot/components.properties"; private static final String DATA_FORMATS_CATALOG = "org/apache/camel/catalog/springboot/dataformats.properties"; private static final String LANGUAGE_CATALOG = "org/apache/camel/catalog/springboot/languages.properties"; + private static final String OTHER_CATALOG = "org/apache/camel/catalog/springboot/others.properties"; private CamelCatalog camelCatalog; @@ -71,6 +73,11 @@ public class SpringBootRuntimeProvider implements RuntimeProvider { } @Override + public String getOtherJSonSchemaDirectory() { + return OTHER_DIR; + } + + @Override public List<String> findComponentNames() { List<String> names = new ArrayList<String>(); InputStream is = camelCatalog.getVersionManager().getResourceAsStream(COMPONENTS_CATALOG); @@ -112,4 +119,18 @@ public class SpringBootRuntimeProvider implements RuntimeProvider { return names; } + @Override + public List<String> findOtherNames() { + List<String> names = new ArrayList<String>(); + InputStream is = camelCatalog.getVersionManager().getResourceAsStream(OTHER_CATALOG); + if (is != null) { + try { + CatalogHelper.loadLines(is, names); + } catch (IOException e) { + // ignore + } + } + return names; + } + } http://git-wip-us.apache.org/repos/asf/camel/blob/fd457a40/platforms/catalog-provider-springboot/src/test/java/org/apache/camel/catalog/springboot/SpringBootRuntimeProviderTest.java ---------------------------------------------------------------------- diff --git a/platforms/catalog-provider-springboot/src/test/java/org/apache/camel/catalog/springboot/SpringBootRuntimeProviderTest.java b/platforms/catalog-provider-springboot/src/test/java/org/apache/camel/catalog/springboot/SpringBootRuntimeProviderTest.java index 28aeb8a..4c53690 100644 --- a/platforms/catalog-provider-springboot/src/test/java/org/apache/camel/catalog/springboot/SpringBootRuntimeProviderTest.java +++ b/platforms/catalog-provider-springboot/src/test/java/org/apache/camel/catalog/springboot/SpringBootRuntimeProviderTest.java @@ -94,6 +94,20 @@ public class SpringBootRuntimeProviderTest { } @Test + public void testFindOtherNames() throws Exception { + List<String> names = catalog.findOtherNames(); + + assertNotNull(names); + assertFalse(names.isEmpty()); + + assertTrue(names.contains("hystrix")); + assertTrue(names.contains("spring-boot")); + assertTrue(names.contains("zipkin")); + + assertFalse(names.contains("blueprint")); + } + + @Test public void testComponentArtifactId() throws Exception { String json = catalog.componentJSonSchema("ftp"); @@ -117,4 +131,12 @@ public class SpringBootRuntimeProviderTest { assertTrue(json.contains("camel-spring-starter")); } + @Test + public void testOtherArtifactId() throws Exception { + String json = catalog.otherJSonSchema("zipkin"); + + assertNotNull(json); + assertTrue(json.contains("camel-zipkin-starter")); + } + } http://git-wip-us.apache.org/repos/asf/camel/blob/fd457a40/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogSpringBootMojo.java ---------------------------------------------------------------------- diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogSpringBootMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogSpringBootMojo.java index c8640a6..fa61295 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogSpringBootMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogSpringBootMojo.java @@ -80,6 +80,13 @@ public class PrepareCatalogSpringBootMojo extends AbstractMojo { protected File languagesOutDir; /** + * The output directory for others catalog + * + * @parameter default-value="${project.build.directory}/classes/org/apache/camel/catalog/springboot/others" + */ + protected File othersOutDir; + + /** * The directory where all spring-boot starters are * * @parameter default-value="${project.build.directory}/../../../platforms/spring-boot/components-starter" @@ -120,6 +127,7 @@ public class PrepareCatalogSpringBootMojo extends AbstractMojo { executeComponents(starters); executeDataFormats(starters); executeLanguages(starters); + executeOthers(starters); } protected void executeComponents(Set<String> starters) throws MojoExecutionException, MojoFailureException { @@ -237,7 +245,7 @@ public class PrepareCatalogSpringBootMojo extends AbstractMojo { if (dir.isDirectory() && "camel-spring-dm".equals(dir.getName())) { continue; } - // the directory must be in the list of known features + // the directory must be in the list of known starters if (!starters.contains(dir.getName())) { continue; } @@ -322,7 +330,7 @@ public class PrepareCatalogSpringBootMojo extends AbstractMojo { if (dir.isDirectory() && "camel-spring-dm".equals(dir.getName())) { continue; } - // the directory must be in the list of known features + // the directory must be in the list of known starters if (!starters.contains(dir.getName())) { continue; } @@ -392,6 +400,102 @@ public class PrepareCatalogSpringBootMojo extends AbstractMojo { } } + protected void executeOthers(Set<String> starters) throws MojoExecutionException, MojoFailureException { + getLog().info("Copying all Camel other json descriptors"); + + // lets use sorted set/maps + Set<File> jsonFiles = new TreeSet<File>(); + Set<File> otherFiles = new TreeSet<File>(); + + // find all other from the components directory + if (componentsDir != null && componentsDir.isDirectory()) { + File[] others = componentsDir.listFiles(); + if (others != null) { + for (File dir : others) { + // skip camel-spring-dm + if (dir.isDirectory() && "camel-spring-dm".equals(dir.getName())) { + continue; + } + // the directory must be in the list of known starters + if (!starters.contains(dir.getName())) { + continue; + } + + // skip these special cases + // (camel-jetty is a placeholder, as camel-jetty9 is the actual component) + if ("camel-core-osgi".equals(dir.getName()) + || "camel-core-xml".equals(dir.getName()) + || "camel-http-common".equals(dir.getName()) + || "camel-jetty".equals(dir.getName()) + || "camel-jetty-common".equals(dir.getName()) + || "camel-linkedin".equals(dir.getName()) + || "camel-olingo2".equals(dir.getName()) + || "camel-salesforce".equals(dir.getName())) { + continue; + } + + if (dir.isDirectory() && !"target".equals(dir.getName())) { + File target = new File(dir, "target/classes"); + findOtherFilesRecursive(target, jsonFiles, otherFiles, new CamelOthersFileFilter()); + } + } + } + } + + getLog().info("Found " + otherFiles.size() + " other.properties files"); + getLog().info("Found " + jsonFiles.size() + " other json files"); + + // make sure to create out dir + othersOutDir.mkdirs(); + + for (File file : jsonFiles) { + // for spring-boot we need to amend the json file to use -starter as the artifact-id + try { + String text = loadText(new FileInputStream(file)); + + text = ARTIFACT_PATTERN.matcher(text).replaceFirst("\"artifactId\": \"camel-$1-starter\""); + + // write new json file + File to = new File(othersOutDir, file.getName()); + FileOutputStream fos = new FileOutputStream(to, false); + + fos.write(text.getBytes()); + + fos.close(); + + } catch (IOException e) { + throw new MojoFailureException("Cannot write json file " + file, e); + } + } + + File all = new File(othersOutDir, "../others.properties"); + try { + FileOutputStream fos = new FileOutputStream(all, false); + + String[] names = othersOutDir.list(); + List<String> others = new ArrayList<String>(); + // sort the names + for (String name : names) { + if (name.endsWith(".json")) { + // strip out .json from the name + String otherName = name.substring(0, name.length() - 5); + others.add(otherName); + } + } + + Collections.sort(others); + for (String name : others) { + fos.write(name.getBytes()); + fos.write("\n".getBytes()); + } + + fos.close(); + + } catch (IOException e) { + throw new MojoFailureException("Error writing to file " + all); + } + } + private void findComponentFilesRecursive(File dir, Set<File> found, Set<File> components, FileFilter filter) { File[] files = dir.listFiles(filter); if (files != null) { @@ -449,6 +553,25 @@ public class PrepareCatalogSpringBootMojo extends AbstractMojo { } } + private void findOtherFilesRecursive(File dir, Set<File> found, Set<File> others, FileFilter filter) { + File[] files = dir.listFiles(filter); + if (files != null) { + for (File file : files) { + // skip files in root dirs as Camel does not store information there but others may do + boolean rootDir = "classes".equals(dir.getName()) || "META-INF".equals(dir.getName()); + boolean jsonFile = rootDir && file.isFile() && file.getName().endsWith(".json"); + boolean otherFile = !rootDir && file.isFile() && file.getName().equals("other.properties"); + if (jsonFile) { + found.add(file); + } else if (otherFile) { + others.add(file); + } else if (file.isDirectory()) { + findOtherFilesRecursive(file, found, others, filter); + } + } + } + } + private class CamelComponentsFileFilter implements FileFilter { @Override @@ -512,6 +635,23 @@ public class PrepareCatalogSpringBootMojo extends AbstractMojo { } } + private class CamelOthersFileFilter implements FileFilter { + + @Override + public boolean accept(File pathname) { + if (pathname.isFile() && pathname.getName().endsWith(".json")) { + // must be a language json file + try { + String json = loadText(new FileInputStream(pathname)); + return json != null && json.contains("\"kind\": \"other\""); + } catch (IOException e) { + // ignore + } + } + return pathname.isDirectory() || (pathname.isFile() && pathname.getName().equals("other.properties")); + } + } + public static void copyFile(File from, File to) throws IOException { FileChannel in = null; FileChannel out = null;