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.logmanager;
019    
020    import java.io.IOException;
021    import java.io.Serializable;
022    import java.io.File;
023    
024    import javax.portlet.PortletConfig;
025    import javax.portlet.PortletContext;
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    import javax.portlet.PortletSession;
032    
033    import org.apache.geronimo.console.BasePortlet;
034    import org.apache.geronimo.console.util.PortletManager;
035    import org.apache.geronimo.system.logging.SystemLog;
036    
037    public class LogViewerPortlet extends BasePortlet {
038        private final static String CRITERIA_KEY = "org.apache.geronimo.console.log.CRITERIA";
039    
040        protected PortletRequestDispatcher searchView;
041    
042        protected PortletRequestDispatcher helpView;
043    
044        protected void doHelp(RenderRequest renderRequest,
045                RenderResponse renderRespose) throws PortletException, IOException {
046            helpView.include(renderRequest, renderRespose);
047        }
048    
049        protected void doView(RenderRequest renderRequest,
050                RenderResponse renderRespose) throws PortletException, IOException {
051            if (WindowState.MINIMIZED.equals(renderRequest.getWindowState())) {
052                return;
053            }
054            String action = renderRequest.getParameter("action");
055    
056            SystemLog log = PortletManager.getCurrentSystemLog(renderRequest);
057            String[] logFiles = log.getLogFileNames();
058            LogFile[] files = new LogFile[logFiles.length];
059            for (int i = 0; i < files.length; i++) {
060                files[i] = new LogFile(logFiles[i]);
061            }
062            Criteria criteria = (Criteria) renderRequest.getPortletSession(true).getAttribute(CRITERIA_KEY, PortletSession.PORTLET_SCOPE);
063            
064            if (criteria == null || (action != null && !"refresh".equals(action))) {
065                if(criteria == null)
066                    criteria = new Criteria();
067                String startPos = renderRequest.getParameter("startPos");
068                String endPos = renderRequest.getParameter("endPos");
069                String maxRows = renderRequest.getParameter("maxRows");
070                String logLevel = renderRequest.getParameter("logLevel");
071                String searchString = renderRequest.getParameter("searchString");
072                String stackTraces = renderRequest.getParameter("stackTraces");
073                String logFile = renderRequest.getParameter("logFile");
074                if(logFile == null || logFile.equals("")) {
075                    logFile = logFiles[0];
076                }
077                
078                criteria.level = logLevel == null || logLevel.equals("") ? criteria.level : logLevel;
079                try{
080                    criteria.max = maxRows == null || maxRows.equals("") ? criteria.max : Integer.parseInt(maxRows);
081                }catch(NumberFormatException e){
082                    //ignore
083                }
084                try{
085                    criteria.start = startPos == null || startPos.equals("") ? null : new Integer(startPos);
086                }catch(NumberFormatException e){
087                //ignore
088                }
089                try{
090                    criteria.stop = endPos == null || endPos.equals("") ? null : new Integer(endPos);
091                }catch(NumberFormatException e){
092                    //ignore
093                    }
094                criteria.logFile = logFile;
095                criteria.stackTraces = stackTraces != null && !stackTraces.equals("");
096                
097                criteria.text = searchString == null || searchString.equals("") ? null : searchString;
098                renderRequest.getPortletSession(true).setAttribute(CRITERIA_KEY, criteria, PortletSession.PORTLET_SCOPE);
099            }
100    
101            SystemLog.SearchResults results = log.getMatchingItems(criteria.logFile, criteria.start, criteria.stop,
102                            criteria.level, criteria.text, criteria.max, criteria.stackTraces);
103            renderRequest.setAttribute("searchResults", results.getResults());
104            renderRequest.setAttribute("lineCount", new Integer(results.getLineCount()));
105            renderRequest.setAttribute("startPos", criteria.start);
106            renderRequest.setAttribute("endPos", criteria.stop);
107            renderRequest.setAttribute("logLevel", criteria.level);
108            renderRequest.setAttribute("searchString", criteria.text);
109            renderRequest.setAttribute("maxRows", Integer.toString(criteria.max));
110            renderRequest.setAttribute("logFile", criteria.logFile);
111            renderRequest.setAttribute("logFiles", files);
112            if(criteria.stackTraces) {
113                renderRequest.setAttribute("stackTraces", Boolean.TRUE);
114            }
115            if(results.isCapped()) {
116                renderRequest.setAttribute("capped", Boolean.TRUE);
117            }
118    
119            searchView.include(renderRequest, renderRespose);
120        }
121    
122        public void init(PortletConfig portletConfig) throws PortletException {
123            PortletContext pc = portletConfig.getPortletContext();
124            searchView = pc
125                    .getRequestDispatcher("/WEB-INF/view/logmanager/search.jsp");
126            helpView = pc
127                    .getRequestDispatcher("/WEB-INF/view/logmanager/viewhelp.jsp");
128            super.init(portletConfig);
129        }
130    
131        private static class Criteria implements Serializable {
132            int max = 10;
133            Integer start;
134            Integer stop;
135            String text;
136            String level = "WARN";
137            String logFile;
138            boolean stackTraces;
139        }
140    
141        public static class LogFile {
142            private String fullName;
143            private String name;
144    
145            public LogFile(String fullName) {
146                this.fullName = fullName;
147                //todo: what if portla JVM has different separator than server JVM?
148                int pos = fullName.lastIndexOf(File.separatorChar);
149                if(pos > -1) {
150                    name = fullName.substring(pos+1);
151                } else {
152                    name = fullName;
153                }
154            }
155    
156            public String getFullName() {
157                return fullName;
158            }
159    
160            public String getName() {
161                return name;
162            }
163        }
164    }