/*
*
* 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 flex2.tools.oem.internal;
import java.io.*;
import java.net.*;
import java.util.*;
import flash.localization.LocalizationManager;
import flash.localization.ResourceBundleLocalizer;
import flex2.compiler.CompilerAPI;
import flex2.compiler.common.DefaultsConfigurator;
import flex2.compiler.config.ConfigurationBuffer;
import flex2.compiler.config.ConfigurationException;
import flex2.compiler.io.FileUtil;
import flex2.compiler.io.VirtualFile;
import flex2.compiler.swc.SwcException;
import flex2.compiler.util.ThreadLocalToolkit;
import flex2.linker.FlexMovie;
import flex2.tools.CompcConfiguration;
import flex2.tools.Mxmlc;
import flex2.tools.oem.Library;
import flex2.tools.oem.Report;
/**
* Command line utility for compiling libraries using the OEM API.
*
* @version 2.0.1
* @author Clement Wong
*/
public class LibraryCompiler
{
public static void main(String[] args)
{
final OEMConsole console = new OEMConsole();
try
{
init();
run(console, args);
}
catch (ConfigurationException ex)
{
Mxmlc.processConfigurationException(ex, "compc");
}
catch (SwcException ex)
{
assert ThreadLocalToolkit.errorCount() > 0;
}
catch (Throwable t) // IOException, Throwable
{
ThreadLocalToolkit.logError(t.getMessage());
t.printStackTrace();
}
finally
{
clean();
}
System.exit(console.errorCount());
}
public static void run(OEMConsole console, String[] args)
throws ConfigurationException, IOException, URISyntaxException
{
ThreadLocalToolkit.setLogger(console);
final Library lib = new Library();
lib.setLogger(console);
OEMConfiguration c1 = (OEMConfiguration) lib.getDefaultConfiguration();
CompcConfiguration c2 = getCompcConfiguration(args);
OEMConfiguration c3 = new OEMConfiguration(null, c2);
c1.importDefaults(c3);
lib.setConfiguration(c1);
// transfer the value of compute-digest from CompcConfiguration to OEMConfiguration.
c1.enableDigestComputation(c2.getComputeDigest());
for (Iterator i = c2.getClasses().iterator(); i.hasNext(); )
{
lib.addComponent((String) i.next());
}
List fileList = flex2.compiler.CompilerAPI.getVirtualFileList(c2.getIncludeSources(),
new HashSet<String>(Arrays.asList(flex2.tools.WebTierAPI.getSourcePathMimeTypes())));
for (Iterator i = fileList.iterator(); i.hasNext(); )
{
lib.addComponent(new File(((VirtualFile) i.next()).getName()));
}
Map ss = c2.getStylesheets();
for (Iterator i = ss.keySet().iterator(); i.hasNext(); )
{
String key = (String) i.next();
lib.addStyleSheet(key, new File(((VirtualFile) ss.get(key)).getName()));
}
for (Iterator i = c2.getIncludeResourceBundles().iterator(); i.hasNext(); )
{
lib.addResourceBundle((String) i.next());
}
for (Iterator i = c2.getNamespaces().iterator(); i.hasNext(); )
{
lib.addComponent(new URI((String) i.next()));
}
Map m = c2.getFiles();
for (Iterator i = m.keySet().iterator(); i.hasNext(); )
{
String key = (String) i.next();
lib.addArchiveFile(key, new File(((VirtualFile) m.get(key)).getName()));
}
try
{
lib.load(new BufferedInputStream(new FileInputStream(new File(c2.getOutput() + ".incr"))));
// load() wipes out our ThreadLocal and we lose our logger
ThreadLocalToolkit.setLogger(console);
}
catch (IOException ex)
{
}
long size = 0;
if ((size = lib.build(new BufferedOutputStream(new FileOutputStream(new File(c2.getOutput()))), true)) == 0)
{
ThreadLocalToolkit.logError("Build unsuccessful.");
}
else
{
System.out.println(c2.getOutput() + " (" + size + " bytes)");
if (c2.generateRBList() && c2.getRBListFileName() != null)
{
Report r = lib.getReport();
String[] rbNames = r.getResourceBundleNames();
HashSet<String> set = new HashSet<String>();
for (int i = 0, l = rbNames == null ? 0 : rbNames.length; i < l; i++)
{
set.add(rbNames[i]);
}
String list = FlexMovie.dumpRBList(set);
FileUtil.writeFile(c2.getRBListFileName(), list);
}
}
lib.save(new BufferedOutputStream(new FileOutputStream(new File(c2.getOutput() + ".incr"))));
lib.clean();
}
private static CompcConfiguration getCompcConfiguration(String[] args)
throws ConfigurationException, IOException
{
ConfigurationBuffer cfgbuf = new ConfigurationBuffer(CompcConfiguration.class,
CompcConfiguration.getAliases());
cfgbuf.setDefaultVar("include-classes");
DefaultsConfigurator.loadCompcDefaults( cfgbuf );
Object obj = Mxmlc.processConfiguration(ThreadLocalToolkit.getLocalizationManager(),
"compc",
args,
cfgbuf,
CompcConfiguration.class,
"include-classes");
return (CompcConfiguration) obj;
}
static final void init()
{
CompilerAPI.useAS3();
CompilerAPI.usePathResolver();
setupLocalizationManager();
}
static final void clean()
{
CompilerAPI.removePathResolver();
ThreadLocalToolkit.setLogger(null);
ThreadLocalToolkit.setLocalizationManager(null);
}
static final LocalizationManager setupLocalizationManager()
{
// set up for localizing messages
LocalizationManager l10n = new LocalizationManager();
l10n.addLocalizer(new ResourceBundleLocalizer());
ThreadLocalToolkit.setLocalizationManager(l10n);
return l10n;
}
}