blob: 53c224ba75ddc65b1f41f444666d8e0d1ea64f5c [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 org.apache.flex.compiler.common;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
/**
* This is a mutable version of a {@link PrefixMap} that allows additions and
* removals of namespaces
*/
public class MutablePrefixMap extends PrefixMap
{
public MutablePrefixMap()
{
super();
}
public MutablePrefixMap(PrefixMap map)
{
PrefixMap clone = map.clone();
namespaceToPrefixMap = new HashMap<String, Set<String>>(clone.namespaceToPrefixMap);
prefixes = new HashSet<String>(clone.prefixes);
}
public MutablePrefixMap(String ns, String prefix)
{
add(ns, prefix);
}
/**
* Creates an immutable version of this prefix map
*
* @return an immutable prefix map
*/
public PrefixMap toImmutable()
{
PrefixMap map = new PrefixMap();
map.namespaceToPrefixMap = new HashMap<String, Set<String>>(namespaceToPrefixMap);
map.prefixes = new HashSet<String>(prefixes);
return map;
}
/**
* Add a prefix and its uri to the map.
*
* @param prefix A namespace prefix string, such as <code>"fx"</code>.
* @param uri The corresponding namespace URI, such as <code>http://ns.adobe.com/mxml/2009</code>.
*/
public void add(String prefix, String uri)
{
add(prefix, uri, false);
}
/**
* Adds a prefix and uri to this namespace map.
*
* @param prefix the prefix to add
* @param uri the namespace to add for the given prefix
* @param onlyIfUnique If the mapping is not unique, it will be added only
* if this flag is set to false. A mapping is considering unique if a prefix
* has not already been defined
*/
public void add(String prefix, String uri, boolean onlyIfUnique)
{
Set<String> list = namespaceToPrefixMap.get(uri);
if (list == null)
{
list = new LinkedHashSet<String>(1);
namespaceToPrefixMap.put(uri, list);
}
if (onlyIfUnique)
{
if (!list.contains(prefix))
{
list.add(prefix);
prefixes.add(prefix);
}
}
else
{
list.add(prefix);
prefixes.add(prefix);
}
}
/**
* Adds all information from one {@link PrefixMap} to another
*
* @param map the {@link PrefixMap} where our data is coming from
* @param onlyIfUnique If the mapping is not unique, it will be added only
* if this flag is set to false. A mapping is considering unique if a prefix
* has not already been defined
*/
public void addAll(PrefixMap map, boolean onlyIfUnique)
{
Iterator<String> it = map.namespaceToPrefixMap.keySet().iterator();
while (it.hasNext())
{
String ns = it.next();
Iterator<String> sItr = map.namespaceToPrefixMap.get(ns).iterator();
while (sItr.hasNext())
{
add(sItr.next(), ns, onlyIfUnique);
}
}
}
/**
* Adds all information from one {@link PrefixMap} to another
*
* @param map the {@link PrefixMap} where our data is coming from
*/
public void addAll(PrefixMap map)
{
Iterator<String> it = map.namespaceToPrefixMap.keySet().iterator();
while (it.hasNext())
{
String ns = it.next();
Iterator<String> sItr = map.namespaceToPrefixMap.get(ns).iterator();
while (sItr.hasNext())
{
add(sItr.next(), ns);
}
}
}
public void remove(String prefix)
{
Iterator<String> it = namespaceToPrefixMap.keySet().iterator();
while (it.hasNext())
{
String next = it.next();
Set<String> set = namespaceToPrefixMap.get(next);
if (set != null)
{
set.remove(prefix);
}
}
prefixes.remove(prefix);
}
}