-
Notifications
You must be signed in to change notification settings - Fork 0
/
mavencentralapi.go
154 lines (126 loc) · 3.6 KB
/
mavencentralapi.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package mavencentralapi
import (
"encoding/json"
"encoding/xml"
"fmt"
"github.com/vifraa/gopom"
"io"
"net/http"
"strings"
)
type Client struct {
BaseURLSHASearch string
BaseURLBrowseArtifact string
BaseURLBrowseLibrary string
BasePOMName string
MetadataName string
}
func NewClient() *Client {
return &Client{
BaseURLSHASearch: "https://search.maven.org/solrsearch/select?q=1:%s&rows=20&wt=json",
BaseURLBrowseArtifact: "https://repo1.maven.org/maven2/%s/%s/%s/%s.%s",
BaseURLBrowseLibrary: "https://repo1.maven.org/maven2/%s/%s/%s.%s",
BasePOMName: "%s-%s",
MetadataName: "maven-metadata",
}
}
type MavenCentralSearch struct {
ResponseHeader struct {
Status int `json:"status"`
QTime int `json:"QTime"`
Params struct {
Q string `json:"q"`
Core string `json:"core"`
Indent string `json:"indent"`
Fl string `json:"fl"`
Start string `json:"start"`
Sort string `json:"sort"`
Rows string `json:"rows"`
Wt string `json:"wt"`
Version string `json:"version"`
} `json:"params"`
} `json:"responseHeader"`
Response struct {
NumFound int `json:"numFound"`
Start int `json:"start"`
Docs []struct {
ID string `json:"id"`
G string `json:"g"`
A string `json:"a"`
V string `json:"v"`
P string `json:"p"`
Timestamp int64 `json:"timestamp"`
Ec []string `json:"ec"`
Tags []string `json:"tags"`
} `json:"docs"`
} `json:"response"`
}
func (c *Client) SearchMavenCentralSHA1(sha1 string) (*MavenCentralSearch, error) {
url := fmt.Sprintf(c.BaseURLSHASearch, sha1)
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var j MavenCentralSearch
err = json.NewDecoder(resp.Body).Decode(&j)
if err != nil {
return nil, err
}
return &j, err
}
func (c *Client) GetArtifactPom(groupId, artifactId, version string) (*gopom.Project, error) {
extension := "pom"
groupId = strings.ReplaceAll(groupId, ".", "/")
artifactId = strings.ReplaceAll(artifactId, ".", "/")
url := fmt.Sprintf(c.BaseURLBrowseArtifact, groupId, artifactId, version, fmt.Sprintf(c.BasePOMName, artifactId, version), extension)
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
pomString := string(body)
var pom gopom.Project
err = xml.Unmarshal([]byte(pomString), &pom)
if err != nil {
return nil, err
}
return &pom, nil
}
type Metadata struct {
XMLName xml.Name `xml:"metadata"`
Text string `xml:",chardata"`
ModelVersion string `xml:"modelVersion,attr"`
GroupId string `xml:"groupId"`
ArtifactId string `xml:"artifactId"`
Versioning struct {
Text string `xml:",chardata"`
Latest string `xml:"latest"`
Release string `xml:"release"`
Versions struct {
Text string `xml:",chardata"`
Version []string `xml:"version"`
} `xml:"versions"`
LastUpdated string `xml:"lastUpdated"`
} `xml:"versioning"`
}
func (c *Client) GetLibraryMetadata(groupId, artifactId string) (*Metadata, error) {
extension := "xml"
groupId = strings.ReplaceAll(groupId, ".", "/")
artifactId = strings.ReplaceAll(artifactId, ".", "/")
url := fmt.Sprintf(c.BaseURLBrowseLibrary, groupId, artifactId, c.MetadataName, extension)
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
pomString := string(body)
var pom Metadata
err = xml.Unmarshal([]byte(pomString), &pom)
if err != nil {
return nil, err
}
return &pom, nil
}