2 * Copyright 2000-2011 JetBrains s.r.o.
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
17 package jetbrains.buildServer.nuget.server.feed.reader;
\r
19 import com.intellij.openapi.diagnostic.Logger;
\r
20 import com.intellij.openapi.util.Pair;
\r
21 import jetbrains.buildServer.util.FileUtil;
\r
22 import jetbrains.buildServer.util.XmlUtil;
\r
23 import org.apache.http.Header;
\r
24 import org.apache.http.HttpHeaders;
\r
25 import org.apache.http.HttpResponse;
\r
26 import org.apache.http.HttpStatus;
\r
27 import org.apache.http.client.methods.HttpGet;
\r
28 import org.apache.http.client.params.ClientPNames;
\r
29 import org.jdom.Element;
\r
30 import org.jdom.JDOMException;
\r
31 import org.jetbrains.annotations.NotNull;
\r
33 import java.io.IOException;
\r
34 import java.net.URISyntaxException;
\r
37 * Created by Eugene Petrenko (eugene.petrenko@gmail.com)
\r
38 * Date: 11.08.11 15:42
\r
40 public class NuGetFeedReader {
\r
41 private static final Logger LOG = Logger.getInstance(NuGetFeedReader.class.getName());
\r
42 private FeedClient myClient;
\r
44 public NuGetFeedReader(FeedClient client) {
\r
49 private Pair<String, HttpResponse> resolvePath(@NotNull String feedUrl) throws IOException {
\r
50 for(int _ = 100; _-->0;) {
\r
51 HttpGet ping = new HttpGet(feedUrl);
\r
52 ping.getParams().setBooleanParameter(ClientPNames.HANDLE_REDIRECTS, false);
\r
53 final HttpResponse execute = myClient.getClient().execute(ping);
\r
54 final int statusCode = execute.getStatusLine().getStatusCode();
\r
55 if (statusCode / 100 == 3) {
\r
56 final Header location = execute.getFirstHeader("Location");
\r
57 if (location != null) {
\r
58 feedUrl = location.getValue();
\r
62 if (statusCode != HttpStatus.SC_OK) {
\r
63 throw new IOException("Failed to connect to " + feedUrl);
\r
65 return Pair.create(feedUrl, execute);
\r
67 throw new IOException("Failed to resolve redirects");
\r
70 public void queryPackage(@NotNull String feedUrl,
\r
71 @NotNull String packageId) throws IOException, URISyntaxException {
\r
72 LOG.debug("Connecting to NuGet feed url: " + feedUrl);
\r
73 final Pair<String, HttpResponse> pair = resolvePath(feedUrl);
\r
74 feedUrl = pair.first;
\r
75 LOG.debug("Resolved NuGet feed URL to " + feedUrl);
\r
76 final Element element = toDocument(pair.second);
\r
78 LOG.debug("Recieved xml: " + XmlUtil.to_s(element));
\r
79 HttpGet get = new HttpGet(feedUrl + "/Packages()?$filter=Id%20eq%20'" + packageId +"'");
\r
80 get.setHeader(HttpHeaders.ACCEPT_ENCODING, "application/atom+xml");
\r
81 final HttpResponse execute = myClient.getClient().execute(get);
\r
83 System.out.println(execute);
\r
84 execute.getEntity().writeTo(System.out);
\r
87 private Element toDocument(HttpResponse response) throws IOException {
\r
89 return FileUtil.parseDocument(response.getEntity().getContent(), false);
\r
90 } catch (final JDOMException e) {
\r
91 throw new IOException("Failed to parse xml document. " + e.getMessage()) {{
\r