Return-Path: X-Original-To: apmail-flex-commits-archive@www.apache.org Delivered-To: apmail-flex-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id AF32010712 for ; Sun, 6 Apr 2014 05:39:34 +0000 (UTC) Received: (qmail 73242 invoked by uid 500); 6 Apr 2014 05:39:34 -0000 Delivered-To: apmail-flex-commits-archive@flex.apache.org Received: (qmail 73025 invoked by uid 500); 6 Apr 2014 05:39:33 -0000 Mailing-List: contact commits-help@flex.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@flex.apache.org Delivered-To: mailing list commits@flex.apache.org Received: (qmail 72621 invoked by uid 99); 6 Apr 2014 05:39:26 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 06 Apr 2014 05:39:25 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id B096C94B6C0; Sun, 6 Apr 2014 05:39:24 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: aharui@apache.org To: commits@flex.apache.org Date: Sun, 06 Apr 2014 05:39:28 -0000 Message-Id: <45acfe1dc34349e5b954281f86a77f1e@git.apache.org> In-Reply-To: <1d2ac80fd95d48be816a176d2930d894@git.apache.org> References: <1d2ac80fd95d48be816a176d2930d894@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [06/26] fork a bunch of files from SDK's FB compiler integration. Several files are intact, but many have been gutted to reduce the number of files required. It appears that the Report isn't used for basic compilation, so removing all of the compilatio http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/dff3a518/flex-compiler-oem/src/flex2/tools/oem/internal/OEMConsole.java ---------------------------------------------------------------------- diff --git a/flex-compiler-oem/src/flex2/tools/oem/internal/OEMConsole.java b/flex-compiler-oem/src/flex2/tools/oem/internal/OEMConsole.java new file mode 100644 index 0000000..2e01d68 --- /dev/null +++ b/flex-compiler-oem/src/flex2/tools/oem/internal/OEMConsole.java @@ -0,0 +1,712 @@ +/* + * + * 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 flex2.compiler.util.ConsoleLogger; +import flex2.tools.oem.Logger; +import flex2.tools.oem.Message; + +/** + * An OEM API logger implementation that outputs using System.err and + * System.out. + * + * @version 2.0.1 + * @author Clement Wong + */ +public class OEMConsole extends ConsoleLogger implements Logger +{ + public OEMConsole() + { + super(); + } + + public void log(Message message, int errorCode, String source) + { + String level = message.getLevel(); + String path = message.getPath(); + int line = message.getLine(); + int col = message.getColumn(); + String text = message.toString(); + + if (Message.INFO.equals(level)) + { + if (path == null) + { + if (line == -1) + { + if (col == -1) + { + if (errorCode == -1) + { + if (source == null) + { + super.logInfo(text); + } + else + { + super.logInfo(text); + } + } + else + { + if (source == null) + { + super.logInfo(text); + } + else + { + super.logInfo(text); + } + } + } + else + { + if (errorCode == -1) + { + if (source == null) + { + super.logInfo(text); + } + else + { + super.logInfo(text); + } + } + else + { + if (source == null) + { + super.logInfo(text); + } + else + { + super.logInfo(text); + } + } + } + } + else + { + if (col == -1) + { + if (errorCode == -1) + { + if (source == null) + { + super.logInfo(text); + } + else + { + super.logInfo(text); + } + } + else + { + if (source == null) + { + super.logInfo(text); + } + else + { + super.logInfo(text); + } + } + } + else + { + if (errorCode == -1) + { + if (source == null) + { + super.logInfo(text); + } + else + { + super.logInfo(text); + } + } + else + { + if (source == null) + { + super.logInfo(text); + } + else + { + super.logInfo(text); + } + } + } + } + } + else + { + if (line == -1) + { + if (col == -1) + { + if (errorCode == -1) + { + if (source == null) + { + super.logInfo(path, text); + } + else + { + super.logInfo(path, text); + } + } + else + { + if (source == null) + { + super.logInfo(path, text); + } + else + { + super.logInfo(path, text); + } + } + } + else + { + if (errorCode == -1) + { + if (source == null) + { + super.logInfo(path, text); + } + else + { + super.logInfo(path, text); + } + } + else + { + if (source == null) + { + super.logInfo(path, text); + } + else + { + super.logInfo(path, text); + } + } + } + } + else + { + if (col == -1) + { + if (errorCode == -1) + { + if (source == null) + { + super.logInfo(path, line, text); + } + else + { + super.logInfo(path, line, text); + } + } + else + { + if (source == null) + { + super.logInfo(path, line, text); + } + else + { + super.logInfo(path, line, text); + } + } + } + else + { + if (errorCode == -1) + { + if (source == null) + { + super.logInfo(path, line, col, text); + } + else + { + super.logInfo(path, line, col, text); + } + } + else + { + if (source == null) + { + super.logInfo(path, line, col, text); + } + else + { + super.logInfo(path, line, col, text); + } + } + } + } + } + } + else if (Message.WARNING.equals(level)) + { + if (path == null) + { + if (line == -1) + { + if (col == -1) + { + if (errorCode == -1) + { + if (source == null) + { + super.logWarning(text); + } + else + { + super.logWarning(text); + } + } + else + { + if (source == null) + { + super.logWarning(text); + } + else + { + super.logWarning(text); + } + } + } + else + { + if (errorCode == -1) + { + if (source == null) + { + super.logWarning(text); + } + else + { + super.logWarning(text); + } + } + else + { + if (source == null) + { + super.logWarning(text); + } + else + { + super.logWarning(text); + } + } + } + } + else + { + if (col == -1) + { + if (errorCode == -1) + { + if (source == null) + { + super.logWarning(text); + } + else + { + super.logWarning(text); + } + } + else + { + if (source == null) + { + super.logWarning(text); + } + else + { + super.logWarning(text); + } + } + } + else + { + if (errorCode == -1) + { + if (source == null) + { + super.logWarning(text); + } + else + { + super.logWarning(text); + } + } + else + { + if (source == null) + { + super.logWarning(text); + } + else + { + super.logWarning(text); + } + } + } + } + } + else + { + if (line == -1) + { + if (col == -1) + { + if (errorCode == -1) + { + if (source == null) + { + super.logWarning(path, text); + } + else + { + super.logWarning(path, text); + } + } + else + { + if (source == null) + { + super.logWarning(path, text, errorCode); + } + else + { + super.logWarning(path, text, errorCode); + } + } + } + else + { + if (errorCode == -1) + { + if (source == null) + { + super.logWarning(path, text); + } + else + { + super.logWarning(path, text); + } + } + else + { + if (source == null) + { + super.logWarning(path, text, errorCode); + } + else + { + super.logWarning(path, text, errorCode); + } + } + } + } + else + { + if (col == -1) + { + if (errorCode == -1) + { + if (source == null) + { + super.logWarning(path, line, text); + } + else + { + super.logWarning(path, line, text); + } + } + else + { + if (source == null) + { + super.logWarning(path, line, text, errorCode); + } + else + { + super.logWarning(path, line, text, errorCode); + } + } + } + else + { + if (errorCode == -1) + { + if (source == null) + { + super.logWarning(path, line, col, text); + } + else + { + super.logWarning(path, line, col, text, source); + } + } + else + { + if (source == null) + { + super.logWarning(path, line, text, errorCode); + } + else + { + super.logWarning(path, line, col, text, source, errorCode); + } + } + } + } + } + } + else if (Message.ERROR.equals(level)) + { + if (path == null) + { + if (line == -1) + { + if (col == -1) + { + if (errorCode == -1) + { + if (source == null) + { + super.logError(text); + } + else + { + super.logError(text); + } + } + else + { + if (source == null) + { + super.logError(text); + } + else + { + super.logError(text); + } + } + } + else + { + if (errorCode == -1) + { + if (source == null) + { + super.logError(text); + } + else + { + super.logError(text); + } + } + else + { + if (source == null) + { + super.logError(text); + } + else + { + super.logError(text); + } + } + } + } + else + { + if (col == -1) + { + if (errorCode == -1) + { + if (source == null) + { + super.logError(text); + } + else + { + super.logError(text); + } + } + else + { + if (source == null) + { + super.logError(text); + } + else + { + super.logError(text); + } + } + } + else + { + if (errorCode == -1) + { + if (source == null) + { + super.logError(text); + } + else + { + super.logError(text); + } + } + else + { + if (source == null) + { + super.logError(text); + } + else + { + super.logError(text); + } + } + } + } + } + else + { + if (line == -1) + { + if (col == -1) + { + if (errorCode == -1) + { + if (source == null) + { + super.logError(path, text); + } + else + { + super.logError(path, text); + } + } + else + { + if (source == null) + { + super.logError(path, text, errorCode); + } + else + { + super.logError(path, text, errorCode); + } + } + } + else + { + if (errorCode == -1) + { + if (source == null) + { + super.logError(path, text); + } + else + { + super.logError(path, text); + } + } + else + { + if (source == null) + { + super.logError(path, text, errorCode); + } + else + { + super.logError(path, text, errorCode); + } + } + } + } + else + { + if (col == -1) + { + if (errorCode == -1) + { + if (source == null) + { + super.logError(path, line, text); + } + else + { + super.logError(path, line, text); + } + } + else + { + if (source == null) + { + super.logError(path, line, text, errorCode); + } + else + { + super.logError(path, line, text, errorCode); + } + } + } + else + { + if (errorCode == -1) + { + if (source == null) + { + super.logError(path, line, col, text); + } + else + { + super.logError(path, line, col, text, source); + } + } + else + { + if (source == null) + { + super.logError(path, line, text, errorCode); + } + else + { + super.logError(path, line, col, text, source, errorCode); + } + } + } + } + } + } + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/dff3a518/flex-compiler-oem/src/flex2/tools/oem/internal/OEMLogAdapter.java ---------------------------------------------------------------------- diff --git a/flex-compiler-oem/src/flex2/tools/oem/internal/OEMLogAdapter.java b/flex-compiler-oem/src/flex2/tools/oem/internal/OEMLogAdapter.java new file mode 100644 index 0000000..20730a0 --- /dev/null +++ b/flex-compiler-oem/src/flex2/tools/oem/internal/OEMLogAdapter.java @@ -0,0 +1,223 @@ +/* + * + * 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 flex2.compiler.ILocalizableMessage; +import flex2.compiler.util.AbstractLogger; +import flex2.compiler.util.ThreadLocalToolkit; +import flex2.tools.oem.*; + +/** + * Extends AbstractLogger to support logging to an OEM API logger. + * + * @version 2.0.1 + * @author Clement Wong + */ +public class OEMLogAdapter extends AbstractLogger +{ + public OEMLogAdapter(Logger l) + { + init(/*ThreadLocalToolkit.getLocalizationManager()*/); + setLogger(l); + } + + private Logger oemLogger; + private int errorCount; + private int warningCount; + + public void setLogger(Logger l) + { + oemLogger = l; + } + + public int errorCount() + { + return errorCount; + } + + public void includedFileAffected(String path) + { + this.logInfo(path, -1, -1, ""); + } + + public void includedFileUpdated(String path) + { + this.logInfo(path, -1, -1, ""); + } + + public void log(ILocalizableMessage m) + { + this.log(m, null); + } + + public void log(ILocalizableMessage m, String source) + { + if (ILocalizableMessage.WARNING.equals(m.getLevel())) + { + warningCount++; + } + else if (ILocalizableMessage.ERROR.equals(m.getLevel())) + { + errorCount++; + } + + if (oemLogger != null) + { + oemLogger.log(m, -1, null); + } + } + + public void logDebug(String debug) + { + } + + public void logDebug(String path, String debug) + { + } + + public void logDebug(String path, int line, String debug) + { + } + + public void logDebug(String path, int line, int col, String debug) + { + } + + public void logError(String error) + { + this.logError(null, -1, -1, error, null, -1); + } + + public void logError(String path, String error) + { + this.logError(null, -1, -1, error, null, -1); + } + + public void logError(String path, String error, int errorCode) + { + this.logError(path, -1, -1, error, null, errorCode); + } + + public void logError(String path, int line, String error) + { + this.logError(path, line, -1, error, null, -1); + } + + public void logError(String path, int line, String error, int errorCode) + { + this.logError(path, line, -1, error, null, errorCode); + } + + public void logError(String path, int line, int col, String error) + { + this.logError(path, line, col, error, null, -1); + } + + public void logError(String path, int line, int col, String error, String source) + { + this.logError(path, line, col, error, source, -1); + } + + public void logError(String path, int line, int col, String error, String source, int errorCode) + { + errorCount++; + if (oemLogger != null) + { + oemLogger.log(new GenericMessage(Message.ERROR, path, line, col, error), errorCode, source); + } + } + + public void logInfo(String info) + { + this.logInfo(null, -1, -1, info); + } + + public void logInfo(String path, String info) + { + this.logInfo(path, -1, -1, info); + } + + public void logInfo(String path, int line, String info) + { + this.logInfo(path, line, -1, info); + } + + public void logInfo(String path, int line, int col, String info) + { + if (oemLogger != null) + { + oemLogger.log(new GenericMessage(Message.INFO, path, line, col, info), -1, null); + } + } + + public void logWarning(String warning) + { + this.logWarning(null, -1, -1, warning, null, -1); + } + + public void logWarning(String path, String warning) + { + this.logWarning(path, -1, -1, warning, null, -1); + } + + public void logWarning(String path, String warning, int errorCode) + { + this.logWarning(path, -1, -1, warning, null, errorCode); + } + + public void logWarning(String path, int line, String warning) + { + this.logWarning(path, line, -1, warning, null, -1); + } + + public void logWarning(String path, int line, String warning, int errorCode) + { + this.logWarning(path, line, -1, warning, null, errorCode); + } + + public void logWarning(String path, int line, int col, String warning) + { + this.logWarning(path, line, col, warning, null, -1); + } + + public void logWarning(String path, int line, int col, String warning, String source) + { + this.logWarning(path, line, col, warning, source, -1); + } + + public void logWarning(String path, int line, int col, String warning, String source, int errorCode) + { + warningCount++; + if (oemLogger != null) + { + oemLogger.log(new GenericMessage(Message.WARNING, path, line, col, warning), errorCode, source); + } + } + + public void needsCompilation(String path, String reason) + { + this.logInfo(path, -1, -1, reason); + } + + public int warningCount() + { + return warningCount; + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/dff3a518/flex-compiler-oem/src/flex2/tools/oem/internal/OEMReport.java ---------------------------------------------------------------------- diff --git a/flex-compiler-oem/src/flex2/tools/oem/internal/OEMReport.java b/flex-compiler-oem/src/flex2/tools/oem/internal/OEMReport.java new file mode 100644 index 0000000..e718736 --- /dev/null +++ b/flex-compiler-oem/src/flex2/tools/oem/internal/OEMReport.java @@ -0,0 +1,766 @@ +/* + * + * 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.File; +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +import flex2.compiler.Source; +import flex2.compiler.SourceList; +import flex2.compiler.common.Configuration; +import flex2.compiler.common.Configuration.RslPathInfo; +import flex2.compiler.io.FileUtil; +import flex2.compiler.io.VirtualFile; +import flex2.linker.SimpleMovie; +import flex2.tools.VersionInfo; +import flex2.tools.oem.Message; +import flex2.tools.oem.Report; + +/** + * A Report implementation. + * + * @version 2.0.1 + * @author Clement Wong + */ +public class OEMReport implements Report +{ + public OEMReport(List sources, SimpleMovie movie, Configuration configuration, + SourceList sourceList, String configurationReport, List messages) + { + this(sources, movie, configuration, sourceList, configurationReport, messages, null); + } + + public OEMReport(List sources, SimpleMovie movie, Configuration configuration, + SourceList sourceList, String configurationReport, List messages, + Map archiveFiles) + { + if (sourceList != null) + { + sourceListPaths = sourceList.getPaths(); + } + + init(sources, /* null,*/ + configuration == null ? null : configuration.getResourceBundles(), + archiveFiles, configuration); + + //processFrames(movie); + processMessages(messages); + + this.frameCount = 1 ; + this.configurationReport = configurationReport; + + defaultWidth = configuration != null ? configuration.defaultWidth() : 0; + defaultHeight = configuration != null ? configuration.defaultHeight() : 0; + + width = 0; + height = 0; + widthPercent = 0.0; + heightPercent = 0.0; + + if (movie != null) + { + linkReport = movie.getLinkReport(); + sizeReport = movie.getSizeReport(); + bgColor = movie.bgcolor.color; + pageTitle = movie.pageTitle; + + if (movie.userSpecifiedWidth) + { + width = movie.width; + } + else if (configuration != null) + { + String percent = configuration.widthPercent(); + if (percent != null) + { + percent = percent.trim(); + // Percent character is expected but allow it to be optional. + if (percent.length() >= 1 && + percent.charAt(percent.length() - 1) == '%') + { + percent = percent.substring(0, percent.length() - 1); + } + try + { + widthPercent = Double.parseDouble(percent) / 100; + } + catch(NumberFormatException ex) {} + } + } + + if (movie.userSpecifiedHeight) + { + height = movie.height; + } + else if (configuration != null) + { + String percent = configuration.heightPercent(); + if (percent != null) + { + percent = percent.trim(); + // Percent character is expected but allow it to be optional. + if (percent.length() >= 1 && + percent.charAt(percent.length() - 1) == '%') + { + percent = percent.substring(0, percent.length() - 1); + } + try + { + heightPercent = Double.parseDouble(percent) / 100; + } + catch(NumberFormatException ex) {} + } + } + } + else + { + linkReport = null; + sizeReport = null; + bgColor = 0; + pageTitle = null; + } + } + + private void init(List sources, /* List exportedUnits,*/ Set resourceBundles, + Map archiveFiles, + Configuration configuration) + { + TreeSet sourceNames = new TreeSet(); + TreeSet assetNames = new TreeSet(); + TreeSet libraryNames = new TreeSet(); + + data = new HashMap(); + locations = new HashMap(); + + if (sources != null) + { + //processSources(sources, sourceNames, assetNames, libraryNames, data, locations); + } + + timestamps = new HashMap(); + + // Store timestamps for each path in the SourceList, so + // contentUpdated() can report true if new sources are added + // to the SourceList. + if (sourceListPaths != null) + { + for (File path : sourceListPaths) + { + storeTimestamps(path); + } + } + + compiler_SourceNames = toArray(sourceNames); + storeTimestamps(compiler_SourceNames); + + compiler_AssetNames = toArray(assetNames); + storeTimestamps(compiler_AssetNames); + + compiler_LibraryNames = toArray(libraryNames); + storeTimestamps(compiler_LibraryNames); + + resourceBundleNames = toArray(resourceBundles); + + sourceNames.clear(); + assetNames.clear(); + libraryNames.clear(); + + //processCompilationUnits(exportedUnits, sourceNames, assetNames, libraryNames); + + // Add files to the assets set so they are included in the timestamps. + // FB calls the OEMReports.contentUpdated() method to determine if a + // file has changed and if so it will recompile. This code was added + // for the specific case where a default.css file was modified but FB + // didn't think it needed to recompile because default.css wasn't in + // the timestamps map. + if (archiveFiles != null) + { + for (String fileName: archiveFiles.keySet()) + { + assetNames.add(fileName); + } + } + + linker_SourceNames = toArray(sourceNames); + storeTimestamps(linker_SourceNames); + + linker_AssetNames = toArray(assetNames); + storeTimestamps(linker_AssetNames); + + linker_LibraryNames = toArray(libraryNames); + storeTimestamps(linker_LibraryNames); + + // Add libraries linked as RSLs to the timestamp map. + // Saving the digests of the libraries would be better than a + // timestamp since we would know if the digest changed, not + // just something in the library. We can't compare digests because + // contentUpdated() does not have access to the swcs we will + // compile with. Timestamps may cause us to recompile an app when + // the RSL has not been modified but that should be pretty rare. + if (configuration != null) + { + List rslPathInfoList = configuration.getRslPathInfo(); + if (rslPathInfoList.size() > 0) + { + String[] rslPaths = new String[rslPathInfoList.size()]; + int i = 0; + for (RslPathInfo rslPathInfo : rslPathInfoList) + { + rslPaths[i++] = rslPathInfo.getSwcVirtualFile().getName(); + } + + storeTimestamps(rslPaths); + } + } + } + + private void storeTimestamps(File path) + { + // (SDK-30367) Timestamp caching was added after Flex 3 but it causes + // performance issues as it also checks files under hidden directories, + // e.g. .svn. Skipping checking the timestamp of hidden files and + // folders helps reduce the time spent in this method. + if (path.isHidden()) + return; + + timestamps.put(FileUtil.getCanonicalPath(path), path.lastModified()); + + for (File file : path.listFiles()) + { + if (file.isDirectory()) + { + storeTimestamps(file); + } + } + } + + private void storeTimestamps(String[] a) + { + if (a != null) + { + for (String fileName : a) + { + if ((fileName != null) && !timestamps.containsKey(fileName)) + { + timestamps.put(fileName, new File(fileName).lastModified()); + } + } + } + } + + private String[] compiler_SourceNames, compiler_AssetNames, compiler_LibraryNames; + private String[] linker_SourceNames, linker_AssetNames, linker_LibraryNames; + private String[] resourceBundleNames; + private Map data; + private Map locations; + private Map timestamps; + + private int frameCount; + private int bgColor, defaultWidth, defaultHeight, width, height; + private String pageTitle; + private double widthPercent, heightPercent; + + private String linkReport, sizeReport, configurationReport; + private Message[] messages; + + private String[][] assetNames, definitionNames; + private List sourceListPaths; + + public boolean contentUpdated() + { + for (Iterator i = timestamps.keySet().iterator(); i.hasNext(); ) + { + String path = i.next(); + Long ts = timestamps.get(path); + File f = new File(path); + + if (!f.exists() || f.lastModified() != ts.longValue()) + { + return true; + } + } + return false; + } + + public String[] getSourceNames(Object report) + { + return (COMPILER.equals(report)) ? compiler_SourceNames : (LINKER.equals(report)) ? linker_SourceNames : null; + } + + public String[] getAssetNames(int frame) + { + return new String[0]; + //return assetNames[frame - 1]; + } + + public String[] getAssetNames(Object report) + { + return (COMPILER.equals(report)) ? compiler_AssetNames : (LINKER.equals(report)) ? linker_AssetNames : null; + } + + public String[] getLibraryNames(Object report) + { + return (COMPILER.equals(report)) ? compiler_LibraryNames : (LINKER.equals(report)) ? linker_LibraryNames : null; + } + + public String[] getResourceBundleNames() + { + return resourceBundleNames; + } + + public String[] getDefinitionNames(int frame) + { + return new String[0]; + //return definitionNames[frame - 1]; + } + + public String[] getDefinitionNames(String sourceName) + { + Data d = data.get(sourceName); + return d == null ? null : d.definitions; + } + + public String getLocation(String definition) + { + return locations.get(definition); + } + + public String[] getDependencies(String definition) + { + String location = getLocation(definition); + + if (location != null) + { + Data d = data.get(location); + return d == null ? null : d.dependencies; + } + else + { + return null; + } + } + + public String[] getPrerequisites(String definition) + { + String location = getLocation(definition); + + if (location != null) + { + Data d = data.get(location); + return d == null ? null : d.prerequisites; + } + else + { + return null; + } + } + + public long writeLinkReport(Writer out) throws IOException + { + long size = 0; + + if (linkReport != null) + { + out.write(linkReport); + out.flush(); + size = linkReport.length(); + } + + return size; + } + + public long writeSizeReport(Writer out) throws IOException + { + long size = 0; + + if (sizeReport != null) + { + out.write(sizeReport); + out.flush(); + size = sizeReport.length(); + } + + return size; + } + + public long writeConfigurationReport(Writer out) throws IOException + { + long size = 0; + + if (configurationReport != null) + { + out.write(configurationReport); + out.flush(); + size = configurationReport.length(); + } + + return size; + } + + public int getBackgroundColor() + { + return bgColor; + } + + public String getPageTitle() + { + return pageTitle; + } + + public int getDefaultWidth() + { + return defaultWidth; + } + + public int getDefaultHeight() + { + return defaultHeight; + } + + public int getWidth() + { + return width; + } + + public int getHeight() + { + return height; + } + + public double getWidthPercent() + { + return widthPercent; + } + + public double getHeightPercent() + { + return heightPercent; + } + + public String getCompilerVersion() + { + return VersionInfo.buildMessage(); + } + + public Message[] getMessages() + { + return messages; + } + + public int getFrameCount() + { + return frameCount; + } + + /* + private void processCompilationUnits(List units, TreeSet sourceNames, + TreeSet assetNames, TreeSet libraryNames) + { + for (int i = 0, length = units == null ? 0 : units.size(); i < length; i++) + { + CompilationUnit u = units.get(i); + Source s = (u == null) ? null : u.getSource(); + + if (s == null) + { + continue; + } + + if (s.isFileSpecOwner() || s.isSourceListOwner() || s.isSourcePathOwner() || s.isResourceBundlePathOwner()) + { + sourceNames.add(s.getName()); + + for (Iterator j = s.getFileIncludes(); j.hasNext(); ) + { + VirtualFile f = (VirtualFile) j.next(); + sourceNames.add(f.getName()); + } + + if (u.hasAssets()) + { + for (Iterator j = u.getAssets().iterator(); j.hasNext(); ) + { + Map.Entry e = (Map.Entry) j.next(); + AssetInfo assetInfo = (AssetInfo) e.getValue(); + VirtualFile path = assetInfo.getPath(); + if (path != null) + { + assetNames.add(path.getName()); + } + } + } + } + else if (s.isSwcScriptOwner()) + { + String location = ((SwcScript) s.getOwner()).getLibrary().getSwcLocation(); + libraryNames.add(location); + } + } + } + + private void processSources(List sources, TreeSet sourceNames, TreeSet assetNames, + TreeSet libraryNames, Map data, Map locations) + { + for (Source s : sources) + { + CompilationUnit u = (s == null) ? null : s.getCompilationUnit(); + + if (s == null) + { + continue; + } + + if (s.isFileSpecOwner() || s.isSourceListOwner() || s.isSourcePathOwner() || s.isResourceBundlePathOwner()) + { + sourceNames.add(s.getName()); + + for (Iterator j = s.getFileIncludes(); j.hasNext(); ) + { + VirtualFile f = (VirtualFile) j.next(); + sourceNames.add(f.getName()); + } + + if (u.hasAssets()) + { + for (Iterator j = u.getAssets().iterator(); j.hasNext(); ) + { + Map.Entry e = (Map.Entry) j.next(); + AssetInfo assetInfo = (AssetInfo) e.getValue(); + VirtualFile path = assetInfo.getPath(); + if (path != null) + { + assetNames.add(assetInfo.getPath().getName()); + } + } + } + + if (locations != null) + { + for (int j = 0, size = u.topLevelDefinitions.size(); j < size; j++) + { + locations.put(u.topLevelDefinitions.get(j).toString(), s.getName()); + } + } + } + else if (s.isSwcScriptOwner()) + { + String location = ((SwcScript) s.getOwner()).getLibrary().getSwcLocation(); + libraryNames.add(location); + + if (locations != null) + { + for (int j = 0, size = u.topLevelDefinitions.size(); j < size; j++) + { + locations.put(u.topLevelDefinitions.get(j).toString(), location); + } + } + } + } + + for (Source s : sources) + { + CompilationUnit u = (s == null) ? null : s.getCompilationUnit(); + + if (s == null) + { + continue; + } + + if (s.isFileSpecOwner() || s.isSourceListOwner() || s.isSourcePathOwner() || s.isResourceBundlePathOwner()) + { + Data d = new Data(); + d.definitions = toArray(u.topLevelDefinitions); + d.prerequisites = toArray(u.inheritance, null, locations); + Set nameSet = new HashSet(); + nameSet.addAll(u.namespaces); + nameSet.addAll(u.types); + nameSet.addAll(u.expressions); + d.dependencies = toArray(nameSet, new Set[] { u.extraClasses, u.resourceBundleHistory }, locations); + + data.put(s.getName(), d); + } + } + } + + private void processFrames(SimpleMovie movie) + { + int count = movie == null ? 0 : movie.frames.size(); + assetNames = new String[count][]; + definitionNames = new String[count][]; + + for (int i = 0; i < count; i++) + { + Frame f = movie.frames.get(i); + List units = movie.getExportedUnitsByFrame(f); + List aList = new ArrayList(), dList = new ArrayList(); + for (int j = 0, size = units == null ? 0 : units.size(); j < size; j++) + { + CompilationUnit u = units.get(j); + Source s = u.getSource(); + + if (u.hasAssets()) + { + for (Iterator k = u.getAssets().iterator(); k.hasNext(); ) + { + Map.Entry e = (Map.Entry) k.next(); + AssetInfo assetInfo = (AssetInfo) e.getValue(); + VirtualFile path = assetInfo.getPath(); + if (path != null) + { + String assetName = path.getName(); + if (!aList.contains(assetName)) + { + aList.add(assetName); + } + } + } + } + + if (s.isFileSpecOwner() || s.isResourceBundlePathOwner() || s.isSourceListOwner() || + s.isSourcePathOwner() || s.isSwcScriptOwner()) + { + for (Iterator k = u.topLevelDefinitions.iterator(); k.hasNext(); ) + { + String definitionName = k.next().toString(); + dList.add(definitionName); + } + } + } + + if (aList.size() > 0) + { + assetNames[i] = new String[aList.size()]; + aList.toArray(assetNames[i]); + } + + if (dList.size() > 0) + { + definitionNames[i] = new String[dList.size()]; + dList.toArray(definitionNames[i]); + } + } + } + */ + private void processMessages(List messages) + { + if (messages != null && messages.size() > 0) + { + List filtered = new ArrayList(); + + for (int i = 0, length = messages.size(); i < length; i++) + { + Message m = messages.get(i); + if (m != null && !Message.INFO.equals(m.getLevel())) + { + filtered.add(m); + } + } + + messages = filtered; + } + + if (messages != null && messages.size() > 0) + { + this.messages = new Message[messages.size()]; + for (int i = 0, length = this.messages.length; i < length; i++) + { + this.messages[i] = new GenericMessage(messages.get(i)); + } + } + else + { + this.messages = null; + } + } + + private String[] toArray(Set set) + { + String[] a = new String[set == null ? 0 : set.size()]; + int j = 0; + + if (set != null) + { + for (String source : set) + { + a[j++] = source; + } + } + + return a.length == 0 ? null : a; + } + + /* + private String[] toArray(QNameList definitions) + { + String[] a = new String[definitions == null ? 0 : definitions.size()]; + + for (int i = 0; i < a.length; i++) + { + a[i] = definitions.get(i).toString(); + } + + return a.length == 0 ? null : a; + } + + private String[] toArray(Set nameSet, Set[] sets, Map locations) + { + TreeSet set = new TreeSet(); + + for (Name name : nameSet) + { + String qName = null; + if (name instanceof QName && (locations == null || locations.containsKey(qName = name.toString()))) + { + set.add(qName); + } + } + + for (int i = 0, length = sets == null ? 0 : sets.length; i < length; i++) + { + if (sets[i] != null) + { + for (Object obj : sets[i]) + { + if ((obj instanceof String) && (locations == null || locations.containsKey(obj))) + { + set.add((String)obj); + } + } + } + } + + return toArray(set); + } + */ + static class Data + { + String[] definitions; + String[] prerequisites; + String[] dependencies; + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/dff3a518/flex-compiler-oem/src/flex2/tools/oem/internal/OEMUtil.java ---------------------------------------------------------------------- diff --git a/flex-compiler-oem/src/flex2/tools/oem/internal/OEMUtil.java b/flex-compiler-oem/src/flex2/tools/oem/internal/OEMUtil.java new file mode 100644 index 0000000..08ccd6c --- /dev/null +++ b/flex-compiler-oem/src/flex2/tools/oem/internal/OEMUtil.java @@ -0,0 +1,459 @@ +/* + * + * 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.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import flex2.compiler.CompilerAPI; +import flex2.compiler.Source; +import flex2.compiler.common.CompilerConfiguration; +import flex2.compiler.common.DefaultsConfigurator; +import flex2.compiler.config.CommandLineConfigurator; +import flex2.compiler.config.ConfigurationBuffer; +import flex2.compiler.config.ConfigurationException; +import flex2.compiler.config.FileConfigurator; +import flex2.compiler.config.SystemPropertyConfigurator; +import flex2.compiler.io.FileUtil; +import flex2.compiler.io.VirtualFile; +import flex2.compiler.util.CompilerControl; +import flex2.compiler.util.MimeMappings; +import flex2.compiler.util.QName; +import flex2.compiler.util.ThreadLocalToolkit; +import flex2.tools.CommandLineConfiguration; +import flex2.tools.CompcConfiguration; +import flex2.tools.ToolsConfiguration; +import flex2.tools.oem.*; + +import org.apache.flex.compiler.clients.COMPC; +import org.apache.flex.compiler.clients.MXMLC; + +/** + * A collection of utility methods used by classes in flex2.tools.oem. + * + * @version 2.0.1 + * @author Clement Wong + */ +public class OEMUtil +{ + /** + * + public static final LocalizationManager setupLocalizationManager() + { + LocalizationManager l10n = ThreadLocalToolkit.getLocalizationManager(); + + if (l10n == null) + { + // set up for localizing messages + l10n = new LocalizationManager(); + l10n.addLocalizer(new ResourceBundleLocalizer()); + ThreadLocalToolkit.setLocalizationManager(l10n); + } + + return l10n; + } + */ + + /** + * + * @param logger + * @param mimeMappings + */ + public static final void init(Logger logger, + MimeMappings mimeMappings, + ProgressMeter meter, + PathResolver resolver, + CompilerControl cc) + { + //CompilerAPI.useAS3(); + //CompilerAPI.usePathResolver(resolver != null ? new OEMPathResolver(resolver) : null); + //setupLocalizationManager(); + ThreadLocalToolkit.setLogger(new OEMLogAdapter(logger)); + ThreadLocalToolkit.setMimeMappings(mimeMappings); + ThreadLocalToolkit.setProgressMeter(meter); + ThreadLocalToolkit.setCompilerControl(cc); + } + + /** + * + * + */ + public static final void clean() + { + //CompilerAPI.removePathResolver(); + ThreadLocalToolkit.setLogger(null); + //ThreadLocalToolkit.setLocalizationManager(null); + ThreadLocalToolkit.setMimeMappings(null); + ThreadLocalToolkit.setProgressMeter(null); + ThreadLocalToolkit.setCompilerControl(null); + ThreadLocalToolkit.setCompatibilityVersion(null); + } + + + /** + * + * @param args + * @param logger + * @param mimeMappings + * @return + */ + public static final OEMConfiguration getApplicationConfiguration(String[] args, boolean keepLinkReport, + boolean keepSizeReport, Logger logger, PathResolver resolver, + MimeMappings mimeMappings) + { + return getApplicationConfiguration(args, keepLinkReport, keepSizeReport, logger, resolver, mimeMappings, true); + } + + /** + * + * @param args + * @param logger + * @param mimeMappings + * @param processDefaults + * @return + */ + public static final OEMConfiguration getApplicationConfiguration(String[] args, boolean keepLinkReport, boolean keepSizeReport, + Logger logger, PathResolver resolver, MimeMappings mimeMappings, + boolean processDefaults) + { + if (!processDefaults) + { + return new OEMConfiguration(null, null); + } + + // expect args to have --file-specs because we need it to find app-specific-config.xml. + OEMUtil.init(logger, mimeMappings, null, resolver, null); + + try + { + ConfigurationBuffer cfgbuf = new ConfigurationBuffer(ApplicationCompilerConfiguration.class, + ApplicationCompilerConfiguration.getAliases()); + cfgbuf.setDefaultVar("--file-specs" /*Mxmlc.FILE_SPECS*/); + DefaultsConfigurator.loadDefaults(cfgbuf); + MXMLC mxmlc = new MXMLC(); + mxmlc.configure(args); + ApplicationCompilerConfiguration configuration = processMXMLCConfiguration(mxmlc.config); + + configuration.keepLinkReport(keepLinkReport); + configuration.keepSizeReport(keepSizeReport); + + return new OEMConfiguration(cfgbuf, configuration); + } + catch (ConfigurationException ex) + { + //Mxmlc.processConfigurationException(ex, "oem"); + return null; + } + /* + catch (IOException ex) + { + ThreadLocalToolkit.logError(ex.getMessage()); + return null; + } + */ + catch (RuntimeException ex) + { + Class c; + try + { + c = Class.forName("flex.messaging.config.ConfigurationException"); + if (c.isInstance(ex)) + { + ThreadLocalToolkit.logError(ex.getMessage()); + } + } + catch (ClassNotFoundException ex2) + { + + } + return null; + } + } + + private static ApplicationCompilerConfiguration processMXMLCConfiguration(org.apache.flex.compiler.config.Configuration config) + { + ApplicationCompilerConfiguration acc = new ApplicationCompilerConfiguration(); + acc.setBackgroundColor(config.getDefaultBackgroundColor()); + acc.setDebug(config.debug()); + acc.setFrameRate(config.getDefaultFrameRate()); + acc.setHeight(Integer.toString(config.getDefaultHeight())); + acc.setWidth(Integer.toString(config.getDefaultWidth())); + acc.setSwfVersion(config.getSwfVersion()); + acc.setScriptRecursionLimit(config.getScriptRecursionLimit()); + acc.setScriptTimeLimit(config.getScriptTimeLimit()); + CompilerConfiguration cc = acc.getCompilerConfiguration(); + cc.setAccessible(config.getCompilerAccessible()); + + return acc; + } + + private static LibraryCompilerConfiguration processCOMPCCConfiguration(org.apache.flex.compiler.config.Configuration config) + { + LibraryCompilerConfiguration acc = new LibraryCompilerConfiguration(); + acc.setBackgroundColor(config.getDefaultBackgroundColor()); + acc.setDebug(config.debug()); + acc.setFrameRate(config.getDefaultFrameRate()); + acc.setHeight(Integer.toString(config.getDefaultHeight())); + acc.setWidth(Integer.toString(config.getDefaultWidth())); + acc.setSwfVersion(config.getSwfVersion()); + acc.setScriptRecursionLimit(config.getScriptRecursionLimit()); + acc.setScriptTimeLimit(config.getScriptTimeLimit()); + + return acc; + } + + /** + * + * @param args + * @param logger + * @param mimeMappings + * @return + */ + public static final OEMConfiguration getLibraryConfiguration(String[] args, boolean keepLinkReport, + boolean keepSizeReport, Logger logger, PathResolver resolver, + MimeMappings mimeMappings) + { + return getLibraryConfiguration(args, keepLinkReport, keepSizeReport, logger, resolver, mimeMappings, true); + } + + /** + * + * @param args + * @param logger + * @param mimeMappings + * @param processDefaults + * @return + */ + public static final OEMConfiguration getLibraryConfiguration(String[] args, boolean keepLinkReport, + boolean keepSizeReport, Logger logger, + PathResolver resolver, MimeMappings mimeMappings, + boolean processDefaults) + { + if (!processDefaults) + { + return new OEMConfiguration(null, null); + } + + // expect no SWC inputs in args. + OEMUtil.init(logger, mimeMappings, null, resolver, null); + + try + { + ConfigurationBuffer cfgbuf = new ConfigurationBuffer(LibraryCompilerConfiguration.class, + LibraryCompilerConfiguration.getAliases()); + DefaultsConfigurator.loadOEMCompcDefaults( cfgbuf ); + COMPC compc = new COMPC(); + compc.configure(args); + LibraryCompilerConfiguration configuration = processCOMPCCConfiguration(compc.config); + configuration.keepLinkReport(keepLinkReport); + configuration.keepSizeReport(keepSizeReport); + + return new OEMConfiguration(cfgbuf, configuration); + } + catch (ConfigurationException ex) + { + //Mxmlc.processConfigurationException(ex, "oem"); + return null; + } + /* + catch (IOException ex) + { + ThreadLocalToolkit.logError(ex.getMessage()); + return null; + } + */ + catch (RuntimeException ex) + { + Class c; + try + { + c = Class.forName("flex.messaging.config.ConfigurationException"); + if (c.isInstance(ex)) + { + ThreadLocalToolkit.logError(ex.getMessage()); + } + } + catch (ClassNotFoundException ex2) + { + + } + return null; + } + } + + /** + * + * @param args + * @param logger + * @param mimeMappings + * @return + */ + public static final OEMConfiguration getLinkerConfiguration(String[] args, boolean keepLinkReport, boolean keepSizeReport, + Logger logger, MimeMappings mimeMappings, + PathResolver resolver, + flex2.compiler.common.Configuration c, + Set newLinkerOptions, Set includes, Set excludes) + { + OEMUtil.init(logger, mimeMappings, null, resolver, null); + + try + { + ConfigurationBuffer cfgbuf = new ConfigurationBuffer(ApplicationCompilerConfiguration.class, + ApplicationCompilerConfiguration.getAliases()); + cfgbuf.setDefaultVar("--file-specs" /*Mxmlc.FILE_SPECS*/); + DefaultsConfigurator.loadDefaults(cfgbuf); + MXMLC mxmlc = new MXMLC(); + mxmlc.configure(args); + ApplicationCompilerConfiguration configuration = processMXMLCConfiguration(mxmlc.config); + + configuration.keepLinkReport(keepLinkReport); + configuration.keepSizeReport(keepSizeReport); + + return new OEMConfiguration(cfgbuf, configuration); + } + catch (ConfigurationException ex) + { + //Mxmlc.processConfigurationException(ex, "oem"); + return null; + } + /* + catch (IOException ex) + { + ThreadLocalToolkit.logError(ex.getMessage()); + return null; + } + */ + catch (RuntimeException ex) + { + Class cls; + try + { + cls = Class.forName("flex.messaging.config.ConfigurationException"); + if (cls.isInstance(ex)) + { + ThreadLocalToolkit.logError(ex.getMessage()); + } + } + catch (ClassNotFoundException ex2) + { + + } + return null; + } + } + + public static final ConfigurationBuffer getCommandLineConfigurationBuffer(Logger logger, PathResolver resolver, String[] args) + { + ConfigurationBuffer cfgbuf = null; + + try + { + OEMUtil.init(logger, null, null, resolver, null); + + cfgbuf = new ConfigurationBuffer(CommandLineConfiguration.class, CommandLineConfiguration.getAliases()); + SystemPropertyConfigurator.load( cfgbuf, "flex" ); + CommandLineConfigurator.parse( cfgbuf, null, args); + } + catch (ConfigurationException ex) + { + ThreadLocalToolkit.log(ex); + cfgbuf = null; + } + + return cfgbuf; + } + + public static final ConfigurationBuffer getCompcConfigurationBuffer(Logger logger, PathResolver resolver, String[] args) + { + ConfigurationBuffer cfgbuf = null; + + try + { + OEMUtil.init(logger, null, null, resolver, null); + + cfgbuf = new ConfigurationBuffer(CompcConfiguration.class, CompcConfiguration.getAliases()); + SystemPropertyConfigurator.load( cfgbuf, "flex" ); + CommandLineConfigurator.parse( cfgbuf, null, args); + } + catch (ConfigurationException ex) + { + ThreadLocalToolkit.log(ex); + cfgbuf = null; + } + + return cfgbuf; + } + + public static String[] trim(String[] args, ConfigurationBuffer cfgbuf, Set excludes) + { + List positions = cfgbuf.getPositions(); + List newArgs = new ArrayList(); + for (int i = 0, length = positions.size(); i < length; i++) + { + Object[] a = positions.get(i); + String var = (String) a[0]; + int iStart = ((Integer) a[1]).intValue(), iEnd = ((Integer) a[2]).intValue(); + if (!excludes.contains(var)) + { + for (int j = iStart; j < iEnd; j++) + { + newArgs.add(args[j]); + } + } + } + args = new String[newArgs.size()]; + newArgs.toArray(args); + return args; + } + + public static final Logger getLogger(Logger logger, List messages) + { + return new BuilderLogger(logger == null ? new OEMConsole() : logger, messages); + } + + public static final String formatConfigurationBuffer(ConfigurationBuffer cfgbuf) + { + return FileConfigurator.formatBuffer(cfgbuf, "flex-config", + /*OEMUtil.setupLocalizationManager(),*/ "flex2.configuration"); + } + + /** + * + * @param configuration + * @return + */ + public static final Map getLicenseMap(ToolsConfiguration configuration) + { + return configuration.getLicensesConfiguration().getLicenseMap(); + } + +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/dff3a518/flex-compiler-oem/src/macromedia/asc/embedding/ConfigVar.java ---------------------------------------------------------------------- diff --git a/flex-compiler-oem/src/macromedia/asc/embedding/ConfigVar.java b/flex-compiler-oem/src/macromedia/asc/embedding/ConfigVar.java new file mode 100644 index 0000000..6aa1c0d --- /dev/null +++ b/flex-compiler-oem/src/macromedia/asc/embedding/ConfigVar.java @@ -0,0 +1,43 @@ +/* + * + * 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 macromedia.asc.embedding; + +public class ConfigVar +{ + // jono: made these final as a sanity check that they don't get mutated. + // feel free to undo this. + final public String ns; + final public String name; + final public String value; + + public ConfigVar(String ns, String name, String value) + { + this.ns = ns; + this.name = name; + this.value = value; + } + + + @Override + public String toString() + { + return String.format("%s::%s=%s", ns, name, value); + } +}