/*
* Copyright 2016 Grzegorz Grzybek
*
* 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.eclipse.aether.internal.impl;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.impl.RemoteRepositoryManager;
import org.eclipse.aether.impl.UpdatePolicyAnalyzer;
import org.eclipse.aether.repository.LocalArtifactRegistration;
import org.eclipse.aether.repository.LocalArtifactRequest;
import org.eclipse.aether.repository.LocalArtifactResult;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.repository.RepositoryPolicy;
public class PaxLocalRepositoryManager extends SimpleLocalRepositoryManager {
public static final String PROPERTY_UPDATE_RELEASES = "paxUrlAether.updateReleases";
private final UpdatePolicyAnalyzer updatePolicyAnalyzer;
private final RemoteRepositoryManager remoteRepositoryManager;
private final String trackingFilename;
private final TrackingFileManager trackingFileManager;
public PaxLocalRepositoryManager(File basedir,
UpdatePolicyAnalyzer updatePolicyAnalyzer,
RemoteRepositoryManager remoteRepositoryManager) {
super(basedir);
this.updatePolicyAnalyzer = updatePolicyAnalyzer;
this.remoteRepositoryManager = remoteRepositoryManager;
trackingFilename = "_pax-url-aether-remote.repositories";
trackingFileManager = new TrackingFileManager();
}
@Override
public LocalArtifactResult find(RepositorySystemSession session, LocalArtifactRequest request) {
LocalArtifactResult result = super.find(session, request);
if (result.isAvailable()
&& !request.getArtifact().isSnapshot()
&& (Boolean) session.getConfigProperties().get(PROPERTY_UPDATE_RELEASES)) {
// check if we should force download
File trackingFile = getTrackingFile(result.getFile());
Properties props = trackingFileManager.read(trackingFile);
if (props != null) {
String localKey = result.getFile().getName() + ">";
if (props.get(localKey) == null) {
// artifact is available, but doesn't origin from local repository
for (RemoteRepository repo : request.getRepositories()) {
String remoteKey = result.getFile().getName() + ">" + repo.getId();
if (props.get(remoteKey) != null) {
// artifact origins from remote repository, check policy
long lastUpdated = result.getFile().lastModified();
RepositoryPolicy policy = remoteRepositoryManager.getPolicy(session, repo, true, false);
if (updatePolicyAnalyzer.isUpdatedRequired(session, lastUpdated, policy.getUpdatePolicy())) {
result.setAvailable(false);
// needed for non SNAPSHOTs.
// If we don't null, PeekTaskRunner will be used instead of GetTaskRunner
result.setFile(null);
result.setRepository(repo);
break;
}
}
}
}
}
}
return result;
}
@Override
public void add(RepositorySystemSession session, LocalArtifactRegistration request) {
super.add(session, request);
if (!request.getArtifact().isSnapshot()
&& (Boolean) session.getConfigProperties().get(PROPERTY_UPDATE_RELEASES)) {
String path = getPathForArtifact(request.getArtifact(), request.getRepository() == null);
File artifactFile = new File(getRepository().getBasedir(), path);
File trackingFile = getTrackingFile(artifactFile);
String repoId = request.getRepository() == null ? "" : request.getRepository().getId();
Map<String, String> updates = new HashMap<String, String>();
updates.put(artifactFile.getName() + ">" + repoId, "");
trackingFileManager.update(trackingFile, updates);
}
}
private File getTrackingFile(File artifactFile) {
return new File(artifactFile.getParentFile(), trackingFilename);
}
}