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/develop Commit: 5fc9d25cbf8b315c574710919f8f23493d1362ce Parents: c11e18a Author: Christofer Dutz <[email protected]> Authored: Sun May 11 20:10:37 2014 +0200 Committer: Christofer Dutz <[email protected]> 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>
