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.impl;
\r
19 import com.intellij.openapi.diagnostic.Logger;
\r
20 import com.intellij.openapi.util.Pair;
\r
21 import jetbrains.buildServer.nuget.server.feed.reader.*;
\r
22 import jetbrains.buildServer.util.FileUtil;
\r
23 import jetbrains.buildServer.util.XmlUtil;
\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.StatusLine;
\r
28 import org.apache.http.client.methods.HttpGet;
\r
29 import org.jdom.Element;
\r
30 import org.jdom.JDOMException;
\r
31 import org.jetbrains.annotations.NotNull;
\r
34 import java.util.Collection;
\r
37 * Created by Eugene Petrenko (eugene.petrenko@gmail.com)
\r
38 * Date: 11.08.11 15:42
\r
40 public class NuGetFeedReaderImpl implements NuGetFeedReader {
\r
41 private static final Logger LOG = Logger.getInstance(NuGetFeedReader.class.getName());
\r
42 private final FeedClient myClient;
\r
43 private final UrlResolver myResolver;
\r
44 private final FeedGetMethodFactory myMethodFactory;
\r
45 private final PackagesFeedParser myParser;
\r
47 public NuGetFeedReaderImpl(@NotNull final FeedClient client,
\r
48 @NotNull final UrlResolver resolver,
\r
49 @NotNull final FeedGetMethodFactory methodFactory,
\r
50 @NotNull final PackagesFeedParser parser) {
\r
52 myResolver = resolver;
\r
53 myMethodFactory = methodFactory;
\r
58 public Collection<FeedPackage> queryPackageVersions(@NotNull String feedUrl,
\r
59 @NotNull String packageId) throws IOException {
\r
60 LOG.debug("Connecting to NuGet feed url: " + feedUrl);
\r
61 final Pair<String, HttpResponse> pair = myResolver.resolvePath(feedUrl);
\r
62 feedUrl = pair.first;
\r
63 LOG.debug("Resolved NuGet feed URL to " + feedUrl);
\r
64 final Element element = toDocument(pair.second);
\r
65 LOG.debug("Recieved xml: " + XmlUtil.to_s(element));
\r
67 final HttpGet get = myMethodFactory.createGet(feedUrl + "/Packages()",
\r
68 new Param("$filter", "Id eq '" + packageId + "'")
\r
70 get.setHeader(HttpHeaders.ACCEPT_ENCODING, "application/atom+xml");
\r
72 LOG.debug("Query for packages: " + get.getURI());
\r
74 final HttpResponse execute = myClient.execute(get);
\r
75 return myParser.readPackages(toDocument(execute));
\r
78 public void downloadPackage(@NotNull FeedPackage pkg, @NotNull File file) throws IOException {
\r
79 FileUtil.createParentDirs(file);
\r
80 final String url = pkg.getDownloadUrl();
\r
82 final HttpGet get = myMethodFactory.createGet(url);
\r
83 final HttpResponse resp = myClient.execute(get);
\r
84 final StatusLine statusLine = resp.getStatusLine();
\r
85 if (statusLine.getStatusCode() != HttpStatus.SC_OK) {
\r
86 throw new IOException("Failed to download package " + pkg + ". Server returned " + statusLine);
\r
89 OutputStream os = null;
\r
91 os = new BufferedOutputStream(new FileOutputStream(file));
\r
92 resp.getEntity().writeTo(os);
\r
93 } catch (final IOException e) {
\r
94 throw new IOException("Failed to download package " + pkg + ". " + e.getMessage()) {{ initCause(e); }};
\r
100 private Element toDocument(HttpResponse response) throws IOException {
\r
102 return FileUtil.parseDocument(response.getEntity().getContent(), false);
\r
103 } catch (final JDOMException e) {
\r
104 throw new IOException("Failed to parse xml document. " + e.getMessage()) {{
\r