/* * * 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.compiler.common; import flex2.compiler.config.ConfigurationException; import flex2.compiler.config.ConfigurationValue; import flex2.compiler.config.ConfigurationInfo; import flex2.compiler.io.VirtualFile; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Iterator; /** * This class handles namespace specific configuration options. * * @author Clement Wong */ public class NamespacesConfiguration { private ConfigurationPathResolver configResolver; public void setConfigPathResolver( ConfigurationPathResolver resolver ) { this.configResolver = resolver; } private Map<String, List<VirtualFile>> manifestMappings; public Map<String, List<VirtualFile>> getManifestMappings() { return manifestMappings; } public void setManifestMappings(Map<String, List<VirtualFile>> manifestMappings) { this.manifestMappings = manifestMappings; } // // 'compiler.namespaces.namespace' option // public VirtualFile[] getNamespace() { if (manifestMappings != null) { List<VirtualFile> fileList = new ArrayList<VirtualFile>(); Iterator<List<VirtualFile>> iterator = manifestMappings.values().iterator(); while (iterator.hasNext()) { List<VirtualFile> files = iterator.next(); if (files != null) { Iterator<VirtualFile> f = files.iterator(); while ( f.hasNext()) { fileList.add(f.next()); } } } VirtualFile[] fileArray = new VirtualFile[fileList.size()]; return fileList.toArray(fileArray); } else { return null; } } /** * Configures a list of many manifests mapped to a single namespace URI. * * <namespace> * <uri>library:adobe/flex/something</uri> * <manifest>something-manifest.xml</manifest> * <manifest>something-else-manifest.xml</manifest> * ... * </namespace> * * @param cfgval The configuration value context. * @param args A List of values for the namespace element, with the first * item expected to be the uri and the remaining are manifest paths. * @throws ConfigurationException */ public void cfgNamespace(ConfigurationValue cfgval, List<String> args) throws ConfigurationException { if (args == null) { throw new ConfigurationException.CannotOpen(null, cfgval.getVar(), cfgval.getSource(), cfgval.getLine()); } if (args.size() < 2) { throw new ConfigurationException.NamespaceMissingManifest("namespace", cfgval.getSource(), cfgval.getLine()); } assert configResolver != null: "Path resolvers must be set before calling this method."; if (configResolver == null) { throw new ConfigurationException.CannotOpen(null, cfgval.getVar(), cfgval.getSource(), cfgval.getLine() ); } String uri = null; Iterator<String> iterator = args.iterator(); while (iterator.hasNext()) { if (uri == null) { uri = iterator.next(); } else { String manifest = iterator.next(); VirtualFile file = ConfigurationPathResolver.getVirtualFile(manifest, configResolver, cfgval); if (manifestMappings == null) manifestMappings = new LinkedHashMap<String, List<VirtualFile>>(); List<VirtualFile> files = manifestMappings.get(uri); if (files == null) files = new ArrayList<VirtualFile>(); files.add(file); manifestMappings.put(uri, files); } } } public static ConfigurationInfo getNamespaceInfo() { return new ConfigurationInfo(-1, new String[] {"uri", "manifest"}) { public boolean allowMultiple() { return true; } }; } }