From f86f621808e8e51c6d1ab713b8663219a28f7bf3 Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Thu, 16 Feb 2012 21:26:48 +0000 Subject: [PATCH] [MRM-1573] start work on browse screen navigate on groupIds. git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1245184 13f79535-47bb-0310-9956-ffa450edef68 --- .../rest/api/model/BrowseGroupIdEntry.java | 71 +++++++++++++++++++ .../rest/api/model/BrowseGroupIdResult.java | 53 ++++++++++++++ .../rest/api/services/BrowseService.java | 10 ++- .../rest/services/DefaultBrowseService.java | 66 ++++++++++++++++- .../src/main/webapp/js/archiva/search.js | 20 +++++- .../webapp/js/archiva/templates/search.html | 8 ++- .../archiva/web/action/BrowseAction.java | 4 +- 7 files changed, 223 insertions(+), 9 deletions(-) create mode 100644 archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/model/BrowseGroupIdEntry.java create mode 100644 archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/model/BrowseGroupIdResult.java diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/model/BrowseGroupIdEntry.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/model/BrowseGroupIdEntry.java new file mode 100644 index 000000000..32c64f738 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/model/BrowseGroupIdEntry.java @@ -0,0 +1,71 @@ +package org.apache.archiva.rest.api.model; +/* + * 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. + */ + +import javax.xml.bind.annotation.XmlRootElement; + +/** + * @author Olivier Lamy + * @since 1.4-M3 + */ +@XmlRootElement( name = "browseGroupIdEntry" ) +public class BrowseGroupIdEntry + implements Comparable +{ + + private String name; + + private boolean project; + + public BrowseGroupIdEntry() + { + // no op + } + + public BrowseGroupIdEntry( String name, boolean project ) + { + this.name = name; + this.project = project; + } + + public String getName() + { + return name; + } + + public void setName( String name ) + { + this.name = name; + } + + public boolean isProject() + { + return project; + } + + public void setProject( boolean project ) + { + this.project = project; + } + + public int compareTo( BrowseGroupIdEntry browseGroupIdEntry ) + { + return this.name.compareTo( browseGroupIdEntry.name ); + } +} diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/model/BrowseGroupIdResult.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/model/BrowseGroupIdResult.java new file mode 100644 index 000000000..309daf37c --- /dev/null +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/model/BrowseGroupIdResult.java @@ -0,0 +1,53 @@ +package org.apache.archiva.rest.api.model; +/* + * 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. + */ + +import javax.xml.bind.annotation.XmlRootElement; +import java.util.Collections; +import java.util.List; + +/** + * @author Olivier Lamy + * @since 1.4-M3 + */ +@XmlRootElement( name = "browseGroupIdResult" ) +public class BrowseGroupIdResult +{ + private List browseGroupIdEntries; + + public BrowseGroupIdResult() + { + // no op + } + + public BrowseGroupIdResult( List browseGroupIdEntries ) + { + // no op + } + + public List getBrowseGroupIdEntries() + { + return browseGroupIdEntries == null ? Collections.emptyList() : browseGroupIdEntries; + } + + public void setBrowseGroupIdEntries( List browseGroupIdEntries ) + { + this.browseGroupIdEntries = browseGroupIdEntries; + } +} diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java index 9e6b85423..a1fd181f6 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java @@ -18,14 +18,15 @@ package org.apache.archiva.rest.api.services; * under the License. */ +import org.apache.archiva.rest.api.model.BrowseGroupIdResult; import org.apache.archiva.rest.api.model.GroupIdList; import org.codehaus.plexus.redback.authorization.RedbackAuthorization; import javax.ws.rs.GET; import javax.ws.rs.Path; +import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; -import java.util.List; /** * @author Olivier Lamy @@ -40,4 +41,11 @@ public interface BrowseService @RedbackAuthorization( noRestriction = true, noPermission = false ) GroupIdList getRootGroups() throws ArchivaRestServiceException; + + @Path( "browseGroupId/{groupId}" ) + @GET + @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } ) + @RedbackAuthorization( noRestriction = true, noPermission = false ) + BrowseGroupIdResult browseGroupId(@PathParam( "groupId" ) String groupId ) + throws ArchivaRestServiceException; } diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java index c83b9f19c..7bee58a43 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java @@ -21,6 +21,8 @@ package org.apache.archiva.rest.services; import org.apache.archiva.metadata.repository.MetadataResolutionException; import org.apache.archiva.metadata.repository.MetadataResolver; import org.apache.archiva.metadata.repository.RepositorySession; +import org.apache.archiva.rest.api.model.BrowseGroupIdEntry; +import org.apache.archiva.rest.api.model.BrowseGroupIdResult; import org.apache.archiva.rest.api.model.GroupIdList; import org.apache.archiva.rest.api.services.ArchivaRestServiceException; import org.apache.archiva.rest.api.services.BrowseService; @@ -90,7 +92,69 @@ public class DefaultBrowseService return new GroupIdList( getSortedList( namespaces ) ); } - //--------------------------- + public BrowseGroupIdResult browseGroupId( String groupId ) + throws ArchivaRestServiceException + { + + List selectedRepos = getObservableRepos(); + if ( CollectionUtils.isEmpty( selectedRepos ) ) + { + // FIXME 403 ??? + return new BrowseGroupIdResult(); + } + + Set projects = new LinkedHashSet(); + + RepositorySession repositorySession = repositorySessionFactory.createSession(); + Set namespaces; + try + { + MetadataResolver metadataResolver = repositorySession.getResolver(); + + Set namespacesToCollapse = new LinkedHashSet(); + for ( String repoId : selectedRepos ) + { + namespacesToCollapse.addAll( metadataResolver.resolveNamespaces( repositorySession, repoId, groupId ) ); + + projects.addAll( metadataResolver.resolveProjects( repositorySession, repoId, groupId ) ); + } + + // TODO: this logic should be optional, particularly remembering we want to keep this code simple + // it is located here to avoid the content repository implementation needing to do too much for what + // is essentially presentation code + namespaces = new LinkedHashSet(); + for ( String n : namespacesToCollapse ) + { + // TODO: check performance of this + namespaces.add( + collapseNamespaces( repositorySession, metadataResolver, selectedRepos, groupId + "." + n ) ); + } + } + catch ( MetadataResolutionException e ) + { + throw new ArchivaRestServiceException( e.getMessage(), + Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() ); + } + finally + { + repositorySession.close(); + } + List browseGroupIdEntries = + new ArrayList( namespaces.size() + projects.size() ); + for ( String namespace : namespaces ) + { + browseGroupIdEntries.add( new BrowseGroupIdEntry( namespace, false ) ); + } + for ( String project : projects ) + { + browseGroupIdEntries.add( new BrowseGroupIdEntry( project, true ) ); + } + Collections.sort( browseGroupIdEntries ); + return new BrowseGroupIdResult( browseGroupIdEntries ); + + } + +//--------------------------- // internals //--------------------------- diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/search.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/search.js index 4d55519c4..4a7744369 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/search.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/search.js @@ -21,12 +21,28 @@ $(function() { BrowseTopViewModel=function(groupIds){ this.groupIds=groupIds; + displayGroupDetail=function(groupId){ + $.log("groupId:"+groupId); + $.ajax("restServices/archivaServices/browseService/browseGroupId/"+encodeURIComponent(groupId), { + type: "GET", + dataType: 'json', + success: function(data) { + var groupdIds = $.map(data.groupIdList.groupIds,function(item){ + return item; + }); + $.log("size:"+groupdIds.length); + //var browseTopViewModel = new BrowseTopViewModel(groupdIds); + //ko.applyBindings(browseTopViewModel,mainContent.find("#browse_result" ).get(0)); + } + }); + } } displayBrowse=function(){ var mainContent = $("#main-content"); - mainContent.html(mediumSpinnerImg()); + mainContent.html($("#browse-tmpl" ).tmpl()); + mainContent.find("#browse_result").html(mediumSpinnerImg()); $.ajax("restServices/archivaServices/browseService/rootGroups", { type: "GET", dataType: 'json', @@ -36,7 +52,7 @@ $(function() { }); $.log("size:"+groupdIds.length); var browseTopViewModel = new BrowseTopViewModel(groupdIds); - mainContent.html($("#browse-tmpl" ).tmpl()); + ko.applyBindings(browseTopViewModel,mainContent.find("#browse_result" ).get(0)); } }); diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/templates/search.html b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/templates/search.html index 7443fcd20..d6b050ad6 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/templates/search.html +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/templates/search.html @@ -23,16 +23,18 @@

${$.i18n.prop('browse.groups')}

-
+