blob: 717cf95849103275cd2741f139659939ba9421d9 [file] [log] [blame]
/*
*
* 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;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
/**
* This class implements the SDK tool bin/copylocale.
* <p>
* This tool is used to create the necessary files for developing
* in a new locale for which the framework has not been localized.
* For example, if you try to compile an application for the fr_FR
* (French) locale, you will get compilation errors because the SDK
* has neither .properties files nor resource bundle SWCs for this locale.
* But if you execute
* <p>
* copylocale en_US fr_FR
* <p>
* you will then have what you need for the fr_FR locale; the resources
* for this locale will simply be copies of those for the en_US locale.
*/
public class CopyLocale
{
/**
* The entry-point for the bin/copylocale script.
*/
public static void main(String[] args)
{
CopyLocale copyLocale = new CopyLocale();
copyLocale.run(args);
}
private CopyLocale()
{
}
/**
* The SDK directory in which the bin/copylocale script
* that called main() lives.
*/
private File sdkDir;
/**
* The locale from which to copy the properties files.
* This is the first argument of copylocale.
* For example, if you execute
* copylocale en_US fr_FR
* then srcLocale is "en_US".
*/
private String srcLocale;
/**
* The new locale to create properties files and SWCs for.
* This is the second argument of copylocale.
* For example, if you execute
* copylocale en_US fr_FR
* then dstLocale is "fr_FR".
*/
private String dstLocale;
/**
* The names of the SWC projects in the frameworks/projects
* directory of the SDK which have resource bundles
* (as identified by having a 'bundles' subdirectory).
*/
private String[] projects;
/**
* A Map (String -> String[]) mapping a project name
* to an array of bundle names, e.g. "rpc" -> [ "messaging", "rpc" ],
* as determined by enumerating the .properties files
* in the project's 'bundle' directory for the sourceLocale.
*/
private HashMap<String, String[]> bundleNamesForProject = new HashMap<String, String[]>();
private void run(String[] args)
{
if (!checkArguments(args))
return;
System.out.println("In Flex SDK at " + sdkDir + " ...");
int n = projects.length;
for (int i = 0; i < n; i++)
{
copyPropertiesFiles(projects[i]);
compileSWC(projects[i]);
}
}
private boolean checkArguments(String[] args)
{
// The bin/copylocale script passes its arguments to main().
// For example, if you execute
// copylocale en_US fr_FR
// then args will be
// [0] en_US -> srcLocale
// [1] fr_FR -> dstLocale
if (args.length != 2)
{
System.out.println("Usage: copylocale src_locale dst_locale");
return false;
}
boolean success = true;
// On Windows, the system property "application.home"
// is set by the JAR launcher, copylocale.exe.
sdkDir = new File(System.getProperty("application.home"));
srcLocale = args[0];
dstLocale = args[1];
// Every directory in the "projects" dir which has a "bundles" dir becomes a project in the "projects" array.
// Return false if the any of the projects are missing the requested src locale in its "bundles" dir.
File projectsDir = new File(sdkDir, "frameworks/projects");
File[] projectDirs = projectsDir.listFiles();
ArrayList<String> projectList = new ArrayList<String>();
int n = projectDirs.length;
for (int i = 0; i < n; i++)
{
File projectDir = projectDirs[i];
File bundlesDir = new File(projectDir, "bundles");
if (!bundlesDir.exists())
continue;
String project = projectDir.getName();
projectList.add(project);
File srcLocaleDir = new File(bundlesDir, srcLocale);
if (!srcLocaleDir.exists())
{
System.err.println("Error: Directory \"" + srcLocaleDir + "\" does not exist");
success = false;
}
}
projects = new String[projectList.size()];
projectList.toArray(projects);
return success;
}
private void copyPropertiesFiles(String project)
{
File bundlesDir = new File(sdkDir, "frameworks/projects/" + project + "/bundles");
File fromSrcDir = new File(bundlesDir, srcLocale);
File[] propertiesFiles = fromSrcDir.listFiles();
ArrayList<String> bundleNameList = new ArrayList<String>();
int m = propertiesFiles.length;
for (int j = 0; j < m; j++)
{
String name = propertiesFiles[j].getName();
if (name.endsWith(".properties"))
{
String bundleName = name.substring(0, name.length() - 11);
bundleNameList.add(bundleName);
}
}
String[] bundleNames = new String[bundleNameList.size()];
bundleNameList.toArray(bundleNames);
bundleNamesForProject.put(project, bundleNames);
File toSrcDir = new File(bundlesDir, dstLocale);
int len = sdkDir.toString().length() + 1;
System.out.println();
System.out.println("Copying files from " + fromSrcDir.toString().substring(len));
System.out.println(" to " + toSrcDir.toString().substring(len) + ":");
System.out.println();
try
{
copyDirectory(fromSrcDir, toSrcDir);
}
catch (IOException e)
{
System.err.println("Error: Can't copy .properties files");
}
}
public void copyDirectory(File fromDir, File toDir) throws IOException
{
if (fromDir.isDirectory())
{
toDir.mkdirs();
String[] children = fromDir.list();
int n = children.length;
for (int i = 0; i < n; i++)
{
copyDirectory(new File(fromDir, children[i]),
new File(toDir, children[i]));
}
}
else
{
System.out.println(fromDir.getName());
FileInputStream in = new FileInputStream(fromDir);
FileOutputStream out = new FileOutputStream(toDir);
byte[] buffer = new byte[32768];
int length;
while ((length = in.read(buffer)) > 0)
{
out.write(buffer, 0, length);
}
in.close();
out.close();
}
}
private void compileSWC(String project)
{
File srcDir = new File(sdkDir, "frameworks/projects/" + project + "/bundles/" + dstLocale);
String bundleNameString = "";
String[] bundleNames = bundleNamesForProject.get(project);
int n = bundleNames.length;
for (int i = 0; i < n; i++)
{
bundleNameString += bundleNames[i];
if (i < n - 1)
bundleNameString += ",";
}
File outputDir = new File(sdkDir, "frameworks/locale/" + dstLocale);
File outputSWC = new File(outputDir, project + "_rb.swc");
int len = sdkDir.toString().length() + 1;
System.out.println();
System.out.println("Compiling resource bundle SWC " + outputSWC.toString().substring(len) + ":");
System.out.println();
String[] args = new String[]
{
"-locale=" + dstLocale,
"-source-path",
srcDir.toString(),
"-include-resource-bundles=" + bundleNameString,
"-output",
outputSWC.toString()
};
outputDir.mkdirs();
Compc.compc(args);
}
}