Return-Path: X-Original-To: apmail-camel-commits-archive@www.apache.org Delivered-To: apmail-camel-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 5D86810796 for ; Wed, 14 Jan 2015 14:38:37 +0000 (UTC) Received: (qmail 83483 invoked by uid 500); 14 Jan 2015 14:38:39 -0000 Delivered-To: apmail-camel-commits-archive@camel.apache.org Received: (qmail 83306 invoked by uid 500); 14 Jan 2015 14:38:39 -0000 Mailing-List: contact commits-help@camel.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@camel.apache.org Delivered-To: mailing list commits@camel.apache.org Received: (qmail 83231 invoked by uid 99); 14 Jan 2015 14:38:38 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 14 Jan 2015 14:38:38 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 84586A41A90; Wed, 14 Jan 2015 14:38:38 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: davsclaus@apache.org To: commits@camel.apache.org Date: Wed, 14 Jan 2015 14:38:43 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [06/12] camel git commit: CAMEL-8242: Camel Toolbox - Include documentation about languages CAMEL-8242: Camel Toolbox - Include documentation about languages Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/cc217571 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/cc217571 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/cc217571 Branch: refs/heads/master Commit: cc217571e78e33c71a8102995c875c56647ad986 Parents: ed9a681 Author: Claus Ibsen Authored: Wed Jan 14 12:22:03 2015 +0100 Committer: Claus Ibsen Committed: Wed Jan 14 15:38:23 2015 +0100 ---------------------------------------------------------------------- .../maven/packaging/PackageDataFormatMojo.java | 110 ++++---- .../maven/packaging/PackageLanguageMojo.java | 110 ++++---- .../maven/packaging/PrepareCatalogMojo.java | 258 ++++++++++++++----- 3 files changed, 300 insertions(+), 178 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/cc217571/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java ---------------------------------------------------------------------- diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java index 3d343f0..dbe88b7 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java @@ -140,66 +140,68 @@ public class PackageDataFormatMojo extends AbstractMojo { // find camel-core and grab the data format model from there, and enrich this model with information from this artifact // and create json schema model file for this data format try { - Artifact camelCore = findCamelCoreArtifact(project); - if (camelCore != null) { - File core = camelCore.getFile(); - if (core != null) { - URL url = new URL("file", null, core.getAbsolutePath()); - URLClassLoader loader = new URLClassLoader(new URL[]{url}); - for (Map.Entry entry : javaTypes.entrySet()) { - String name = entry.getKey(); - String javaType = entry.getValue(); - String modelName = asModelName(name); - - InputStream is = loader.getResourceAsStream("org/apache/camel/model/dataformat/" + modelName + ".json"); - if (is == null) { - // use file input stream if we build camel-core itself, and thus do not have a JAR which can be loaded by URLClassLoader - is = new FileInputStream(new File(core, "org/apache/camel/model/dataformat/" + modelName + ".json")); - } - String json = loadText(is); - if (json != null) { - DataFormatModel dataFormatModel = new DataFormatModel(); - dataFormatModel.setName(name); - dataFormatModel.setModelName(modelName); - dataFormatModel.setLabel(""); - dataFormatModel.setDescription(project.getDescription()); - dataFormatModel.setJavaType(javaType); - dataFormatModel.setGroupId(project.getGroupId()); - dataFormatModel.setArtifactId(project.getArtifactId()); - dataFormatModel.setVersion(project.getVersion()); - - List> rows = JSonSchemaHelper.parseJsonSchema("model", json, false); - for (Map row : rows) { - if (row.containsKey("label")) { - dataFormatModel.setLabel(row.get("label")); - } - if (row.containsKey("javaType")) { - dataFormatModel.setModelJavaType(row.get("javaType")); - } - // override description for camel-core, as otherwise its too generic - if ("camel-core".equals(project.getArtifactId())) { - if (row.containsKey("description")) { - dataFormatModel.setLabel(row.get("description")); + if (count > 0) { + Artifact camelCore = findCamelCoreArtifact(project); + if (camelCore != null) { + File core = camelCore.getFile(); + if (core != null) { + URL url = new URL("file", null, core.getAbsolutePath()); + URLClassLoader loader = new URLClassLoader(new URL[]{url}); + for (Map.Entry entry : javaTypes.entrySet()) { + String name = entry.getKey(); + String javaType = entry.getValue(); + String modelName = asModelName(name); + + InputStream is = loader.getResourceAsStream("org/apache/camel/model/dataformat/" + modelName + ".json"); + if (is == null) { + // use file input stream if we build camel-core itself, and thus do not have a JAR which can be loaded by URLClassLoader + is = new FileInputStream(new File(core, "org/apache/camel/model/dataformat/" + modelName + ".json")); + } + String json = loadText(is); + if (json != null) { + DataFormatModel dataFormatModel = new DataFormatModel(); + dataFormatModel.setName(name); + dataFormatModel.setModelName(modelName); + dataFormatModel.setLabel(""); + dataFormatModel.setDescription(project.getDescription()); + dataFormatModel.setJavaType(javaType); + dataFormatModel.setGroupId(project.getGroupId()); + dataFormatModel.setArtifactId(project.getArtifactId()); + dataFormatModel.setVersion(project.getVersion()); + + List> rows = JSonSchemaHelper.parseJsonSchema("model", json, false); + for (Map row : rows) { + if (row.containsKey("label")) { + dataFormatModel.setLabel(row.get("label")); + } + if (row.containsKey("javaType")) { + dataFormatModel.setModelJavaType(row.get("javaType")); + } + // override description for camel-core, as otherwise its too generic + if ("camel-core".equals(project.getArtifactId())) { + if (row.containsKey("description")) { + dataFormatModel.setLabel(row.get("description")); + } } } - } - getLog().debug("Model " + dataFormatModel); + getLog().debug("Model " + dataFormatModel); - // build json schema for the data format - String properties = after(json, " \"properties\": {"); - String schema = createParameterJsonSchema(dataFormatModel, properties); - getLog().debug("JSon schema\n" + schema); + // build json schema for the data format + String properties = after(json, " \"properties\": {"); + String schema = createParameterJsonSchema(dataFormatModel, properties); + getLog().debug("JSon schema\n" + schema); - // write this to the directory - File dir = new File(schemaOutDir, schemaSubDirectory(dataFormatModel.getJavaType())); - dir.mkdirs(); + // write this to the directory + File dir = new File(schemaOutDir, schemaSubDirectory(dataFormatModel.getJavaType())); + dir.mkdirs(); - File out = new File(dir, name + ".json"); - FileOutputStream fos = new FileOutputStream(out, false); - fos.write(schema.getBytes()); - fos.close(); + File out = new File(dir, name + ".json"); + FileOutputStream fos = new FileOutputStream(out, false); + fos.write(schema.getBytes()); + fos.close(); - getLog().info("Generated " + out + " containing JSon schema for " + name + " data format"); + getLog().info("Generated " + out + " containing JSon schema for " + name + " data format"); + } } } } http://git-wip-us.apache.org/repos/asf/camel/blob/cc217571/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java ---------------------------------------------------------------------- diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java index 5f52ce1..9442b2d 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java @@ -140,66 +140,68 @@ public class PackageLanguageMojo extends AbstractMojo { // find camel-core and grab the data format model from there, and enrich this model with information from this artifact // and create json schema model file for this data format try { - Artifact camelCore = findCamelCoreArtifact(project); - if (camelCore != null) { - File core = camelCore.getFile(); - if (core != null) { - URL url = new URL("file", null, core.getAbsolutePath()); - URLClassLoader loader = new URLClassLoader(new URL[]{url}); - for (Map.Entry entry : javaTypes.entrySet()) { - String name = entry.getKey(); - String javaType = entry.getValue(); - String modelName = asModelName(name); - - InputStream is = loader.getResourceAsStream("org/apache/camel/model/language/" + modelName + ".json"); - if (is == null) { - // use file input stream if we build camel-core itself, and thus do not have a JAR which can be loaded by URLClassLoader - is = new FileInputStream(new File(core, "org/apache/camel/model/language/" + modelName + ".json")); - } - String json = loadText(is); - if (json != null) { - LanguageModel languageModel = new LanguageModel(); - languageModel.setName(name); - languageModel.setModelName(modelName); - languageModel.setLabel(""); - languageModel.setDescription(project.getDescription()); - languageModel.setJavaType(javaType); - languageModel.setGroupId(project.getGroupId()); - languageModel.setArtifactId(project.getArtifactId()); - languageModel.setVersion(project.getVersion()); - - List> rows = JSonSchemaHelper.parseJsonSchema("model", json, false); - for (Map row : rows) { - if (row.containsKey("label")) { - languageModel.setLabel(row.get("label")); - } - if (row.containsKey("javaType")) { - languageModel.setModelJavaType(row.get("javaType")); - } - // override description for camel-core, as otherwise its too generic - if ("camel-core".equals(project.getArtifactId())) { - if (row.containsKey("description")) { - languageModel.setLabel(row.get("description")); + if (count > 0) { + Artifact camelCore = findCamelCoreArtifact(project); + if (camelCore != null) { + File core = camelCore.getFile(); + if (core != null) { + URL url = new URL("file", null, core.getAbsolutePath()); + URLClassLoader loader = new URLClassLoader(new URL[]{url}); + for (Map.Entry entry : javaTypes.entrySet()) { + String name = entry.getKey(); + String javaType = entry.getValue(); + String modelName = asModelName(name); + + InputStream is = loader.getResourceAsStream("org/apache/camel/model/language/" + modelName + ".json"); + if (is == null) { + // use file input stream if we build camel-core itself, and thus do not have a JAR which can be loaded by URLClassLoader + is = new FileInputStream(new File(core, "org/apache/camel/model/language/" + modelName + ".json")); + } + String json = loadText(is); + if (json != null) { + LanguageModel languageModel = new LanguageModel(); + languageModel.setName(name); + languageModel.setModelName(modelName); + languageModel.setLabel(""); + languageModel.setDescription(project.getDescription()); + languageModel.setJavaType(javaType); + languageModel.setGroupId(project.getGroupId()); + languageModel.setArtifactId(project.getArtifactId()); + languageModel.setVersion(project.getVersion()); + + List> rows = JSonSchemaHelper.parseJsonSchema("model", json, false); + for (Map row : rows) { + if (row.containsKey("label")) { + languageModel.setLabel(row.get("label")); + } + if (row.containsKey("javaType")) { + languageModel.setModelJavaType(row.get("javaType")); + } + // override description for camel-core, as otherwise its too generic + if ("camel-core".equals(project.getArtifactId())) { + if (row.containsKey("description")) { + languageModel.setLabel(row.get("description")); + } } } - } - getLog().debug("Model " + languageModel); + getLog().debug("Model " + languageModel); - // build json schema for the data format - String properties = after(json, " \"properties\": {"); - String schema = createParameterJsonSchema(languageModel, properties); - getLog().debug("JSon schema\n" + schema); + // build json schema for the data format + String properties = after(json, " \"properties\": {"); + String schema = createParameterJsonSchema(languageModel, properties); + getLog().debug("JSon schema\n" + schema); - // write this to the directory - File dir = new File(schemaOutDir, schemaSubDirectory(languageModel.getJavaType())); - dir.mkdirs(); + // write this to the directory + File dir = new File(schemaOutDir, schemaSubDirectory(languageModel.getJavaType())); + dir.mkdirs(); - File out = new File(dir, name + ".json"); - FileOutputStream fos = new FileOutputStream(out, false); - fos.write(schema.getBytes()); - fos.close(); + File out = new File(dir, name + ".json"); + FileOutputStream fos = new FileOutputStream(out, false); + fos.write(schema.getBytes()); + fos.close(); - getLog().info("Generated " + out + " containing JSon schema for " + name + " language"); + getLog().info("Generated " + out + " containing JSon schema for " + name + " language"); + } } } } http://git-wip-us.apache.org/repos/asf/camel/blob/cc217571/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java ---------------------------------------------------------------------- diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java index 37ed638..286044a 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java @@ -40,7 +40,6 @@ import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectHelper; import static org.apache.camel.maven.packaging.PackageHelper.loadText; -import static org.apache.camel.maven.packaging.PackageHelper.parseAsMap; /** * Prepares the camel catalog to include component, data format, and eip descriptors, @@ -79,6 +78,13 @@ public class PrepareCatalogMojo extends AbstractMojo { protected File dataFormatsOutDir; /** + * The output directory for languages catalog + * + * @parameter default-value="${project.build.directory}/classes/org/apache/camel/catalog/languages" + */ + protected File languagesOutDir; + + /** * The output directory for models catalog * * @parameter default-value="${project.build.directory}/classes/org/apache/camel/catalog/models" @@ -118,6 +124,7 @@ public class PrepareCatalogMojo extends AbstractMojo { executeModel(); executeComponents(); executeDataFormats(); + executeLanguages(); } protected void executeModel() throws MojoExecutionException, MojoFailureException { @@ -442,6 +449,109 @@ public class PrepareCatalogMojo extends AbstractMojo { printDataFormatsReport(jsonFiles, duplicateJsonFiles, missingLabels, usedLabels); } + protected void executeLanguages() throws MojoExecutionException, MojoFailureException { + getLog().info("Copying all Camel language json descriptors"); + + // lets use sorted set/maps + Set jsonFiles = new TreeSet(); + Set duplicateJsonFiles = new TreeSet(); + Set languageFiles = new TreeSet(); + Set missingLabels = new TreeSet(); + Map> usedLabels = new TreeMap>(); + + // find all languages from the components directory + if (componentsDir != null && componentsDir.isDirectory()) { + File[] languages = componentsDir.listFiles(); + if (languages != null) { + for (File dir : languages) { + if (dir.isDirectory() && !"target".equals(dir.getName())) { + File target = new File(dir, "target/classes"); + findLanguageFilesRecursive(target, jsonFiles, languageFiles, new CamelLanguagesFileFilter()); + } + } + } + } + if (coreDir != null && coreDir.isDirectory()) { + File target = new File(coreDir, "target/classes"); + findLanguageFilesRecursive(target, jsonFiles, languageFiles, new CamelLanguagesFileFilter()); + } + + getLog().info("Found " + languageFiles.size() + " language.properties files"); + getLog().info("Found " + jsonFiles.size() + " language json files"); + + // make sure to create out dir + languagesOutDir.mkdirs(); + + for (File file : jsonFiles) { + File to = new File(languagesOutDir, file.getName()); + if (to.exists()) { + duplicateJsonFiles.add(to); + getLog().warn("Duplicate language name detected: " + to); + } + try { + copyFile(file, to); + } catch (IOException e) { + throw new MojoFailureException("Cannot copy file from " + file + " -> " + to, e); + } + + // check if we have a label as we want the data format to include labels + try { + String text = loadText(new FileInputStream(file)); + // just do a basic label check + if (text.contains("\"label\": \"\"")) { + missingLabels.add(file); + } else { + String name = asComponentName(file); + Matcher matcher = LABEL_PATTERN.matcher(text); + // grab the label, and remember it in the used labels + if (matcher.find()) { + String label = matcher.group(1); + String[] labels = label.split(","); + for (String s : labels) { + Set languages = usedLabels.get(s); + if (languages == null) { + languages = new TreeSet(); + usedLabels.put(s, languages); + } + languages.add(name); + } + } + } + } catch (IOException e) { + // ignore + } + } + + File all = new File(languagesOutDir, "../languages.properties"); + try { + FileOutputStream fos = new FileOutputStream(all, false); + + String[] names = languagesOutDir.list(); + List languages = new ArrayList(); + // sort the names + for (String name : names) { + if (name.endsWith(".json")) { + // strip out .json from the name + String languageName = name.substring(0, name.length() - 5); + languages.add(languageName); + } + } + + Collections.sort(languages); + for (String name : languages) { + fos.write(name.getBytes()); + fos.write("\n".getBytes()); + } + + fos.close(); + + } catch (IOException e) { + throw new MojoFailureException("Error writing to file " + all); + } + + printLanguagesReport(jsonFiles, duplicateJsonFiles, missingLabels, usedLabels); + } + private void printModelsReport(Set json, Set duplicate, Set missingLabels, Map> usedLabels) { getLog().info("================================================================================"); @@ -569,6 +679,43 @@ public class PrepareCatalogMojo extends AbstractMojo { getLog().info("================================================================================"); } + private void printLanguagesReport(Set json, Set duplicate, Set missingLabels, Map> usedLabels) { + getLog().info("================================================================================"); + getLog().info(""); + getLog().info("Camel language catalog report"); + getLog().info(""); + getLog().info("\tLanguages found: " + json.size()); + for (File file : json) { + getLog().info("\t\t" + asComponentName(file)); + } + if (!duplicate.isEmpty()) { + getLog().info(""); + getLog().warn("\tDuplicate language detected: " + duplicate.size()); + for (File file : duplicate) { + getLog().warn("\t\t" + asComponentName(file)); + } + } + if (!missingLabels.isEmpty()) { + getLog().info(""); + getLog().warn("\tMissing labels detected: " + missingLabels.size()); + for (File file : missingLabels) { + getLog().warn("\t\t" + asComponentName(file)); + } + } + if (!usedLabels.isEmpty()) { + getLog().info(""); + getLog().info("\tUsed labels: " + usedLabels.size()); + for (Map.Entry> entry : usedLabels.entrySet()) { + getLog().info("\t\t" + entry.getKey() + ":"); + for (String name : entry.getValue()) { + getLog().info("\t\t\t" + name); + } + } + } + getLog().info(""); + getLog().info("================================================================================"); + } + private static String asComponentName(File file) { String name = file.getName(); if (name.endsWith(".json")) { @@ -615,6 +762,25 @@ public class PrepareCatalogMojo extends AbstractMojo { } } + private void findLanguageFilesRecursive(File dir, Set found, Set languages, 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 languageFile = !rootDir && file.isFile() && file.getName().equals("language.properties"); + if (jsonFile) { + found.add(file); + } else if (languageFile) { + languages.add(file); + } else if (file.isDirectory()) { + findLanguageFilesRecursive(file, found, languages, filter); + } + } + } + } + private class CamelComponentsFileFilter implements FileFilter { @Override @@ -657,6 +823,27 @@ public class PrepareCatalogMojo extends AbstractMojo { } } + private class CamelLanguagesFileFilter implements FileFilter { + + @Override + public boolean accept(File pathname) { + if (pathname.isDirectory() && pathname.getName().equals("model")) { + // do not check the camel-core model packages as there is no components there + return false; + } + 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("\"language\":"); + } catch (IOException e) { + // ignore + } + } + return pathname.isDirectory() || (pathname.isFile() && pathname.getName().equals("language.properties")); + } + } + public static void copyFile(File from, File to) throws IOException { FileChannel in = null; FileChannel out = null; @@ -679,73 +866,4 @@ public class PrepareCatalogMojo extends AbstractMojo { } } - private static class DataFormatModel { - private String name; - private String description; - private String javaType; - private String groupId; - private String artifactId; - private String versionId; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getJavaType() { - return javaType; - } - - public void setJavaType(String javaType) { - this.javaType = javaType; - } - - public String getGroupId() { - return groupId; - } - - public void setGroupId(String groupId) { - this.groupId = groupId; - } - - public String getArtifactId() { - return artifactId; - } - - public void setArtifactId(String artifactId) { - this.artifactId = artifactId; - } - - public String getVersionId() { - return versionId; - } - - public void setVersionId(String versionId) { - this.versionId = versionId; - } - - @Override - public String toString() { - return "DataFormatModel[" - + "name='" + name + '\'' - + ", description='" + description + '\'' - + ", javaType='" + javaType + '\'' - + ", groupId='" + groupId + '\'' - + ", artifactId='" + artifactId + '\'' - + ", versionId='" + versionId + '\'' - + ']'; - } - } - } \ No newline at end of file