CAMEL-10774: Add others to karaf 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/bfe4fec7 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/bfe4fec7 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/bfe4fec7 Branch: refs/heads/master Commit: bfe4fec7ef6c2a95f911558a8106f530108fb192 Parents: 794e382 Author: Claus Ibsen <davscl...@apache.org> Authored: Fri Feb 3 18:34:53 2017 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Feb 3 20:31:28 2017 +0100 ---------------------------------------------------------------------- .../catalog/karaf/KarafRuntimeProvider.java | 23 +++- .../catalog/karaf/KarafRuntimeProviderTest.java | 15 +++ .../packaging/PrepareCatalogKarafMojo.java | 126 ++++++++++++++++++- 3 files changed, 161 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/bfe4fec7/platforms/catalog-provider-karaf/src/main/java/org/apache/camel/catalog/karaf/KarafRuntimeProvider.java ---------------------------------------------------------------------- diff --git a/platforms/catalog-provider-karaf/src/main/java/org/apache/camel/catalog/karaf/KarafRuntimeProvider.java b/platforms/catalog-provider-karaf/src/main/java/org/apache/camel/catalog/karaf/KarafRuntimeProvider.java index 86811e4..8f037bc 100644 --- a/platforms/catalog-provider-karaf/src/main/java/org/apache/camel/catalog/karaf/KarafRuntimeProvider.java +++ b/platforms/catalog-provider-karaf/src/main/java/org/apache/camel/catalog/karaf/KarafRuntimeProvider.java @@ -26,7 +26,7 @@ import org.apache.camel.catalog.CatalogHelper; import org.apache.camel.catalog.RuntimeProvider; /** - * A karaf based {@link RuntimeProvider} which only includes the supported Camel components, data formats, and languages + * A karaf based {@link RuntimeProvider} which only includes the supported Camel components, data formats, languages and others * which can be installed in Karaf using the Camel Karaf features.xml descriptor. */ public class KarafRuntimeProvider implements RuntimeProvider { @@ -34,9 +34,11 @@ public class KarafRuntimeProvider implements RuntimeProvider { private static final String COMPONENT_DIR = "org/apache/camel/catalog/karaf/components"; private static final String DATAFORMAT_DIR = "org/apache/camel/catalog/karaf/dataformats"; private static final String LANGUAGE_DIR = "org/apache/camel/catalog/karaf/languages"; + private static final String OTHER_DIR = "org/apache/camel/catalog/karaf/others"; private static final String COMPONENTS_CATALOG = "org/apache/camel/catalog/karaf/components.properties"; private static final String DATA_FORMATS_CATALOG = "org/apache/camel/catalog/karaf/dataformats.properties"; private static final String LANGUAGE_CATALOG = "org/apache/camel/catalog/karaf/languages.properties"; + private static final String OTHER_CATALOG = "org/apache/camel/catalog/karaf/others.properties"; private CamelCatalog camelCatalog; @@ -71,6 +73,11 @@ public class KarafRuntimeProvider 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 KarafRuntimeProvider 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/bfe4fec7/platforms/catalog-provider-karaf/src/test/java/org/apache/camel/catalog/karaf/KarafRuntimeProviderTest.java ---------------------------------------------------------------------- diff --git a/platforms/catalog-provider-karaf/src/test/java/org/apache/camel/catalog/karaf/KarafRuntimeProviderTest.java b/platforms/catalog-provider-karaf/src/test/java/org/apache/camel/catalog/karaf/KarafRuntimeProviderTest.java index c652b2f..74425de 100644 --- a/platforms/catalog-provider-karaf/src/test/java/org/apache/camel/catalog/karaf/KarafRuntimeProviderTest.java +++ b/platforms/catalog-provider-karaf/src/test/java/org/apache/camel/catalog/karaf/KarafRuntimeProviderTest.java @@ -90,4 +90,19 @@ public class KarafRuntimeProviderTest { assertTrue(names.contains("xpath")); } + @Test + public void testFindOtherNames() throws Exception { + List<String> names = catalog.findOtherNames(); + + assertNotNull(names); + assertFalse(names.isEmpty()); + + assertTrue(names.contains("blueprint")); + assertTrue(names.contains("hystrix")); + assertTrue(names.contains("swagger-java")); + assertTrue(names.contains("zipkin")); + + assertFalse(names.contains("spring-boot")); + } + } http://git-wip-us.apache.org/repos/asf/camel/blob/bfe4fec7/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogKarafMojo.java ---------------------------------------------------------------------- diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogKarafMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogKarafMojo.java index 8ee7a15..c60522b 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogKarafMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogKarafMojo.java @@ -85,6 +85,13 @@ public class PrepareCatalogKarafMojo extends AbstractMojo { protected File languagesOutDir; /** + * The output directory for others catalog + * + * @parameter default-value="${project.build.directory}/classes/org/apache/camel/catalog/karaf/others" + */ + protected File othersOutDir; + + /** * The karaf features directory * * @parameter default-value="${project.build.directory}/../../../platforms/karaf/features/src/main/resources/" @@ -125,6 +132,7 @@ public class PrepareCatalogKarafMojo extends AbstractMojo { executeComponents(features); executeDataFormats(features); executeLanguages(features); + executeOthers(features); } protected void executeComponents(Set<String> features) throws MojoExecutionException, MojoFailureException { @@ -144,7 +152,6 @@ public class PrepareCatalogKarafMojo extends AbstractMojo { continue; } - if (dir.isDirectory() && !"target".equals(dir.getName())) { File target = new File(dir, "target/classes"); @@ -160,7 +167,6 @@ public class PrepareCatalogKarafMojo extends AbstractMojo { target = new File(dir, "camel-linkedin-component/target/classes"); } - findComponentFilesRecursive(target, jsonFiles, componentFiles, new CamelComponentsFileFilter()); } } @@ -366,6 +372,86 @@ public class PrepareCatalogKarafMojo extends AbstractMojo { } } + protected void executeOthers(Set<String> features) 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 languages from the components directory + if (componentsDir != null && componentsDir.isDirectory()) { + File[] others = componentsDir.listFiles(); + if (others != null) { + for (File dir : others) { + // the directory must be in the list of known features + if (!features.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) { + File to = new File(othersOutDir, file.getName()); + try { + copyFile(file, to); + } catch (IOException e) { + throw new MojoFailureException("Cannot copy file from " + file + " -> " + to, 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) { @@ -423,6 +509,25 @@ public class PrepareCatalogKarafMojo 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 @@ -486,6 +591,23 @@ public class PrepareCatalogKarafMojo 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;