blob: bf521b43a72a4bb6f8dbbe2a65d6de3ed8171152 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Bachmann electronic GmbH. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bachmann electronic GmbH. - initial API and implementation
*******************************************************************************/
package org.eclipse.tycho.core.resolver;
import java.util.List;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.repository.DefaultMirrorSelector;
import org.apache.maven.repository.MirrorSelector;
import org.apache.maven.settings.Mirror;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.util.StringUtils;
/**
* A Tycho specific {@link MirrorSelector} in order to support mirror definitions based on a prefix
* URL for full or partial mirror sites.
*
* <p>
* E.g. a mirror definition like that:
*
* <pre>
* &lt;mirror&gt;
* &lt;id&gt;example-mirror&lt;/id&gt;
* &lt;mirrorOf&gt;http://download.eclipse.org&lt;/mirrorOf&gt;
* &lt;url&gt;http://mirror.example.org/eclipse-mirror&lt;/url&gt;
* &lt;layout&gt;p2&lt;/layout&gt;
* &lt;mirrorOfLayouts&gt;p2&lt;/mirrorOfLayouts&gt;
* &lt;/mirror&gt;
* </pre>
* </p>
*
* will cause the repository URL http://download.eclipse.org/eclipse/updates/4.6 to be mirrored to
* http://mirror.example.org/eclipse-mirror/eclipse/updates/4.6 <br/>
*
*
* (see #501809)
*
*/
@Component(role = MirrorSelector.class, hint = "tycho")
public class TychoMirrorSelector extends DefaultMirrorSelector {
@Override
public Mirror getMirror(ArtifactRepository repository, List<Mirror> mirrors) {
// if we find a mirror the default way (the maven way) we will use that mirror
Mirror mavenMirror = super.getMirror(repository, mirrors);
if (mavenMirror != null || mirrors == null) {
return mavenMirror;
}
for (Mirror mirror : mirrors) {
if (isPrefixMirrorOf(repository, mirror)) {
// We will create a new Mirror that does
// have the artifacts URL replaced with the Prefix URL from the mirror
return createMirror(repository, mirror);
}
}
return null;
}
private boolean isPrefixMirrorOf(ArtifactRepository repo, Mirror mirror) {
boolean isMirrorOfRepoUrl = repo.getUrl() != null && repo.getUrl().startsWith(mirror.getMirrorOf());
boolean matchesLayout = repo.getLayout() != null
&& repo.getLayout().getId().equals(mirror.getMirrorOfLayouts());
return isMirrorOfRepoUrl && matchesLayout;
}
// We have to create a new Mirror
private Mirror createMirror(ArtifactRepository repo, Mirror toMirror) {
Mirror mirror = toMirror.clone();
String urlToReplace = toMirror.getMirrorOf();
String newUrl = StringUtils.replaceOnce(repo.getUrl(), urlToReplace, toMirror.getUrl());
mirror.setUrl(newUrl);
mirror.setId(toMirror.getId());
return mirror;
}
}