Author: maartenc Date: Sun Mar 14 22:52:00 2010 New Revision: 922994 URL: http://svn.apache.org/viewvc?rev=922994&view=rev Log: FIX: ApacheURLLister does not allow directories not containing a dot on Artifactory (IVY-1175) (thanks to Anders Jacobsson)
Added: ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/ArtifactoryListingTest.java (with props) ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/artifactory-dir-listing.html (with props) Modified: ant/ivy/core/trunk/CHANGES.txt ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/ApacheURLLister.java ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/ApacheURLListerTest.java Modified: ant/ivy/core/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=922994&r1=922993&r2=922994&view=diff ============================================================================== --- ant/ivy/core/trunk/CHANGES.txt (original) +++ ant/ivy/core/trunk/CHANGES.txt Sun Mar 14 22:52:00 2010 @@ -49,6 +49,7 @@ for detailed view of each issue, please Scott Hebert Achim Huegen Matt Inger + Anders Jacobsson Anders Janmyr Steve Jones Christer Jonsson @@ -115,6 +116,7 @@ for detailed view of each issue, please - IMPROVEMENT: Trace a message when a property file referenced from the settings doesn't exixts (IVY-1074) - IMPROVEMENT: use defaultconf in combination with defaultconfmapping (IVY-1135) (thanks to Jon Schneider) +- FIX: ApacheURLLister does not allow directories not containing a dot on Artifactory (IVY-1175) (thanks to Anders Jacobsson) - FIX: artifact-lock strategy could hang Ivy when resolving dynamic revisions - FIX: Authentication won't work in some situations (IVY-1168) (thanks to Sven Walter) - FIX: Using SFTP resolver with full pattern URL prevents use of dynamic versions (IVY-1167) (thanks to Gregory Fernandez) Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/ApacheURLLister.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/ApacheURLLister.java?rev=922994&r1=922993&r2=922994&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/ApacheURLLister.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/ApacheURLLister.java Sun Mar 14 22:52:00 2010 @@ -159,14 +159,19 @@ public class ApacheURLLister { // exclude those where they do not match // href will never be truncated, text may be truncated by apache - // may have a '.' from either the extension (.jar) or "..>" - int dotIndex = text.indexOf('.'); - - if (((dotIndex != -1) && !href.startsWith(text.substring(0, dotIndex))) - || ((dotIndex == -1) - && !href.toLowerCase(Locale.US).equals(text.toLowerCase(Locale.US)))) { - // the href and the text do not "match" - continue; + if (text.endsWith("..>")) { + // text is probably truncated, we can only check if the href starts with text + if (!href.startsWith(text.substring(0, text.length() - 3))) { + continue; + } + } else { + // text is not truncated, so it must match the url after stripping optional + // trailing slashes + String strippedHref = href.endsWith("/") ? href.substring(0, href.length() - 1) : href; + String strippedText = text.endsWith("/") ? text.substring(0, text.length() - 1) : text; + if (!strippedHref.equalsIgnoreCase(strippedText)) { + continue; + } } boolean directory = href.endsWith("/"); Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/ApacheURLListerTest.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/ApacheURLListerTest.java?rev=922994&r1=922993&r2=922994&view=diff ============================================================================== --- ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/ApacheURLListerTest.java (original) +++ ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/ApacheURLListerTest.java Sun Mar 14 22:52:00 2010 @@ -70,7 +70,16 @@ public class ApacheURLListerTest extends assertNotNull(files); assertTrue(files.size() > 0); } + + public void testRetrieveArtifactoryListing() throws Exception { + ApacheURLLister lister = new ApacheURLLister(); + List files = lister.retrieveListing(ApacheURLListerTest.class + .getResource("artifactory-dir-listing.html"), true, true); + assertNotNull(files); + assertEquals(1, files.size()); + } + public void testRetrieveArchivaListing() throws Exception { ApacheURLLister lister = new ApacheURLLister(); Added: ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/ArtifactoryListingTest.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/ArtifactoryListingTest.java?rev=922994&view=auto ============================================================================== --- ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/ArtifactoryListingTest.java (added) +++ ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/ArtifactoryListingTest.java Sun Mar 14 22:52:00 2010 @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.ivy.util.url; + +import java.net.URL; +import java.util.List; + +import junit.framework.TestCase; + +public class ArtifactoryListingTest extends TestCase { + // remote.test + + public void testWicketListing() throws Exception { + ApacheURLLister lister = new ApacheURLLister(); + + List content = lister.listAll(new URL("http://repo.jfrog.org/artifactory/libs-releases-local/org/apache/wicket/wicket/")); + assertNotNull(content); + assertEquals(2, content.size()); + } +} Propchange: ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/ArtifactoryListingTest.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/artifactory-dir-listing.html URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/artifactory-dir-listing.html?rev=922994&view=auto ============================================================================== --- ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/artifactory-dir-listing.html (added) +++ ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/artifactory-dir-listing.html Sun Mar 14 22:52:00 2010 @@ -0,0 +1,428 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<html class="Win32 FF FF-3.6 Moz Moz-5" +xmlns:wicket="http://wicket.sourceforge.net/" +xmlns="http://www.w3.org/1999/xhtml"><head> + + + +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> +<link rel="icon" type="image/x-icon" +href="http://localhost:8081/artifactory/favicon.ico"> +<link rel="shortcut icon" type="image/x-icon" +href="http://localhost:8081/artifactory/favicon.ico"> +<title>artifact...@ev001a4b5729ca :: Repository Browser</title> +<meta content="10024" name="revision"> + +<script type="text/javascript"><!--/*--><![CDATA[/*><!--*/ +var djConfig = { +isDebug: false, +parseOnLoad: false, +debugAtAllCosts: false, +excludeNamespace: ['wicket'] +}; +/*-->]]>*/</script> + +<script type="text/javascript" src="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/dojo.js"></script> +<script type="text/javascript" src="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/artifactory-dojo.js"></script> +<link rel="stylesheet" type="text/css" +href="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/dojo.css"> +<link rel="stylesheet" type="text/css" +href="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/tundra.css"> +<script type="text/javascript" src="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/DomUtils.js"></script> +<script type="text/javascript" src="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/AjaxIndicator.js"></script> +<link rel="stylesheet" type="text/css" +href="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/GreenSkin.css"> +<script type="text/javascript" src="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/AggregateFeedbackPanel.js"></script> +<script type="text/javascript" src="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/FeedbackDistributer.js"></script> +<script type="text/javascript" src="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/wicket-event.js"></script> +<script type="text/javascript" src="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/wicket-ajax.js"></script> +<script type="text/javascript" src="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/modal.js"></script> +<link rel="stylesheet" type="text/css" +href="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/modal.css"> +<script type="text/javascript" src="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/ModalHandler.js"></script> +<script type="text/javascript" src="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/SubMenuPanel.js"></script> +<script type="text/javascript"><!--/*--><![CDATA[/*><!--*/ +var artApp = '/artifactory' +/*-->]]>*/</script> + +<script type="text/javascript" src="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/TooltipBehavior.js"></script> +<script type="text/javascript" src="artifact...@ev001a4b5729ca%20%20%20repository%20browser_files/AddonNeededBehavior.js"></script> +</head><body class="tundra"> +<table class="page" cellpadding="0" cellspacing="0"> +<tbody><tr> +<td class="main"> +<div class="header"> +<div class="spacer"> +<div id="id7d" class="app-logo"> +<a title="Artifactory" class=" artifactory-logo" +href="http://localhost:8081/artifactory/webapp/home.html"> + +<span class="none">Artifactory</span> + + +</a> +</div> +<div class="top-menu"> +<ul> +<li class="HomePage menu-group menu-group-enabled"> +<a class="enabled" +href="http://localhost:8081/artifactory/webapp/home.html"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">Home</span> +</a> +</li><li class="BrowseRepoPage menu-group menu-group-opened"> +<a class="opened" +href="http://localhost:8081/artifactory/webapp/browserepo.html"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">Artifacts</span> +</a> +</li><li class="DeployArtifactPage menu-group menu-group-enabled"> +<a class="enabled" +href="http://localhost:8081/artifactory/webapp/deployartifact.html"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">Deploy</span> +</a> +</li><li class="AdminPage menu-group menu-group-enabled"> +<a class="enabled" +href="http://localhost:8081/artifactory/webapp/admin.html"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">Admin</span> +</a> +</li> +</ul> +</div> +<div class="quick-search-box"> +<form id="id7e" +action="../../../webapp/?wicket:interface=:4:searchForm::IFormSubmitListener::" + method="post"><div style="display: none;"><input name="id7e_hf_0" +id="id7e_hf_0" type="hidden"></div><div style="width: 0px; height: 0px; +position: absolute; left: -100px; top: -100px; overflow: hidden;"><input + autocomplete="false" type="text"><input name="searchButton" onclick=" +var b=document.getElementById('id7f'); if +(b!=null&&b.onclick!=null&&typeof(b.onclick) != +'undefined') { var r = b.onclick.bind(b)(); if (r != false) b.click(); } + else { b.click(); }; return false;" type="submit"></div> +<span class="search-box"> +<input name="query" type="text"> +</span> +<button id="id7f" name="searchButton" onclick="var +wcall=wicketSubmitFormById('id7e', +'../../../webapp/?wicket:interface=:4:searchForm:searchButton::IActivePageBehaviorListener:0:2&wicket:ignoreIfNotActive=true', + 'searchButton' ,null,null, function() {return +Wicket.$$(this)&&Wicket.$$('id7e')}.bind(this));return !wcall;;" + class=" button" type="submit"><span class="button-center"><span +class="button-left"><span class="button-right">Search</span></span></span></button> +</form> +</div> +<div class="user-info"> +<span>Logged in as</span> +<a class="profileLink button" +href="http://localhost:8081/artifactory/webapp/profile.html">admin</a> +<span> | </span> +<a class=" button" +href="http://localhost:8081/artifactory/webapp/logout.html">Log Out</a> + +</div> +</div> +</div> +<div id="id80" class="aggregate-feedback default-feedback" +onshow="AggregateFeedbackPanel.onShow('id80')" +onclear="AggregateFeedbackPanel.onClear('id80')"></div> +<div class="main"> + +<div class="side-menu"> +<div class="side-menu-top"> +<div class="side-menu-bottom"> +<div id="id81"> +<ul class="menu-items"> +<li class="menu-group menu-group-opened"> +<a class="opened" onclick="return SubMenuPanel.toogleMenu('menu.1.0', +this);" href="#"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">Browse</span> +</a> +</li><li id="id82" class="sub-menu-opened"> +<ul class="menu-items"> +<li class="BrowseRepoPage menu-item menu-item-enabled"> +<a class="enabled" +href="http://localhost:8081/artifactory/webapp/browserepo.html"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">Tree Browser</span> +</a> +</li><li class="SimpleBrowserRootPage menu-item menu-item-selected"> +<a class="selected" +href="http://localhost:8081/artifactory/webapp/simplebrowserroot.html"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">Simple Browser</span> +</a> +</li><li id="id83" class="menu-item menu-item-disabled disabled-addon"><span + class="addon-icon"></span> +<a class="disabled" onclick="return false;" href="#"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">Search Results</span> +</a> +</li> + +<span class="dijitTooltipData" widgetid="id83_bubble" id="id83_bubble" +dojotype="artifactory.Tooltip" connectid="id83" showdelay="0" +toggle="fade" toggleduration="200" style="display: none;"> + <a class="addon-link addon-search" +href="http://store.artifactoryonline.com/addons#search" target="_blank">Learn + more about the Smart Searches add-on...</a> + + <a id="id83_hide" class="hide-link" href="#" onclick="return +DisabledAddon.toogle(this, 'id83', '1267546487543', 'search');"> + Don't show me again. + </a> +</span> + +<script type="text/javascript"> + DomUtils.addOnRender(function () { + DisabledAddon.create('id83'); + }); +</script> +<li class="BuildBrowserRootPage menu-item menu-item-enabled"> +<a class="enabled" +href="http://localhost:8081/artifactory/webapp/builds/"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">Builds</span> +</a> +</li> +</ul> +</li><li class="menu-group menu-group-opened"> +<a class="opened" onclick="return SubMenuPanel.toogleMenu('menu.1.1', +this);" href="#"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">Search</span> +</a> +</li><li id="id84" class="sub-menu-opened"> +<ul class="menu-items"> +<li class="ArtifactSearchPage menu-item menu-item-enabled"> +<a class="enabled" +href="http://localhost:8081/artifactory/webapp/artifactsearch.html"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">Quick Search</span> +</a> +</li><li class="ArchiveSearchPage menu-item menu-item-enabled"> +<a class="enabled" +href="http://localhost:8081/artifactory/webapp/archivesearch.html"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">Class Search</span> +</a> +</li><li class="GavcSearchPage menu-item menu-item-enabled"> +<a class="enabled" +href="http://localhost:8081/artifactory/webapp/gavcsearch.html"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">GAVC Search</span> +</a> +</li><li id="id85" class="menu-item menu-item-disabled disabled-addon"><span + class="addon-icon"></span> +<a class="disabled" onclick="return false;" href="#"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">Property Search</span> +</a> +</li> + +<span class="dijitTooltipData" widgetid="id85_bubble" id="id85_bubble" +dojotype="artifactory.Tooltip" connectid="id85" showdelay="0" +toggle="fade" toggleduration="200" style="display: none;"> + <a class="addon-link addon-properties" +href="http://store.artifactoryonline.com/addons#properties" +target="_blank">Learn more about the Properties add-on...</a> + + <a id="id85_hide" class="hide-link" href="#" onclick="return +DisabledAddon.toogle(this, 'id85', '1267546487543', 'properties');"> + Don't show me again. + </a> +</span> + +<script type="text/javascript"> + DomUtils.addOnRender(function () { + DisabledAddon.create('id85'); + }); +</script> +<li class="MetadataSearchPage menu-item menu-item-enabled"> +<a class="enabled" +href="http://localhost:8081/artifactory/webapp/metadatasearch.html"> +<span class="menu-center"></span> +<span class="menu-left"></span> +<span class="menu-right"></span> +<span class="item-name">POM/XML Search</span> +</a> +</li> +</ul> +</li> +</ul> +</div> +</div> +</div> +</div> +<div class="page-content"> +<div class="outer-border-wrapper"> +<div class="outer-border-top"> +<div class="outer-border-bottom"> +<div class="outer-border-left"> +<div class="outer-border-right"> +<div class="outer-border-top-left"> +<div class="outer-border-top-right"> +<div class="outer-border-bottom-left"> +<div class="outer-border-bottom-right"> +<h1 class="outer-border-title">Repository Browser</h1> +<div class="outer-border-content"> + +<div id="id86"> +<div class="border-wrapper"> +<div class="border-top"> +<div class="border-left"> +<div class="border-right"> +<div class="border-top-left"> +<div class="border-top-right"> +<div class="border-bottom"> +<div class="border-bottom-left"> +<div class="border-bottom-right"> +<h2 class="border-title"> + + +</h2> +<div class="border-content"> + +<div class="bread-crumbs"> +<span class="crumb"> +<a href="http://localhost:8081/artifactory/libs-snapshots-local/">libs-snapshots-local</a> +: +</span><span class="crumb"> +<a +href="http://localhost:8081/artifactory/libs-snapshots-local/com.bla.bla.scf/">com.bla.bla.scf</a> +/ +</span><span class="crumb"> +<a +href="http://localhost:8081/artifactory/libs-snapshots-local/com.bla.bla.scf/a2/">a2</a> +/ +</span> +<div class="clear"></div> +</div> +<div class="local-repos-list"> +<div> +<a class="icon-link folder" +href="http://localhost:8081/artifactory/libs-snapshots-local/com.bla.bla.scf/">..</a> +</div><div> +<a class="icon-link folder" +href="R1A-SNAPSHOT/">R1A-SNAPSHOT</a> +</div> +</div> + +<div class="clear"></div> +</div> +</div> +</div> +</div> +</div> +</div> +</div> +</div> +</div> +</div> +</div> + +</div> +</div> +</div> +</div> +</div> +</div> +</div> +</div> +</div> +</div> +</div> + +</div> +</td> +</tr> +<tr> +<td class="footer"> +<div class="footer"> +<p class="copywrites"> +<span>© Copyright 2010</span> +<a href="http://www.jfrog.org/">JFrog Ltd.</a> +<span id="id87" name="footer"></span> +</p> +<p class="version">Artifactory 2.2.1 (rev. 10024)</p> +</div> +</td> +</tr> +</tbody></table><div widgetid="dijit__MasterTooltip_0" +class="dijitTooltip dijitTooltipLeft" id="dijit__MasterTooltip_0"> + <div role="alert" class="dijitTooltipContainer dijitTooltipContents" +dojoattachpoint="containerNode" wairole="alert"></div> + <div class="dijitTooltipConnector"></div> +<iframe tabindex="-1" style="opacity: 0.1; width: 100%; height: 100%;" +class="dijitBackgroundIframe" src='javascript:""'></iframe></div> +<div id="id88" style="display: none;"> + +</div> +<div id="id89"> +<script type="text/javascript">(function(fd) { +fd.init('id80'); +fd.showMessages(); +})(FeedbackDistributer); +</script> +</div> +<div id="ajaxIndicatorContainer" class="ajax-indicator"> + +<iframe src="javascript:;"></iframe> + +<div id="ajaxIndicator"> +<div class="ajax-indicator-bg"></div> +<div id="ajaxIndicatorMessage" class="ajax-indicator-message"> +<span>Loading...</span> +</div> +</div> +</div> +</body></html> Propchange: ant/ivy/core/trunk/test/java/org/apache/ivy/util/url/artifactory-dir-listing.html ------------------------------------------------------------------------------ svn:mime-type = text/plain