Skip to content

Commit c19adb8

Browse files
committed
[XABT] Allow deployment artifacts to specify mutiple JavaDependencyVerification JavaArtifact libraries.
1 parent 000759c commit c19adb8

File tree

6 files changed

+91
-75
lines changed

6 files changed

+91
-75
lines changed

src/Xamarin.Android.Build.Tasks/Tasks/JavaDependencyVerification.cs

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -149,15 +149,12 @@ public void AddAndroidLibraries (ITaskItem []? tasks)
149149
{
150150
foreach (var task in tasks.OrEmpty ()) {
151151
var id = task.GetMetadataOrDefault ("JavaArtifact", string.Empty);
152-
var version = task.GetMetadataOrDefault ("JavaVersion", string.Empty);
153152

154-
// TODO: Should raise an error if JavaArtifact is specified but JavaVersion is not
155-
if (!id.HasValue () || !version.HasValue ())
156-
continue;
157-
158-
if (version != null && MavenExtensions.TryParseArtifactWithVersion (id, version, log, out var art)) {
159-
log.LogMessage ("Found Java dependency '{0}:{1}' version '{2}' from AndroidLibrary '{3}'", art.GroupId, art.Id, art.Version, task.ItemSpec);
160-
artifacts.Add (art.ArtifactString, art);
153+
if (MavenExtensions.TryParseArtifacts (id, log, out var parsed)) {
154+
foreach (var art in parsed) {
155+
log.LogMessage ("Found Java dependency '{0}:{1}' version '{2}' from AndroidLibrary '{3}'", art.GroupId, art.Id, art.Version, task.ItemSpec);
156+
artifacts.Add (art.ArtifactString, art);
157+
}
161158
}
162159
}
163160
}
@@ -166,13 +163,15 @@ public void AddPackageReferences (ITaskItem []? tasks)
166163
{
167164
foreach (var task in tasks.OrEmpty ()) {
168165

169-
// See if JavaArtifact/JavaVersion overrides were used
170-
if (task.TryParseJavaArtifactAndJavaVersion ("PackageReference", log, out var explicit_artifact, out var attributes_specified)) {
171-
artifacts.Add (explicit_artifact.ArtifactString, explicit_artifact);
166+
// See if JavaArtifact override was used
167+
if (task.TryParseJavaArtifacts ("PackageReference", log, out var explicit_artifacts, out var attributes_specified)) {
168+
foreach (var explicit_artifact in explicit_artifacts)
169+
artifacts.Add (explicit_artifact.ArtifactString, explicit_artifact);
170+
172171
continue;
173172
}
174173

175-
// If user tried to specify JavaArtifact or JavaVersion, but did it incorrectly, we do not perform any fallback
174+
// If user tried to specify JavaArtifact, but did it incorrectly, we do not perform any fallback
176175
if (attributes_specified)
177176
continue;
178177

@@ -193,13 +192,15 @@ public void AddPackageReferences (ITaskItem []? tasks)
193192
public void AddProjectReferences (ITaskItem []? tasks)
194193
{
195194
foreach (var task in tasks.OrEmpty ()) {
196-
// See if JavaArtifact/JavaVersion overrides were used
197-
if (task.TryParseJavaArtifactAndJavaVersion ("ProjectReference", log, out var explicit_artifact, out var attributes_specified)) {
198-
artifacts.Add (explicit_artifact.ArtifactString, explicit_artifact);
195+
// See if JavaArtifact override was used
196+
if (task.TryParseJavaArtifacts ("ProjectReference", log, out var explicit_artifacts, out var attributes_specified)) {
197+
foreach (var explicit_artifact in explicit_artifacts)
198+
artifacts.Add (explicit_artifact.ArtifactString, explicit_artifact);
199+
199200
continue;
200201
}
201202

202-
// If user tried to specify JavaArtifact or JavaVersion, but did it incorrectly, we do not perform any fallback
203+
// If user tried to specify JavaArtifact, but did it incorrectly, we do not perform any fallback
203204
if (attributes_specified)
204205
continue;
205206

@@ -212,14 +213,12 @@ public void AddIgnoredDependencies (ITaskItem []? tasks)
212213
{
213214
foreach (var task in tasks.OrEmpty ()) {
214215
var id = task.ItemSpec;
215-
var version = task.GetRequiredMetadata ("AndroidIgnoredJavaDependency", "Version", log);
216-
217-
if (version is null)
218-
continue;
219216

220-
if (version != null && MavenExtensions.TryParseArtifactWithVersion (id, version, log, out var art)) {
221-
log.LogMessage ("Ignoring Java dependency '{0}:{1}' version '{2}'", art.GroupId, art.Id, art.Version);
222-
artifacts.Add (art.ArtifactString, art);
217+
if (MavenExtensions.TryParseArtifacts (id, log, out var parsed)) {
218+
foreach (var art in parsed) {
219+
log.LogMessage ("Ignoring Java dependency '{0}:{1}' version '{2}'", art.GroupId, art.Id, art.Version);
220+
artifacts.Add (art.ArtifactString, art);
221+
}
223222
}
224223
}
225224
}
@@ -263,7 +262,7 @@ public MSBuildLoggingPomResolver (TaskLoggingHelper logger)
263262

264263
Artifact? RegisterFromTaskItem (ITaskItem item, string itemName, string filename)
265264
{
266-
item.TryParseJavaArtifactAndJavaVersion (itemName, logger, out var artifact, out var _);
265+
item.TryParseJavaArtifact (itemName, logger, out var artifact, out var _);
267266

268267
if (!File.Exists (filename)) {
269268
logger.LogCodedError ("XA4245", Properties.Resources.XA4245, filename);

src/Xamarin.Android.Build.Tasks/Tasks/MavenDownload.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,7 @@ public async override System.Threading.Tasks.Task RunTaskAsync ()
9797

9898
var result = new TaskItem (artifact_file);
9999

100-
result.SetMetadata ("JavaArtifact", $"{artifact.GroupId}:{artifact.Id}");
101-
result.SetMetadata ("JavaVersion", artifact.Version);
100+
result.SetMetadata ("JavaArtifact", artifact.VersionedArtifactString);
102101

103102
// Allow user to opt out of dependency verification
104103
if (string.Compare (item.GetMetadataOrDefault ("VerifyDependencies", "true"), "false", true) == 0)
@@ -121,8 +120,7 @@ public async override System.Threading.Tasks.Task RunTaskAsync ()
121120
var pom_item = new TaskItem (kv.Value);
122121
var pom_artifact = Artifact.Parse (kv.Key);
123122

124-
pom_item.SetMetadata ("JavaArtifact", $"{pom_artifact.GroupId}:{pom_artifact.Id}");
125-
pom_item.SetMetadata ("JavaVersion", pom_artifact.Version);
123+
pom_item.SetMetadata ("JavaArtifact", pom_artifact.VersionedArtifactString);
126124

127125
additionalPoms.Add (pom_item);
128126

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -888,14 +888,9 @@ public void AndroidMavenLibrary_AllDependenciesAreVerified ()
888888
var collection = new XamarinAndroidBindingProject ();
889889

890890
// Dependencies ignored by <AndroidIgnoredJavaDependency>
891-
var concurrent = new BuildItem ("AndroidIgnoredJavaDependency", "androidx.concurrent:concurrent-futures");
892-
concurrent.Metadata.Add ("Version", "1.1.0");
893-
894-
var lifecycle = new BuildItem ("AndroidIgnoredJavaDependency", "androidx.lifecycle:lifecycle-runtime");
895-
lifecycle.Metadata.Add ("Version", "2.6.2");
896-
897-
var parcelable = new BuildItem ("AndroidIgnoredJavaDependency", "androidx.versionedparcelable:versionedparcelable");
898-
parcelable.Metadata.Add ("Version", "1.2.0");
891+
var concurrent = new BuildItem ("AndroidIgnoredJavaDependency", "androidx.concurrent:concurrent-futures:1.1.0");
892+
var lifecycle = new BuildItem ("AndroidIgnoredJavaDependency", "androidx.lifecycle:lifecycle-runtime:2.6.2");
893+
var parcelable = new BuildItem ("AndroidIgnoredJavaDependency", "androidx.versionedparcelable:versionedparcelable:1.2.0");
899894

900895
var proj = new XamarinAndroidBindingProject {
901896
Jars = { item, annotations_experimental_androidlib },
@@ -905,8 +900,7 @@ public void AndroidMavenLibrary_AllDependenciesAreVerified ()
905900

906901
proj.AddReference (collection);
907902
var collection_proj = proj.References.First ();
908-
collection_proj.Metadata.Add ("JavaArtifact", "androidx.collection:collection");
909-
collection_proj.Metadata.Add ("JavaVersion", "1.3.0");
903+
collection_proj.Metadata.Add ("JavaArtifact", "androidx.collection:collection:1.3.0");
910904

911905
using var a = CreateDllBuilder ();
912906
using var b = CreateDllBuilder ();

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/JavaDependencyVerificationTests.cs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ public void MalformedMicrosoftPackagesJson ()
161161
BuildEngine = engine,
162162
AndroidLibraries = [
163163
CreateAndroidLibraryTaskItem ("com.google.android.material.jar", pom.FilePath),
164-
CreateAndroidLibraryTaskItem ("com.google.android.material-core.jar", null, "com.google.android:material-core", "1.0"),
164+
CreateAndroidLibraryTaskItem ("com.google.android.material-core.jar", null, "com.google.android:material-core:1.0"),
165165
],
166166
MicrosoftPackagesFile = package_finder.FilePath,
167167
};
@@ -184,7 +184,7 @@ public void DependencyFulfilledByAndroidLibrary ()
184184
BuildEngine = engine,
185185
AndroidLibraries = [
186186
CreateAndroidLibraryTaskItem ("com.google.android.material.jar", pom.FilePath),
187-
CreateAndroidLibraryTaskItem ("com.google.android.material-core.jar", null, "com.google.android:material-core", "1.0"),
187+
CreateAndroidLibraryTaskItem ("com.google.android.material-core.jar", null, "com.google.android:material-core:1.0"),
188188
],
189189
};
190190

@@ -208,7 +208,7 @@ public void DependencyFulfilledByProjectReferenceExplicitMetadata ()
208208
CreateAndroidLibraryTaskItem ("com.google.android.material.jar", pom.FilePath),
209209
],
210210
ProjectReferences = [
211-
CreateAndroidLibraryTaskItem ("Google.Material.Core.csproj", null, "com.google.android:material-core", "1.0"),
211+
CreateAndroidLibraryTaskItem ("Google.Material.Core.csproj", null, "com.google.android:material-core:1.0"),
212212
],
213213
};
214214

@@ -232,7 +232,7 @@ public void DependencyFulfilledByPackageReferenceExplicitMetadata ()
232232
CreateAndroidLibraryTaskItem ("com.google.android.material.jar", pom.FilePath),
233233
],
234234
PackageReferences = [
235-
CreateAndroidLibraryTaskItem ("Xamarin.Google.Material.Core", null, "com.google.android:material-core", "1.0"),
235+
CreateAndroidLibraryTaskItem ("Xamarin.Google.Material.Core", null, "com.google.android:material-core:1.0"),
236236
],
237237
};
238238

@@ -256,7 +256,7 @@ public void DependencyIgnored ()
256256
CreateAndroidLibraryTaskItem ("com.google.android.material.jar", pom.FilePath),
257257
],
258258
IgnoredDependencies = [
259-
CreateAndroidLibraryTaskItem ("com.google.android:material-core", rawVersion: "1.0"),
259+
CreateAndroidLibraryTaskItem ("com.google.android:material-core:1.0"),
260260
],
261261
};
262262

@@ -279,7 +279,7 @@ public void DependencyWithoutVersionFulfilled ()
279279
BuildEngine = engine,
280280
AndroidLibraries = [
281281
CreateAndroidLibraryTaskItem ("com.google.android.material.jar", pom.FilePath),
282-
CreateAndroidLibraryTaskItem ("com.google.android.material-core.jar", null, "com.google.android:material-core", "1.0"),
282+
CreateAndroidLibraryTaskItem ("com.google.android.material-core.jar", null, "com.google.android:material-core:1.0"),
283283
],
284284
};
285285

@@ -312,18 +312,14 @@ public void DependencyWithoutVersionNotFulfilled ()
312312
Assert.AreEqual ("Java dependency 'com.google.android:material-core' is not satisfied.", engine.Errors [0].Message);
313313
}
314314

315-
TaskItem CreateAndroidLibraryTaskItem (string name, string? manifest = null, string? javaArtifact = null, string? javaVersion = null, string? rawVersion = null)
315+
TaskItem CreateAndroidLibraryTaskItem (string name, string? manifest = null, string? javaArtifact = null)
316316
{
317317
var item = new TaskItem (name);
318318

319319
if (manifest is not null)
320320
item.SetMetadata ("Manifest", manifest);
321321
if (javaArtifact is not null)
322322
item.SetMetadata ("JavaArtifact", javaArtifact);
323-
if (javaVersion is not null)
324-
item.SetMetadata ("JavaVersion", javaVersion);
325-
if (rawVersion is not null)
326-
item.SetMetadata ("Version", rawVersion);
327323

328324
return item;
329325
}

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/MavenDownloadTests.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,7 @@ public async Task MavenCentralSuccess ()
136136

137137
var output_item = task.ResolvedAndroidMavenLibraries! [0];
138138

139-
Assert.AreEqual ("com.google.auto.value:auto-value-annotations", output_item.GetMetadata ("JavaArtifact"));
140-
Assert.AreEqual ("1.10.4", output_item.GetMetadata ("JavaVersion"));
139+
Assert.AreEqual ("com.google.auto.value:auto-value-annotations:1.10.4", output_item.GetMetadata ("JavaArtifact"));
141140
Assert.AreEqual (Path.Combine (temp_cache_dir, "central", "com.google.auto.value", "auto-value-annotations", "1.10.4", "auto-value-annotations-1.10.4.pom"), output_item.GetMetadata ("Manifest"));
142141
} finally {
143142
DeleteTempDirectory (temp_cache_dir);
@@ -164,8 +163,7 @@ public async Task MavenGoogleSuccess ()
164163

165164
var output_item = task.ResolvedAndroidMavenLibraries! [0];
166165

167-
Assert.AreEqual ("androidx.core:core", output_item.GetMetadata ("JavaArtifact"));
168-
Assert.AreEqual ("1.12.0", output_item.GetMetadata ("JavaVersion"));
166+
Assert.AreEqual ("androidx.core:core:1.12.0", output_item.GetMetadata ("JavaArtifact"));
169167
Assert.AreEqual (Path.Combine (temp_cache_dir, "google", "androidx.core", "core", "1.12.0", "core-1.12.0.pom"), output_item.GetMetadata ("Manifest"));
170168
} finally {
171169
DeleteTempDirectory (temp_cache_dir);

src/Xamarin.Android.Build.Tasks/Utilities/MavenExtensions.cs

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#nullable enable
22

33
using System;
4+
using System.Collections.Generic;
45
using System.Diagnostics.CodeAnalysis;
56
using System.IO;
67
using System.Linq;
@@ -17,6 +18,7 @@ namespace Xamarin.Android.Tasks;
1718
static class MavenExtensions
1819
{
1920
static readonly char [] separator = [':'];
21+
static readonly char [] artifacts_separators = [';', ',', '\r', '\n'];
2022

2123
/// <summary>
2224
/// Shortcut for !string.IsNullOrWhiteSpace (s)
@@ -54,47 +56,76 @@ public static bool TryParseArtifactWithVersion (string id, string version, TaskL
5456
return true;
5557
}
5658

57-
public static bool TryParseJavaArtifactAndJavaVersion (this ITaskItem task, string type, TaskLoggingHelper log, [NotNullWhen (true)] out Artifact? artifact, out bool attributesSpecified)
59+
public static bool TryParseArtifacts (string id, TaskLoggingHelper log, out List<Artifact> artifacts)
5860
{
59-
artifact = null;
60-
var item_name = task.ItemSpec;
61+
artifacts = new List<Artifact> ();
62+
var result = true;
6163

62-
// Convert "../../src/blah/Blah.csproj" to "Blah.csproj"
63-
if (type == "ProjectReference")
64-
item_name = Path.GetFileName (item_name);
64+
var arts = id.Split (artifacts_separators, StringSplitOptions.RemoveEmptyEntries);
6565

66-
var has_artifact = task.HasMetadata ("JavaArtifact");
67-
var has_version = task.HasMetadata ("JavaVersion");
66+
foreach (var art in arts) {
67+
68+
if (Artifact.TryParse (art, out var a)) {
69+
artifacts.Add (a);
70+
continue;
71+
}
72+
73+
log.LogCodedError ("XA4235", Properties.Resources.XA4235, art);
74+
result = false;
75+
}
6876

69-
// Lets callers know if user attempted to specify JavaArtifact or JavaVersion, even if they did it incorrectly
70-
attributesSpecified = has_artifact || has_version;
77+
return result;
78+
}
7179

72-
if (has_artifact && !has_version) {
73-
log.LogCodedError ("XA4243", Properties.Resources.XA4243, "JavaVersion", "JavaArtifact", type, item_name);
80+
public static bool TryParseJavaArtifact (this ITaskItem task, string type, TaskLoggingHelper log, [NotNullWhen (true)]out Artifact? artifact, out bool attributesSpecified)
81+
{
82+
var result = TryParseJavaArtifacts (task, type, log, out var artifacts, out attributesSpecified);
83+
84+
if (!result) {
85+
artifact = null;
7486
return false;
7587
}
7688

77-
if (!has_artifact && has_version) {
78-
log.LogCodedError ("XA4243", Properties.Resources.XA4243, "JavaArtifact", "JavaVersion", type, item_name);
89+
// TODO: Need a new message saying that only one JavaArtifact is allowed
90+
if (artifacts.Count > 1) {
91+
log.LogCodedError ("XA4243", Properties.Resources.XA4243, "JavaArtifact", type, task.ItemSpec);
92+
artifact = null;
7993
return false;
8094
}
8195

82-
if (has_artifact && has_version) {
96+
artifact = artifacts.FirstOrDefault ();
97+
98+
return artifact is not null;
99+
}
100+
101+
public static bool TryParseJavaArtifacts (this ITaskItem task, string type, TaskLoggingHelper log, out List<Artifact> artifacts, out bool attributesSpecified)
102+
{
103+
artifacts = new List<Artifact> ();
104+
var item_name = task.ItemSpec;
105+
106+
// Convert "../../src/blah/Blah.csproj" to "Blah.csproj"
107+
if (type == "ProjectReference")
108+
item_name = Path.GetFileName (item_name);
109+
110+
var has_artifact = task.HasMetadata ("JavaArtifact");
111+
112+
// Lets callers know if user attempted to specify JavaArtifact, even if they did it incorrectly
113+
attributesSpecified = has_artifact;
114+
115+
if (has_artifact) {
83116
var id = task.GetMetadata ("JavaArtifact");
84-
var version = task.GetMetadata ("JavaVersion");
85117

86118
if (string.IsNullOrWhiteSpace (id)) {
87119
log.LogCodedError ("XA4244", Properties.Resources.XA4244, "JavaArtifact", type, item_name);
88120
return false;
89121
}
90122

91-
if (string.IsNullOrWhiteSpace (version)) {
92-
log.LogCodedError ("XA4244", Properties.Resources.XA4244, "JavaVersion", type, item_name);
93-
return false;
94-
}
123+
if (TryParseArtifacts (id, log, out var parsed)) {
124+
foreach (var art in parsed) {
125+
log.LogMessage ("Found Java dependency '{0}:{1}' version '{2}' from {3} '{4}' (JavaArtifact)", art.GroupId, art.Id, art.Version, type, item_name);
126+
artifacts.Add (art);
127+
}
95128

96-
if (TryParseArtifactWithVersion (id, version, log, out artifact)) {
97-
log.LogMessage ("Found Java dependency '{0}:{1}' version '{2}' from {3} '{4}' (JavaArtifact)", artifact.GroupId, artifact.Id, artifact.Version, type, item_name);
98129
return true;
99130
}
100131
}

0 commit comments

Comments
 (0)