You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by cd...@apache.org on 2014/05/11 20:14:58 UTC
[1/2] FLEX-34318 - [Mavenizer] Refactor the Mavenizer in preparation
of future mavenized releases of Flex - Split up the Mavenizer Logic into 3
parts: AirConverter,
FlashConverter and FlexConverter - Each converter is located in a dedicated
Maven module
Repository: flex-utilities
Updated Branches:
refs/heads/mavenizer-refactoring [created] 5fc9d25cb
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/converters/flex/src/main/java/org/apache/flex/utilities/converter/flex/FlexConverter.java
----------------------------------------------------------------------
diff --git a/mavenizer/converters/flex/src/main/java/org/apache/flex/utilities/converter/flex/FlexConverter.java b/mavenizer/converters/flex/src/main/java/org/apache/flex/utilities/converter/flex/FlexConverter.java
new file mode 100644
index 0000000..658f067
--- /dev/null
+++ b/mavenizer/converters/flex/src/main/java/org/apache/flex/utilities/converter/flex/FlexConverter.java
@@ -0,0 +1,617 @@
+package org.apache.flex.utilities.converter.flex;
+
+import org.apache.flex.utilities.converter.BaseConverter;
+import org.apache.flex.utilities.converter.Converter;
+import org.apache.flex.utilities.converter.air.AirConverter;
+import org.apache.flex.utilities.converter.exceptions.ConverterException;
+import org.apache.flex.utilities.converter.flash.FlashConverter;
+import org.apache.flex.utilities.converter.model.MavenArtifact;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.*;
+import java.util.*;
+import java.util.jar.JarOutputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * Created by cdutz on 22.04.2014.
+ */
+public class FlexConverter extends BaseConverter implements Converter {
+
+ protected String flexSdkVersion;
+
+ /**
+ * @param rootSourceDirectory Path to the root of the original Flex SDK.
+ * @param rootTargetDirectory Path to the root of the directory where the Maven artifacts should be generated to.
+ * @throws org.apache.flex.utilities.converter.exceptions.ConverterException
+ */
+ public FlexConverter(File rootSourceDirectory, File rootTargetDirectory) throws ConverterException {
+ super(rootSourceDirectory, rootTargetDirectory);
+
+ // Get the version of the current Flex SDK.
+ this.flexSdkVersion = getFlexVersion(rootSourceDirectory);
+ }
+
+ /**
+ * Entry point for generating the Maven artifacts for an Flex SDK.
+ *
+ * @throws ConverterException
+ */
+ @Override
+ protected void processDirectory() throws ConverterException {
+ if(!rootSourceDirectory.exists() || !rootSourceDirectory.isDirectory()) {
+ throw new ConverterException("Flex SDK directory '" + rootSourceDirectory.getPath() + "' is invalid.");
+ }
+
+ generateCompilerArtifacts();
+ generateFrameworkArtifacts();
+ }
+
+ /**
+ * This method generates those artifacts that resemble the compiler part of the Flex SDK.
+ *
+ * @throws ConverterException
+ */
+ protected void generateCompilerArtifacts() throws ConverterException {
+ // Create the root artifact.
+ final MavenArtifact compiler = new MavenArtifact();
+ compiler.setGroupId("org.apache.flex");
+ compiler.setArtifactId("compiler");
+ compiler.setVersion(flexSdkVersion);
+ compiler.setPackaging("pom");
+
+ // Create a list of all libs that should belong to the Flex SDK compiler.
+ final File directory = new File(rootSourceDirectory, "lib");
+ if(!directory.exists() || !directory.isDirectory()) {
+ throw new ConverterException("Compiler directory does not exist.");
+ }
+ final List<File> files = new ArrayList<File>();
+ files.addAll(Arrays.asList(directory.listFiles(new FlexCompilerFilter())));
+
+ // Add all jars in the "external" directory.
+ final File externalDirectory = new File(directory, "external");
+ if(externalDirectory.exists() && externalDirectory.isDirectory()) {
+ files.addAll(Arrays.asList(externalDirectory.listFiles(new FlexCompilerFilter())));
+
+ // Add all jars in the "external/optional" directory.
+ final File optionalDirectory = new File(externalDirectory, "optional");
+ if(optionalDirectory.exists() && optionalDirectory.isDirectory()) {
+ files.addAll(Arrays.asList(optionalDirectory.listFiles(new FlexCompilerFilter())));
+ }
+ }
+
+ // Generate artifacts for every jar in the input directories.
+ for(final File sourceFile : files) {
+ final MavenArtifact artifact = resolveArtifact(sourceFile, "org.apache.flex.compiler", flexSdkVersion);
+ compiler.addDependency(artifact);
+ }
+
+ // Write this artifact to file.
+ writeArtifact(compiler);
+ }
+
+ /**
+ * This method generates those artifacts that resemble the framework part of the Flex SDK.
+ *
+ * @throws ConverterException
+ */
+ protected void generateFrameworkArtifacts() throws ConverterException {
+ final File directory = new File(rootSourceDirectory, "frameworks" + File.separator + "libs");
+ generateFrameworkArtifacts(directory, "org.apache.flex");
+ generateThemeArtifacts();
+ generateFrameworkConfigurationArtifact();
+ }
+
+ protected void generateFrameworkArtifacts(File directory, String curGroupId) throws ConverterException {
+ // Create the root artifact.
+ final MavenArtifact framework = new MavenArtifact();
+ framework.setGroupId(curGroupId);
+ framework.setArtifactId("libs".equals(directory.getName()) ? "framework" : directory.getName());
+ framework.setVersion(flexSdkVersion);
+ framework.setPackaging("pom");
+
+ final String artifactGroupId = framework.getGroupId() + "." + framework.getArtifactId();
+
+ // Create a list of all libs that should belong to the Flex SDK framework.
+ if(!directory.exists() || !directory.isDirectory()) {
+ throw new ConverterException("Framework directory does not exist.");
+ }
+ final List<File> files = new ArrayList<File>();
+ files.addAll(Arrays.asList(directory.listFiles(new FlexFrameworkFilter())));
+
+ // Generate artifacts for every jar in the input directories.
+ for(final File sourceFile : files) {
+ // I think the experimental_mobile.swc belongs in the "mobile" package.
+ if(!"libs".equals(directory.getName()) || !"experimental_mobile.swc".equals(sourceFile.getName())) {
+ final MavenArtifact artifact = resolveArtifact(sourceFile, artifactGroupId, flexSdkVersion);
+ framework.addDependency(artifact);
+ }
+ }
+ // If we are in the "mobile" directory and the paren contains an "experimental_mobile.swc" file,
+ // add this to the mobile package.
+ if("mobile".equals(directory.getName())) {
+ final File mobileExperimental = new File(directory.getParent(), "experimental_mobile.swc");
+ final MavenArtifact artifact = resolveArtifact(mobileExperimental, artifactGroupId, flexSdkVersion);
+ framework.addDependency(artifact);
+ }
+ // Write this artifact to file.
+ writeArtifact(framework);
+
+ // After processing the current directory, process any eventually existing child directories.
+ final List<File> children = new ArrayList<File>();
+ children.addAll(Arrays.asList(directory.listFiles(new FileFilter() {
+ @Override
+ public boolean accept(File pathname) {
+ return pathname.isDirectory() && !"player".equals(pathname.getName());
+ }
+ })));
+ for(final File childDirectory : children) {
+ generateFrameworkArtifacts(childDirectory, artifactGroupId);
+ }
+ }
+
+ protected void generateThemeArtifacts() throws ConverterException {
+ final File frameworksDirectory = new File(rootSourceDirectory, "frameworks");
+
+ // Deploy all the swcs in the themes directory.
+ final File themesSrcDirectory = new File(frameworksDirectory, "themes");
+ if(themesSrcDirectory.exists()) {
+ generateDefaultThemeArtifacts(themesSrcDirectory);
+ }
+
+ // Deploy MXFTEText theme
+ final File mxfteThemeCss = new File(frameworksDirectory, "projects" + File.separator + "spark" +
+ File.separator + "MXFTEText.css");
+ if(mxfteThemeCss.exists()){
+ generateMxFteThemeArtifact(mxfteThemeCss);
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////
+ //
+ // Utility methods
+ //
+ ///////////////////////////////////////////////////////////////////////////////////////////////////
+
+ @Override
+ protected void writeArtifact(MavenArtifact artifact) throws ConverterException {
+ if(!"pom".equals(artifact.getPackaging())) {
+ // Copy the rsls too.
+ final File rslSourceFile = getRsl(artifact.getArtifactId());
+ if(rslSourceFile != null) {
+ final File rslTargetFile = new File(
+ artifact.getBinaryTargetFile(rootTargetDirectory, MavenArtifact.DEFAULT_CLASSIFIER).getParent(),
+ artifact.getArtifactId() + "-" + artifact.getVersion() + ".swf");
+ copyFile(rslSourceFile, rslTargetFile);
+ }
+
+ // Copy the swzc too.
+ final File signedRslSourceFile = getSignedRsl(artifact.getArtifactId());
+ if(signedRslSourceFile != null) {
+ final File signedRslTargetFile = new File(
+ artifact.getBinaryTargetFile(rootTargetDirectory, MavenArtifact.DEFAULT_CLASSIFIER).getParent(),
+ artifact.getArtifactId() + "-" + artifact.getVersion() + ".swz");
+ copyFile(signedRslSourceFile, signedRslTargetFile);
+ }
+
+ // Copy the language resources too.
+ final Map<String, File> resourceBundles = getResourceBundles(artifact.getArtifactId());
+ if(!resourceBundles.isEmpty() &&
+ artifact.getBinaryTargetFile(rootTargetDirectory, MavenArtifact.DEFAULT_CLASSIFIER) != null) {
+ boolean foundResources = false;
+ for(final String resource : resourceBundles.keySet()) {
+ final File resourceSourceFile = resourceBundles.get(resource);
+ final File resourceTargetFile = new File(
+ artifact.getBinaryTargetFile(rootTargetDirectory, MavenArtifact.DEFAULT_CLASSIFIER).getParent(),
+ artifact.getArtifactId() + "-" + artifact.getVersion() + "-" + resource + ".rb.swc");
+ copyFile(resourceSourceFile, resourceTargetFile);
+ foundResources = true;
+ }
+
+ // If the library had at least one resource bundle, generate a dummy rb.swc and add that as dependency.
+ if(foundResources) {
+ final File resourceDummyTargetFile = new File(
+ artifact.getBinaryTargetFile(rootTargetDirectory, MavenArtifact.DEFAULT_CLASSIFIER).getParent(),
+ artifact.getArtifactId() + "-" + artifact.getVersion() + ".rb.swc");
+ writeDummy(resourceDummyTargetFile);
+
+ final MavenArtifact resourceBundleDependency = new MavenArtifact();
+ resourceBundleDependency.setGroupId(artifact.getGroupId());
+ resourceBundleDependency.setArtifactId(artifact.getArtifactId());
+ resourceBundleDependency.setVersion(artifact.getVersion());
+ resourceBundleDependency.setPackaging("rb.swc");
+ artifact.addDependency(resourceBundleDependency);
+ }
+ }
+
+ // Add source zips ...
+ final File sourceArtifactSourceFile = generateSourceArtifact(artifact.getArtifactId());
+ if(sourceArtifactSourceFile != null) {
+ final File sourceArtifactTargetFile = new File(
+ artifact.getBinaryTargetFile(rootTargetDirectory, MavenArtifact.DEFAULT_CLASSIFIER).getParent(),
+ artifact.getArtifactId() + "-" + artifact.getVersion() + "-sources.jar");
+ copyFile(sourceArtifactSourceFile, sourceArtifactTargetFile);
+ }
+ }
+
+ super.writeArtifact(artifact);
+ }
+
+ protected File generateSourceArtifact(String artifactId) throws ConverterException {
+ final File frameworksDirectory = new File(rootSourceDirectory, "frameworks");
+ final File librarySrcRootPath = new File(frameworksDirectory, "projects/" + artifactId);
+ final File librarySourcePath = new File(librarySrcRootPath, "src");
+
+ if (librarySourcePath.listFiles() != null) {
+ final File sourceFiles[] = librarySourcePath.listFiles();
+ if (sourceFiles != null) {
+ final File zipInputFiles[] = new File[sourceFiles.length + 1];
+ System.arraycopy(sourceFiles, 0, zipInputFiles, 0, sourceFiles.length);
+
+ try {
+ // Create a temp file.
+ final File targetFile = File.createTempFile("temp-" + artifactId, "zip");
+
+ JarOutputStream jar = new JarOutputStream(new FileOutputStream(targetFile));
+ for (final File file : zipInputFiles) {
+ addFileToZip(jar, file, librarySourcePath);
+ }
+ jar.close();
+
+ return targetFile;
+ } catch(IOException e) {
+ throw new ConverterException("Error creating source archive.", e);
+ }
+ }
+ }
+ return null;
+ }
+
+ protected void generateFrameworkConfigurationArtifact() throws ConverterException {
+ // ZIP up every file (not directory) in the framework directory and the entire themes directory.
+ final File frameworksDirectory = new File(rootSourceDirectory, "frameworks");
+ final File sourceFiles[] = frameworksDirectory.listFiles(new FileFilter() {
+ public boolean accept(File pathname) {
+ return pathname.isFile();
+ }
+ });
+ final File zipInputFiles[] = new File[sourceFiles.length];
+ System.arraycopy(sourceFiles, 0, zipInputFiles, 0, sourceFiles.length);
+
+ try {
+ final File targetFile = new File(rootTargetDirectory,
+ "org.apache.flex.framework.framework.".replace(".", File.separator) + flexSdkVersion +
+ File.separator + "framework-" + flexSdkVersion + "-configs.zip");
+
+ // Add all the content to a zip-file.
+ final ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(targetFile));
+ for (final File file : zipInputFiles) {
+ addFileToZip(zipOutputStream, file, frameworksDirectory);
+ }
+ zipOutputStream.close();
+ } catch(IOException e) {
+ throw new ConverterException("Error generating configuration zip.", e);
+ }
+ }
+
+ protected void generateDefaultThemeArtifacts(File themesDirectory) throws ConverterException {
+ final File[] themes = themesDirectory.listFiles();
+ if(themes != null) {
+ for(final File themeDirectory : themes) {
+ if(themeDirectory.isDirectory()) {
+ final String themeName = themeDirectory.getName().toLowerCase();
+ final File themeFile = new File(themeDirectory, themeName + ".swc");
+
+ File targetSwcFile = null;
+ if(themeFile.exists()) {
+ targetSwcFile = themeFile;
+ } else {
+ targetSwcFile = generateThemeSwc(themeDirectory);
+ }
+
+ if(targetSwcFile != null) {
+ // Generate the pom file.
+ final MavenArtifact themeArtifact = new MavenArtifact();
+ themeArtifact.setGroupId("org.apache.flex.framework.themes");
+ themeArtifact.setArtifactId(themeName);
+ themeArtifact.setVersion(flexSdkVersion);
+ themeArtifact.setPackaging("swc");
+ themeArtifact.addDefaultBinaryArtifact(targetSwcFile);
+
+ // In this case we don't want the resources to be copied.
+ super.writeArtifact(themeArtifact);
+ }
+ }
+ }
+ }
+ }
+
+ protected void generateMxFteThemeArtifact(File themeCssFile) throws ConverterException {
+ final String themeName = "mxfte";
+
+ // Generate and Copy the SWC.
+ final File targetSwcFile = generateThemeSwc(themeCssFile);
+
+ if(targetSwcFile != null) {
+ // Generate the pom file.
+ final MavenArtifact themeArtifact = new MavenArtifact();
+ themeArtifact.setGroupId("org.apache.flex.framework.themes");
+ themeArtifact.setArtifactId(themeName);
+ themeArtifact.setVersion(flexSdkVersion);
+ themeArtifact.setPackaging("swc");
+ themeArtifact.addDefaultBinaryArtifact(targetSwcFile);
+
+ // In this case we don't want the resources to be copied.
+ super.writeArtifact(themeArtifact);
+ }
+ }
+
+ protected File generateThemeSwc(File themeDirectory) throws ConverterException {
+ final File fdkLibDir = new File(rootSourceDirectory, "lib");
+
+ List<String> processCmd = new ArrayList<String>(10);
+
+ if(fdkLibDir.exists() && fdkLibDir.isDirectory()) {
+ try {
+ final File compcLibrary = new File(fdkLibDir, "compc.jar");
+ final File frameworkDir = new File(rootSourceDirectory, "frameworks");
+
+ processCmd.add("java");
+ processCmd.add("-Xmx384m");
+ processCmd.add("-Dsun.io.useCanonCaches=false");
+ processCmd.add("-jar");
+ processCmd.add(compcLibrary.getCanonicalPath());
+ processCmd.add("+flexlib=" + frameworkDir.getCanonicalPath());
+
+ if (themeDirectory.isDirectory()) {
+ // Add all the content files.
+ final File contents[] = themeDirectory.listFiles(new FileFilter() {
+ @Override
+ public boolean accept(File pathname) {
+ return !(pathname.isDirectory() && "src".equals(pathname.getName())) &&
+ !"preview.jpg".equals(pathname.getName()) && !pathname.getName().endsWith(".fla");
+ }
+ });
+ if (contents.length == 0) {
+ return null;
+ }
+
+ for (final File resource : contents) {
+ processCmd.add("-include-file");
+ processCmd.add(resource.getName());
+ processCmd.add(resource.getCanonicalPath());
+ }
+ } else {
+ processCmd.add("-include-file");
+ processCmd.add(themeDirectory.getName());
+ processCmd.add(themeDirectory.getCanonicalPath());
+ }
+
+ // Create a temp file.
+ final File targetFile = File.createTempFile(themeDirectory.getName(), "swc");
+
+ // Define the output file.
+ processCmd.add("-o");
+ processCmd.add(targetFile.getCanonicalPath());
+
+ final File targetDirectory = targetFile.getParentFile();
+ if (!targetDirectory.exists()) {
+ if (!targetDirectory.mkdirs()) {
+ throw new RuntimeException("Could not create directory: " + targetDirectory.getCanonicalPath());
+ }
+ }
+
+ // Execute the command.
+ try {
+ System.out.println("Generating theme '" + themeDirectory.getName() + "'");
+
+ //final Process child = Runtime.getRuntime().exec(cmd.toString(), envps);
+ ProcessBuilder processBuilder = new ProcessBuilder(processCmd);
+ processBuilder.environment().put("PLAYERGLOBAL_HOME",
+ new File(new File(frameworkDir, "libs"), "player").getCanonicalPath());
+ int exitValue = exec(processBuilder.start());
+ if (exitValue != 0) {
+ System.out.println("Couldn't create theme swc");
+ System.out.println("----------------------------------------------------------------");
+ System.out.println("Env: '" + processBuilder.environment().get("PLAYERGLOBAL_HOME") + "'");
+ System.out.println(processBuilder.command());
+ System.out.println("----------------------------------------------------------------");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ // Return a reference on the theme swc.
+ return targetFile;
+ } catch(IOException e) {
+ throw new ConverterException("Error generating theme swc.", e);
+ }
+ }
+ return null;
+ }
+
+ protected int exec(Process p) throws InterruptedException, IOException {
+ String line;
+ BufferedReader bri = new BufferedReader(new InputStreamReader(p.getInputStream()));
+ BufferedReader bre = new BufferedReader(new InputStreamReader(p.getErrorStream()));
+ while ((line = bri.readLine()) != null) {
+ System.out.println(line);
+ }
+ while ((line = bre.readLine()) != null) {
+ System.out.println(line);
+ }
+ int result = p.waitFor();
+ bri.close();
+ bre.close();
+ System.out.println("Done.");
+ return result;
+ }
+
+ private void addFileToZip(ZipOutputStream zipOutputStream, File inputFile, File rootDirectory)
+ throws ConverterException {
+ if (inputFile == null) {
+ return;
+ }
+
+ // If this is a directory, add all it's children.
+ if (inputFile.isDirectory()) {
+ final File directoryContent[] = inputFile.listFiles();
+ if (directoryContent != null) {
+ for (final File file : directoryContent) {
+ addFileToZip(zipOutputStream, file, rootDirectory);
+ }
+ }
+ }
+ // If this is a file, add it to the zips output.
+ else {
+ byte[] buf = new byte[1024];
+ try {
+ final FileInputStream in = new FileInputStream(inputFile);
+ final String zipPath = inputFile.getAbsolutePath().substring(
+ rootDirectory.getAbsolutePath().length() + 1).replace("\\", "/");
+ zipOutputStream.putNextEntry(new ZipEntry(zipPath));
+ int len;
+ while ((len = in.read(buf)) > 0) {
+ zipOutputStream.write(buf, 0, len);
+ }
+ zipOutputStream.closeEntry();
+ in.close();
+ } catch(IOException e) {
+ throw new ConverterException("Error adding files to zip.", e);
+ }
+ }
+ }
+
+ /**
+ * Get the version of an Flex SDK from the content of the SDK directory.
+ *
+ * @return version string for the current Flex SDK
+ */
+ protected String getFlexVersion(File rootDirectory) throws ConverterException {
+ final File sdkDescriptor = new File(rootDirectory, "flex-sdk-description.xml");
+
+ final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ try {
+ // Parse the document
+ final DocumentBuilder db = dbf.newDocumentBuilder();
+ final Document dom = db.parse(sdkDescriptor);
+
+ // Get name, version and build nodes
+ final Element root = dom.getDocumentElement();
+ final String version = root.getElementsByTagName("version").item(0).getTextContent();
+ final String build = root.getElementsByTagName("build").item(0).getTextContent();
+
+ // In general the version consists of the content of the version element with an appended build-number.
+ return (build.equals("0")) ? version + "-SNAPSHOT" : version + "." + build;
+ } catch (ParserConfigurationException pce) {
+ throw new RuntimeException(pce);
+ } catch (SAXException se) {
+ throw new RuntimeException(se);
+ } catch (IOException ioe) {
+ throw new RuntimeException(ioe);
+ }
+ }
+
+ protected File getRsl(String artifactId) {
+ final FlexRslFilter filter = new FlexRslFilter(artifactId, flexSdkVersion);
+ final File rslDirectory = new File(rootSourceDirectory, "frameworks" + File.separator + "rsls");
+ final File[] rsls = rslDirectory.listFiles(filter);
+ if ((rsls != null) && (rsls.length == 1)) {
+ return rsls[0];
+ }
+ return null;
+ }
+
+ protected File getSignedRsl(String artifactId) {
+ final FlexSignedRslFilter filter = new FlexSignedRslFilter(artifactId, flexSdkVersion);
+ final File rslDirectory = new File(rootSourceDirectory, "frameworks" + File.separator + "rsls");
+ final File[] swzs = rslDirectory.listFiles(filter);
+ if ((swzs != null) && (swzs.length == 1)) {
+ return swzs[0];
+ }
+ return null;
+ }
+
+ protected Map<String, File> getResourceBundles(String artifactId) {
+ final Map<String, File> bundles = new HashMap<String, File>();
+ final FlexResourceBundleFilter filter = new FlexResourceBundleFilter(artifactId);
+ final File[] languages = new File(rootSourceDirectory, "frameworks" + File.separator + "locale").listFiles();
+ if(languages != null) {
+ for (final File language : languages) {
+ final File[] resources = language.listFiles(filter);
+ if ((resources != null) && (resources.length == 1)) {
+ bundles.put(language.getName(), resources[0]);
+ }
+ }
+ }
+ return bundles;
+ }
+
+ public static class FlexCompilerFilter implements FilenameFilter {
+ private AirConverter.AirCompilerFilter airFilter = new AirConverter.AirCompilerFilter();
+
+ public boolean accept(File dir, String name) {
+ return name.endsWith(".jar") && !airFilter.accept(dir, name) &&
+ // Some old AIR SDKs contained two android libs in the main lib directory,
+ // we have to manually exclude them.
+ !name.equals("smali.jar") && !name.equals("baksmali.jar");
+ }
+ }
+
+ public static class FlexFrameworkFilter implements FilenameFilter {
+ private AirConverter.AirFrameworkFilter airFilter = new AirConverter.AirFrameworkFilter();
+ private FlashConverter.FlashFrameworkFilter flashFilter = new FlashConverter.FlashFrameworkFilter();
+
+ public boolean accept(File dir, String name) {
+ return name.endsWith(".swc") && !airFilter.accept(dir, name) && !flashFilter.accept(dir, name);
+ }
+ }
+
+ public static class FlexRslFilter implements FilenameFilter {
+ private String fileName;
+
+ public FlexRslFilter(String artifactName, String artifactVersion) {
+ this.fileName = artifactName + "_" + artifactVersion + ".swf";
+ }
+
+ public boolean accept(File dir, String name) {
+ return name.equals(fileName);
+ }
+ }
+
+ public static class FlexSignedRslFilter implements FilenameFilter {
+ private String fileName;
+
+ public FlexSignedRslFilter(String artifactName, String artifactVersion) {
+ this.fileName = artifactName + "_" + artifactVersion + ".swz";
+ }
+
+ public boolean accept(File dir, String name) {
+ return name.equals(fileName);
+ }
+ }
+
+ public static class FlexResourceBundleFilter implements FilenameFilter {
+ private String fileName;
+
+ public FlexResourceBundleFilter(String artifactName) {
+ this.fileName = artifactName + "_rb.swc";
+ }
+
+ public boolean accept(File dir, String name) {
+ return name.equals(fileName);
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ FlexConverter converter = new FlexConverter(new File(args[0]), new File(args[1]));
+ converter.convert();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/converters/pom.xml
----------------------------------------------------------------------
diff --git a/mavenizer/converters/pom.xml b/mavenizer/converters/pom.xml
new file mode 100644
index 0000000..41847d8
--- /dev/null
+++ b/mavenizer/converters/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.flex.utilities.converter</groupId>
+ <artifactId>flex-sdk-converter</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>converters</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>pom</packaging>
+
+ <modules>
+ <!-- Module defining all the base functionality shared among the other converters -->
+ <module>base</module>
+
+ <!-- The individual converter implementations -->
+ <module>air</module>
+ <module>flash</module>
+ <module>flex</module>
+ </modules>
+
+</project>
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/deployers/aether/pom.xml
----------------------------------------------------------------------
diff --git a/mavenizer/deployers/aether/pom.xml b/mavenizer/deployers/aether/pom.xml
new file mode 100644
index 0000000..3f0d3db
--- /dev/null
+++ b/mavenizer/deployers/aether/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.flex.utilities.converter</groupId>
+ <artifactId>deployers</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>aether-deployer</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+
+</project>
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/deployers/maven/pom.xml
----------------------------------------------------------------------
diff --git a/mavenizer/deployers/maven/pom.xml b/mavenizer/deployers/maven/pom.xml
new file mode 100644
index 0000000..ae85598
--- /dev/null
+++ b/mavenizer/deployers/maven/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.flex.utilities.converter</groupId>
+ <artifactId>deployers</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>maven-deployer</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+
+</project>
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/deployers/pom.xml
----------------------------------------------------------------------
diff --git a/mavenizer/deployers/pom.xml b/mavenizer/deployers/pom.xml
new file mode 100644
index 0000000..3c821dc
--- /dev/null
+++ b/mavenizer/deployers/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.flex.utilities.converter</groupId>
+ <artifactId>flex-sdk-converter</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>deployers</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>pom</packaging>
+
+ <modules>
+ <module>maven</module>
+ <module>aether</module>
+ </modules>
+
+</project>
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/pom.xml
----------------------------------------------------------------------
diff --git a/mavenizer/pom.xml b/mavenizer/pom.xml
index 77f19e9..e70008c 100644
--- a/mavenizer/pom.xml
+++ b/mavenizer/pom.xml
@@ -25,6 +25,7 @@
<groupId>org.apache.flex.utilities.converter</groupId>
<artifactId>flex-sdk-converter</artifactId>
<version>1.0.0-SNAPSHOT</version>
+ <packaging>pom</packaging>
<properties>
<mavenVersion>3.1.0</mavenVersion>
@@ -47,6 +48,11 @@
</developer>
</developers>
+ <modules>
+ <module>converters</module>
+ <module>deployers</module>
+ </modules>
+
<dependencies>
<dependency>
<groupId>com.sun.jersey</groupId>
[2/2] git commit: [flex-utilities] [refs/heads/mavenizer-refactoring]
- FLEX-34318 - [Mavenizer] Refactor the Mavenizer in preparation of future
mavenized releases of Flex - Split up the Mavenizer Logic into 3 parts:
AirConverter, FlashConverter and Flex
Posted by cd...@apache.org.
FLEX-34318 - [Mavenizer] Refactor the Mavenizer in preparation of future mavenized releases of Flex
- Split up the Mavenizer Logic into 3 parts: AirConverter, FlashConverter and FlexConverter
- Each converter is located in a dedicated Maven module while shared logic is located in a base-converter module.
- Code generation code has been dramatically cleaned up.
- The Flex modules no longer reference runtime artifacts
- The Flash converter generates an Apache dummy module for each Flashplayer version.
- Removed the Dependency-Version poms and included the dependencyManagement into the pom artifacts.
- Attached the resource-bundle dependencies to the swc artifacts directly instead of referencing both from a pom-artifact.
Project: http://git-wip-us.apache.org/repos/asf/flex-utilities/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-utilities/commit/5fc9d25c
Tree: http://git-wip-us.apache.org/repos/asf/flex-utilities/tree/5fc9d25c
Diff: http://git-wip-us.apache.org/repos/asf/flex-utilities/diff/5fc9d25c
Branch: refs/heads/mavenizer-refactoring
Commit: 5fc9d25cbf8b315c574710919f8f23493d1362ce
Parents: c11e18a
Author: Christofer Dutz <ch...@c-ware.de>
Authored: Sun May 11 20:10:37 2014 +0200
Committer: Christofer Dutz <ch...@c-ware.de>
Committed: Sun May 11 20:10:37 2014 +0200
----------------------------------------------------------------------
mavenizer/converters/air/pom.xml | 43 ++
.../utilities/converter/air/AirConverter.java | 210 +++++++
mavenizer/converters/base/pom.xml | 35 ++
.../flex/utilities/converter/BaseConverter.java | 486 +++++++++++++++
.../flex/utilities/converter/Converter.java | 14 +
.../exceptions/ConverterException.java | 16 +
.../converter/model/MavenArtifact.java | 152 +++++
mavenizer/converters/flash/pom.xml | 43 ++
.../converter/flash/FlashConverter.java | 262 ++++++++
mavenizer/converters/flex/pom.xml | 56 ++
.../utilities/converter/flex/FlexConverter.java | 617 +++++++++++++++++++
mavenizer/converters/pom.xml | 45 ++
mavenizer/deployers/aether/pom.xml | 35 ++
mavenizer/deployers/maven/pom.xml | 35 ++
mavenizer/deployers/pom.xml | 40 ++
mavenizer/pom.xml | 6 +
16 files changed, 2095 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/converters/air/pom.xml
----------------------------------------------------------------------
diff --git a/mavenizer/converters/air/pom.xml b/mavenizer/converters/air/pom.xml
new file mode 100644
index 0000000..c3021c5
--- /dev/null
+++ b/mavenizer/converters/air/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.flex.utilities.converter</groupId>
+ <artifactId>converters</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>air-converter</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.flex.utilities.converter</groupId>
+ <artifactId>base-converter</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+
+</project>
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/converters/air/src/main/java/org/apache/flex/utilities/converter/air/AirConverter.java
----------------------------------------------------------------------
diff --git a/mavenizer/converters/air/src/main/java/org/apache/flex/utilities/converter/air/AirConverter.java b/mavenizer/converters/air/src/main/java/org/apache/flex/utilities/converter/air/AirConverter.java
new file mode 100644
index 0000000..6212b8b
--- /dev/null
+++ b/mavenizer/converters/air/src/main/java/org/apache/flex/utilities/converter/air/AirConverter.java
@@ -0,0 +1,210 @@
+package org.apache.flex.utilities.converter.air;
+
+import org.apache.flex.utilities.converter.BaseConverter;
+import org.apache.flex.utilities.converter.Converter;
+import org.apache.flex.utilities.converter.exceptions.ConverterException;
+import org.apache.flex.utilities.converter.model.MavenArtifact;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by cdutz on 22.04.2014.
+ */
+public class AirConverter extends BaseConverter implements Converter {
+
+ protected String airSdkVersion;
+
+ /**
+ * @param rootSourceDirectory Path to the root of the original AIR SDK.
+ * @param rootTargetDirectory Path to the root of the directory where the Maven artifacts should be generated to.
+ * @throws ConverterException
+ */
+ public AirConverter(File rootSourceDirectory, File rootTargetDirectory) throws ConverterException {
+ super(rootSourceDirectory, rootTargetDirectory);
+
+ // Get the version of the current air sdk.
+ this.airSdkVersion = getAirVersion(rootSourceDirectory);
+ }
+
+ /**
+ * Entry point for generating the Maven artifacts for an AIR SDK.
+ *
+ * @throws ConverterException
+ */
+ @Override
+ protected void processDirectory() throws ConverterException {
+ if(!rootSourceDirectory.exists() || !rootSourceDirectory.isDirectory()) {
+ throw new ConverterException("Air SDK directory '" + rootSourceDirectory.getPath() + "' is invalid.");
+ }
+
+ generateCompilerArtifacts();
+ generateRuntimeArtifacts();
+ generateFrameworkArtifacts();
+ }
+
+ /**
+ * This method generates those artifacts that resemble the compiler part of the AIR SDK.
+ *
+ * @throws ConverterException
+ */
+ protected void generateCompilerArtifacts() throws ConverterException {
+ // Create the root artifact.
+ final MavenArtifact compiler = new MavenArtifact();
+ compiler.setGroupId("com.adobe.air");
+ compiler.setArtifactId("compiler");
+ compiler.setVersion(airSdkVersion);
+ compiler.setPackaging("pom");
+
+ // Create a list of all libs that should belong to the AIR SDK compiler.
+ final File directory = new File(rootSourceDirectory, "lib");
+ if(!directory.exists() || !directory.isDirectory()) {
+ throw new ConverterException("Compiler directory does not exist.");
+ }
+ final List<File> files = new ArrayList<File>();
+ files.addAll(Arrays.asList(directory.listFiles(new AirCompilerFilter())));
+
+ // Generate artifacts for every jar in the input directories.
+ for(final File sourceFile : files) {
+ final MavenArtifact artifact = resolveArtifact(sourceFile, "com.adobe.air.compiler", airSdkVersion);
+ compiler.addDependency(artifact);
+ }
+
+ // Write this artifact to file.
+ writeArtifact(compiler);
+ }
+
+ /**
+ * This method generates those artifacts that resemble the runtime part of the AIR SDK.
+ *
+ * @throws ConverterException
+ */
+ protected void generateRuntimeArtifacts() throws ConverterException {
+ // Create the root artifact.
+ final MavenArtifact runtime = new MavenArtifact();
+ runtime.setGroupId("com.adobe.air");
+ runtime.setArtifactId("runtime");
+ runtime.setVersion(airSdkVersion);
+ runtime.setPackaging("pom");
+
+ // Create a list of all libs that should belong to the AIR SDK runtime.
+ final File directory = new File(rootSourceDirectory, "bin");
+ if(!directory.exists() || !directory.isDirectory()) {
+ throw new ConverterException("Runtime directory does not exist.");
+ }
+ final List<File> files = new ArrayList<File>();
+ files.addAll(Arrays.asList(directory.listFiles(new AirRuntimeFilter())));
+
+ // Generate artifacts for every jar in the input directories.
+ for(final File sourceFile : files) {
+ final MavenArtifact artifact = resolveArtifact(sourceFile, "com.adobe.air.runtime", airSdkVersion);
+ runtime.addDependency(artifact);
+ }
+
+ // Write this artifact to file.
+ writeArtifact(runtime);
+ }
+
+ /**
+ * This method generates those artifacts that resemble the framework part of the AIR SDK.
+ *
+ * @throws ConverterException
+ */
+ protected void generateFrameworkArtifacts() throws ConverterException {
+ // Create the root artifact.
+ final MavenArtifact framework = new MavenArtifact();
+ framework.setGroupId("com.adobe.air");
+ framework.setArtifactId("framework");
+ framework.setVersion(airSdkVersion);
+ framework.setPackaging("pom");
+
+ // Create a list of all libs that should belong to the AIR SDK framework.
+ final File directory =
+ new File(rootSourceDirectory, "frameworks" + File.separator + "libs" + File.separator + "air");
+ if(!directory.exists() || !directory.isDirectory()) {
+ throw new ConverterException("Framework directory does not exist.");
+ }
+ final List<File> files = new ArrayList<File>();
+ files.addAll(Arrays.asList(directory.listFiles(new AirFrameworkFilter())));
+
+ // Generate artifacts for every jar in the input directories.
+ for(final File sourceFile : files) {
+ final MavenArtifact artifact = resolveArtifact(sourceFile, "com.adobe.air.framework", airSdkVersion);
+ framework.addDependency(artifact);
+ }
+
+ // Write this artifact to file.
+ writeArtifact(framework);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////
+ //
+ // Utility methods
+ //
+ ///////////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Get the version of an AIR SDK from the content of the SDK directory.
+ *
+ * @return version string for the current AIR SDK
+ */
+ protected String getAirVersion(File rootDirectory) throws ConverterException {
+ // All AIR SDKs contain a text file "AIR SDK Readme.txt" which contains a
+ // Version string in the first line. Newer SDKs contain an additional "airsdk.xml"
+ // which would be easier to parse, but as all SDKs contain the text-file, we'll
+ // stick to that for now.
+
+ final File sdkDescriptor = new File(rootDirectory, "AIR SDK Readme.txt");
+ if(!sdkDescriptor.exists() || !sdkDescriptor.isFile()) {
+ throw new ConverterException("Air SDK directory '" + rootDirectory.getPath() +
+ "' is missing a the version text-file 'AIR SDK Readme.txt'.");
+ }
+
+ DataInputStream in = null;
+ try {
+ final FileInputStream descriptorInputStream = new FileInputStream(sdkDescriptor);
+ in = new DataInputStream(descriptorInputStream);
+ final BufferedReader br = new BufferedReader(new InputStreamReader(in));
+ final String strLine = br.readLine();
+ return strLine.substring("Adobe AIR ".length(), strLine.indexOf(" ", "Adobe AIR ".length()));
+ } catch (Exception e) {
+ throw new ConverterException("Error getting AIR version.", e);
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException ioe) {
+ // Ignore.
+ }
+ }
+ }
+ }
+
+ public static class AirCompilerFilter implements FilenameFilter {
+ public boolean accept(File dir, String name) {
+ return name.equals("adt.jar");
+ }
+ }
+
+ public static class AirRuntimeFilter implements FilenameFilter {
+ public boolean accept(File dir, String name) {
+ return name.equalsIgnoreCase("adl.exe");
+ }
+ }
+
+ public static class AirFrameworkFilter implements FilenameFilter {
+ public boolean accept(File dir, String name) {
+ return name.equals("aircore.swc") || name.equals("airglobal.swc") ||
+ name.equals("applicationupdater.swc") || name.equals("applicationupdater_ui.swc") ||
+ name.equals("servicemonitor.swc");
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ AirConverter converter = new AirConverter(new File(args[0]), new File(args[1]));
+ converter.convert();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/converters/base/pom.xml
----------------------------------------------------------------------
diff --git a/mavenizer/converters/base/pom.xml b/mavenizer/converters/base/pom.xml
new file mode 100644
index 0000000..e058961
--- /dev/null
+++ b/mavenizer/converters/base/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.flex.utilities.converter</groupId>
+ <artifactId>converters</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>base-converter</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+
+</project>
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/BaseConverter.java
----------------------------------------------------------------------
diff --git a/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/BaseConverter.java b/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/BaseConverter.java
new file mode 100644
index 0000000..8a62f25
--- /dev/null
+++ b/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/BaseConverter.java
@@ -0,0 +1,486 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.flex.utilities.converter;
+
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+
+import org.apache.flex.utilities.converter.exceptions.ConverterException;
+import org.apache.flex.utilities.converter.model.MavenArtifact;
+import org.codehaus.jettison.json.JSONArray;
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
+import org.codehaus.jettison.json.JSONTokener;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.*;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: cdutz
+ * Date: 11.05.12
+ * Time: 14:53
+ */
+public abstract class BaseConverter {
+
+ protected static final Map<String, MavenArtifact> checksums = new HashMap<String, MavenArtifact>();
+
+ protected static final String MAVEN_SCHEMA_URI = "http://maven.apache.org/POM/4.0.0";
+ protected static final String MAVEN_CENTRAL_SHA_1_QUERY_URL = "http://search.maven.org/solrsearch/select?rows=20&wt=json&q=1:";
+ // Artifactory: "http://server:port/artifactory/api/search/checksum?repos=libs-release-local&md5=04040c7c184620af0a0a8a3682a75eb7
+ // Nexus: "http://repository.sonatype.org/service/local/data_index?a=04040c7c184620af0a0a8a3682a75eb7"
+
+ protected File rootSourceDirectory;
+ protected File rootTargetDirectory;
+
+ protected BaseConverter(File rootSourceDirectory, File rootTargetDirectory) throws ConverterException {
+ if(rootSourceDirectory == null) {
+ throw new ConverterException("Air SDK directory is null.");
+ }
+ if(rootTargetDirectory == null) {
+ throw new ConverterException("Target directory is null.");
+ }
+
+ this.rootSourceDirectory = rootSourceDirectory;
+ this.rootTargetDirectory = rootTargetDirectory;
+ }
+
+ public void convert() throws ConverterException {
+ if(rootSourceDirectory.isFile()) {
+ processArchive();
+ } else {
+ processDirectory();
+ }
+ }
+
+ abstract protected void processDirectory() throws ConverterException;
+
+ protected void processArchive() throws ConverterException {
+
+ }
+
+ protected String calculateChecksum(File jarFile) throws ConverterException {
+ // Implement the calculation of checksums for a given jar.
+ final MessageDigest digest;
+ try {
+ digest = MessageDigest.getInstance("SHA-1");
+
+ final InputStream is = new FileInputStream(jarFile);
+ final byte[] buffer = new byte[8192];
+ int read;
+ try {
+ while( (read = is.read(buffer)) > 0) {
+ digest.update(buffer, 0, read);
+ }
+ final byte[] md5sum = digest.digest();
+ final BigInteger bigInt = new BigInteger(1, md5sum);
+ return bigInt.toString(16);
+ }
+ catch(IOException e) {
+ throw new RuntimeException("Unable to process file for MD5", e);
+ }
+ finally {
+ try {
+ is.close();
+ }
+ catch(IOException e) {
+ //noinspection ThrowFromFinallyBlock
+ throw new RuntimeException("Unable to close input stream for MD5 calculation", e);
+ }
+ }
+ } catch (NoSuchAlgorithmException e) {
+ throw new ConverterException("Error calculating checksum of file '" + jarFile.getPath() + "'", e);
+ } catch (FileNotFoundException e) {
+ throw new ConverterException("Error calculating checksum of file '" + jarFile.getPath() + "'", e);
+ }
+ }
+
+ protected MavenArtifact lookupMetadataForChecksum(String checksum) throws ConverterException {
+ final String queryUrl = MAVEN_CENTRAL_SHA_1_QUERY_URL + checksum;
+
+ final Client client = Client.create();
+ final WebResource webResource = client.resource(queryUrl);
+ final ClientResponse response = webResource.accept("application/json").get(ClientResponse.class);
+
+ if (response.getStatus() != 200) {
+ throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
+ }
+
+ final String output = response.getEntity(String.class);
+
+ final BufferedReader reader = new BufferedReader(new StringReader(output));
+ final StringBuilder builder = new StringBuilder();
+ try {
+ for (String line; (line = reader.readLine()) != null; ) {
+ builder.append(line).append("\n");
+ }
+ final JSONTokener tokener = new JSONTokener(builder.toString());
+ final JSONObject rootObject = new JSONObject(tokener);
+
+ final JSONObject responseObject = (JSONObject) rootObject.get("response");
+ final int numFound = (Integer) responseObject.get("numFound");
+ if(numFound == 0) {
+ return null;
+ }
+ else if(numFound == 1) {
+ final JSONArray docs = (JSONArray) responseObject.get("docs");
+ final JSONObject firstHit = (JSONObject) docs.get(0);
+
+ final MavenArtifact artifactMetadata = new MavenArtifact();
+ artifactMetadata.setGroupId((String) firstHit.get("g"));
+ artifactMetadata.setArtifactId((String) firstHit.get("a"));
+ artifactMetadata.setVersion((String) firstHit.get("v"));
+ artifactMetadata.setPackaging((String) firstHit.get("p"));
+
+ return artifactMetadata;
+ } else {
+ long newestTimestamp = 0;
+ JSONObject newestVersion = null;
+
+ JSONArray options = (JSONArray) responseObject.get("docs");
+ // if the "groupId" is "batik" then use the newer version.
+ for(int i = 0; i < numFound; i++) {
+ final JSONObject option = (JSONObject) options.get(0);
+ if("batik".equals(option.get("g")) && "batik-dom".equals(option.get("a")) && "jar".equals(option.get("p"))) {
+ final long timestamp = (Long) option.get("timestamp");
+ if(timestamp > newestTimestamp) {
+ newestTimestamp = timestamp;
+ newestVersion = option;
+ }
+ }
+ }
+
+ if(newestVersion != null) {
+ final MavenArtifact artifactMetadata = new MavenArtifact();
+ artifactMetadata.setGroupId((String) newestVersion.get("g"));
+ artifactMetadata.setArtifactId((String) newestVersion.get("a"));
+ artifactMetadata.setVersion((String) newestVersion.get("v"));
+ artifactMetadata.setPackaging((String) newestVersion.get("p"));
+
+ return artifactMetadata;
+ } else {
+ System.out.println("For jar-file with checksum: " + checksum +
+ " more than one result was returned by query: " + queryUrl);
+ }
+ }
+ return null;
+ } catch(IOException e) {
+ throw new ConverterException("Error processing Metadata for checksum: '" + checksum + "'", e);
+ } catch (JSONException e) {
+ throw new ConverterException("Error processing Metadata for checksum: '" + checksum + "'", e);
+ }
+ }
+
+ protected void copyFile(File source, File target) throws ConverterException {
+ try {
+ final File outputDirectory = target.getParentFile();
+ if(!outputDirectory.exists()) {
+ if(!outputDirectory.mkdirs()) {
+ throw new RuntimeException("Could not create directory: " + outputDirectory.getAbsolutePath());
+ }
+ }
+
+ final InputStream in = new FileInputStream(source);
+ final OutputStream out = new FileOutputStream(target);
+
+ final byte[] buf = new byte[1024];
+ int len;
+ while ((len = in.read(buf)) > 0){
+ out.write(buf, 0, len);
+ }
+
+ in.close();
+ out.close();
+ } catch(IOException e) {
+ throw new ConverterException("Error copying file from '" + source.getPath() +
+ "' to '" + target.getPath() + "'", e);
+ }
+ }
+
+ /*protected void appendArtifact(MavenMetadata artifactMetadata, Element dependencies) {
+ final Document doc = dependencies.getOwnerDocument();
+ final Element dependency = doc.createElementNS(MAVEN_SCHEMA_URI, "dependency");
+ dependencies.appendChild(dependency);
+
+ final Element groupId = doc.createElementNS(MAVEN_SCHEMA_URI, "groupId");
+ groupId.setTextContent(artifactMetadata.getGroupId());
+ dependency.appendChild(groupId);
+ final Element artifactId = doc.createElementNS(MAVEN_SCHEMA_URI, "artifactId");
+ artifactId.setTextContent(artifactMetadata.getArtifactId());
+ dependency.appendChild(artifactId);
+ final Element version = doc.createElementNS(MAVEN_SCHEMA_URI, "version");
+ version.setTextContent(artifactMetadata.getVersion());
+ dependency.appendChild(version);
+ if(!artifactMetadata.getPackaging().equals("jar")) {
+ final Element packaging = doc.createElementNS(MAVEN_SCHEMA_URI, "type");
+ packaging.setTextContent(artifactMetadata.getPackaging());
+ dependency.appendChild(packaging);
+ }
+ }*/
+
+ protected void writePomArtifact(MavenArtifact pomData) throws ConverterException {
+ final Document pomDoc = createPomDocument(pomData);
+ final File outputFile = pomData.getPomTargetFile(rootTargetDirectory);
+ writeDocument(pomDoc, outputFile);
+ }
+
+ protected void writeDocument(Document doc, File outputFile) throws ConverterException {
+ final Source source = new DOMSource(doc);
+ final File outputDirectory = outputFile.getParentFile();
+ if(!outputDirectory.exists()) {
+ if(!outputDirectory.mkdirs()) {
+ throw new RuntimeException("Could not create directory: " + outputDirectory.getAbsolutePath());
+ }
+ }
+
+ final Result result = new StreamResult(outputFile);
+
+ final Transformer transformer;
+ try {
+ transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
+ transformer.transform(source, result);
+ } catch (TransformerConfigurationException e) {
+ throw new ConverterException("Error writing xml document.", e);
+ } catch (TransformerException e) {
+ throw new ConverterException("Error writing xml document.", e);
+ }
+ }
+
+ protected Document createPomDocument(final MavenArtifact metadata) throws ConverterException {
+ final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setNamespaceAware(true);
+ final DocumentBuilder builder;
+ try {
+ builder = factory.newDocumentBuilder();
+ DOMImplementation domImpl = builder.getDOMImplementation();
+ final Document pom = domImpl.createDocument(MAVEN_SCHEMA_URI, "project", null);
+
+ final Element root = pom.getDocumentElement();
+ final Element modelVersion = pom.createElementNS(MAVEN_SCHEMA_URI, "modelVersion");
+ modelVersion.setTextContent("4.0.0");
+ root.appendChild(modelVersion);
+ final Element groupId = pom.createElementNS(MAVEN_SCHEMA_URI, "groupId");
+ groupId.setTextContent(metadata.getGroupId());
+ root.appendChild(groupId);
+ final Element artifactId = pom.createElementNS(MAVEN_SCHEMA_URI, "artifactId");
+ artifactId.setTextContent(metadata.getArtifactId());
+ root.appendChild(artifactId);
+ final Element version = pom.createElementNS(MAVEN_SCHEMA_URI, "version");
+ version.setTextContent(metadata.getVersion());
+ root.appendChild(version);
+ final Element packaging = pom.createElementNS(MAVEN_SCHEMA_URI, "packaging");
+ packaging.setTextContent(metadata.getPackaging());
+ root.appendChild(packaging);
+
+ // Output dependency data.
+ if((metadata.getDependencies() != null) && !metadata.getDependencies().isEmpty()) {
+ final Element dependencies = pom.createElementNS(MAVEN_SCHEMA_URI, "dependencies");
+ root.appendChild(dependencies);
+ final Element dependencyManagement = pom.createElementNS(MAVEN_SCHEMA_URI, "dependencyManagement");
+ final Element dependencyManagementDependencies = pom.createElementNS(MAVEN_SCHEMA_URI, "dependencies");
+ dependencyManagement.appendChild(dependencyManagementDependencies);
+ root.appendChild(dependencyManagement);
+
+ final Map<String, MavenArtifact> dependencyIndex = new HashMap<String, MavenArtifact>();
+ for(final MavenArtifact dependencyMetadata : metadata.getDependencies()) {
+ Element dependency = pom.createElementNS(MAVEN_SCHEMA_URI, "dependency");
+ dependencies.appendChild(dependency);
+
+ // Generate the normal dependency.
+ Element dependencyGroupId = pom.createElementNS(MAVEN_SCHEMA_URI, "groupId");
+ dependencyGroupId.setTextContent(dependencyMetadata.getGroupId());
+ dependency.appendChild(dependencyGroupId);
+ Element dependencyArtifactId = pom.createElementNS(MAVEN_SCHEMA_URI, "artifactId");
+ dependencyArtifactId.setTextContent(dependencyMetadata.getArtifactId());
+ dependency.appendChild(dependencyArtifactId);
+ Element dependencyPackaging = pom.createElementNS(MAVEN_SCHEMA_URI, "type");
+ dependencyPackaging.setTextContent(dependencyMetadata.getPackaging());
+ dependency.appendChild(dependencyPackaging);
+ if(dependencyMetadata.getClassifier() != null) {
+ final Element dependencyClassifier = pom.createElementNS(MAVEN_SCHEMA_URI, "classifier");
+ dependencyClassifier.setTextContent(dependencyMetadata.getClassifier());
+ dependency.appendChild(dependencyClassifier);
+ }
+
+ // Configure the dependency including version in the dependency management section of the pom.
+ dependency = pom.createElementNS(MAVEN_SCHEMA_URI, "dependency");
+ dependencyGroupId = pom.createElementNS(MAVEN_SCHEMA_URI, "groupId");
+ dependencyGroupId.setTextContent(dependencyMetadata.getGroupId());
+ dependency.appendChild(dependencyGroupId);
+ dependencyArtifactId = pom.createElementNS(MAVEN_SCHEMA_URI, "artifactId");
+ dependencyArtifactId.setTextContent(dependencyMetadata.getArtifactId());
+ dependency.appendChild(dependencyArtifactId);
+ Element dependencyVersion = pom.createElementNS(MAVEN_SCHEMA_URI, "version");
+ dependencyVersion.setTextContent(dependencyMetadata.getVersion());
+ dependency.appendChild(dependencyVersion);
+ dependencyPackaging = pom.createElementNS(MAVEN_SCHEMA_URI, "type");
+ dependencyPackaging.setTextContent(dependencyMetadata.getPackaging());
+ dependency.appendChild(dependencyPackaging);
+ dependencyManagementDependencies.appendChild(dependency);
+
+ dependencyIndex.put(dependencyMetadata.getArtifactId(), dependencyMetadata);
+ }
+
+ // Output the rb.swc dependencies.
+ if(metadata.getLibrariesWithResourceBundles() != null) {
+ for(final String artifactWithResourceBundle : metadata.getLibrariesWithResourceBundles()) {
+ final MavenArtifact dependencyMetadata = dependencyIndex.get(artifactWithResourceBundle);
+ if(dependencyMetadata != null) {
+ final Element dependency = pom.createElementNS(MAVEN_SCHEMA_URI, "dependency");
+ dependencies.appendChild(dependency);
+
+ final Element dependencyGroupId = pom.createElementNS(MAVEN_SCHEMA_URI, "groupId");
+ dependencyGroupId.setTextContent(dependencyMetadata.getGroupId());
+ dependency.appendChild(dependencyGroupId);
+ final Element dependencyArtifactId = pom.createElementNS(MAVEN_SCHEMA_URI, "artifactId");
+ dependencyArtifactId.setTextContent(dependencyMetadata.getArtifactId());
+ dependency.appendChild(dependencyArtifactId);
+ final Element dependencyVersion = pom.createElementNS(MAVEN_SCHEMA_URI, "version");
+ dependencyVersion.setTextContent(dependencyMetadata.getVersion());
+ dependency.appendChild(dependencyVersion);
+ final Element dependencyPackaging = pom.createElementNS(MAVEN_SCHEMA_URI, "type");
+ dependencyPackaging.setTextContent("rb.swc");
+ dependency.appendChild(dependencyPackaging);
+ }
+ }
+ }
+ }
+ return pom;
+ } catch (ParserConfigurationException e) {
+ throw new ConverterException("Error creating pom document.", e);
+ }
+ }
+
+ protected void writeDummy(final File targetFile) throws ConverterException {
+ try {
+ final ZipOutputStream out = new ZipOutputStream(new FileOutputStream(targetFile));
+ out.putNextEntry(new ZipEntry("dummy"));
+ out.closeEntry();
+ out.close();
+ } catch (IOException e) {
+ throw new ConverterException("Error generating dummy resouce bundle.");
+ }
+ }
+
+ protected static File findDirectory(File directory, String directoryToFind) {
+ File[] entries = directory.listFiles();
+ File founded = null;
+
+ // Go over entries
+ if(entries != null) {
+ for (File entry : entries) {
+ if (entry.isDirectory() && directoryToFind.equalsIgnoreCase(entry.getName())) {
+ founded = entry;
+ break;
+ }
+ if (entry.isDirectory()) {
+ founded = findDirectory(entry, directoryToFind);
+ if (founded != null)
+ break;
+ }
+ }
+ }
+ return founded;
+ }
+
+ protected MavenArtifact resolveArtifact(File sourceFile, String defaultGroupId, String defaultVersion)
+ throws ConverterException {
+ // Calculate a checksum for the current file. We will use this checksum to query maven central
+ // in order to find out if this lib has already been published. If it has, there is no need to
+ // publish it again under a new name. In case a matching artifact is found the generated FDK
+ // will use the already deployed version. Additionally the checksum will be saved and if a
+ // fdk generated after this one uses the same version of a lib, the version of the older fdk is
+ // used also reducing the amount of jars that have to be re-deployed.
+ final String checksum = calculateChecksum(sourceFile);
+
+ // Try to get artifact metadata based upon the checksum by looking up the internal cache.
+ MavenArtifact artifact = checksums.get(checksum);
+
+ // Reusing artifact from other sdk version.
+ if(artifact != null) {
+ System.out.println("Reusing artifact (" + checksum + ") : " + artifact.getGroupId() + ":" +
+ artifact.getArtifactId() + ":" + artifact.getVersion());
+ return artifact;
+ }
+ // Id no artifact was found in the local cache, continue processing.
+ else {
+ // Do a lookup in maven central.
+ artifact = lookupMetadataForChecksum(checksum);
+
+ // The file was available on maven central, so use that version instead of the one coming with the sdk.
+ if(artifact != null) {
+ System.out.println("Using artifact from Maven Central (" + checksum + ") : " +
+ artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getVersion());
+ }
+ // The file was not available on maven central, so we have to add it manually.
+ else {
+ // The artifact name is the name of the jar.
+ final String artifactFileName = sourceFile.getName();
+ final String dependencyArtifactId = artifactFileName.substring(0, artifactFileName.lastIndexOf("."));
+ final String dependencyArtifactPackaging =
+ artifactFileName.substring(artifactFileName.lastIndexOf(".") + 1);
+
+ // Generate a new metadata object
+ artifact = new MavenArtifact();
+ artifact.setGroupId(defaultGroupId);
+ artifact.setArtifactId(dependencyArtifactId);
+ artifact.setVersion(defaultVersion);
+ artifact.setPackaging(dependencyArtifactPackaging);
+ artifact.addDefaultBinaryArtifact(sourceFile);
+
+ // Create the pom document that will reside next to the artifact lib.
+ writeArtifact(artifact);
+ }
+
+ // Remember the checksum for later re-usage.
+ checksums.put(checksum, artifact);
+
+ return artifact;
+ }
+ }
+
+ protected void writeArtifact(MavenArtifact artifact) throws ConverterException {
+ // Write the pom itself.
+ writePomArtifact(artifact);
+ final List<String> binaryClassifiers = artifact.getBinaryFilesClassifiers();
+ for(final String classifier : binaryClassifiers) {
+ final File binarySourceFile = artifact.getBinarySourceFile(classifier);
+ final File binaryTargetFile = artifact.getBinaryTargetFile(rootTargetDirectory, classifier);
+ copyFile(binarySourceFile, binaryTargetFile);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/Converter.java
----------------------------------------------------------------------
diff --git a/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/Converter.java b/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/Converter.java
new file mode 100644
index 0000000..0f94155
--- /dev/null
+++ b/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/Converter.java
@@ -0,0 +1,14 @@
+package org.apache.flex.utilities.converter;
+
+import org.apache.flex.utilities.converter.exceptions.ConverterException;
+
+import java.io.File;
+
+/**
+ * Created by cdutz on 18.04.2014.
+ */
+public interface Converter {
+
+ void convert() throws ConverterException;
+
+}
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/exceptions/ConverterException.java
----------------------------------------------------------------------
diff --git a/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/exceptions/ConverterException.java b/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/exceptions/ConverterException.java
new file mode 100644
index 0000000..3a0b7c6
--- /dev/null
+++ b/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/exceptions/ConverterException.java
@@ -0,0 +1,16 @@
+package org.apache.flex.utilities.converter.exceptions;
+
+/**
+ * Created by cdutz on 07.05.2014.
+ */
+public class ConverterException extends Exception {
+
+ public ConverterException(String message) {
+ super(message);
+ }
+
+ public ConverterException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/model/MavenArtifact.java
----------------------------------------------------------------------
diff --git a/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/model/MavenArtifact.java b/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/model/MavenArtifact.java
new file mode 100644
index 0000000..0dca36c
--- /dev/null
+++ b/mavenizer/converters/base/src/main/java/org/apache/flex/utilities/converter/model/MavenArtifact.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.flex.utilities.converter.model;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: cdutz
+ * Date: 01.07.12
+ * Time: 12:31
+ */
+public class MavenArtifact {
+
+ public static final String DEFAULT_CLASSIFIER = "default";
+
+ protected String groupId;
+ protected String artifactId;
+ protected String version;
+ protected String packaging = "pom";
+ protected String classifier;
+ protected List<String> librariesWithResourceBundles;
+
+ protected List<MavenArtifact> dependencies;
+
+ protected Map<String, File> binaryArtifacts;
+
+ 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 getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getPackaging() {
+ return packaging;
+ }
+
+ public void setPackaging(String packaging) {
+ this.packaging = packaging;
+ }
+
+ public String getClassifier() {
+ return classifier;
+ }
+
+ public void setClassifier(String classifier) {
+ this.classifier = classifier;
+ }
+
+ public List<String> getLibrariesWithResourceBundles() {
+ return librariesWithResourceBundles;
+ }
+
+ public void setLibrariesWithResourceBundles(List<String> librariesWithResourceBundles) {
+ this.librariesWithResourceBundles = librariesWithResourceBundles;
+ }
+
+ public List<MavenArtifact> getDependencies() {
+ return dependencies;
+ }
+
+ public void setDependencies(List<MavenArtifact> dependencies) {
+ this.dependencies = dependencies;
+ }
+
+ public void addDependency(MavenArtifact dependency) {
+ if(dependencies == null) {
+ dependencies = new ArrayList<MavenArtifact>();
+ }
+ dependencies.add(dependency);
+ }
+
+ public void addDefaultBinaryArtifact(File binaryArtifact) {
+ addBinaryArtifact(DEFAULT_CLASSIFIER, binaryArtifact);
+ }
+
+ public void addBinaryArtifact(String classifier, File binaryArtifact) {
+ if(binaryArtifacts == null) {
+ binaryArtifacts = new HashMap<String, File>();
+ }
+ binaryArtifacts.put(classifier, binaryArtifact);
+ }
+
+ public File getPomTargetFile(File targetRootDirectory) {
+ final String fileName = groupId.replace(".", File.separator) + File.separator + artifactId + File.separator +
+ version + File.separator + artifactId + "-" + version + ((classifier != null) ? "-" + classifier : "") +
+ ".pom";
+ return new File(targetRootDirectory, fileName);
+ }
+
+ public List<String> getBinaryFilesClassifiers() {
+ final List<String> classifiers = new ArrayList<String>();
+ if(binaryArtifacts != null) {
+ classifiers.addAll(binaryArtifacts.keySet());
+ }
+ return classifiers;
+ }
+
+ public File getBinarySourceFile(String classifier) {
+ if((binaryArtifacts != null) && (binaryArtifacts.containsKey(classifier))) {
+ return binaryArtifacts.get(classifier);
+ }
+ return null;
+ }
+
+ public File getBinaryTargetFile(File targetRootDirectory, String classifier) {
+ if((binaryArtifacts != null) && (binaryArtifacts.containsKey(classifier))) {
+ final String fileName = groupId.replace(".", File.separator) + File.separator + artifactId + File.separator +
+ version + File.separator + artifactId + "-" + version +
+ (DEFAULT_CLASSIFIER.equals(classifier) ? "" : "-" + classifier) + "." + packaging;
+ return new File(targetRootDirectory, fileName);
+ }
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/converters/flash/pom.xml
----------------------------------------------------------------------
diff --git a/mavenizer/converters/flash/pom.xml b/mavenizer/converters/flash/pom.xml
new file mode 100644
index 0000000..d231261
--- /dev/null
+++ b/mavenizer/converters/flash/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.flex.utilities.converter</groupId>
+ <artifactId>converters</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>flash-converter</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.flex.utilities.converter</groupId>
+ <artifactId>base-converter</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+
+</project>
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/converters/flash/src/main/java/org/apache/flex/utilities/converter/flash/FlashConverter.java
----------------------------------------------------------------------
diff --git a/mavenizer/converters/flash/src/main/java/org/apache/flex/utilities/converter/flash/FlashConverter.java b/mavenizer/converters/flash/src/main/java/org/apache/flex/utilities/converter/flash/FlashConverter.java
new file mode 100644
index 0000000..6ff5462
--- /dev/null
+++ b/mavenizer/converters/flash/src/main/java/org/apache/flex/utilities/converter/flash/FlashConverter.java
@@ -0,0 +1,262 @@
+package org.apache.flex.utilities.converter.flash;
+
+import org.apache.commons.compress.archivers.ArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
+import org.apache.flex.utilities.converter.BaseConverter;
+import org.apache.flex.utilities.converter.Converter;
+import org.apache.flex.utilities.converter.exceptions.ConverterException;
+import org.apache.flex.utilities.converter.model.MavenArtifact;
+
+import java.io.*;
+import java.text.NumberFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Created by cdutz on 22.04.2014.
+ */
+public class FlashConverter extends BaseConverter implements Converter {
+
+ /**
+ * @param rootSourceDirectory Path to the root of the original Flash SDK.
+ * @param rootTargetDirectory Path to the root of the directory where the Maven artifacts should be generated to.
+ * @throws org.apache.flex.utilities.converter.exceptions.ConverterException
+ */
+ public FlashConverter(File rootSourceDirectory, File rootTargetDirectory) throws ConverterException {
+ super(rootSourceDirectory, rootTargetDirectory);
+ }
+
+ /**
+ * Entry point for generating the Maven artifacts for an Flash SDK.
+ *
+ * @throws ConverterException
+ */
+ @Override
+ protected void processDirectory() throws ConverterException {
+ if(!rootSourceDirectory.exists() || !rootSourceDirectory.isDirectory()) {
+ throw new ConverterException("Flash SDK directory '" + rootSourceDirectory.getPath() + "' is invalid.");
+ }
+
+ generateRuntimeArtifacts();
+ generateFrameworkArtifacts();
+ }
+
+ /**
+ * This method generates those artifacts that resemble the runtime part of the Flash SDK.
+ *
+ * @throws ConverterException
+ */
+ protected void generateRuntimeArtifacts() throws ConverterException {
+ // Create a list of all libs that should belong to the Flash SDK runtime.
+ final File directory = new File(rootSourceDirectory, "runtimes" + File.separator + "player");
+ if(!directory.exists() || !directory.isDirectory()) {
+ throw new ConverterException("Runtime directory does not exist.");
+ }
+ final List<File> playerVersions = new ArrayList<File>();
+ playerVersions.addAll(Arrays.asList(directory.listFiles(new FlashRuntimeFilter())));
+
+ // In really old SDKs the flash-player was installed in the players directory directly.
+ if(new File(directory, "win").exists()) {
+ playerVersions.add(directory);
+ }
+
+ // Generate artifacts for every jar in the input directories.
+ for(final File versionDir : playerVersions) {
+ // The flash-player 9 is installed directly in the player directory.
+ String playerVersionString;
+ if(versionDir == directory) {
+ playerVersionString = "9.0";
+ } else {
+ playerVersionString = versionDir.getName();
+ }
+
+ final double playerVersion = Double.valueOf(playerVersionString);
+ final NumberFormat doubleFormat = NumberFormat.getInstance(Locale.US);
+ doubleFormat.setMinimumFractionDigits(1);
+ doubleFormat.setMaximumFractionDigits(1);
+ final String version = doubleFormat.format(playerVersion);
+
+ final MavenArtifact playerArtifact = new MavenArtifact();
+ playerArtifact.setGroupId("com.adobe.flash");
+ playerArtifact.setArtifactId("runtime");
+ playerArtifact.setVersion(version);
+ playerArtifact.setPackaging("exe");
+
+ // Deploy Windows binaries.
+ final File windowsDirectory = new File(versionDir, "win");
+ if(windowsDirectory.exists()) {
+ // Find out if a flash-player binary exists.
+ File flashPlayerBinary = null;
+ if(new File(windowsDirectory, "FlashPlayerDebugger.exe").exists()) {
+ flashPlayerBinary = new File(windowsDirectory, "FlashPlayerDebugger.exe");
+ } else if(new File(windowsDirectory, "FlashPlayer.exe").exists()) {
+ flashPlayerBinary = new File(windowsDirectory, "FlashPlayer.exe");
+ }
+
+ // If a binary exists, copy it to the target and create a pom for it.
+ if (flashPlayerBinary != null) {
+ playerArtifact.addBinaryArtifact("win", flashPlayerBinary);
+ }
+ }
+
+ // Deploy Mac binaries.
+ final File macDirectory = new File(versionDir, "mac");
+ if(macDirectory.exists()) {
+ // Find out if a flash-player binary exists.
+ File flashPlayerBinary = null;
+ if(new File(macDirectory, "Flash Player.app.zip").exists()) {
+ flashPlayerBinary = new File(macDirectory, "Flash Player.app.zip");
+ } else if(new File(macDirectory, "Flash Player Debugger.app.zip").exists()) {
+ flashPlayerBinary = new File(macDirectory, "Flash Player Debugger.app.zip");
+ }
+
+ // If a binary exists, copy it to the target and create a pom for it.
+ if (flashPlayerBinary != null) {
+ playerArtifact.addBinaryArtifact("mac", flashPlayerBinary);
+ }
+ }
+
+ // Deploy Linux binaries.
+ final File lnxDirectory = new File(versionDir, "lnx");
+ if(lnxDirectory.exists()) {
+ // Find out if a flash-player binary exists.
+ File flashPlayerBinary;
+ if(new File(lnxDirectory, "flashplayer.tar.gz").exists()) {
+ flashPlayerBinary = new File(lnxDirectory, "flashplayer.tar.gz");
+ } else if(new File(lnxDirectory, "flashplayerdebugger.tar.gz").exists()) {
+ flashPlayerBinary = new File(lnxDirectory, "flashplayerdebugger.tar.gz");
+ } else {
+ throw new ConverterException("Couldn't find player archive.");
+ }
+
+ // Decompress the archive.
+ // First unzip it.
+ final FileInputStream fin;
+ try {
+ fin = new FileInputStream(flashPlayerBinary);
+ final BufferedInputStream in = new BufferedInputStream(fin);
+ final File tempTarFile = File.createTempFile("flex-sdk-linux-flashplayer-binary-" + version, ".tar");
+ final FileOutputStream out = new FileOutputStream(tempTarFile);
+ final GzipCompressorInputStream gzIn = new GzipCompressorInputStream(in);
+ final byte[] buffer = new byte[1024];
+ int n;
+ while (-1 != (n = gzIn.read(buffer))) {
+ out.write(buffer, 0, n);
+ }
+ out.close();
+ gzIn.close();
+
+ // Then untar it.
+ File uncompressedBinary = null;
+ final FileInputStream tarFileInputStream = new FileInputStream(tempTarFile);
+ final TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(tarFileInputStream);
+ ArchiveEntry entry;
+ while((entry = tarArchiveInputStream.getNextEntry()) != null) {
+ if("flashplayer".equals(entry.getName())) {
+ uncompressedBinary = File.createTempFile("flex-sdk-linux-flashplayer-binary-" + version, ".uexe");
+ final FileOutputStream uncompressedBinaryOutputStream = new FileOutputStream(uncompressedBinary);
+ while(-1 != (n = tarArchiveInputStream.read(buffer))) {
+ uncompressedBinaryOutputStream.write(buffer, 0, n);
+ }
+ uncompressedBinaryOutputStream.close();
+ } else if("flashplayerdebugger".equals(entry.getName())) {
+ uncompressedBinary = File.createTempFile("flex-sdk-linux-flashplayer-binary-" + version, ".uexe");
+ final FileOutputStream uncompressedBinaryOutputStream = new FileOutputStream(uncompressedBinary);
+ while(-1 != (n = tarArchiveInputStream.read(buffer))) {
+ uncompressedBinaryOutputStream.write(buffer, 0, n);
+ }
+ uncompressedBinaryOutputStream.close();
+ }
+ }
+ tarFileInputStream.close();
+
+ // If a binary exists, copy it to the target and create a pom for it.
+ if (uncompressedBinary != null) {
+ playerArtifact.addBinaryArtifact("linux", flashPlayerBinary);
+ }
+ } catch (FileNotFoundException e) {
+ throw new ConverterException("Error processing the linux player tar file", e);
+ } catch (IOException e) {
+ throw new ConverterException("Error processing the linux player tar file", e);
+ }
+ }
+
+ // Write this artifact to file.
+ writeArtifact(playerArtifact);
+ }
+ }
+
+ /**
+ * This method generates those artifacts that resemble the framework part of the Flash SDK.
+ *
+ * @throws ConverterException
+ */
+ protected void generateFrameworkArtifacts() throws ConverterException {
+ // Create a list of all libs that should belong to the Flash SDK runtime.
+ final File directory = new File(rootSourceDirectory, "frameworks.libs.player".replace(".", File.separator));
+ if (!directory.exists() || !directory.isDirectory()) {
+ throw new ConverterException("Runtime directory does not exist.");
+ }
+ final List<File> playerVersions = new ArrayList<File>();
+ final File[] versions = directory.listFiles();
+ if((versions != null) && (versions.length > 0)) {
+ playerVersions.addAll(Arrays.asList(versions));
+
+ // Generate artifacts for every jar in the input directories.
+ for (final File versionDir : playerVersions) {
+ final File playerglobalSwc = new File(versionDir, "playerglobal.swc");
+
+ // Convert any version into a two-segment version number.
+ final double playerVersion = Double.valueOf(versionDir.getName());
+ final NumberFormat doubleFormat = NumberFormat.getInstance(Locale.US);
+ doubleFormat.setMinimumFractionDigits(1);
+ doubleFormat.setMaximumFractionDigits(1);
+ final String version = doubleFormat.format(playerVersion);
+
+ // Create an artifact for the player-global.
+ final MavenArtifact playerglobal = new MavenArtifact();
+ playerglobal.setGroupId("com.adobe.flash.framework");
+ playerglobal.setArtifactId("playerglobal");
+ playerglobal.setVersion(version);
+ playerglobal.setPackaging("swc");
+ playerglobal.addDefaultBinaryArtifact(playerglobalSwc);
+ writeArtifact(playerglobal);
+
+ // Generate dummy pom-artifact which we are allowed to deploy.
+ final MavenArtifact playerglobalDummy = new MavenArtifact();
+ playerglobalDummy.setGroupId("org.apache.flex.runtime");
+ playerglobalDummy.setArtifactId("flashplayer");
+ playerglobalDummy.setVersion(version);
+ writeArtifact(playerglobalDummy);
+ }
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////
+ //
+ // Utility methods
+ //
+ ///////////////////////////////////////////////////////////////////////////////////////////////////
+
+ public static class FlashRuntimeFilter implements FileFilter {
+ public boolean accept(File pathname) {
+ return pathname.isDirectory() && !"win".equalsIgnoreCase(pathname.getName()) &&
+ !"lnx".equalsIgnoreCase(pathname.getName()) && !"mac".equalsIgnoreCase(pathname.getName());
+ }
+ }
+
+ public static class FlashFrameworkFilter implements FilenameFilter {
+ public boolean accept(File dir, String name) {
+ return name.equals("playerglobal.swc");
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ FlashConverter converter = new FlashConverter(new File(args[0]), new File(args[1]));
+ converter.convert();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5fc9d25c/mavenizer/converters/flex/pom.xml
----------------------------------------------------------------------
diff --git a/mavenizer/converters/flex/pom.xml b/mavenizer/converters/flex/pom.xml
new file mode 100644
index 0000000..eca8505
--- /dev/null
+++ b/mavenizer/converters/flex/pom.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.flex.utilities.converter</groupId>
+ <artifactId>converters</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>flex-converter</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.flex.utilities.converter</groupId>
+ <artifactId>base-converter</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ <!--
+ Flex usually contains Air and Flash artifacts, so we need to reference them.
+ -->
+ <dependency>
+ <groupId>org.apache.flex.utilities.converter</groupId>
+ <artifactId>air-converter</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.flex.utilities.converter</groupId>
+ <artifactId>flash-converter</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+
+</project>