001    /**
002     *  Licensed to the Apache Software Foundation (ASF) under one or more
003     *  contributor license agreements.  See the NOTICE file distributed with
004     *  this work for additional information regarding copyright ownership.
005     *  The ASF licenses this file to You under the Apache License, Version 2.0
006     *  (the "License"); you may not use this file except in compliance with
007     *  the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    
018    package org.apache.geronimo.console.internaldb;
019    
020    import java.io.IOException;
021    import java.util.Collection;
022    
023    import javax.portlet.ActionRequest;
024    import javax.portlet.ActionResponse;
025    import javax.portlet.PortletConfig;
026    import javax.portlet.PortletException;
027    import javax.portlet.PortletRequestDispatcher;
028    import javax.portlet.RenderRequest;
029    import javax.portlet.RenderResponse;
030    import javax.portlet.WindowState;
031    
032    import org.apache.geronimo.console.BasePortlet;
033    
034    public class RunSQLPortlet extends BasePortlet {
035    
036        private static final String NORMALVIEW_JSP = "/WEB-INF/view/internaldb/runSQLNormal.jsp";
037    
038        private static final String MAXIMIZEDVIEW_JSP = "/WEB-INF/view/internaldb/runSQLMaximized.jsp";
039    
040        private static final String HELPVIEW_JSP = "/WEB-INF/view/internaldb/runSQLHelp.jsp";
041    
042        private static final String CREATEDB_ACTION = "Create";
043    
044        private static final String DELETEDB_ACTION = "Delete";
045    
046        private static final String RUNSQL_ACTION = "Run SQL";
047    
048        private static final String BACKUPDB_ACTION = "Backup";
049    
050        private static final String RESTOREDB_ACTION = "Restore";
051    
052        private static RunSQLHelper sqlHelper = new RunSQLHelper();
053    
054        private static DBViewerHelper dbHelper = new DBViewerHelper();
055    
056        private PortletRequestDispatcher normalView;
057    
058        private PortletRequestDispatcher maximizedView;
059    
060        private PortletRequestDispatcher helpView;
061    
062        private Collection databases;
063    
064        private String action;
065    
066        private String createDB;
067    
068        private String deleteDB;
069    
070        private String useDB;
071    
072        private String backupDB;
073    
074        private String restoreDB;
075    
076        private String sqlStmts;
077    
078        private String actionResult;
079    
080        public void processAction(ActionRequest actionRequest,
081                ActionResponse actionResponse) throws PortletException, IOException {
082            // Getting parameters here because it fails on doView()
083            action = actionRequest.getParameter("action");
084            createDB = actionRequest.getParameter("createDB");
085            deleteDB = actionRequest.getParameter("deleteDB");
086            useDB = actionRequest.getParameter("useDB");
087            backupDB = actionRequest.getParameter("backupDB");
088            restoreDB = actionRequest.getParameter("restoreDB");
089            sqlStmts = actionRequest.getParameter("sqlStmts");
090            actionResult = "";
091            if (CREATEDB_ACTION.equals(action)) {
092                actionResult = sqlHelper.createDB(createDB);
093            } else if (DELETEDB_ACTION.equals(action)) {
094                actionResult = sqlHelper.deleteDB(DerbyConnectionUtil.getDerbyHome(), deleteDB);
095            } else if (RUNSQL_ACTION.equals(action)) {
096                actionResult = sqlHelper.runSQL(useDB, sqlStmts);
097            } else if (BACKUPDB_ACTION.equals(action)) {
098                actionResult = sqlHelper.backupDB(DerbyConnectionUtil.getDerbyHome(), backupDB);
099            } else if (RESTOREDB_ACTION.equals(action)) {
100                actionResult = sqlHelper.restoreDB(DerbyConnectionUtil.getDerbyHome(), restoreDB);
101            }
102        }
103    
104        protected void doView(RenderRequest renderRequest,
105                RenderResponse renderResponse) throws IOException, PortletException {
106            if (WindowState.MINIMIZED.equals(renderRequest.getWindowState())) {
107                return;
108            }
109    
110            String singleSelectStmt;
111            if (WindowState.NORMAL.equals(renderRequest.getWindowState())) {
112                databases = dbHelper.getDerbyDatabases(DerbyConnectionUtil.getDerbyHome());
113                renderRequest.setAttribute("databases", databases);
114                if (RUNSQL_ACTION.equals(action)) {
115                    // check if it's a single Select statement
116                    if ((sqlStmts != null) && (sqlStmts.trim().indexOf(';') == -1)
117                            && sqlStmts.trim().toUpperCase().startsWith("SELECT")
118                            && RunSQLHelper.SQL_SUCCESS_MSG.equals(actionResult)) {
119                        singleSelectStmt = sqlStmts.trim();
120                        // set action result to blank so it won't display
121                        actionResult = "";
122                    } else {
123                        singleSelectStmt = "";
124                    }
125                    renderRequest.setAttribute("useDB", useDB);
126                    renderRequest
127                            .setAttribute("singleSelectStmt", singleSelectStmt);
128                    renderRequest.setAttribute("ds", DerbyConnectionUtil
129                            .getDataSource(useDB));
130                }
131                if ((action != null) && (action.trim().length() > 0)) {
132                    renderRequest.setAttribute("actionResult", actionResult);
133                    //set action to null so that subsequent renders of portlet
134                    // won't display
135                    //action result if there is no action to process
136                    action = null;
137                }
138                normalView.include(renderRequest, renderResponse);
139            } else {
140                maximizedView.include(renderRequest, renderResponse);
141            }
142        }
143    
144        protected void doHelp(RenderRequest renderRequest,
145                RenderResponse renderResponse) throws PortletException, IOException {
146            helpView.include(renderRequest, renderResponse);
147        }
148    
149        public void init(PortletConfig portletConfig) throws PortletException {
150            super.init(portletConfig);
151            normalView = portletConfig.getPortletContext().getRequestDispatcher(
152                    NORMALVIEW_JSP);
153            maximizedView = portletConfig.getPortletContext().getRequestDispatcher(
154                    MAXIMIZEDVIEW_JSP);
155            helpView = portletConfig.getPortletContext().getRequestDispatcher(
156                    HELPVIEW_JSP);
157            databases = dbHelper.getDerbyDatabases(DerbyConnectionUtil.getDerbyHome());
158        }
159    
160        public void destroy() {
161            normalView = null;
162            maximizedView = null;
163            helpView = null;
164            super.destroy();
165        }
166    
167    }