Skip to content

Commit c78bd4e

Browse files
authored
Remove IPackage and IPackageRepository implementations (#25)
Remove the IPackage interface from ServerPackage Remove the IPackageRepository interface from ServerPackageRepository This further decouples NuGet.Server from NuGet.Core (still a work in progress!)
1 parent 5652a03 commit c78bd4e

20 files changed

Lines changed: 728 additions & 255 deletions

src/HashCodeCombiner.cs

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Linq;
7+
8+
namespace NuGet.Shared
9+
{
10+
/// <summary>
11+
/// Hash code creator, based on the original NuGet hash code combiner/ASP hash code combiner implementations
12+
/// </summary>
13+
internal struct HashCodeCombiner
14+
{
15+
// seed from String.GetHashCode()
16+
private const long Seed = 0x1505L;
17+
18+
private bool _initialized;
19+
private long _combinedHash;
20+
21+
internal int CombinedHash
22+
{
23+
get { return _combinedHash.GetHashCode(); }
24+
}
25+
26+
internal void AddInt32(int i)
27+
{
28+
CheckInitialized();
29+
_combinedHash = ((_combinedHash << 5) + _combinedHash) ^ i;
30+
}
31+
32+
internal void AddObject(int i)
33+
{
34+
CheckInitialized();
35+
AddInt32(i);
36+
}
37+
38+
internal void AddObject(bool b)
39+
{
40+
CheckInitialized();
41+
AddInt32(b.GetHashCode());
42+
}
43+
44+
internal void AddObject<TValue>(TValue o, IEqualityComparer<TValue> comparer)
45+
{
46+
CheckInitialized();
47+
if (o != null)
48+
{
49+
AddInt32(comparer.GetHashCode(o));
50+
}
51+
}
52+
53+
internal void AddObject(object o)
54+
{
55+
CheckInitialized();
56+
if (o != null)
57+
{
58+
AddInt32(o.GetHashCode());
59+
}
60+
}
61+
62+
internal void AddStringIgnoreCase(string s)
63+
{
64+
CheckInitialized();
65+
if (s != null)
66+
{
67+
AddObject(s, StringComparer.OrdinalIgnoreCase);
68+
}
69+
}
70+
71+
internal void AddSequence<T>(IEnumerable<T> sequence)
72+
{
73+
if (sequence != null)
74+
{
75+
foreach (var item in sequence)
76+
{
77+
AddObject(item);
78+
}
79+
}
80+
}
81+
82+
internal void AddDictionary<TKey, TValue>(IEnumerable<KeyValuePair<TKey, TValue>> dictionary)
83+
{
84+
if (dictionary != null)
85+
{
86+
foreach (var pair in dictionary.OrderBy(x => x.Key))
87+
{
88+
AddObject(pair.Key);
89+
AddObject(pair.Value);
90+
}
91+
}
92+
}
93+
94+
/// <summary>
95+
/// Create a unique hash code for the given set of items
96+
/// </summary>
97+
internal static int GetHashCode(params object[] objects)
98+
{
99+
var combiner = new HashCodeCombiner();
100+
101+
foreach (var obj in objects)
102+
{
103+
combiner.AddObject(obj);
104+
}
105+
106+
return combiner.CombinedHash;
107+
}
108+
109+
private void CheckInitialized()
110+
{
111+
if (!_initialized)
112+
{
113+
_combinedHash = Seed;
114+
_initialized = true;
115+
}
116+
}
117+
}
118+
}

src/NuGet.Server.Core/DataServices/PackageExtensions.cs

Lines changed: 3 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
2-
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
34
using System;
45
using System.Collections.Generic;
56
using System.Linq;
@@ -10,52 +11,7 @@ namespace NuGet.Server.Core.DataServices
1011
{
1112
public static class PackageExtensions
1213
{
13-
public static ODataPackage AsODataPackage(this IPackage package)
14-
{
15-
var serverPackage = package as ServerPackage;
16-
if (serverPackage != null)
17-
{
18-
return AsODataPackage(serverPackage);
19-
}
20-
21-
var utcNow = DateTime.UtcNow;
22-
23-
return new ODataPackage
24-
{
25-
Id = package.Id,
26-
Version = package.Version.ToString(),
27-
NormalizedVersion = package.Version.ToNormalizedString(),
28-
IsPrerelease = !package.IsReleaseVersion(),
29-
Title = package.Title,
30-
Authors = string.Join(",", package.Authors),
31-
Owners = string.Join(",", package.Owners),
32-
IconUrl = package.IconUrl == null ? null : package.IconUrl.GetComponents(UriComponents.HttpRequestUrl, UriFormat.Unescaped),
33-
LicenseUrl = package.LicenseUrl == null ? null : package.LicenseUrl.GetComponents(UriComponents.HttpRequestUrl, UriFormat.Unescaped),
34-
ProjectUrl = package.ProjectUrl == null ? null : package.ProjectUrl.GetComponents(UriComponents.HttpRequestUrl, UriFormat.Unescaped),
35-
DownloadCount = package.DownloadCount,
36-
RequireLicenseAcceptance = package.RequireLicenseAcceptance,
37-
DevelopmentDependency = package.DevelopmentDependency,
38-
Description = package.Description,
39-
Summary = package.Summary,
40-
ReleaseNotes = package.ReleaseNotes,
41-
Published = package.Published.HasValue ? package.Published.Value.UtcDateTime : utcNow,
42-
LastUpdated = package.Published.HasValue ? package.Published.Value.UtcDateTime : utcNow,
43-
Dependencies = string.Join("|", package.DependencySets.SelectMany(ConvertDependencySetToStrings)),
44-
PackageHash = package.GetHash(Constants.HashAlgorithm),
45-
PackageHashAlgorithm = Constants.HashAlgorithm,
46-
PackageSize = package.GetStream().Length,
47-
Copyright = package.Copyright,
48-
Tags = package.Tags,
49-
IsAbsoluteLatestVersion = package.IsAbsoluteLatestVersion,
50-
IsLatestVersion = package.IsLatestVersion,
51-
Listed = package.Listed,
52-
VersionDownloadCount = package.DownloadCount,
53-
MinClientVersion = package.MinClientVersion == null ? null : package.MinClientVersion.ToString(),
54-
Language = package.Language
55-
};
56-
}
57-
58-
public static ODataPackage AsODataPackage(this ServerPackage package)
14+
public static ODataPackage AsODataPackage(this IServerPackage package)
5915
{
6016
return new ODataPackage
6117
{
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Runtime.Versioning;
7+
8+
namespace NuGet.Server.Core.Infrastructure
9+
{
10+
public interface IServerPackage
11+
{
12+
string Id { get; }
13+
SemanticVersion Version { get; }
14+
string Title { get; }
15+
IEnumerable<string> Authors { get; }
16+
IEnumerable<string> Owners { get; }
17+
Uri IconUrl { get; }
18+
Uri LicenseUrl { get; }
19+
Uri ProjectUrl { get; }
20+
int DownloadCount { get; }
21+
bool RequireLicenseAcceptance { get; }
22+
bool DevelopmentDependency { get; }
23+
string Description { get; }
24+
string Summary { get; }
25+
string ReleaseNotes { get; }
26+
IEnumerable<PackageDependencySet> DependencySets { get; }
27+
string Copyright { get; }
28+
string Tags { get; }
29+
bool IsAbsoluteLatestVersion { get; }
30+
bool IsLatestVersion { get; }
31+
bool Listed { get; }
32+
Version MinClientVersion { get; }
33+
string Language { get; }
34+
long PackageSize { get; }
35+
string PackageHash { get; }
36+
string PackageHashAlgorithm { get; }
37+
string FullPath { get; }
38+
DateTimeOffset LastUpdated { get; }
39+
DateTimeOffset Created { get; }
40+
41+
IEnumerable<FrameworkName> GetSupportedFrameworks();
42+
}
43+
}
Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,34 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
2-
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Runtime.Versioning;
7+
38
namespace NuGet.Server.Core.Infrastructure
49
{
5-
public interface IServerPackageRepository
6-
: IServiceBasedRepository
10+
public interface IServerPackageRepository
711
{
12+
string Source { get; }
13+
14+
void AddPackage(IPackage package);
15+
16+
IQueryable<IServerPackage> GetPackages();
17+
18+
IEnumerable<IServerPackage> GetUpdates(
19+
IEnumerable<IPackageName> packages,
20+
bool includePrerelease,
21+
bool includeAllVersions,
22+
IEnumerable<FrameworkName> targetFrameworks,
23+
IEnumerable<IVersionSpec> versionConstraints);
24+
25+
IQueryable<IServerPackage> Search(
26+
string searchTerm,
27+
IEnumerable<string> targetFrameworks,
28+
bool allowPrereleaseVersions);
29+
830
void ClearCache();
31+
932
void RemovePackage(string packageId, SemanticVersion version);
1033
}
1134
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using NuGet.Shared;
7+
8+
namespace NuGet.Server.Core.Infrastructure
9+
{
10+
public class IdAndVersionEqualityComparer : IEqualityComparer<IServerPackage>
11+
{
12+
private static readonly IdAndVersionEqualityComparer _instance = new IdAndVersionEqualityComparer();
13+
public static IdAndVersionEqualityComparer Instance => _instance;
14+
15+
public bool Equals(IServerPackage x, IServerPackage y)
16+
{
17+
// If both are null or the same instance, this condition will be true.
18+
if (ReferenceEquals(x, y))
19+
{
20+
return true;
21+
}
22+
23+
if (x == null || y == null)
24+
{
25+
return false;
26+
}
27+
28+
return StringComparer.OrdinalIgnoreCase.Equals(x.Id, y.Id) &&
29+
x.Version == y.Version;
30+
}
31+
32+
public int GetHashCode(IServerPackage obj)
33+
{
34+
var combiner = new HashCodeCombiner();
35+
36+
combiner.AddStringIgnoreCase(obj.Id);
37+
combiner.AddObject(obj.Version);
38+
39+
return combiner.CombinedHash;
40+
}
41+
}
42+
}

src/NuGet.Server.Core/Infrastructure/PackageDerivedData.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ public PackageDerivedData()
1616
public string PackageHashAlgorithm { get; set; }
1717
public DateTimeOffset LastUpdated { get; set; }
1818
public DateTimeOffset Created { get; set; }
19-
public string Path { get; set; }
2019
public string FullPath { get; set; }
2120
}
2221
}

0 commit comments

Comments
 (0)