/** * Copyright (c) Codice Foundation * <p> * This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser * General Public License as published by the Free Software Foundation, either version 3 of the * License, or any later version. * <p> * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. A copy of the GNU Lesser General Public License * is distributed along with this program and can be found at * <http://www.gnu.org/licenses/lgpl.html>. */ package ddf.security.ws.policy.impl; import java.io.IOException; import java.io.InputStream; import java.net.URL; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.commons.io.IOUtils; import org.osgi.framework.BundleContext; import org.w3c.dom.Document; import org.xml.sax.SAXException; import ddf.security.ws.policy.PolicyLoader; /** * Uses the filesystem to load a policy file. */ public class FilePolicyLoader implements PolicyLoader { private static volatile Document policyDoc; /** * Creates a new instance of the file policy loader. * * @param context Used to obtain the file from the file system. * @param policyLocation Location of the file within the bundle classpath. * @throws IOException If an error occurs while trying to load the policy file. */ public FilePolicyLoader(BundleContext context, String policyLocation) throws IOException { URL policyURL = context.getBundle() .getResource(policyLocation); FilePolicyLoader.policyDoc = loadFromFile(policyURL); } /** * Loads the policy and converts it into a Document. * * @param policyFileURL URL that is based in from the bundlecontext. * @return The policy in a Document format. * @throws IOException If an error occurs while trying to parse the file into a Document. */ protected Document loadFromFile(URL policyFileURL) throws IOException { InputStream policyStream = null; Document doc = null; if (policyFileURL != null) { try { policyStream = policyFileURL.openStream(); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); dbFactory.setNamespaceAware(true); try { dbFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); dbFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); } catch (ParserConfigurationException e) { throw new IOException(e); } DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); doc = dBuilder.parse(policyStream); } catch (IOException e) { throw new IOException("Could not read policy file located at " + policyFileURL, e); } catch (ParserConfigurationException e) { throw new IOException("Could not read policy file located at " + policyFileURL, e); } catch (SAXException e) { throw new IOException("Could not read policy file located at " + policyFileURL, e); } finally { IOUtils.closeQuietly(policyStream); } } if (doc == null) { throw new IOException( "Could not find policy file. No valid location given: " + policyFileURL); } return doc; } @Override public Document getPolicy() { return FilePolicyLoader.policyDoc; } }