/* * <p><b>License and Copyright: </b>The contents of this file is subject to the * same open source license as the Fedora Repository System at www.fedora-commons.org * Copyright © 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 by The Technical University of Denmark. * All rights reserved.</p> */ package dk.defxws.fedoragsearch.server; import java.net.MalformedURLException; import java.net.URL; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.URIResolver; import javax.xml.transform.stream.StreamSource; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.log4j.Logger; import org.fcrepo.common.http.WebClient; /** * custom URIResolver for ssl access to fedora repository * * @author gsp@dtv.dk * @version */ public class URIResolverImpl implements URIResolver { private Config config; private final Logger logger = Logger.getLogger(URIResolverImpl.class); public void setConfig(Config config) { this.config = config; } public Source resolve(String href, String base) throws TransformerException { Source source = null; URL url; try { url = new URL(href); } catch (MalformedURLException e) { // the XSLT processor should try to resolve the URI itself, // here it may be a location path, which it can resolve if (logger.isDebugEnabled()) logger.debug("resolve back to XSLT processor MalformedURLException href="+href+" base="+base+" exception="+e); return null; } String reposName = config.getRepositoryNameFromUrl(url); if (reposName == null || reposName.length() == 0) { // here other resolve mechanism may be coded, or // the XSLT processor should try to resolve the URI itself, // e.g. it can resolve the file protocol if (logger.isDebugEnabled()) logger.debug("resolve back to XSLT processor no reposName href="+href+" base="+base+" url="+url.toString()); return null; } if (logger.isDebugEnabled()) logger.debug("resolve get from repository href="+href+" base="+base+" url="+url.toString()+" reposName="+reposName); System.setProperty("javax.net.ssl.trustStore", config.getTrustStorePath(reposName)); System.setProperty("javax.net.ssl.trustStorePassword", config.getTrustStorePass(reposName)); WebClient client = new WebClient(); try { if (logger.isDebugEnabled()) logger.debug("resolve get from reposName="+reposName+" source=\n"+client.getResponseAsString(href, false, new UsernamePasswordCredentials(config.getFedoraUser(reposName), config.getFedoraPass(reposName)))); source = new StreamSource(client.get(href, false, config.getFedoraUser(reposName), config.getFedoraPass(reposName))); } catch (Exception e) { throw new TransformerException("resolve get from reposName="+reposName+" href="+href+" base="+base+" exception=\n", e); } return source; } }