/* * 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 * * 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.apache.ivy.plugins.resolver; import java.io.File; import java.io.IOException; import java.text.ParseException; import java.util.List; import org.apache.ivy.Ivy; import org.apache.ivy.core.module.descriptor.Artifact; import org.apache.ivy.core.module.descriptor.Configuration; import org.apache.ivy.core.module.descriptor.DefaultArtifact; import org.apache.ivy.core.module.descriptor.DefaultWorkspaceModuleDescriptor; import org.apache.ivy.core.module.descriptor.DependencyDescriptor; import org.apache.ivy.core.module.descriptor.ExcludeRule; import org.apache.ivy.core.module.descriptor.License; import org.apache.ivy.core.module.descriptor.ModuleDescriptor; import org.apache.ivy.core.module.descriptor.WorkspaceModuleDescriptor; import org.apache.ivy.core.module.id.ModuleId; import org.apache.ivy.core.module.id.ModuleRevisionId; import org.apache.ivy.core.report.DownloadStatus; import org.apache.ivy.core.report.MetadataArtifactDownloadReport; import org.apache.ivy.core.resolve.ResolveData; import org.apache.ivy.core.resolve.ResolvedModuleRevision; import org.apache.ivy.osgi.core.BundleInfo; import org.apache.ivy.osgi.core.ManifestHeaderElement; import org.apache.ivy.osgi.core.ManifestHeaderValue; import org.apache.ivy.plugins.resolver.util.ResolvedResource; import org.apache.ivy.plugins.version.VersionMatcher; import org.apache.ivy.util.Message; public abstract class AbstractWorkspaceResolver extends AbstractResolver { private boolean ignoreBranch; private boolean ignoreVersion; public void setIgnoreBranch(boolean ignoreBranch) { this.ignoreBranch = ignoreBranch; } public void setIgnoreVersion(boolean ignoreVersion) { this.ignoreVersion = ignoreVersion; } protected ResolvedModuleRevision checkCandidate(DependencyDescriptor dd, ModuleDescriptor md, String workspaceModuleName) { if (workspaceModuleName == null) { workspaceModuleName = dd.getDependencyId().toString(); } ModuleRevisionId dependencyMrid = dd.getDependencyRevisionId(); String org = dependencyMrid.getModuleId().getOrganisation(); String module = dependencyMrid.getModuleId().getName(); VersionMatcher versionMatcher = getSettings().getVersionMatcher(); ModuleRevisionId candidateMrid = md.getModuleRevisionId(); // search a match on the organization and the module name if (org.equals(BundleInfo.BUNDLE_TYPE)) { // looking for an OSGi bundle via its symbolic name String sn = md.getExtraInfoContentByTagName("Bundle-SymbolicName"); if (sn == null || !module.equals(sn)) { // not found, skip to next return null; } } else if (org.equals(BundleInfo.PACKAGE_TYPE)) { // looking for an OSGi bundle via its exported package String exportedPackages = md.getExtraInfoContentByTagName("Export-Package"); if (exportedPackages == null) { // not found, skip to next return null; } boolean found = false; String version = null; ManifestHeaderValue exportElements; try { exportElements = new ManifestHeaderValue(exportedPackages); } catch (ParseException e) { // wrong OSGi header: skip it return null; } for (ManifestHeaderElement exportElement : exportElements.getElements()) { if (exportElement.getValues().contains(module)) { found = true; version = exportElement.getAttributes().get("version"); break; } } if (!found) { // not found, skip to next return null; } if (version == null) { // no version means anything can match. Let's trick the version matcher by // setting the exact expected version version = dependencyMrid.getRevision(); } md.setResolvedModuleRevisionId(ModuleRevisionId.newInstance(org, module, version)); } else { if (!candidateMrid.getModuleId().equals(dependencyMrid.getModuleId())) { // it doesn't match org#module, skip to next return null; } } Message.verbose("Workspace resolver found potential matching workspace module " + workspaceModuleName + " with module " + candidateMrid + " for module " + dependencyMrid); if (!ignoreBranch) { ModuleId mid = dependencyMrid.getModuleId(); String defaultBranch = getSettings().getDefaultBranch(mid); String dependencyBranch = dependencyMrid.getBranch(); String candidateBranch = candidateMrid.getBranch(); if (dependencyBranch == null) { dependencyBranch = defaultBranch; } if (candidateBranch == null) { candidateBranch = defaultBranch; } if (dependencyBranch != candidateBranch) { // Both cannot be null if (dependencyBranch == null || candidateBranch == null) { Message.verbose("\t\trejected since branches doesn't match (one is set, the other isn't)"); return null; } if (!dependencyBranch.equals(candidateBranch)) { Message.verbose("\t\trejected since branches doesn't match"); return null; } } } // Found one; check if it is for the module we need if (!ignoreVersion && !md.getModuleRevisionId().getRevision().equals(Ivy.getWorkingRevision()) && !versionMatcher.accept(dd.getDependencyRevisionId(), md)) { Message.verbose("\t\treject as version didn't match"); return null; } if (ignoreVersion) { Message.verbose("\t\tmatched (version are ignored)"); } else { Message.verbose("\t\tversion matched"); } WorkspaceModuleDescriptor workspaceMd = createWorkspaceMd(md); Artifact mdaf = md.getMetadataArtifact(); if (mdaf == null) { mdaf = new DefaultArtifact(md.getModuleRevisionId(), md.getPublicationDate(), workspaceModuleName, "ivy", ""); } MetadataArtifactDownloadReport madr = new MetadataArtifactDownloadReport(mdaf); madr.setDownloadStatus(DownloadStatus.SUCCESSFUL); madr.setSearched(true); return new ResolvedModuleRevision(this, this, workspaceMd, madr); } protected WorkspaceModuleDescriptor createWorkspaceMd(ModuleDescriptor md) { DefaultWorkspaceModuleDescriptor newMd = new DefaultWorkspaceModuleDescriptor( md.getModuleRevisionId(), "release", null, true); newMd.addConfiguration(new Configuration(ModuleDescriptor.DEFAULT_CONFIGURATION)); newMd.setLastModified(System.currentTimeMillis()); newMd.setDescription(md.getDescription()); newMd.setHomePage(md.getHomePage()); newMd.setLastModified(md.getLastModified()); newMd.setPublicationDate(md.getPublicationDate()); newMd.setResolvedPublicationDate(md.getResolvedPublicationDate()); newMd.setStatus(md.getStatus()); List<Artifact> artifacts = createWorkspaceArtifacts(md); Configuration[] allConfs = md.getConfigurations(); for (Artifact af : artifacts) { if (allConfs.length == 0) { newMd.addArtifact(ModuleDescriptor.DEFAULT_CONFIGURATION, af); } else { for (int k = 0; k < allConfs.length; k++) { newMd.addConfiguration(allConfs[k]); newMd.addArtifact(allConfs[k].getName(), af); } } } DependencyDescriptor[] dependencies = md.getDependencies(); for (int k = 0; k < dependencies.length; k++) { newMd.addDependency(dependencies[k]); } ExcludeRule[] allExcludeRules = md.getAllExcludeRules(); for (int k = 0; k < allExcludeRules.length; k++) { newMd.addExcludeRule(allExcludeRules[k]); } newMd.getExtraInfos().addAll(md.getExtraInfos()); License[] licenses = md.getLicenses(); for (int k = 0; k < licenses.length; k++) { newMd.addLicense(licenses[k]); } return newMd; } abstract protected List<Artifact> createWorkspaceArtifacts(ModuleDescriptor md); public void publish(Artifact artifact, File src, boolean overwrite) throws IOException { throw new UnsupportedOperationException("publish not supported by " + getName()); } public ResolvedResource findIvyFileRef(DependencyDescriptor dd, ResolveData data) { return null; } }