blob: 4bed4e7c06806f35de113aa415f8b22313b85aef [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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
*
* https://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.ivy.osgi.obr;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import org.apache.ivy.core.cache.CacheResourceOptions;
import org.apache.ivy.core.event.EventManager;
import org.apache.ivy.core.report.ArtifactDownloadReport;
import org.apache.ivy.osgi.obr.xml.OBRXMLParser;
import org.apache.ivy.osgi.repo.AbstractOSGiResolver;
import org.apache.ivy.plugins.repository.Resource;
import org.apache.ivy.plugins.repository.url.URLResource;
import org.xml.sax.SAXException;
public class OBRResolver extends AbstractOSGiResolver {
private String repoXmlURL;
private String repoXmlFile;
private Long metadataTtl;
private Boolean forceMetadataUpdate;
public void setRepoXmlFile(String repositoryXmlFile) {
this.repoXmlFile = repositoryXmlFile;
}
public void setRepoXmlURL(String repositoryXmlURL) {
this.repoXmlURL = repositoryXmlURL;
}
public void setMetadataTtl(Long metadataTtl) {
this.metadataTtl = metadataTtl;
}
public void setForceMetadataUpdate(Boolean forceMetadataUpdate) {
this.forceMetadataUpdate = forceMetadataUpdate;
}
@Override
protected void init() {
if (repoXmlFile != null && repoXmlURL != null) {
throw new RuntimeException("The OBR repository resolver " + getName()
+ " couldn't be configured: repoXmlFile and repoXmlUrl cannot be set both");
}
if (repoXmlFile != null) {
File f = new File(repoXmlFile);
loadRepoFromFile(f.getParentFile().toURI(), f, repoXmlFile);
} else if (repoXmlURL != null) {
final URL url;
try {
url = new URL(repoXmlURL);
} catch (MalformedURLException e) {
throw new RuntimeException("The OBR repository resolver " + getName()
+ " couldn't be configured: repoXmlURL '" + repoXmlURL + "' is not an URL");
}
ArtifactDownloadReport report;
EventManager eventManager = getEventManager();
try {
if (eventManager != null) {
getRepository().addTransferListener(eventManager);
}
final Resource obrResource = new URLResource(url, this.getTimeoutConstraint());
CacheResourceOptions options = new CacheResourceOptions();
if (metadataTtl != null) {
options.setTtl(metadataTtl);
}
if (forceMetadataUpdate != null) {
options.setForce(forceMetadataUpdate);
}
report = getRepositoryCacheManager().downloadRepositoryResource(obrResource, "obr",
"obr", "xml", options, getRepository());
} finally {
if (eventManager != null) {
getRepository().removeTransferListener(eventManager);
}
}
URI baseURI;
try {
baseURI = new URI(repoXmlURL);
} catch (URISyntaxException e) {
throw new RuntimeException("illegal uri");
}
loadRepoFromFile(baseURI, report.getLocalFile(), repoXmlURL);
} else {
throw new RuntimeException("The OBR repository resolver " + getName()
+ " couldn't be configured: repoXmlFile or repoXmlUrl is missing");
}
}
private void loadRepoFromFile(URI baseUri, File repoFile, String sourceLocation) {
FileInputStream in;
try {
in = new FileInputStream(repoFile);
} catch (FileNotFoundException e) {
throw new RuntimeException("The OBR repository resolver " + getName()
+ " couldn't be configured: the file " + sourceLocation + " was not found");
}
try {
setRepoDescriptor(OBRXMLParser.parse(baseUri, in));
} catch (IOException e) {
throw new RuntimeException("The OBR repository resolver " + getName()
+ " couldn't be configured: the file " + sourceLocation
+ " could not be read (" + e.getMessage() + ")", e);
} catch (SAXException e) {
throw new RuntimeException("The OBR repository resolver " + getName()
+ " couldn't be configured: the file " + sourceLocation
+ " has incorrect XML (" + e.getMessage() + ")", e);
}
try {
in.close();
} catch (IOException e) {
// don't care
}
}
}