package com.intellij.flex.maven; import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; import java.io.File; import java.io.IOException; public class ShareableFlexConfigGenerator extends IdeaConfigurator { private static final String TARGET_WITH_FRONT_SLASH = "/target"; private static final String CLASSSES_WITH_FRONT_SLASH = "/target/classes"; private static boolean listForGantGenerated; private String localRepositoryBasedir; private int localRepositoryBasedirLength; private String baseDir; public ShareableFlexConfigGenerator(MavenSession session, File outputDirectory) { super(session, new File("build-gant/flex-configs")); //noinspection ResultOfMethodCallIgnored this.outputDirectory.mkdirs(); } @Override public void preGenerate(MavenProject project, String classifier) throws IOException { super.preGenerate(project, classifier); baseDir = project.getBasedir().getPath(); localRepositoryBasedir = session.getLocalRepository().getBasedir(); localRepositoryBasedirLength = localRepositoryBasedir.length(); if (!listForGantGenerated) { listForGantGenerated = true; StringBuilder s = new StringBuilder(8192); s.append("def List<SwfDescriptor> getList() {\n\treturn ["); boolean isFirst = true; final int absPathPrefixLength = session.getTopLevelProject().getBasedir().getPath().length(); for (MavenProject p : session.getProjects()) { final String packaging = p.getPackaging(); if (packaging.equals("swf") || packaging.equals("air") || packaging.equals("swc")) { if (!isFirst) { s.append(", "); } else { isFirst = false; } s.append("\n\t\tnew SwfDescriptor(\"").append(p.getArtifactId()).append(".xml\", \""); final String pBaseDir = p.getBasedir().getPath(); if (session.getTopLevelProject() != p) { s.append(pBaseDir.substring(absPathPrefixLength + 1)); } else { s.append(pBaseDir); } s.append("\", ").append(packaging.equals("swc") ? "true" : "false").append(')'); } } s.append("\n\t];\n}"); Utils.write(s, new File("build-gant/flex_ui_designer_swfs_build.gant")); } } @Override protected String getConfigFilePath(MavenProject project, String classifier) { return project.getArtifactId() + ".xml"; } @Override protected void processValue(String value, String name) throws IOException { if (name.equals(LOCAL_FONTS_SNAPSHOT)) { out.append("@@repo@@/fonts.ser"); } else if (name.equals("output")) { target(value); } else { super.processValue(value, name); } } @Override protected void writeTag(String indent, String name, String value, String parentName) throws IOException { if (name.equals(PATH_ELEMENT) || name.equals("library") || name.equals("manifest") || name.equals("path")) { out.append(indent).append("\t<").append(name).append('>'); if (parentName.equals(FILE_SPECS) || parentName.equals("source-path") || parentName.equals("include-sources") || parentName.equals("include-file")) { if (value.startsWith(baseDir)) { out.append("@@baseDir@@").append(value, baseDir.length(), value.length()); } else { int sIndex = value.indexOf(TARGET_WITH_FRONT_SLASH); if (sIndex != -1) { out.append("@@target@@").append(value, sIndex + TARGET_WITH_FRONT_SLASH.length(), value.length()); } else { throw new IllegalArgumentException(value); } } } else { int sIndex; if (value.startsWith(localRepositoryBasedir)) { out.append("@@repo@@").append(value, localRepositoryBasedirLength, value.length()); } else if ((sIndex = value.indexOf(CLASSSES_WITH_FRONT_SLASH)) != -1) { String filename = value.substring(sIndex + CLASSSES_WITH_FRONT_SLASH.length() + 1); Utils.copyFile(new File(value), new File("build-gant/flex-configs/" + filename)); out.append("@@configs@@/").append(filename); } else { target(value); } } out.append("</").append(name).append('>'); } else { if (name.equals(LOCAL_FONTS_SNAPSHOT)) { value = "@@repo@@/fonts.ser"; } super.writeTag(indent, name, value, parentName); } } private void target(String value) { out.append("@@target@@").append(value, lastSlashIndex(value), value.length()); } private static int lastSlashIndex(String value) { int index = value.lastIndexOf('/'); return index == -1 ? value.lastIndexOf('\\') : index; } }