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    package org.apache.geronimo.derby;
018    
019    import org.apache.geronimo.gbean.GBeanInfo;
020    import org.apache.geronimo.gbean.GBeanInfoBuilder;
021    
022    import java.io.BufferedReader;
023    import java.io.File;
024    import java.io.FileInputStream;
025    import java.io.IOException;
026    import java.io.InputStreamReader;
027    import java.util.LinkedList;
028    import java.util.List;
029    import java.util.regex.Matcher;
030    import java.util.regex.Pattern;
031    import java.util.regex.PatternSyntaxException;
032    
033    /**
034     * ReplaceMe
035     *
036     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
037     */
038    public class DerbyLogGBean implements DerbyLog {
039    
040        private final DerbySystem derby;
041        private File logFile = null;
042    
043        public DerbyLogGBean(DerbySystem derby) {
044            this.derby = derby;
045        }
046    
047        public SearchResults searchLog(Integer startLine, Integer endLine, Integer max, String text) {
048            // Get log file
049            if(logFile == null) {
050                logFile = new File(derby.getDerbyHome(), "derby.log");
051                if(!logFile.canRead()) {
052                    throw new IllegalStateException("Cannot read Derby log file at '"+logFile.getAbsolutePath()+"'");
053                }
054            }
055            // Check that the text pattern is valid
056            Pattern textPattern;
057            try {
058                textPattern = text == null || text.equals("") ? null : Pattern.compile(text);
059            } catch (PatternSyntaxException e) {
060                throw new IllegalArgumentException("Bad regular expression '"+text+"'");
061            }
062            return searchFile(logFile, textPattern, startLine, endLine,
063                    max == null ? MAX_SEARCH_RESULTS : Math.min(MAX_SEARCH_RESULTS, max.intValue()));
064        }
065    
066        private static SearchResults searchFile(File file, Pattern textSearch, Integer start, Integer stop, int max) {
067            List list = new LinkedList();
068            boolean capped = false;
069            int lineCount = 0;
070            FileInputStream logInputStream = null;
071            try {
072                logInputStream = new FileInputStream(file);
073                BufferedReader reader = new BufferedReader(new InputStreamReader(logInputStream, "US-ASCII"));
074                Matcher text = textSearch == null ? null : textSearch.matcher("");
075                max = Math.min(max, MAX_SEARCH_RESULTS);
076                String line;
077                while ((line = reader.readLine()) != null) {
078                    ++lineCount;
079                    if(start != null && start.intValue() > lineCount) {
080                        continue;
081                    }
082                    if(stop != null && stop.intValue() < lineCount) {
083                        continue;
084                    }
085                    if(text != null) {
086                        text.reset(line);
087                        if(!text.find()) {
088                            continue;
089                        }
090                    }
091                    list.add(new LogMessage(lineCount,line.toString()));
092                    if(list.size() > max) {
093                        list.remove(0);
094                        capped = true;
095                    }
096                }
097    
098            } catch (Exception e) {            
099                // TODO: improve exception handling
100            } finally {
101                if (logInputStream != null) {
102                    try {
103                        logInputStream.close();
104                    } catch (IOException e) {
105                        // ignore
106                    }
107                }
108            }
109            return new SearchResults(lineCount, (LogMessage[]) list.toArray(new LogMessage[list.size()]), capped);
110        }
111        public static final GBeanInfo GBEAN_INFO;
112    
113        static {
114            GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic("Derby Log", DerbyLogGBean.class);
115    
116            infoFactory.addReference("DerbySystem", DerbySystem.class, "GBean");
117            infoFactory.addInterface(DerbyLog.class);
118            infoFactory.setConstructor(new String[]{"DerbySystem"});
119    
120            GBEAN_INFO = infoFactory.getBeanInfo();
121        }
122    
123        public static GBeanInfo getGBeanInfo() {
124            return GBEAN_INFO;
125        }
126    }