/*
* JBoss, Home of Professional Open Source
* Copyright 2011, Red Hat, Inc. and/or its affiliates, and individual
* contributors by the @authors tag. See the copyright.txt in the
* distribution for a full listing of individual contributors.
*
* 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.jboss.solder.config.xml.bootstrap;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.jboss.solder.resourceLoader.ResourceLoaderManager;
import org.jboss.solder.servlet.resource.WebResourceLocator;
import org.xml.sax.InputSource;
/**
* Document Provider that loads XML documents from the classpath
*
* @author Stuart Douglas <stuart@baileyroberts.com.au>
*/
public class ResourceLoaderXmlDocumentProvider implements XmlDocumentProvider {
private final ResourceLoaderManager manager = new ResourceLoaderManager();
static final String[] DEFAULT_RESOURCES = {"WEB-INF/beans.xml", "WEB-INF/seam-beans.xml", "META-INF/seam-beans.xml", "META-INF/beans.xml"};
final String[] resources;
InputStream stream;
public ResourceLoaderXmlDocumentProvider() {
this(DEFAULT_RESOURCES);
}
public ResourceLoaderXmlDocumentProvider(String[] resources) {
this.resources = resources;
}
List<URL> docs;
ListIterator<URL> iterator;
DocumentBuilderFactory factory;
DocumentBuilder builder;
public void open() {
factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setIgnoringComments(true);
factory.setIgnoringElementContentWhitespace(true);
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e1) {
throw new RuntimeException(e1);
}
docs = new ArrayList<URL>();
for (String i : resources) {
if (i.contains("WEB-INF")) {
final WebResourceLocator wrl = new WebResourceLocator();
final URL resourceUrl = wrl.getWebResourceUrl("/" + i);
if (resourceUrl != null) {
docs.add(wrl.getWebResourceUrl("/" + i));
}
} else {
docs.addAll(manager.getResources(i));
}
}
iterator = docs.listIterator();
}
public void close() {
if (stream != null) {
try {
stream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public XmlDocument getNextDocument() {
if (stream != null) {
try {
stream.close();
stream = null;
} catch (Exception e) {
e.printStackTrace();
}
}
try {
while (iterator.hasNext()) {
final URL url = iterator.next();
// ignore empty files
InputStream test = null;
try {
test = url.openStream();
if (test.available() == 0) {
continue;
}
} catch (FileNotFoundException e) {
// one of the expected locations didn't exist, move on.
continue;
} finally {
if (test != null) {
test.close();
}
}
return new XmlDocument() {
public InputSource getInputSource() {
try {
stream = url.openStream();
return new InputSource(stream);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public String getFileUrl() {
return url.toString();
}
};
}
return null;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}