Author: oching
Date: Fri Feb 13 11:25:47 2009
New Revision: 744080

URL: http://svn.apache.org/viewvc?rev=744080&view=rev
Log:
[MRM-1043]
o moved the advanced search to the quick search page
o dynamically add search criteria
o added additional test in SearchAction

Modified:
    
archiva/trunk/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/src/main/java/org/apache/archiva/consumers/lucene/NexusIndexerConsumer.java
    
archiva/trunk/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/quickSearch.jsp
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/results.jsp
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/SearchActionTest.java

Modified: 
archiva/trunk/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/src/main/java/org/apache/archiva/consumers/lucene/NexusIndexerConsumer.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/src/main/java/org/apache/archiva/consumers/lucene/NexusIndexerConsumer.java?rev=744080&r1=744079&r2=744080&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/src/main/java/org/apache/archiva/consumers/lucene/NexusIndexerConsumer.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/src/main/java/org/apache/archiva/consumers/lucene/NexusIndexerConsumer.java
 Fri Feb 13 11:25:47 2009
@@ -57,11 +57,11 @@
 {
     private static final Logger log = LoggerFactory.getLogger( 
NexusIndexerConsumer.class );
 
-    private final NexusIndexer indexer;
+    private NexusIndexer indexer;
 
-    private final ArtifactContextProducer artifactContextProducer;
+    private ArtifactContextProducer artifactContextProducer;
 
-    private final IndexPacker indexPacker;
+    private IndexPacker indexPacker;
 
     private ManagedDefaultRepositoryContent repositoryContent;
 

Modified: 
archiva/trunk/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java?rev=744080&r1=744079&r2=744080&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java
 Fri Feb 13 11:25:47 2009
@@ -425,4 +425,5 @@
         assertFalse( new File( getBasedir(), "/target/test-classes/" + 
TEST_REPO_2 + "/.indexer" ).exists() );
     }
 
+    // TODO: add test when an existing index already exists
 }

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java?rev=744080&r1=744079&r2=744080&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java
 Fri Feb 13 11:25:47 2009
@@ -22,6 +22,7 @@
 import java.net.MalformedURLException;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -60,7 +61,7 @@
  *
  * @plexus.component role="com.opensymphony.xwork2.Action" 
role-hint="searchAction"
  */
-public class SearchAction
+public class SearchAction 
     extends PlexusActionSupport
     implements Preparable
 {
@@ -131,6 +132,8 @@
     private boolean fromResultsPage;
 
     private RepositorySearch nexusSearch;
+    
+    private Map<String, String> searchFields;
         
     public boolean isFromResultsPage()
     {
@@ -161,16 +164,49 @@
         {
             managedRepositoryList.add( "all" );
         }
+        
+        searchFields = new HashMap<String, String>();
+        searchFields.put( "groupId", "Group ID" );
+        searchFields.put( "artifactId", "Artifact ID" );
+        searchFields.put( "version", "Version" );
+        searchFields.put( "className", "Class/Package Name" ); 
+        searchFields.put( "repositoryId", "Repository" );
+        
+        super.clearErrorsAndMessages();       
+        clearSearchFields();
+    }
+    
+    private void clearSearchFields()
+    {
+        repositoryId = "";
+        artifactId = "";
+        groupId = "";
+        version = "";
+        className = "";     
+        currentPage = 0;
     }
 
     // advanced search MRM-90 -- filtered search
     public String filteredSearch()
         throws MalformedURLException, RepositoryIndexException, 
RepositoryIndexSearchException
-    {
+    {   
+        // TODO: 
+        // - repositories must be provided as a select box instead of as a 
textfield!
+        // - what about the row count?
+        // - remove advancedSearch.jsp
+        
+        if ( ( groupId == null || "".equals( groupId ) ) &&
+            ( artifactId == null || "".equals( artifactId ) ) && ( className 
== null || "".equals( className ) ) &&
+            ( version == null || "".equals( version ) ) )
+        {   
+            addActionError( "Advanced Search - At least one search criteria 
must be provided." );
+            return INPUT;
+        }
+        
         fromFilterSearch = true;
-
+        
         if ( CollectionUtils.isEmpty( managedRepositoryList ) )
-        {
+        {            
             return GlobalResults.ACCESS_TO_NO_REPOS;
         }
 
@@ -178,22 +214,24 @@
 
         limits.setPageSize( rowCount );
         List<String> selectedRepos = new ArrayList<String>();
-
-        if ( repositoryId.equals( "all" ) )
+        
+        if ( repositoryId == null || StringUtils.isBlank( repositoryId ) ||
+            "all".equals( StringUtils.stripToEmpty( repositoryId ) ) )
         {
             selectedRepos = getObservableRepos();
         }
         else
         {
             selectedRepos.add( repositoryId );
-        }
+        }        
 
         if ( CollectionUtils.isEmpty( selectedRepos ) )
-        {
+        {         
             return GlobalResults.ACCESS_TO_NO_REPOS;
         }
 
-        SearchFields searchFields = new SearchFields( groupId, artifactId, 
version, null, className, selectedRepos );
+        SearchFields searchFields =
+            new SearchFields( groupId, artifactId, version, null, className, 
selectedRepos );
                 
         // TODO: add packaging in the list of fields for advanced search (UI)?
         try
@@ -641,4 +679,14 @@
     {
         this.archivaXworkUser = archivaXworkUser;
     }
+
+    public Map<String, String> getSearchFields()
+    {
+        return searchFields;
+    }
+
+    public void setSearchFields( Map<String, String> searchFields )
+    {
+        this.searchFields = searchFields;
+    }
 }

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml?rev=744080&r1=744079&r2=744080&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml
 Fri Feb 13 11:25:47 2009
@@ -147,7 +147,7 @@
     </action>
 
     <action name="filteredSearch" class="searchAction" method="filteredSearch">
-      <result name="input">/WEB-INF/jsp/advancedSearch.jsp</result>
+      <result name="input">/WEB-INF/jsp/quickSearch.jsp</result>
       <result>/WEB-INF/jsp/results.jsp</result>
       <result name="error">/WEB-INF/jsp/quickSearch.jsp</result>
     </action>

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/quickSearch.jsp
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/quickSearch.jsp?rev=744080&r1=744079&r2=744080&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/quickSearch.jsp
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/quickSearch.jsp
 Fri Feb 13 11:25:47 2009
@@ -25,6 +25,35 @@
 <head>
   <title>Quick Search</title>
   <s:head/>
+  <script type="text/javascript">  
+    function addSearchField(fieldText, field, divName)
+    {     
+      var element = document.getElementById( field );
+      if( element != null )
+      {
+        alert( "Cannot add field! Field has already been added." );
+        return 0;
+      }
+
+      var table = document.getElementById( "dynamicTable" );
+      var row = document.createElement( "TR" );
+      var label = document.createElement("TD");
+      label.innerHTML = fieldText + ": ";      
+     
+      var textfield = document.createElement( "TD" );
+      var inp1 =  document.createElement( "INPUT" );
+      inp1.setAttribute( "type", "text" );
+      inp1.setAttribute( "size", "30" );
+      inp1.setAttribute( "id", field );
+      inp1.setAttribute( "name", field );
+      textfield.appendChild( inp1 );
+
+      row.appendChild( label ); 
+      row.appendChild( textfield );
+      table.appendChild( row );
+    }
+  </script>  
+
   <script type="text/javascript" src="<c:url 
value='/js/jquery/jquery-1.2.6.pack.js'/>"></script>
   <script type="text/javascript">
     $(document).ready(function(){
@@ -36,6 +65,18 @@
     });
   });
   </script>
+  
+  <%-- advanced search --%>
+  <script type="text/javascript">
+    $(document).ready(function(){
+    
+    $("table.settings-search").hide();
+    $("a.expand-search").click(function(event){
+      event.preventDefault();
+      $(this).next().toggle("slow");
+    });
+  });
+  </script>
 </head>
 
 <s:if test="%{infoMessage != null}">
@@ -48,38 +89,53 @@
 
 <div id="contentArea">
 <div id="searchBox">
-  <s:form method="get" action="quickSearch" validate="true">
-    <s:textfield label="Search for" size="50" name="q"/>
-    <s:hidden name="completeQueryString" value="%{completeQueryString}"/>      
  
-    <s:submit value="Search"/>
-  </s:form>
-
-  <s:url id="filteredSearchUrl" action="advancedSearch"/>
-  <s:a href="%{filteredSearchUrl}">
-    Advanced Search >>
-  </s:a>
 
+  <c:url var="iconCreateUrl" value="/images/icons/create.png" />
+  
+  <s:form method="get" id="quickSearch" action="quickSearch" validate="true">  
  
+    <s:textfield label="Search for" size="50" name="q"/> 
+    <s:hidden name="completeQueryString" value="%{completeQueryString}"/>  
+    <s:submit value="Search"/>         
+  </s:form>  
   <p>
     <s:actionerror/>
   </p>
 </div>
-<div id="searchHint">
-  
+
+<div id="searchHint">  
   Enter your search terms. A variety of data will be searched for your 
keywords. <a class="expand" href="#"><img src="<c:url 
value="/images/icon_info_sml.gif"/>" /></a>
+  
   <table class="settings">
     <tr>
       <td>
-        <b>*</b> To search for Java classes or packages, just type the class 
name or package name in the search box.<br/>  
-      </td>
-    </tr>
-    <tr>
-      <td>
         <b>*</b> To perform a boolean <code>NOT</code> search, use the keyword 
<code>NOT</code> after your search
          term, followed by the term you want to exclude. For example, to 
exclude artifacts with 
          a dependency on the artifact you are searching for from showing up in 
the search results:  
          <code>myQueryTerm NOT dependency</code> 
       </td>
     </tr>
+    <tr>
+      <td>
+        <b>*</b> To do a filtered or advanced search, select the criteria from 
the list below and click the <img src="${iconCreateUrl}"/> icon. Specify the 
term you want to be matched in the created text field.
+      </td>
+    </tr>
+    <tr>
+      <td>    
+        <s:form id="filteredSearch" method="get" action="filteredSearch" 
validate="true">  
+          <label><strong>Advanced Search Fields: </strong></label><s:select 
name="searchField" list="searchFields" theme="simple"/> 
+          <s:a href="#" title="Add Search Field" onclick="addSearchField( 
document.filteredSearch.searchField.options[document.filteredSearch.searchField.selectedIndex].text,
 document.filteredSearch.searchField.value, 'dynamicFields' )" theme="simple">
+            <img src="${iconCreateUrl}" />
+          </s:a>
+          <table id="dynamicTable">          
+            <tr>
+              <td/>
+              <td/>  
+            </tr>
+          </table> 
+          <s:submit value="Search" theme="simple"/>  
+        </s:form>  
+      </td>
+    </tr>    
   </table>
   
 </div>

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/results.jsp
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/results.jsp?rev=744080&r1=744079&r2=744080&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/results.jsp
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/results.jsp
 Fri Feb 13 11:25:47 2009
@@ -26,10 +26,40 @@
 <head>
   <title>Search Results</title>
   <s:head/>
+  <script type="text/javascript">  
+    function addSearchField(fieldText, field, divName)
+    {     
+      var element = document.getElementById( field );
+      if( element != null )
+      {
+        alert( "Cannot add field! Field has already been added." );
+        return 0;
+      }
+
+      var table = document.getElementById( "dynamicTable" );
+      var row = document.createElement( "TR" );
+      var label = document.createElement("TD");
+      label.innerHTML = fieldText + ": ";      
+     
+      var textfield = document.createElement( "TD" );
+      var inp1 =  document.createElement( "INPUT" );
+      inp1.setAttribute( "type", "text" );
+      inp1.setAttribute( "size", "30" );
+      inp1.setAttribute( "id", field );
+      inp1.setAttribute( "name", field );
+      textfield.appendChild( inp1 );
+
+      row.appendChild( label ); 
+      row.appendChild( textfield );
+      table.appendChild( row );
+    }
+  </script>  
 </head>
 
 <body>
 
+<c:url var="iconCreateUrl" value="/images/icons/create.png" />
+
 <c:if test="${fromFilterSearch == true}">
   <h1>Advanced Search</h1>
 </c:if>
@@ -46,6 +76,33 @@
   <div id="searchBoxResults">
 
     <c:if test="${fromFilterSearch == true}">
+    <table>
+    <tr>
+      <td>
+        <b>*</b> To do a filtered or advanced search, select the criteria from 
the list below and click the <img src="${iconCreateUrl}"/> icon. Specify the 
term you want to be matched in the created text field.
+      </td>
+    </tr>
+    <tr>
+      <td>
+      <s:form id="filteredSearch" method="get" action="filteredSearch" 
validate="true">
+         <s:hidden name="fromFilterSearch" value="%{#attr.fromFilterSearch}" 
theme="simple"/>  
+         <label><strong>Advanced Search Fields: </strong></label><s:select 
name="searchField" list="searchFields" theme="simple"/> 
+         <s:a href="#" title="Add Search Field" onclick="addSearchField( 
document.filteredSearch.searchField.options[document.filteredSearch.searchField.selectedIndex].text,
 document.filteredSearch.searchField.value, 'dynamicFields' )" theme="simple">
+            <img src="${iconCreateUrl}" />
+         </s:a>
+         <table id="dynamicTable">          
+           <tr>
+             <td/>
+             <td/>  
+           </tr>
+         </table> 
+         <s:submit value="Search" theme="simple"/>  
+       </s:form>  
+       </td>
+     </tr>
+     </table>
+
+      <%--
       <s:form method="get" action="filteredSearch" validate="true">
         <s:textfield label="Row Count" size="50" name="rowCount"/>
         <s:textfield label="Group Id" size="50" name="groupId"/>
@@ -65,7 +122,8 @@
       <script type="text/javascript">
         document.getElementById("filteredSearch_groupId").focus();
       </script>
-      </c:if>
+      --%>
+    </c:if>
     <c:if test="${fromFilterSearch == false}">
       <s:form method="get" action="quickSearch" validate="true">
         <s:textfield label="Search for" size="50" name="q"/>
@@ -81,7 +139,6 @@
   <p>
     <s:actionerror/>
   </p>
-
   </div>
 
   <h1>Results</h1>
@@ -322,4 +379,4 @@
   </div>
 </div>
 </body>
-</html>
+</html>
\ No newline at end of file

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/SearchActionTest.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/SearchActionTest.java?rev=744080&r1=744079&r2=744080&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/SearchActionTest.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/SearchActionTest.java
 Fri Feb 13 11:25:47 2009
@@ -451,6 +451,7 @@
     {
         List<String> managedRepos = new ArrayList<String>();
         
+        action.setGroupId( "org.apache.archiva" );
         action.setManagedRepositoryList( managedRepos );
         
         String result = action.filteredSearch();
@@ -458,6 +459,21 @@
         assertEquals( GlobalResults.ACCESS_TO_NO_REPOS, result );
     }
     
+    public void testAdvancedSearchNoSpecifiedCriteria()
+        throws Exception
+    {
+        List<String> managedRepos = new ArrayList<String>();
+        
+        action.setManagedRepositoryList( managedRepos );
+        
+        String result = action.filteredSearch();
+        
+        assertEquals( Action.INPUT, result );
+        assertFalse( action.getActionErrors().isEmpty() );
+        assertEquals( "Advanced Search - At least one search criteria must be 
provided.",
+                      (String) action.getActionErrors().iterator().next() );
+    }
+    
     // find artifact..
     
     public void testFindArtifactWithOneHit()


Reply via email to