1+ package oracle .weblogic .deploy .logging ;
2+
3+ import java .util .ArrayList ;
4+ import java .util .List ;
5+ import java .util .Properties ;
6+ import java .util .logging .*;
7+
8+
9+ public class SummaryHandler extends MemoryHandler implements WLSDeployLogEndHandler {
10+ private static final String CLASS = SummaryHandler .class .getName ();
11+ private static final PlatformLogger LOGGER = WLSDeployLogFactory .getLogger ("wlsdeploy" );
12+ private static final String LEVEL_PROPERTY = "level" ;
13+ private static final String TARGET_PROPERTY = "target" ;
14+ private static final String SIZE_PROPERTY = "size" ;
15+ private static final int DEFAULT_SIZE = 3000 ;
16+
17+ private boolean online = false ;
18+ private int bufferSize ;
19+
20+ private LevelHandler infoMemoryHandler = new NoActionHandler (Level .INFO );
21+ private LevelHandler warnMemoryHandler = new NoActionHandler (Level .WARNING );
22+ private LevelHandler errMemoryHandler = new NoActionHandler (Level .SEVERE );
23+ private LevelHandler [] handlers = {infoMemoryHandler , warnMemoryHandler , errMemoryHandler };
24+ private boolean closed = false ;
25+
26+ public SummaryHandler () {
27+ super ();
28+ configure ();
29+ infoMemoryHandler = getLevelHandler (Level .INFO );
30+ infoMemoryHandler = getLevelHandler (Level .WARNING );
31+ infoMemoryHandler = getLevelHandler (Level .SEVERE );
32+ }
33+
34+ @ Override
35+ public synchronized void publish (LogRecord record ) {
36+ // after close, take yourself out of the mix. The stored up log messages are going to go to the
37+ // console handler anyway
38+ if (!closed ) {
39+ infoMemoryHandler .publish (record );
40+ warnMemoryHandler .publish (record );
41+ errMemoryHandler .publish (record );
42+ }
43+ }
44+
45+ @ Override
46+ public synchronized void push () {
47+ String METHOD = "push" ;
48+ LOGGER .entering (CLASS , METHOD );
49+ closed = true ;
50+ List <Integer > counts = new ArrayList <>();
51+ for (LevelHandler handler : handlers ) {
52+ int count = handler .pushSection ();
53+ if (count >= 0 ) {
54+ counts .add (count );
55+ }
56+ }
57+ int size = counts .size ();
58+ String msgNbr = "WLSDPLY-21004" ;
59+ if (size == 2 ) {
60+ msgNbr = "WLSDPLY-21003" ;
61+ } else if (size == 3 ) {
62+ msgNbr = "WLSDPLY-21002" ;
63+ }
64+ // got to fix this as this isn't allowed ? check to see if it resolves the msg nbr. Is this going to be 1 arg?
65+ LOGGER .log (Level .ALL , msgNbr , (Object [])counts .toArray (new Object [size ]));
66+ LOGGER .exiting (CLASS , METHOD );
67+ }
68+
69+ @ Override
70+ public void flush () {
71+ super .flush ();
72+ }
73+
74+ @ Override
75+ public void close () throws SecurityException {
76+ super .close ();
77+ }
78+
79+ public void setOnline (boolean isOnline ) {
80+ online = isOnline ;
81+ }
82+
83+ public boolean isOnline () {
84+ return online ;
85+ }
86+
87+ @ Override
88+ public void logEnd (boolean online ) {
89+ setOnline (online );
90+ push ();
91+ }
92+
93+ /**
94+ * The WLSDeployLoggingConfig will call this method to add to the logging.properties files.
95+ * If the logging.properties already contains the property, the property in this list will be ignored.
96+ * @return properties to set in logging.properties
97+ */
98+ public static Properties getHandlerProperties () {
99+ String METHOD = "getHandlerProperties" ;
100+ LOGGER .entering (CLASS , METHOD );
101+ Properties properties = new Properties ();
102+ properties .setProperty (LEVEL_PROPERTY , Level .INFO .getName ());
103+ properties .setProperty (TARGET_PROPERTY , WLSDeployLoggingConsoleHandler .class .getName ());
104+ LOGGER .exiting (CLASS , METHOD , properties );
105+ return properties ;
106+ }
107+
108+ private class SummaryFormatter extends Formatter {
109+ public synchronized String format (LogRecord logRecord ) {
110+ // for now, only format the message in summary - maybe add logger name or other later
111+ return formatMessage (logRecord );
112+ }
113+ }
114+
115+ private LevelHandler getLevelHandler (Level compareTo ) {
116+ LevelHandler handler ;
117+ if (getLevel ().intValue () <= compareTo .intValue ()) {
118+ handler = new LevelHandler (this , bufferSize , Level .ALL );
119+ setLevel (compareTo );
120+ setFilter (getFilter ());
121+ setFormatter (new SummaryFormatter ());
122+ } else {
123+ handler = new NoActionHandler (compareTo );
124+ }
125+ return handler ;
126+ }
127+
128+ private class LevelHandler extends MemoryHandler {
129+
130+ private int totalRecords ;
131+
132+ LevelHandler (Handler handler , int size , Level level ) {
133+ super (handler , size , Level .ALL );
134+ setLevel (level );
135+ }
136+
137+ LevelHandler (Level level ) {
138+ setLevel (level );
139+ }
140+
141+ @ Override
142+ public synchronized void publish (LogRecord record ) {
143+ if (record .getLevel ().intValue () == getLevel ().intValue ()) {
144+ ++totalRecords ;
145+ super .publish (record );
146+ }
147+ }
148+
149+ public int pushSection () {
150+ if (isOnline ()) {
151+ logStart ();
152+ super .push ();
153+ logEnd ();
154+ }
155+ return getTotalRecords ();
156+ }
157+
158+ int getTotalRecords () {
159+ return totalRecords ;
160+ }
161+
162+ void logStart () {
163+ LOGGER .log (Level .ALL , "WLSDPLY-2100" , getLevel ().getName ());
164+ }
165+
166+ void logEnd () {
167+ LOGGER .log (Level .ALL , "WLSDPLY-2101" , getLevel ().getName (), getTotalRecords ());
168+ }
169+ }
170+
171+ private class NoActionHandler extends LevelHandler {
172+
173+ NoActionHandler (Level level ) {
174+ super (level );
175+ }
176+
177+
178+ @ Override
179+ public void publish (LogRecord record ) {
180+
181+ }
182+
183+ @ Override
184+ public int pushSection () {
185+ return getTotalRecords ();
186+ }
187+
188+ @ Override
189+ public void push () {
190+
191+ }
192+
193+ @ Override
194+ public void flush () {
195+
196+ }
197+
198+ @ Override
199+ public void close () throws SecurityException {
200+
201+ }
202+
203+ @ Override
204+ public int getTotalRecords () {
205+ return -1 ;
206+ }
207+
208+ @ Override
209+ void logStart () {
210+
211+ }
212+
213+ @ Override
214+ void logEnd () {
215+
216+ }
217+ }
218+
219+ private void configure () {
220+ LogManager manager = LogManager .getLogManager ();
221+ String cname = getClass ().getName ();
222+
223+ bufferSize = getSize (manager .getProperty (cname + "." + SIZE_PROPERTY ));
224+ }
225+
226+ private int getSize (String propSize ) {
227+ Integer handlerSize ;
228+ try {
229+ handlerSize = new Integer (propSize );
230+ } catch (NumberFormatException nfe ) {
231+ handlerSize = DEFAULT_SIZE ;
232+ }
233+ return handlerSize ;
234+ }
235+
236+ }
0 commit comments