1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.util;
18 
19 import java.io.FileDescriptor;
20 import java.io.PrintWriter;
21 import java.util.Calendar;
22 import java.util.Iterator;
23 import java.util.LinkedList;
24 
25 /**
26  * @hide
27  */
28 public final class LocalLog {
29 
30     private LinkedList<String> mLog;
31     private int mMaxLines;
32     private long mNow;
33 
LocalLog(int maxLines)34     public LocalLog(int maxLines) {
35         mLog = new LinkedList<String>();
36         mMaxLines = maxLines;
37     }
38 
log(String msg)39     public synchronized void log(String msg) {
40         if (mMaxLines > 0) {
41             mNow = System.currentTimeMillis();
42             StringBuilder sb = new StringBuilder();
43             Calendar c = Calendar.getInstance();
44             c.setTimeInMillis(mNow);
45             sb.append(String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c));
46             mLog.add(sb.toString() + " - " + msg);
47             while (mLog.size() > mMaxLines) mLog.remove();
48         }
49     }
50 
dump(FileDescriptor fd, PrintWriter pw, String[] args)51     public synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
52         Iterator<String> itr = mLog.listIterator(0);
53         while (itr.hasNext()) {
54             pw.println(itr.next());
55         }
56     }
57 
reverseDump(FileDescriptor fd, PrintWriter pw, String[] args)58     public synchronized void reverseDump(FileDescriptor fd, PrintWriter pw, String[] args) {
59         for (int i = mLog.size() - 1; i >= 0; i--) {
60             pw.println(mLog.get(i));
61         }
62     }
63 
64     public static class ReadOnlyLocalLog {
65         private final LocalLog mLog;
ReadOnlyLocalLog(LocalLog log)66         ReadOnlyLocalLog(LocalLog log) {
67             mLog = log;
68         }
dump(FileDescriptor fd, PrintWriter pw, String[] args)69         public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
70             mLog.dump(fd, pw, args);
71         }
72     }
73 
readOnlyLocalLog()74     public ReadOnlyLocalLog readOnlyLocalLog() {
75         return new ReadOnlyLocalLog(this);
76     }
77 }
78