/** * GRANITE DATA SERVICES * Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S. * * This file is part of the Granite Data Services Platform. * * Granite Data Services is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * Granite Data Services is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA, or see <http://www.gnu.org/licenses/>. */ package org.granite.builder.util; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Properties; import org.eclipse.core.resources.IProject; import org.granite.builder.BuilderConfiguration; import org.granite.builder.BuilderListener; import org.granite.builder.properties.Gas3Source; import org.granite.builder.properties.GraniteProperties; import org.granite.generator.Listener; /** * @author Franck WOLFF */ public class FlexConfigGenerator { private static final String AS3_METADATA_RES = "org/granite/tide/as3-metadata.properties"; public static final String FILE_NAME="granite-flex-config.xml"; private static final String PREFIX = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<flex-config>\n" + " <compiler>\n" + " <keep-as3-metadata>\n"; private static final String INFIX = " </keep-as3-metadata>\n" + " </compiler>\n" + " <includes>\n"; private static final String SUFFIX = " </includes>\n" + "</flex-config>"; private static final FileFilter AS_FILE_FILTER = new FileFilter() { @Override public boolean accept(File file) { return file.isDirectory() || file.getName().endsWith(".as"); } }; public static boolean generateFlexConfig(BuilderConfiguration config, BuilderListener listener, IProject project) throws Exception { GraniteProperties properties = config.getProperties(); if (properties.getGas3().getSources() == null || properties.getGas3().getSources().isEmpty()) return false; if (!ProjectUtil.isFlexBuilderProject(project)) return false; List<String> asClasses = new ArrayList<String>(); for (Gas3Source source : properties.getGas3().getSources()) { File output = new File(ProjectUtil.getProjectFile(project), source.getOutputDir()); asClasses.addAll(listAsFiles(output)); } Collections.sort(asClasses); File flexConfigFile = FileUtil.getLocationFile(project.getFile(FILE_NAME)); StringBuilder sb = new StringBuilder(1024); sb.append(PREFIX); try { Properties as3Metadata = new Properties(); InputStream is = config.getClassLoader().getResourceAsStream(AS3_METADATA_RES); // If null -> granite.jar isn't in the classpath or is outdated... if (is != null) { try { as3Metadata.load(is); } finally { is.close(); } String[] names = as3Metadata.keySet().toArray(new String[as3Metadata.size()]); Arrays.sort(names); for (Object name : names) sb.append(" <name>").append(name).append("</name>\n"); } } catch (IOException e) { // ignore... } sb.append(INFIX); for (String asClass : asClasses) sb.append(" <symbol>").append(asClass).append("</symbol>\n"); sb.append(SUFFIX); byte[] bs = sb.toString().getBytes("UTF-8"); boolean writeFile = true; String message = Listener.MSG_FILE_UPTODATE; if (flexConfigFile.exists()) { if (flexConfigFile.length() == bs.length) { InputStream is = new FileInputStream(flexConfigFile); try { byte[] fc = new byte[bs.length]; is.read(fc); writeFile = !Arrays.equals(bs, fc); } finally { is.close(); } } if (writeFile) message = Listener.MSG_FILE_OUTDATED; } else message = Listener.MSG_FILE_NOT_EXISTS; if (writeFile) { listener.generating(flexConfigFile.toString(), message); OutputStream os = new FileOutputStream(flexConfigFile); try { os.write(bs); } finally { os.close(); } } else listener.skipping(flexConfigFile.toString(), message); return writeFile; } private static List<String> listAsFiles(File root) throws Exception { List<String> files = new ArrayList<String>(); listAsFiles(root, root, files); return files; } private static void listAsFiles(File root, File dir, List<String> files) throws Exception { if (dir.exists() && dir.isDirectory()) { for (File file : dir.listFiles(AS_FILE_FILTER)) { if (file.isDirectory()) listAsFiles(root, file, files); else { StringBuilder sb = new StringBuilder(); sb.append(file.getName().substring(0, file.getName().length() - 3)); for (File parent = file.getParentFile(); parent != null && !root.equals(parent); parent = parent.getParentFile()) sb.insert(0, '.').insert(0, parent.getName()); files.add(sb.toString()); } } } } }