You are viewing a plain text version of this content. The canonical link for it is here.
Posted to general@portals.apache.org by vk...@apache.org on 2008/12/12 15:37:33 UTC

svn commit: r726017 - in /portals/applications: demo/src/webapp/WEB-INF/view/ gems/ gems/src/java/org/apache/portals/gems/browser/ gems/src/java/org/apache/portals/gems/file/

Author: vkumar
Date: Fri Dec 12 06:37:32 2008
New Revision: 726017

URL: http://svn.apache.org/viewvc?rev=726017&view=rev
Log:
New Features in Database Browser

Added:
    portals/applications/demo/src/webapp/WEB-INF/view/database-edit1.vm   (with props)
Modified:
    portals/applications/demo/src/webapp/WEB-INF/view/database-edit.vm
    portals/applications/demo/src/webapp/WEB-INF/view/database-view.vm
    portals/applications/gems/pom.xml
    portals/applications/gems/src/java/org/apache/portals/gems/browser/BrowserPortlet.java
    portals/applications/gems/src/java/org/apache/portals/gems/browser/DatabaseBrowserPortlet.java
    portals/applications/gems/src/java/org/apache/portals/gems/file/FilePortlet.java

Modified: portals/applications/demo/src/webapp/WEB-INF/view/database-edit.vm
URL: http://svn.apache.org/viewvc/portals/applications/demo/src/webapp/WEB-INF/view/database-edit.vm?rev=726017&r1=726016&r2=726017&view=diff
==============================================================================
--- portals/applications/demo/src/webapp/WEB-INF/view/database-edit.vm (original)
+++ portals/applications/demo/src/webapp/WEB-INF/view/database-edit.vm Fri Dec 12 06:37:32 2008
@@ -127,18 +127,23 @@
   <tr>
     <th class="portlet-section-alternate"><font class="portlet-form-field-label">$MESSAGES.getString("label.sql")</font></th>
     <td>
-      <textarea name="sql" cols='60' rows='8' class="portlet-form-field-label">$!prefsMap.get('sql')</textarea>
+      <input type="input" name="tableName" class="portlet-form-field-label" value="$!prefsMap.get('tableName')" />
     </td>
   </tr>
 </table>
 
+<input type="hidden" name="configPage" value=""/>
 <input type="submit" name="Save" value="Save" onClick="javascript:presave();"/>
 <input type="submit" name="Test" value="Test" onClick="javascript:presave();"/>
-
+<input type="button" name="Next" value="Next" onClick="javascript:nextPage();"/>
 </form>
 
 <script language="JavaScript">
-
+  function nextPage()
+  {
+	document.J2DBEdit.configPage.value = 'configPage1';
+	document.J2DBEdit.submit();
+  }
   function chooseDS() 
   {
     disableDS(false);

Added: portals/applications/demo/src/webapp/WEB-INF/view/database-edit1.vm
URL: http://svn.apache.org/viewvc/portals/applications/demo/src/webapp/WEB-INF/view/database-edit1.vm?rev=726017&view=auto
==============================================================================
--- portals/applications/demo/src/webapp/WEB-INF/view/database-edit1.vm (added)
+++ portals/applications/demo/src/webapp/WEB-INF/view/database-edit1.vm Fri Dec 12 06:37:32 2008
@@ -0,0 +1,325 @@
+#*
+  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.
+*#
+#set ($MESSAGES = $portletConfig.getResourceBundle($renderRequest.Locale))
+#set ($dst = $prefsMap.get('DatasourceType'))
+#set ($disableDS = "disabled")
+#set ($disableDBCP = "disabled")
+#set ($disableSSO = "disabled")
+#if ($!dst == 'jndi')
+#set ($disableDS = "")
+#elseif ($!dst == 'dbcp')
+#set ($disableDBCP = "")
+#elseif ($!dst == 'sso')
+#set ($disableSSO = "")
+#end
+
+#if ($statusMsg)
+#parse ('/WEB-INF/view/status-include.vm')
+#end
+
+<h3 class="portlet-section-header">$MESSAGES.getString('label.prefs')</h3>
+
+<form name='J2DBEdit' action="$renderResponse.createActionURL()" method="post">
+<table border="0" cellspacing="2" cellpadding="3">
+  <tr>
+    <td class="portlet-section-alternate"><font class="portlet-form-field-label">Field Name</font></td>
+    <td><select size="8" name="avilableCols" id="avilableCols">
+	 #foreach ($col in $cols )
+		<option value="$col">$col</option>
+	 #end
+	</select></td>
+	<td><input type="button" onClick="javascript:moveoutid();" value="&nbsp;>&nbsp;" /><br/><input type="button" onClick="javascript:moveinid();" value="&nbsp;<&nbsp;" /></td>
+	<td><select size="8" name="selectedCols" id="selectedCols">
+	</select></td>
+	<td><input type="button" onClick="javascript:moveUpList();" value="Move Up" /><br/><input type="button" onClick="javascript:moveDownList();" value="Move Down" /></td>
+  </tr>
+  <tr>
+	<td colspan="3">&nbsp;</td>
+	<td colspan="2">Set Column Labels</td>
+  </tr>  
+  <tr>
+	<td colspan="3">&nbsp;</td>
+	<td><input type="text" id="colLabel" name="colLabel" /></td>
+	<td><input type="button" onClick="javascript:setLabel()" value="Set Label"/></td>
+  </tr>
+</table>
+
+<h4 class="portlet-section-header">$MESSAGES.getString('label.general.settings')</h4>
+<table border="0" cellspacing="2" cellpadding="3">
+  <tr>
+    <th class="portlet-section-alternate"><font class="portlet-form-field-label">$MESSAGES.getString("label.sql")</font></th>
+    <td>
+      <textarea name="conditions" id="conditions" cols='60' rows='8' class="portlet-form-field-label">$!prefsMap.get('conditions')</textarea>
+    </td>
+  </tr>
+</table>
+
+<input type="hidden" name="columnTitles" id="columnTitles" value=""/>
+<input type="hidden" name="columnNames" id="columnNames" value=""/>
+<input type="hidden" name="configPage" value=""/>
+<input type="button" name="Save" value="Save" onClick="javascript:saveAdvanceData();"/>
+</form>
+
+<script language="JavaScript">
+
+    var ColTitle = new Array();
+	#set($index = 0)
+	#foreach ($colT in $colTitle )
+		ColTitle[$index] = '$colT';
+		#set($index = $index + 1)
+	#end
+	var ColName = new Array();
+	#set($index = 0)
+	#foreach ($colN in $colName )
+		ColName[$index] = '$colN';
+		#set($index = $index + 1)
+	 #end	
+	 
+	function removeFromList()
+	{
+		var columns = document.getElementById('avilableCols');
+		var selectedCols = document.getElementById('selectedCols');	
+		for(var j=0; j<ColName.length; j++)
+		{
+			for(var i=0; i<columns.length; i++)
+			{
+				if(columns.options[i].value == ColName[j])
+				{
+					columns.remove(i);
+					var y=document.createElement('option');
+					y.text=ColName[j] + ' ' + ColTitle[j];
+					y.value=ColName[j] + ':' + ColTitle[j];
+					try
+					{		
+						selectedCols.add(y,null);
+					}
+					catch(ex)
+					{
+						selectedCols.add(y);
+					}
+				}
+			}
+		}
+	}
+	function listToString()
+	{
+		var columns = document.getElementById('columnTitles');
+		var selectedCols = document.getElementById('selectedCols');
+		var len = selectedCols.length;
+		var tempValue = '';
+		var sqlValue ='';
+		for(var j=0; j<len; j++)
+		{
+			if(selectedCols.options[j].value.indexOf(':')>-1){
+				tempValue = tempValue + "," +selectedCols.options[j].value.split(':')[1];
+				sqlValue = sqlValue + "," +selectedCols.options[j].value.split(':')[0];
+			}else{
+				tempValue = tempValue + "," +selectedCols.options[j].value;
+				sqlValue = sqlValue + "," +selectedCols.options[j].value;			
+			}
+		}
+		document.getElementById('columnTitles').value = tempValue.substring(1);
+		document.getElementById('columnNames').value =  sqlValue.substring(1);
+	}
+	function saveAdvanceData()
+	{
+		listToString();
+		document.J2DBEdit.submit();
+	}
+	
+	function moveoutid()
+	{
+		var avilableCols = document.getElementById('avilableCols');
+		var len = avilableCols.length;
+		var selectedCols = document.getElementById('selectedCols');
+		for(var j=0; j<len; j++)
+		{
+			if(avilableCols[j].selected)
+			{	
+				var tmp = avilableCols.options[j].text;
+				var tmp1 = avilableCols.options[j].value;
+				avilableCols.remove(j);
+				j--;
+				var y=document.createElement('option');
+				y.text=tmp;
+				y.value=tmp1;
+				try
+				{		
+					selectedCols.add(y,null);
+				}
+				catch(ex)
+				{
+				selectedCols.add(y);
+				}
+				break;
+			}
+		}
+	}
+
+
+	function moveinid()
+	{
+		var avilableCols = document.getElementById('avilableCols');
+		var selectedCols = document.getElementById('selectedCols');
+		var len = selectedCols.length;
+		for(var j=0; j<len; j++)
+		{
+			if(selectedCols[j].selected)
+			{
+				var tmp = selectedCols.options[j].text.split(' ')[0];
+				var tmp1 = selectedCols.options[j].value.split(':')[0];
+				selectedCols.remove(j);
+				j--;
+				var y=document.createElement('option');
+				y.text=tmp;
+				y.value=tmp1;
+				try
+				{
+				avilableCols.add(y,null);}
+				catch(ex){
+				avilableCols.add(y);	
+				}
+				break;
+			}
+		}	
+	}
+
+  function setLabel()
+  {
+	var listField = document.getElementById('selectedCols');
+	var colLabel = document.getElementById('colLabel').value;
+	var index = listField.selectedIndex
+	var labelsVal = listField[index].value.split(':');
+	listField[index].text = labelsVal[0] + ' ' + colLabel;
+	listField[index].value = labelsVal[0] + ':' + colLabel;
+	document.getElementById('colLabel').value = '';
+	listField.selectedIndex=0;
+  }
+  
+  function moveUpList() {
+   var listField = document.getElementById('selectedCols');
+   if ( listField.length == -1) {  // If the list is empty
+      alert("There are no values which can be moved!");
+   } else {
+      var selected = listField.selectedIndex;
+      if (selected == -1) {
+         alert("You must select an entry to be moved!");
+      } else {  // Something is selected
+         if ( listField.length == 0 ) {  // If there's only one in the list
+            alert("There is only one entry!\nThe one entry will remain in place.");
+         } else {  // There's more than one in the list, rearrange the list order
+            if ( selected == 0 ) {
+               alert("The first entry in the list cannot be moved up.");
+            } else {
+               // Get the text/value of the one directly above the hightlighted entry as
+               // well as the highlighted entry; then flip them
+               var moveText1 = listField[selected-1].text;
+               var moveText2 = listField[selected].text;
+               var moveValue1 = listField[selected-1].value;
+               var moveValue2 = listField[selected].value;
+               listField[selected].text = moveText1;
+               listField[selected].value = moveValue1;
+               listField[selected-1].text = moveText2;
+               listField[selected-1].value = moveValue2;
+               listField.selectedIndex = selected-1; // Select the one that was selected before
+            }  // Ends the check for selecting one which can be moved
+         }  // Ends the check for there only being one in the list to begin with
+      }  // Ends the check for there being something selected
+   }  // Ends the check for there being none in the list
+  }
+  
+  function moveDownList() {
+  var listField = document.getElementById('selectedCols');
+	   if ( listField.length == -1) {  // If the list is empty
+	      alert("There are no values which can be moved!");
+	   } else {
+	      var selected = listField.selectedIndex;
+	      if (selected == -1) {
+	         alert("You must select an entry to be moved!");
+	      } else {  // Something is selected
+	         if ( listField.length == 0 ) {  // If there's only one in the list
+	            alert("There is only one entry!\nThe one entry will remain in place.");
+	         } else {  // There's more than one in the list, rearrange the list order
+	            if ( selected == listField.length-1 ) {
+	               alert("The last entry in the list cannot be moved down.");
+	            } else {
+	               // Get the text/value of the one directly below the hightlighted entry as
+	               // well as the highlighted entry; then flip them
+	               var moveText1 = listField[selected+1].text;
+	               var moveText2 = listField[selected].text;
+	               var moveValue1 = listField[selected+1].value;
+	               var moveValue2 = listField[selected].value;
+	               listField[selected].text = moveText1;
+	               listField[selected].value = moveValue1;
+	               listField[selected+1].text = moveText2;
+	               listField[selected+1].value = moveValue2;
+	               listField.selectedIndex = selected+1; // Select the one that was selected before
+	            }  // Ends the check for selecting one which can be moved
+	         }  // Ends the check for there only being one in the list to begin with
+	      }  // Ends the check for there being something selected
+	   }  // Ends the check for there being none in the list
+  }
+  
+  function chooseDS() 
+  {
+    disableDS(false);
+    disableDBCP(true);
+    disableSSO(true);
+  }
+
+  function chooseDBCP() 
+  {
+    disableDS(true);
+    disableDBCP(false);
+    disableSSO(true);
+  }
+
+  function chooseSSO() 
+  {
+    disableDS(true);
+    disableDBCP(true);
+    disableSSO(false);
+  }
+
+  function disableDS(flag) 
+  {
+    document.forms['J2DBEdit'].JndiDatasource.disabled = flag;            
+  }
+
+  function disableDBCP(flag) 
+  {
+    document.forms['J2DBEdit'].JdbcDriver.disabled = flag;            
+    document.forms['J2DBEdit'].JdbcConnection.disabled = flag;            
+    document.forms['J2DBEdit'].JdbcUsername.disabled = flag;            
+    document.forms['J2DBEdit'].JdbcPassword.disabled = flag;            
+  }
+
+  function disableSSO(flag) 
+  {
+    document.forms['J2DBEdit'].SSOSite.disabled = flag;            
+    document.forms['J2DBEdit'].SSOJdbcDriver.disabled = flag;            
+    document.forms['J2DBEdit'].SSOJdbcConnection.disabled = flag;                   
+  }
+
+  function presave()
+  {
+    disableDS(false);
+    disableDBCP(false);
+    disableSSO(false);
+  }
+	removeFromList();
+</script>

Propchange: portals/applications/demo/src/webapp/WEB-INF/view/database-edit1.vm
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/applications/demo/src/webapp/WEB-INF/view/database-edit1.vm
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: portals/applications/demo/src/webapp/WEB-INF/view/database-view.vm
URL: http://svn.apache.org/viewvc/portals/applications/demo/src/webapp/WEB-INF/view/database-view.vm?rev=726017&r1=726016&r2=726017&view=diff
==============================================================================
--- portals/applications/demo/src/webapp/WEB-INF/view/database-view.vm (original)
+++ portals/applications/demo/src/webapp/WEB-INF/view/database-view.vm Fri Dec 12 06:37:32 2008
@@ -27,7 +27,15 @@
 #if ($statusMsg)
 #parse ('/WEB-INF/view/status-include.vm')
 #end
-
+#set ($xlsLink = $renderResponse.createActionURL())
+$xlsLink.setParameter("exportType","xlsExport")
+#set ($xmlLink = $renderResponse.createActionURL())
+$xmlLink.setParameter("exportType","xmlExport")
+<table>
+	<tr>
+		<td><a target="_blank" href="$xlsLink">XLS</a>&nbsp;<!--<a target="_blank" href="$xmlLink">XML</a>--></td>
+	</tr>
+</table>
 <table cellpadding=0 cellspacing=1 border=0 width="100%">
   <tbody>
   <tr>

Modified: portals/applications/gems/pom.xml
URL: http://svn.apache.org/viewvc/portals/applications/gems/pom.xml?rev=726017&r1=726016&r2=726017&view=diff
==============================================================================
--- portals/applications/gems/pom.xml (original)
+++ portals/applications/gems/pom.xml Fri Dec 12 06:37:32 2008
@@ -89,7 +89,11 @@
             <groupId>org.springframework</groupId>
             <artifactId>spring-beans</artifactId>
         </dependency>
-        
+        <dependency>
+            <groupId>poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.0-FINAL</version>
+        </dependency>
     </dependencies>
 
     <!-- Project Information -->

Modified: portals/applications/gems/src/java/org/apache/portals/gems/browser/BrowserPortlet.java
URL: http://svn.apache.org/viewvc/portals/applications/gems/src/java/org/apache/portals/gems/browser/BrowserPortlet.java?rev=726017&r1=726016&r2=726017&view=diff
==============================================================================
--- portals/applications/gems/src/java/org/apache/portals/gems/browser/BrowserPortlet.java (original)
+++ portals/applications/gems/src/java/org/apache/portals/gems/browser/BrowserPortlet.java Fri Dec 12 06:37:32 2008
@@ -46,84 +46,54 @@
  * AbstractBrowserPortlet
  * 
  * @author <a href="mailto:taylor@apache.org">David Sean Taylor </a>
- * @version $Id: AbstractBrowserPortlet.java,v 1.2 2005/01/01 00:01:29 taylor
- *          Exp $
+ * @version $Id$
  */
 public class BrowserPortlet extends GenericVelocityPortlet implements Browser
 {
-
     protected static final String SQL = "sql";
-
+    public static final String TABLE_NAME = "tableName";
+    public static final String CONDITIONS = "conditions";
+    public static final String COLUMNS = "columnNames";
     protected static final String POOLNAME = "poolname";
-
     protected static final String START = "start";
     protected static final String FIND = "find";
     protected static final String SEARCH_STRING = "searchString";
     protected static final String SEARCH_COLUMN = "searchColumn";
     protected static final String FILTERED = "filtered";
     protected static final String FILTER = "filter";
-    
     protected static final String CUSTOMIZE_TEMPLATE = "customizeTemplate";
-
     protected static final String WINDOW_SIZE = "WindowSize";
-
     protected static final String USER_OBJECT_NAMES = "user-object-names";
-
     protected static final String USER_OBJECT_TYPES = "user-object-types";
-
     protected static final String USER_OBJECTS = "user-objects";
-
     protected static final String SQL_PARAM_PREFIX = "sqlparam";
-
     protected static final String LINKS_READ = "linksRead";
-
     protected static final String ROW_LINK = "rowLinks";
-
     protected static final String TABLE_LINK = "tableLinks";
-
     protected static final String ROW_LINK_IDS = "row-link-ids";
-
     protected static final String ROW_LINK_TYPES = "row-link-types";
-
     protected static final String ROW_LINK_TARGETS = "row-link-targets";
-
     protected static final String TABLE_LINK_IDS = "table-link-ids";
-
     protected static final String TABLE_LINK_TYPES = "table-link-types";
-
     protected static final String TABLE_LINK_TARGETS = "table-link-targets";
-
     protected static final String BROWSER_TABLE_SIZE = "tableSize";
-
     protected static final String BROWSER_ACTION_KEY = "browser_action_key";
-
     protected static final String BROWSER_ITERATOR = "table";
-
     protected static final String BROWSER_TITLE_ITERATOR = "title";
-
     protected static final String NEXT = "next";
-
     protected static final String PREVIOUS = "prev";
-
     protected static final String FIRST = "first";
-
     protected static final String LAST = "last";
-    
     protected static final String VELOCITY_NULL_ENTRY = "-";
-
     // portlet entry Id
     protected static final String PEID = "js_peid";
-
     protected static final String SORT_COLUMN_NAME = "js_dbcolumn";
-
     protected List sqlParameters = new Vector();
-    
     /*
      * SSO link
      */
     protected PortletContext context;
     protected SSOProvider sso;
-
     /**
      * Static initialization of the logger for this class
      */
@@ -132,49 +102,38 @@
     public void init(PortletConfig config) throws PortletException
     {
         super.init(config);
-        
         context = getPortletContext();
-        sso = (SSOProvider)context.getAttribute("cps:SSO");
+        sso = (SSOProvider) context.getAttribute("cps:SSO");
         if (null == sso)
         {
             log.info("Warning: SSO provider not found.");
-           //throw new PortletException("Failed to find SSO Provider on portlet initialization");
-        }        
+            // throw new PortletException("Failed to find SSO Provider on portlet initialization");
+        }
     }
 
-    public void getRows(RenderRequest request, String sql, int windowSize)
-            throws Exception
+    public void getRows(RenderRequest request, String sql, int windowSize) throws Exception
     {
     }
 
-    public void getRows(RenderRequest request, String sql, int windowSize, String filter)
-    throws Exception
+    public void getRows(RenderRequest request, String sql, int windowSize, String filter) throws Exception
     {
     }
-    
-    public void doView(RenderRequest request, RenderResponse response)
-            throws PortletException, IOException
+
+    public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException
     {
         int resultSetSize, next, prev, windowSize;
-
         response.setContentType("text/html");
-
         BrowserIterator iterator = getBrowserIterator(request);
         Context context = this.getContext(request);
-
         String sortColName = request.getParameter(SORT_COLUMN_NAME);
         int start = getStartVariable(request, START, sortColName, iterator);
-        
         PortletPreferences prefs = request.getPreferences();
-
         windowSize = Integer.parseInt(prefs.getValue(WINDOW_SIZE, "10"));
-        
-        StatusMessage message = (StatusMessage)PortletMessaging.consume(request, "DatabaseBrowserPortlet", "action");
+        StatusMessage message = (StatusMessage) PortletMessaging.consume(request, "DatabaseBrowserPortlet", "action");
         if (message != null)
         {
-            this.getContext(request).put("statusMsg", message);            
+            this.getContext(request).put("statusMsg", message);
         }
-        
         try
         {
             if (iterator == null)
@@ -185,11 +144,11 @@
                 String filter = request.getParameter(FILTER);
                 if (filter != null)
                     getRows(request, sql, windowSize, filter);
-                else                    
+                else
                     getRows(request, sql, windowSize);
                 iterator = getBrowserIterator(request);
                 start = 0;
-            } 
+            }
             else
             {
                 if (sortColName != null)
@@ -197,28 +156,23 @@
                     iterator.sort(sortColName);
                 }
             }
-
-            resultSetSize = iterator.getResultSetSize();                    
+            resultSetSize = iterator.getResultSetSize();
             if (start >= resultSetSize)
             {
                 if ((start - windowSize) > 0)
                     start = resultSetSize - windowSize;
                 else
-                    start = 0;            
-            }        
+                    start = 0;
+            }
             next = start + windowSize;
             prev = start - windowSize;
             if (prev < 0 && start > 0)
-               prev = 0;
+                prev = 0;
             iterator.setTop(start);
-            
-            
             readLinkParameters(request, context);
-
             if (iterator != null)
             {
                 resultSetSize = iterator.getResultSetSize();
-
                 if (next <= resultSetSize)
                 {
                     context.put(NEXT, String.valueOf(next));
@@ -227,25 +181,19 @@
                 {
                     context.put(PREVIOUS, String.valueOf(prev));
                 }
-
                 context.put(BROWSER_ITERATOR, iterator);
-                context.put(BROWSER_TITLE_ITERATOR, iterator
-                        .getResultSetTitleList());
+                context.put(BROWSER_TITLE_ITERATOR, getTitleList(request));
                 context.put(BROWSER_TABLE_SIZE, new Integer(resultSetSize));
                 context.put(WINDOW_SIZE, new Integer(windowSize));
                 context.put(START, new Integer(start));
                 /*
-                 * System.out.println("buildNormalContext Sort column name=
-                 * "+sortColName); System.out.println("buildNormalContext
-                 * Iterator: "+iterator); System.out.println("buildNormalContext
-                 * Titles= "+iterator.getResultSetTitleList());
-                 * System.out.println("buildNormalContext
-                 * windowSize="+windowSize+" prev="+prev+ " next="+next+"
-                 * start="+start+" resultSetSize="+resultSetSize);
+                 * System.out.println("buildNormalContext Sort column name= "+sortColName); System.out.println("buildNormalContext Iterator:
+                 * "+iterator); System.out.println("buildNormalContext Titles= "+iterator.getResultSetTitleList()); System.out.println("buildNormalContext
+                 * windowSize="+windowSize+" prev="+prev+ " next="+next+" start="+start+" resultSetSize="+resultSetSize);
                  */
             }
-
-        } catch (Exception e)
+        }
+        catch (Exception e)
         {
             String msg = e.toString();
             Throwable cause = e.getCause();
@@ -253,39 +201,31 @@
             {
                 msg = msg + ", " + cause.getMessage();
             }
-            
             context.put("statusMsg", new StatusMessage(msg, StatusMessage.ERROR));
             // log the error msg
             log.error("Exception", e);
-
             /*
-             * TODO: error logging
-             * 
-             * rundata.setMessage("Error in Portals Gems Browser: " +
-             * e.toString()); rundata.setStackTrace(StringUtils.stackTrace(e),
-             * e);
+             * TODO: error logging rundata.setMessage("Error in Portals Gems Browser: " + e.toString()); rundata.setStackTrace(StringUtils.stackTrace(e), e);
              * rundata.setScreenTemplate(JetspeedResources.getString("template.error","Error"));
              */
         }
-
         super.doView(request, response);
     }
 
-    public void doEdit(RenderRequest request, RenderResponse response)
-            throws PortletException, IOException
+    public void doEdit(RenderRequest request, RenderResponse response) throws PortletException, IOException
     {
         response.setContentType("text/html");
         doPreferencesEdit(request, response);
     }
 
-    public void processAction(ActionRequest request, ActionResponse response)
-            throws PortletException, IOException
+    public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException
     {
         if (request.getPortletMode() == PortletMode.EDIT)
         {
             processPreferencesAction(request, response);
-            clearBrowserIterator(request);            
-        } else
+            clearBrowserIterator(request);
+        }
+        else
         {
             String browserAction = request.getParameter("db.browser.action");
             if (browserAction != null)
@@ -301,12 +241,12 @@
                 }
                 String searchString = request.getParameter(SEARCH_STRING);
                 if (searchString != null)
-                {                    
+                {
                     String searchColumn = request.getParameter(SEARCH_COLUMN);
-                    String filtered = request.getParameter(FILTERED);                    
+                    String filtered = request.getParameter(FILTERED);
                     if (filtered != null)
                     {
-                        clearBrowserIterator(request);                        
+                        clearBrowserIterator(request);
                         response.setRenderParameter(FILTER, searchString);
                     }
                     else
@@ -316,18 +256,19 @@
                         {
                             try
                             {
-                                StatusMessage sm = new StatusMessage("Could not find match for: " + searchString, StatusMessage.ALERT);        
+                                StatusMessage sm = new StatusMessage("Could not find match for: " + searchString, StatusMessage.ALERT);
                                 PortletMessaging.publish(request, "DatabaseBrowserPortlet", "action", sm);
                             }
                             catch (Exception e)
-                            {}
+                            {
+                            }
                         }
                         else
                         {
-                            response.setRenderParameter(START, Integer.toString(index));                        
+                            response.setRenderParameter(START, Integer.toString(index));
                         }
                     }
-                }                
+                }
             }
         }
     }
@@ -337,13 +278,10 @@
      * 
      * @param data
      *            The turbine rundata context for this request.
-     * 
      */
     protected BrowserIterator getBrowserIterator(PortletRequest request)
     {
-        BrowserIterator iterator = (BrowserIterator) request
-                .getPortletSession().getAttribute(BROWSER_ACTION_KEY,
-                        PortletSession.PORTLET_SCOPE);
+        BrowserIterator iterator = (BrowserIterator) request.getPortletSession().getAttribute(BROWSER_ACTION_KEY, PortletSession.PORTLET_SCOPE);
         return iterator;
     }
 
@@ -352,37 +290,32 @@
      * 
      * @param data
      *            The turbine rundata context for this request.
-     * @param iterator.
-     * 
+     * @param iterator
+     *            .
      */
-    protected void setBrowserIterator(RenderRequest request,
-            BrowserIterator iterator)
+    protected void setBrowserIterator(RenderRequest request, BrowserIterator iterator)
     {
         request.getPortletSession().setAttribute(BROWSER_ACTION_KEY, iterator);
     }
 
     /**
-     * Centralizes the calls to session - to clear the BrowserIterator from the
-     * temp storage.
+     * Centralizes the calls to session - to clear the BrowserIterator from the temp storage.
      * 
      * @param data
      *            The turbine rundata context for this request.
-     * 
      */
     protected void clearBrowserIterator(PortletRequest request)
     {
         request.getPortletSession().removeAttribute(BROWSER_ACTION_KEY);
     }
 
-    protected int getStartVariable(RenderRequest request, String attrName,
-            String sortColName, BrowserIterator iterator)
+    protected int getStartVariable(RenderRequest request, String attrName, String sortColName, BrowserIterator iterator)
     {
         int start = -1;
         // if users want to overwrite how the sorting affects the cursor for
         // the window
-        if (sortColName != null) 
+        if (sortColName != null)
             start = getStartIndex();
-
         if (start < 0)
         {
             // fallback routine for start
@@ -391,7 +324,7 @@
             {
                 try
                 {
-                    start = Integer.parseInt(startStr);                    
+                    start = Integer.parseInt(startStr);
                 }
                 catch (Exception e)
                 {
@@ -400,12 +333,13 @@
                     else
                         start = 0;
                 }
-            } else if (start == -1 && iterator != null)
+            }
+            else if (start == -1 && iterator != null)
             {
                 start = iterator.getTop();
             }
-
-            if (start < 0) start = 0;
+            if (start < 0)
+                start = 0;
         }
         return start;
     }
@@ -419,11 +353,8 @@
     }
 
     /**
-     * This method returns the sql from the getQuery method which can be
-     * overwritten according to the needs of the application. If the getQuery()
-     * returns null, then it gets the value from the psml file. If the psml
-     * value is null then it returns the value from the xreg file.
-     * 
+     * This method returns the sql from the getQuery method which can be overwritten according to the needs of the application. If the getQuery() returns null,
+     * then it gets the value from the psml file. If the psml value is null then it returns the value from the xreg file.
      */
     protected String getQueryString(RenderRequest request, Context context)
     {
@@ -435,56 +366,42 @@
         return sql;
     }
 
-    public String getQueryString(RenderRequest request)
+    public String getQueryString(PortletRequest request)
     {
         return null;
     }
 
-    protected String getPreference(RenderRequest request, String attrName,
-            String attrDefValue)
+    protected String getPreference(PortletRequest request, String attrName, String attrDefValue)
     {
         return request.getPreferences().getValue(attrName, attrDefValue);
     }
 
     protected void readUserParameters(RenderRequest request, Context context)
     {
-        Object userObjRead = request.getPortletSession().getAttribute(
-                USER_OBJECTS, PortletSession.PORTLET_SCOPE);
+        Object userObjRead = request.getPortletSession().getAttribute(USER_OBJECTS, PortletSession.PORTLET_SCOPE);
         if (userObjRead != null)
         {
             context.put(USER_OBJECTS, userObjRead);
             // System.out.println("userObjectListSize: "+
             // ((List)userObjRead).size());
-        } else
+        }
+        else
         {
             /*
-             * TODO: implement user parameters
-             * 
-             * String userObjTypes=
-             * getParameterFromRegistry(portlet,USER_OBJECT_TYPES,null); String
-             * userObjNames=
-             * getParameterFromRegistry(portlet,USER_OBJECT_NAMES,null); if(
-             * userObjTypes != null && userObjTypes.length() > 0 ) {
-             * userObjectList = new ArrayList(); int userObjectIndex = 0;
-             * StringTokenizer tokenizer1 = new StringTokenizer(userObjNames,
-             * ","); StringTokenizer tokenizer3 = new
-             * StringTokenizer(userObjTypes, ",");
-             * while(tokenizer1.hasMoreTokens() && tokenizer3.hasMoreTokens()) {
-             * userObjectList.add(userObjectIndex, new
-             * ActionParameter(tokenizer1.nextToken(), null,
-             * tokenizer3.nextToken())); userObjectIndex++; }
-             * context.put(USER_OBJECTS, userObjectList);
-             * setParameterToTemp(portlet, rundata, USER_OBJECTS,
-             * userObjectList); //System.out.println("readLink:
-             * userObjectTypesListSize: "+userObjectList.size()); }
+             * TODO: implement user parameters String userObjTypes= getParameterFromRegistry(portlet,USER_OBJECT_TYPES,null); String userObjNames=
+             * getParameterFromRegistry(portlet,USER_OBJECT_NAMES,null); if( userObjTypes != null && userObjTypes.length() > 0 ) { userObjectList = new
+             * ArrayList(); int userObjectIndex = 0; StringTokenizer tokenizer1 = new StringTokenizer(userObjNames, ","); StringTokenizer tokenizer3 = new
+             * StringTokenizer(userObjTypes, ","); while(tokenizer1.hasMoreTokens() && tokenizer3.hasMoreTokens()) { userObjectList.add(userObjectIndex, new
+             * ActionParameter(tokenizer1.nextToken(), null, tokenizer3.nextToken())); userObjectIndex++; } context.put(USER_OBJECTS, userObjectList);
+             * setParameterToTemp(portlet, rundata, USER_OBJECTS, userObjectList); //System.out.println("readLink: userObjectTypesListSize:
+             * "+userObjectList.size()); }
              */
         }
     }
 
-    protected void readSqlParameters(RenderRequest request)
+    protected void readSqlParameters(PortletRequest request)
     {
         List sqlParamList = null;
-
         int i = 1;
         while (true)
         {
@@ -492,7 +409,8 @@
             if (param == null)
             {
                 break;
-            } else
+            }
+            else
             {
                 if (sqlParamList == null)
                 {
@@ -502,12 +420,13 @@
             }
             i++;
         }
-
         if (sqlParamList != null)
         {
             setSQLParameters(sqlParamList);
         }
     }
+    
+    
 
     public void setSQLParameters(List parameters)
     {
@@ -520,11 +439,8 @@
     }
 
     /**
-     * This method should be overwritten every time the user object needs to be
-     * populated with some user specific constraints. As an example if the user
-     * wanted to track the parent of an object based on some calculation per
-     * row, it could be done here.
-     * 
+     * This method should be overwritten every time the user object needs to be populated with some user specific constraints. As an example if the user wanted
+     * to track the parent of an object based on some calculation per row, it could be done here.
      */
     public void populate(int rowIndex, int columnIndex, List row)
     {
@@ -532,9 +448,7 @@
 
     /*
      * (non-Javadoc)
-     * 
-     * @see org.apache.jetspeed.modules.actions.portlets.browser.BrowserQuery#filter(java.util.List,
-     *      RunData)
+     * @see org.apache.jetspeed.modules.actions.portlets.browser.BrowserQuery#filter(java.util.List, RunData)
      */
     public boolean filter(List row, RenderRequest request)
     {
@@ -558,28 +472,26 @@
         catch (Exception ee)
         {
             System.err.println("Failed to publish message: " + e);
-        }        
+        }
     }
 
     public int find(BrowserIterator iterator, String searchString, String searchColumn)
     {
         int index = 0;
-        int column = 1; 
-        
+        int column = 1;
         if (searchColumn != null)
             column = Integer.parseInt(searchColumn);
-        
         Iterator it = iterator.getResultSet().iterator();
         while (it.hasNext())
         {
             Object row = it.next();
             String item = "";
             if (row instanceof String)
-                item = (String)row;
+                item = (String) row;
             else if (row instanceof List)
             {
-                // TODO: this only works on String columns                
-                item = (String)((List)row).get(column); 
+                // TODO: this only works on String columns
+                item = (String) ((List) row).get(column);
             }
             if (item.startsWith(searchString))
             {
@@ -587,7 +499,11 @@
             }
             index++;
         }
-        
         return -1;
     }
+
+    public List getTitleList(PortletRequest request)
+    {
+        return null;
+    }
 }
\ No newline at end of file

Modified: portals/applications/gems/src/java/org/apache/portals/gems/browser/DatabaseBrowserPortlet.java
URL: http://svn.apache.org/viewvc/portals/applications/gems/src/java/org/apache/portals/gems/browser/DatabaseBrowserPortlet.java?rev=726017&r1=726016&r2=726017&view=diff
==============================================================================
--- portals/applications/gems/src/java/org/apache/portals/gems/browser/DatabaseBrowserPortlet.java (original)
+++ portals/applications/gems/src/java/org/apache/portals/gems/browser/DatabaseBrowserPortlet.java Fri Dec 12 06:37:32 2008
@@ -16,7 +16,10 @@
  */
 package org.apache.portals.gems.browser;
 
+import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.lang.reflect.Method;
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.sql.Connection;
@@ -24,8 +27,12 @@
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
+import java.sql.Statement;
 import java.sql.Types;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 
@@ -44,12 +51,20 @@
 import javax.sql.DataSource;
 
 import org.apache.commons.dbcp.BasicDataSource;
+import org.apache.commons.lang.StringUtils;
+import org.apache.jetspeed.PortalReservedParameters;
+import org.apache.jetspeed.request.RequestContext;
 import org.apache.jetspeed.security.JSSubject;
 import org.apache.jetspeed.sso.SSOContext;
 import org.apache.jetspeed.sso.SSOException;
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.portals.bridges.util.PreferencesHelper;
 import org.apache.portals.gems.util.StatusMessage;
 import org.apache.portals.messaging.PortletMessaging;
+import org.springframework.util.ReflectionUtils;
 
 /**
  * DatabaseBrowserPortlet
@@ -62,11 +77,159 @@
     private static final String COLUMNS_TITLE = "columnTitles";
     private static final String CATLOG_NAME = "catlogName";
     private static final String SCHEMA_NAME = "schemaName";
-    private static final String TABLE_NAME = "tableName";
+    private static final String EXPORT_TYPE = "exportType";
+    private static final String XML_EXPORT = "xmlExport";
+    private static final String XLS_EXPORT = "xlsExport";
+    String pathSeprator = System.getProperty("file.separator");
+    String pageRoot = System.getProperty("java.io.tmpdir");
     private String[] catlogNames;
     private String[] tableNames;
     private String[] schemaNames;
     private String[] colNames;
+    private SimpleDateFormat date_output;
+    private static final String DATE_OUTPUT_PATTERN = "M/d/yyyy";
+    BrowserIterator dataBaseIterator;
+
+    public BrowserIterator getLocalIterators(PortletRequest request, String sql, int windowSize) throws Exception
+    {
+        BrowserIterator iterator;
+        List resultSetList = new ArrayList();
+        List resultSetTitleList = new ArrayList();
+        List resultSetTypeList = new ArrayList();
+        Connection con = null;
+        PreparedStatement selectStmt = null;
+        ResultSet rs = null;
+        PortletSession session = request.getPortletSession();
+        try
+        {
+            String poolname = request.getPreferences().getValue(POOLNAME, null);
+            if (poolname == null || poolname.length() == 0)
+            {
+                con = getConnection(request);
+            }
+            else
+            {
+                con = getConnection(poolname);
+            }
+            selectStmt = con.prepareStatement(sql);
+            readSqlParameters(request);
+            Iterator it = sqlParameters.iterator();
+            int ix = 0;
+            while (it.hasNext())
+            {
+                ix++;
+                Object object = it.next();
+                selectStmt.setObject(ix, object);
+            }
+            rs = selectStmt.executeQuery();
+            ResultSetMetaData rsmd = rs.getMetaData();
+            int columnNum = rsmd.getColumnCount();
+            /*
+             * get the user object types to be displayed and add them to the title list as well as the result set list
+             */
+            List userObjList = (List) session.getAttribute(USER_OBJECTS);
+            int userObjListSize = 0;
+            if (userObjList != null)
+            {
+                userObjListSize = userObjList.size();
+            }
+            // System.out.println("User List Size = "+ userObjListSize);
+            /*
+             * the array columnDisplayed maintains a boolean value for each column index. Only the columns that are set to true are added to the resultSetList,
+             * resultSetTitleList and resultSetTypeList.
+             */
+            boolean[] columnDisplayed = new boolean[columnNum + userObjListSize];
+            /*
+             * this for loop constructs the columnDisplayed array as well as adds to the resultSetTitleList and resultSetTypeList
+             */
+            for (int i = 1; i <= columnNum; i++)
+            {
+                int type = rsmd.getColumnType(i);
+                if (!((type == Types.BLOB) || (type == Types.CLOB) || (type == Types.BINARY) || (type == Types.LONGVARBINARY) || (type == Types.VARBINARY)))
+                {
+                    resultSetTitleList.add(rsmd.getColumnName(i));
+                    resultSetTypeList.add(String.valueOf(type));
+                    columnDisplayed[i - 1] = true;
+                }
+                else
+                {
+                    columnDisplayed[i - 1] = false;
+                }
+            }
+            for (int i = columnNum; i < columnNum + userObjListSize; i++)
+            {
+                ActionParameter usrObj = (ActionParameter) userObjList.get(i - columnNum);
+                resultSetTitleList.add(usrObj.getName());
+                resultSetTypeList.add(usrObj.getType());
+                columnDisplayed[i] = true;
+                // System.out.println("User List Name = "+ usrObj.getName()+"
+                // Type = "+usrObj.getType());
+            }
+            /*
+             * this while loop adds each row to the resultSetList
+             */
+            int index = 0;
+            while (rs.next())
+            {
+                List row = new ArrayList(columnNum);
+                for (int i = 1; i <= columnNum; i++)
+                {
+                    if (columnDisplayed[i - 1])
+                    {
+                        Object obj = rs.getObject(i);
+                        if (obj == null)
+                        {
+                            obj = VELOCITY_NULL_ENTRY;
+                        }
+                        row.add(obj);
+                    }
+                }
+                for (int i = columnNum; i < columnNum + userObjListSize; i++)
+                {
+                    ActionParameter usrObj = (ActionParameter) userObjList.get(i - columnNum);
+                    if (columnDisplayed[i])
+                    {
+                        Class c = Class.forName(usrObj.getType());
+                        row.add(c.newInstance());
+                        populate(index, i, row);
+                    }
+                }
+                resultSetList.add(row);
+                index++;
+            }
+            if (windowSize == -1)
+            {
+                iterator = new DatabaseBrowserIterator(resultSetList, resultSetTitleList, resultSetTypeList, resultSetList.size());
+            }
+            else
+            {
+                iterator = new DatabaseBrowserIterator(resultSetList, resultSetTitleList, resultSetTypeList, windowSize);
+            }
+        }
+        catch (SQLException e)
+        {
+            throw e;
+        }
+        finally
+        {
+            try
+            {
+                if (null != selectStmt)
+                    selectStmt.close();
+                if (null != rs)
+                    rs.close();
+                if (null != con) // closes con also
+                {
+                    closeConnection(con);
+                }
+            }
+            catch (Exception e)
+            {
+                throw e;
+            }
+        }
+        return iterator;
+    }
 
     /**
      * Execute the sql statement as specified by the user or the default, and store the resultSet in a vector.
@@ -284,6 +447,38 @@
         return con;
     }
 
+    private Method[] getResultMethods(List types)
+    {
+        Method beanMethods[] = new Method[types.size()];
+        int type;
+        for (int index = 0; index < beanMethods.length; index++)
+        {
+            type = Integer.parseInt((String) types.get(index));
+            switch (type)
+            {
+                case Types.DATE:
+                    beanMethods[index] = ReflectionUtils.findMethod(ResultSet.class, "getDate", new Class[] { String.class });
+                    break;
+                case Types.VARCHAR:
+                    beanMethods[index] = ReflectionUtils.findMethod(ResultSet.class, "getString", new Class[] { String.class });
+                    break;
+                case Types.CHAR:
+                    beanMethods[index] = ReflectionUtils.findMethod(ResultSet.class, "getString", new Class[] { String.class });
+                    break;
+                case Types.INTEGER:
+                    beanMethods[index] = ReflectionUtils.findMethod(ResultSet.class, "getInt", new Class[] { String.class });
+                    break;
+                case Types.FLOAT:
+                    beanMethods[index] = ReflectionUtils.findMethod(ResultSet.class, "getFloat", new Class[] { String.class });
+                    break;
+                case Types.DOUBLE:
+                    beanMethods[index] = ReflectionUtils.findMethod(ResultSet.class, "getDouble", new Class[] { String.class });
+                    break;
+            }
+        }
+        return beanMethods;
+    }
+
     public Connection getConnection(String poolName)
     {
         return null;
@@ -314,12 +509,10 @@
         {
             try
             {
-                // fillDropDowns(getConnection(request), request);
-                // getContext(request).put("catlogs", getCatalogNames());
-                // getContext(request).put("schemas", getSchemaNames());
-                // getContext(request).put("tables", getTableNames());
                 fillColumnDropDown(getConnection(request), request);
                 getContext(request).put("cols", getColNames());
+                getContext(request).put("colTitle",getTitleList(request));
+                getContext(request).put("colName",getColumNames(request));
             }
             catch (Exception e)
             {
@@ -328,24 +521,12 @@
             }
             request.setAttribute("EditPage", "/WEB-INF/view/database-edit1.vm");
         }
-        else if (editAction != null && editAction.equals("configPage2"))
-        {
-            try
-            {
-                fillDropDowns(getConnection(request), request);
-            }
-            catch (Exception e)
-            {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-            request.setAttribute("EditPage", "/WEB-INF/view/database-edit2.vm");
-        }
         super.doEdit(request, response);
     }
 
     public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException
     {
+        String userName = "";
         if (request.getPortletMode() == PortletMode.EDIT)
         {
             String test = request.getParameter("Test");
@@ -379,10 +560,65 @@
             {
                 response.setPortletMode(PortletMode.EDIT);
                 response.setRenderParameter("configPage", editAction);
+                response.setRenderParameter(TABLE_NAME, request.getParameter(TABLE_NAME));
                 return;
             }
+            super.processAction(request, response);
+        }
+        else
+        {
+            String exportParam = request.getParameter(EXPORT_TYPE);
+            String xlsFileName = "thedata.xls";
+            String fileName ="";
+            if (!StringUtils.isEmpty(exportParam))
+            {
+                if (exportParam.equals(XLS_EXPORT))
+                {
+                    if (request.getUserPrincipal() != null)
+                    {
+                        userName = request.getUserPrincipal().getName();
+                    }
+                    else
+                    {
+                        userName = "guest";
+                    }
+                    try
+                    {
+                        dataBaseIterator = getLocalIterators(request, getQueryString(request), -1);
+                        HSSFWorkbook excelWorkbook = generateExcel(dataBaseIterator.getResultSet(), getColumNames(request),
+                                                                   (String[]) getTitleList(request).toArray(new String[getTitleList(request).size()]),
+                                                                   getResultMethods(dataBaseIterator.getResultSetTypesList()));
+                        if (excelWorkbook != null)
+                        {
+                            String path;
+                            path = cleanUserFolder(userName);
+                            path = path + pathSeprator + xlsFileName;
+                            File tempFile = new File(path);
+                            FileOutputStream out = new FileOutputStream(tempFile);
+                            excelWorkbook.write(out);
+                            fileName = xlsFileName;
+                        }
+                    }
+                    catch (Exception e)
+                    {
+                        // TODO Auto-generated catch block
+                        e.printStackTrace();
+                    }
+                }
+                else if (exportParam.equals(XML_EXPORT))
+                {
+                }
+                RequestContext jsReqContext = (RequestContext) request.getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
+                response.sendRedirect(request.getContextPath().replace(
+                                                                       request.getContextPath(),
+                                                                       jsReqContext.getPortalURL().getBasePath().subSequence(
+                                                                                                                             0,
+                                                                                                                             jsReqContext.getPortalURL()
+                                                                                                                                         .getBasePath()
+                                                                                                                                         .lastIndexOf("/"))) +
+                                      "/fileserver/content?file=" + userName + "_" + fileName);
+            }
         }
-        super.processAction(request, response);
     }
 
     private Subject getSubject()
@@ -391,21 +627,6 @@
         return JSSubject.getSubject(context);
     }
 
-    private String[] getCatalogNames()
-    {
-        return catlogNames;
-    }
-
-    private String[] getSchemaNames()
-    {
-        return schemaNames;
-    }
-
-    private String[] getTableNames()
-    {
-        return tableNames;
-    }
-
     private String[] getColNames()
     {
         return colNames;
@@ -419,19 +640,28 @@
 
     private void fillColumnDropDown(Connection con, RenderRequest request)
     {
-        String tableName = request.getPreferences().getValue(TABLE_NAME, "client");
+        String tableName;
         try
         {
-            PreparedStatement stmt = con.prepareStatement("select * from " + tableName);
-            ResultSet set = stmt.executeQuery();
+            if (!StringUtils.isEmpty(request.getParameter(TABLE_NAME)))
+            {
+                tableName = request.getParameter(TABLE_NAME);
+            }
+            else
+            {
+                tableName = request.getPreferences().getValue(TABLE_NAME, "");
+            }
+            Statement stmt = con.createStatement();
+            ResultSet set = stmt.executeQuery("select * from " + tableName);
             ResultSetMetaData meta = set.getMetaData();
             int ColumnCount = meta.getColumnCount();
             List colums = new ArrayList();
-            for (int index = 0; index < ColumnCount; index++)
+            for (int index = 1; index <= ColumnCount; index++)
             {
                 colums.add(meta.getColumnName(index));
             }
-            tableNames = (String[]) colums.toArray();
+            this.colNames = new String[colums.size()];
+            colums.toArray((String[]) this.colNames);
         }
         catch (Exception e)
         {
@@ -439,21 +669,163 @@
         }
     }
 
-    private void fillDropDowns(Connection con, RenderRequest request)
+    public List getTitleList(PortletRequest request)
     {
-        String catlogName = request.getPreferences().getValue(CATLOG_NAME, "");
-        String tableName = request.getPreferences().getValue(TABLE_NAME, "");
-        String schemaName = request.getPreferences().getValue(SCHEMA_NAME, "");
-        try
+        String titles = null;
+        titles = request.getPreferences().getValue(COLUMNS_TITLE, titles);
+        return Arrays.asList(titles.split(","));
+    }
+
+    public String[] getColumNames(PortletRequest request)
+    {
+        String columns[] = null;
+        String tempColumn = "";
+        tempColumn = request.getPreferences().getValue(COLUMNS, tempColumn);
+        return tempColumn.split(",");
+    }
+
+    public String getQueryString(PortletRequest request)
+    {
+        StringBuffer query = new StringBuffer();
+        String table = request.getPreferences().getValue(TABLE_NAME, "");
+        String condtions = request.getPreferences().getValue(CONDITIONS, "");
+        String columns = request.getPreferences().getValue(COLUMNS, "");
+        if (!StringUtils.isEmpty(columns))
         {
-            // catlogNames = (String[]) con.getMetaData().getCatalogs().getArray("TABLE_CATALOG").getArray();
-            // schemaNames = (String[]) con.getMetaData().getSchemas().getArray("TABLE_SCHEM").getArray();
-            tableNames = (String[]) con.getMetaData().getTables(catlogName, tableName, "%", new String[] { "TABLE" }).getArray("TABLE_NAME").getArray();
+            query.append("select ").append(columns).append(" from ").append(table);
         }
-        catch (SQLException e)
+        else
+        {
+            query.append("select * from ").append(table);
+        }
+        if (!StringUtils.isEmpty(condtions))
+        {
+            query.append(" ").append(condtions);
+        }
+        return query.toString();
+    }
+
+    private HSSFWorkbook generateExcel(List beanList, String[] colNames, String[] colDescs, Method[] readMethods)
+    {
+        date_output = new SimpleDateFormat(DATE_OUTPUT_PATTERN);
+        HSSFWorkbook workbook = new HSSFWorkbook();
+        HSSFSheet sheet = workbook.createSheet("export");
+        addColumnHeaders(sheet, colDescs);
+        addColumnValues(sheet, beanList, colNames, readMethods);
+        return workbook;
+    }
+
+    private void addColumnHeaders(HSSFSheet sheet, String[] colDescs)
+    {
+        HSSFRow rowHeader = sheet.createRow(0);
+        for (int i = 0; i < colDescs.length; i++)
+        {
+            addColumnValue(rowHeader, colDescs[i], i);
+        }
+    }
+
+    private void addColumnValues(HSSFSheet sheet, List beanList, String[] colNames, Method[] readMethods)
+    {
+        int rowIndex = 0;
+        Iterator beanListIter = beanList.iterator();
+        List tempList = null;
+        while (beanListIter.hasNext())
+        {
+            Object bean = beanListIter.next();
+            if (bean != null)
+            {
+                HSSFRow row = sheet.createRow(rowIndex + 1);
+                if (bean instanceof ArrayList)
+                {
+                    tempList = (List) bean;
+                    for (int i = 0; i < tempList.size(); i++)
+                    {
+                        String colVal = columnValueToString(tempList.get(i));
+                        addColumnValue(row, colVal, i);
+                    }
+                }
+                else
+                {
+                    for (int i = 0; i < colNames.length; i++)
+                    {
+                        String colName = colNames[i];
+                        Method colReadMethod = readMethods[i];
+                        String colVal = "";
+                        if (colReadMethod != null)
+                        {
+                            try
+                            {
+                                Object colValObj = colReadMethod.invoke(bean, new Object[] { colName });
+                                colVal = columnValueToString(colValObj);
+                            }
+                            catch (Exception ex)
+                            {
+                                colVal = "";
+                            }
+                        }
+                        addColumnValue(row, colVal, i);
+                    }
+                }
+                rowIndex++;
+            }
+        }
+    }
+
+    private void addColumnValue(HSSFRow rowHeader, String value, int index)
+    {
+        HSSFCell cell = rowHeader.createCell((short) index);
+        cell.setEncoding(HSSFCell.ENCODING_UTF_16);
+        if (value == null)
+            value = "";
+        cell.setCellValue(value);
+    }
+
+    protected String columnValueToString(Object colValObj)
+    {
+        String colVal = null;
+        if (colValObj == null)
+            colVal = "";
+        else
+        {
+            if (colValObj instanceof Date)
+            {
+                colVal = date_output.format((Date) colValObj);
+            }
+            else
+            {
+                colVal = colValObj.toString();
+            }
+        }
+        return colVal;
+    }
+
+    private String cleanUserFolder(String userName)
+    {
+        String folderName="";
+        synchronized (this)
+        {
+            folderName = getUserFolder(userName, false);
+            File dir = new File(folderName);
+            if (dir.exists())
+                dir.delete();
+            dir = new File(folderName);
+            dir.mkdir();
+        }
+        return folderName;
+    }
+    
+
+    private String getUserFolder(String userName, boolean fullPath)
+    {
+        if (pathSeprator == null || pathSeprator.equals(""))
+            pathSeprator = "/";
+        if (fullPath)
+        {
+            return userName + pathSeprator;
+        }
+        else
         {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
+            return pageRoot + pathSeprator + userName;
         }
     }
 }

Modified: portals/applications/gems/src/java/org/apache/portals/gems/file/FilePortlet.java
URL: http://svn.apache.org/viewvc/portals/applications/gems/src/java/org/apache/portals/gems/file/FilePortlet.java?rev=726017&r1=726016&r2=726017&view=diff
==============================================================================
--- portals/applications/gems/src/java/org/apache/portals/gems/file/FilePortlet.java (original)
+++ portals/applications/gems/src/java/org/apache/portals/gems/file/FilePortlet.java Fri Dec 12 06:37:32 2008
@@ -35,6 +35,7 @@
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.jetspeed.CommonPortletServices;
 import org.apache.jetspeed.Jetspeed;
 import org.apache.jetspeed.PortalReservedParameters;
@@ -143,7 +144,7 @@
         }
         catch (Exception e)
         {
-           //File not found;
+            // File not found;
         }
         return is;
     }
@@ -152,13 +153,23 @@
     {
         // NOTE: this is Jetspeed specific
         HttpServletRequest req = getHttpServletRequest(request);
-        String fileName = (String) req.getSession().getAttribute("file");
+        String fileName;
         String appName;
+        if (req.getSession().getAttribute("file") != null)
+        {
+            fileName = (String) req.getSession().getAttribute("file");
+        }
+        else
+        {
+            fileName = req.getParameter("file");
+        }
+        RequestContext jsReqContext = (RequestContext)request.getAttribute( PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE );
         if (fileName != null && !fileName.equals(""))
         {
             InputStream is = null;
             try
-            {
+            {                                
+                setContentType(fileName, response,jsReqContext);                
                 fileName = getFilePath(fileName);
                 is = new FileInputStream(fileName);
                 if (is == null)
@@ -166,8 +177,7 @@
                     byte[] bytes = ("File " + fileName + " not found.").getBytes();
                     response.getPortletOutputStream().write(bytes);
                     return;
-                }
-                setContentType(fileName, response);
+                }                
                 drain(is, response.getPortletOutputStream());
                 response.getPortletOutputStream().flush();
                 is.close();
@@ -216,7 +226,7 @@
             }
             else
             {
-                setContentType(path, response);
+                setContentType(path, response,jsReqContext);
                 appName = getApplicationName(request);
                 List paths = fallback(path, request.getLocale().getLanguage(), appName);
                 renderFile(response, paths, appName);
@@ -260,7 +270,7 @@
         return paths;
     }
 
-    protected void setContentType(String path, RenderResponse response)
+    protected void setContentType(String path, RenderResponse response,RequestContext jsReqContext)
     {
         // Note these content types need to be added to the portlet.xml
         if (path.endsWith(".html"))
@@ -279,10 +289,16 @@
         {
             response.setContentType("text/csv");
         }
-        else if (path.endsWith(".xml") || path.endsWith(".xsl"))
+        else if (path.endsWith(".xml"))
         {
             response.setContentType("text/xml");
         }
+        else if (path.endsWith(".xls"))
+        {
+            response.setContentType("application/vnd.ms-excel");
+            jsReqContext.getResponse().setHeader( "Content-Type", "application/vnd.ms-excel" );
+            jsReqContext.getResponse().setHeader( "Content-Disposition", "inline; filename=thedata.xls" );
+        }        
         else if (path.endsWith(".psml") || path.endsWith(".link"))
         {
             response.setContentType("text/xml");