ImplementationSource.java [plain text]
package gnu.xml.dom;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.DOMImplementationList;
import org.w3c.dom.DOMImplementationSource;
public class ImplementationSource
implements DOMImplementationSource
{
private static final String DIGITS = "1234567890";
private static final DOMImplementation[] implementations;
static
{
List acc = new ArrayList();
acc.add(new gnu.xml.dom.DomImpl());
try
{
Class t = Class.forName("gnu.xml.libxmlj.dom.GnomeDocumentBuilder");
acc.add(t.newInstance());
}
catch (Exception e)
{
}
catch (UnsatisfiedLinkError e)
{
}
implementations = new DOMImplementation[acc.size()];
acc.toArray(implementations);
}
public DOMImplementation getDOMImplementation(String features)
{
List available = getImplementations(features);
if (available.isEmpty())
{
return null;
}
return (DOMImplementation) available.get(0);
}
public DOMImplementationList getDOMImplementationList(String features)
{
List available = getImplementations(features);
return new ImplementationList(available);
}
private final List getImplementations(String features)
{
List available = new ArrayList(Arrays.asList(implementations));
for (Iterator i = parseFeatures(features).iterator(); i.hasNext(); )
{
String feature = (String) i.next();
String version = null;
int si = feature.indexOf(' ');
if (si != -1)
{
version = feature.substring(si + 1);
feature = feature.substring(0, si);
}
for (Iterator j = available.iterator(); j.hasNext(); )
{
DOMImplementation impl = (DOMImplementation) j.next();
if (!impl.hasFeature(feature, version))
{
j.remove();
}
}
}
return available;
}
final List parseFeatures(String features)
{
List list = new ArrayList();
int pos = 0, start = 0;
int len = features.length();
for (; pos < len; pos++)
{
char c = features.charAt(pos);
if (c == ' ')
{
if (pos + 1 < len &&
DIGITS.indexOf(features.charAt(pos + 1)) == -1)
{
list.add(getFeature(features, start, pos));
start = pos + 1;
}
}
}
if (pos > start)
{
list.add(getFeature(features, start, len));
}
return list;
}
final String getFeature(String features, int start, int end)
{
if (features.length() > 0 && features.charAt(start) == '+')
{
return features.substring(start + 1, end);
}
return features.substring(start, end);
}
}