blob: 3f4b6c7a3858110fc5cd7c022678eb99e49a2608 [file] [log] [blame]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed 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.xmlbeans.impl.schema;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class SchemaDependencies
{
// This class is NOT synchronized
void registerDependency(String source, String target)
{
Set depSet = (Set) _dependencies.get(target);
if (depSet == null)
{
depSet = new HashSet();
_dependencies.put(target, depSet);
}
depSet.add(source);
}
/**
* Records anti-dependencies. Keys are namespaces and values are
* the lists of namespaces that depend on each key
*/
private Map/*<String,Set<String>>*/ _dependencies;
Set computeTransitiveClosure(List modifiedNamespaces)
{
List nsList = new ArrayList(modifiedNamespaces);
Set result = new HashSet(modifiedNamespaces);
for (int i = 0; i < nsList.size(); i++)
{
Set deps = (Set) _dependencies.get(nsList.get(i));
if (deps == null)
continue;
for (Iterator it = deps.iterator(); it.hasNext(); )
{
String ns = (String) it.next();
if (!result.contains(ns))
{
nsList.add(ns);
result.add(ns);
}
}
}
return result;
}
SchemaDependencies()
{
_dependencies = new HashMap();
_contributions = new HashMap();
}
SchemaDependencies(SchemaDependencies base, Set updatedNs)
{
_dependencies = new HashMap();
_contributions = new HashMap();
for (Iterator it = base._dependencies.keySet().iterator(); it.hasNext(); )
{
String target = (String) it.next();
if (updatedNs.contains(target))
continue;
Set depSet = new HashSet();
_dependencies.put(target, depSet);
Set baseDepSet = (Set) base._dependencies.get(target);
for (Iterator it2 = baseDepSet.iterator(); it2.hasNext(); )
{
String source = (String) it2.next();
if (updatedNs.contains(source))
continue;
depSet.add(source);
}
}
for (Iterator it = base._contributions.keySet().iterator(); it.hasNext(); )
{
String ns = (String) it.next();
if (updatedNs.contains(ns))
continue;
List fileList = new ArrayList();
_contributions.put(ns, fileList);
List baseFileList = (List) base._contributions.get(ns);
for (Iterator it2 = baseFileList.iterator(); it2.hasNext(); )
fileList.add(it2.next());
}
}
/**
* Records the list of files associated to each namespace.
* This is needed so that we can return a list of files that
* need to be compiled once we get a set of altered namespaces
*/
private Map/*<String,List<String>>*/ _contributions;
void registerContribution(String ns, String fileURL)
{
List fileList = (List) _contributions.get(ns);
if (fileList == null)
{
fileList = new ArrayList();
_contributions.put(ns, fileList);
}
fileList.add(fileURL);
}
boolean isFileRepresented(String fileURL)
{
for (Iterator it = _contributions.values().iterator(); it.hasNext(); )
{
List fileList = (List) it.next();
if (fileList.contains(fileURL))
return true;
}
return false;
}
List getFilesTouched(Set updatedNs)
{
List result = new ArrayList();
for (Iterator it = updatedNs.iterator(); it.hasNext(); )
{
result.addAll((List) _contributions.get(it.next()));
}
return result;
}
List getNamespacesTouched(Set modifiedFiles)
{
List result = new ArrayList();
for (Iterator it = _contributions.keySet().iterator(); it.hasNext(); )
{
String ns = (String) it.next();
List files = (List) _contributions.get(ns);
for (int i = 0; i < files.size(); i++)
if (modifiedFiles.contains(files.get(i)))
result.add(ns);
}
return result;
}
}