Author: gnodet Date: Wed Apr 30 04:26:15 2008 New Revision: 652336 URL: http://svn.apache.org/viewvc?rev=652336&view=rev Log: SMX4KNL-1: Implements a log command Added: servicemix/smx4/kernel/trunk/gshell/gshell-log/ (with props) servicemix/smx4/kernel/trunk/gshell/gshell-log/pom.xml servicemix/smx4/kernel/trunk/gshell/gshell-log/src/ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/DisplayLog.java servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/GetLogLevel.java servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/LruList.java servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/SetLogLevel.java servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/VmLogAppender.java servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/AbsoluteTimeDateFormat.java servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/DateTimeDateFormat.java servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/FormattingInfo.java servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/ISO8601DateFormat.java servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/PatternConverter.java servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/PatternParser.java servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/resources/ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/resources/META-INF/ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/resources/META-INF/spring/ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/resources/META-INF/spring/gshell-log.xml Modified: servicemix/smx4/kernel/trunk/assembly/pom.xml servicemix/smx4/kernel/trunk/assembly/src/main/descriptors/unix-bin.xml servicemix/smx4/kernel/trunk/assembly/src/main/descriptors/windows-bin.xml servicemix/smx4/kernel/trunk/assembly/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg servicemix/smx4/kernel/trunk/assembly/src/main/filtered-resources/etc/startup.properties servicemix/smx4/kernel/trunk/gshell/gshell-core/src/main/filtered-resources/org/apache/geronimo/gshell/spring/etc/startup.properties servicemix/smx4/kernel/trunk/gshell/pom.xml servicemix/smx4/kernel/trunk/pom.xml Modified: servicemix/smx4/kernel/trunk/assembly/pom.xml URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/assembly/pom.xml?rev=652336&r1=652335&r2=652336&view=diff ============================================================================== --- servicemix/smx4/kernel/trunk/assembly/pom.xml (original) +++ servicemix/smx4/kernel/trunk/assembly/pom.xml Wed Apr 30 04:26:15 2008 @@ -109,6 +109,11 @@ org.apache.servicemix.kernel.gshell.osgi ${pom.version} + + org.apache.servicemix.kernel.gshell + org.apache.servicemix.kernel.gshell.log + ${pom.version} + org.apache.servicemix.kernel.gshell org.apache.servicemix.kernel.gshell.features Modified: servicemix/smx4/kernel/trunk/assembly/src/main/descriptors/unix-bin.xml URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/assembly/src/main/descriptors/unix-bin.xml?rev=652336&r1=652335&r2=652336&view=diff ============================================================================== --- servicemix/smx4/kernel/trunk/assembly/src/main/descriptors/unix-bin.xml (original) +++ servicemix/smx4/kernel/trunk/assembly/src/main/descriptors/unix-bin.xml Wed Apr 30 04:26:15 2008 @@ -133,6 +133,7 @@ org.apache.servicemix.bundles:org.apache.servicemix.bundles.mina-${mina.version} org.apache.servicemix.kernel.gshell:org.apache.servicemix.kernel.gshell.core org.apache.servicemix.kernel.gshell:org.apache.servicemix.kernel.gshell.osgi + org.apache.servicemix.kernel.gshell:org.apache.servicemix.kernel.gshell.log org.apache.felix:org.apache.felix.bundlerepository Modified: servicemix/smx4/kernel/trunk/assembly/src/main/descriptors/windows-bin.xml URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/assembly/src/main/descriptors/windows-bin.xml?rev=652336&r1=652335&r2=652336&view=diff ============================================================================== --- servicemix/smx4/kernel/trunk/assembly/src/main/descriptors/windows-bin.xml (original) +++ servicemix/smx4/kernel/trunk/assembly/src/main/descriptors/windows-bin.xml Wed Apr 30 04:26:15 2008 @@ -126,6 +126,7 @@ org.apache.servicemix.bundles:org.apache.servicemix.bundles.mina-${mina.version} org.apache.servicemix.kernel.gshell:org.apache.servicemix.kernel.gshell.core org.apache.servicemix.kernel.gshell:org.apache.servicemix.kernel.gshell.osgi + org.apache.servicemix.kernel.gshell:org.apache.servicemix.kernel.gshell.log org.apache.felix:org.apache.felix.bundlerepository Modified: servicemix/smx4/kernel/trunk/assembly/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/assembly/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg?rev=652336&r1=652335&r2=652336&view=diff ============================================================================== --- servicemix/smx4/kernel/trunk/assembly/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg (original) +++ servicemix/smx4/kernel/trunk/assembly/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg Wed Apr 30 04:26:15 2008 @@ -18,7 +18,7 @@ ################################################################################ # -log4j.rootLogger=INFO, out +log4j.rootLogger=INFO, out, osgi:VmLogAppender # CONSOLE appender not used by default log4j.appender.stdout=org.apache.log4j.ConsoleAppender Modified: servicemix/smx4/kernel/trunk/assembly/src/main/filtered-resources/etc/startup.properties URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/assembly/src/main/filtered-resources/etc/startup.properties?rev=652336&r1=652335&r2=652336&view=diff ============================================================================== --- servicemix/smx4/kernel/trunk/assembly/src/main/filtered-resources/etc/startup.properties (original) +++ servicemix/smx4/kernel/trunk/assembly/src/main/filtered-resources/etc/startup.properties Wed Apr 30 04:26:15 2008 @@ -51,6 +51,7 @@ org.apache.servicemix.kernel.gshell.obr-${pom.version}.jar=50 org.apache.servicemix.kernel.gshell.osgi-${pom.version}.jar=50 org.apache.servicemix.kernel.gshell.features-${pom.version}.jar=50 +org.apache.servicemix.kernel.gshell.log-${pom.version}.jar=50 # # Start console last Modified: servicemix/smx4/kernel/trunk/gshell/gshell-core/src/main/filtered-resources/org/apache/geronimo/gshell/spring/etc/startup.properties URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/gshell-core/src/main/filtered-resources/org/apache/geronimo/gshell/spring/etc/startup.properties?rev=652336&r1=652335&r2=652336&view=diff ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/gshell-core/src/main/filtered-resources/org/apache/geronimo/gshell/spring/etc/startup.properties (original) +++ servicemix/smx4/kernel/trunk/gshell/gshell-core/src/main/filtered-resources/org/apache/geronimo/gshell/spring/etc/startup.properties Wed Apr 30 04:26:15 2008 @@ -51,6 +51,7 @@ org.apache.servicemix.kernel.gshell.obr-${pom.version}.jar=50 org.apache.servicemix.kernel.gshell.osgi-${pom.version}.jar=50 org.apache.servicemix.kernel.gshell.features-${pom.version}.jar=50 +org.apache.servicemix.kernel.gshell.log-${pom.version}.jar=50 # # Start console last Propchange: servicemix/smx4/kernel/trunk/gshell/gshell-log/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Wed Apr 30 04:26:15 2008 @@ -0,0 +1,9 @@ +target +*.iml +*.ipr +*.iws +.classpath +.project +.settings + + Added: servicemix/smx4/kernel/trunk/gshell/gshell-log/pom.xml URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/gshell-log/pom.xml?rev=652336&view=auto ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/gshell-log/pom.xml (added) +++ servicemix/smx4/kernel/trunk/gshell/gshell-log/pom.xml Wed Apr 30 04:26:15 2008 @@ -0,0 +1,102 @@ + + + + + + 4.0.0 + + + org.apache.servicemix.kernel.gshell + gshell + 1.0-m3-SNAPSHOT + + + org.apache.servicemix.kernel.gshell + org.apache.servicemix.kernel.gshell.log + bundle + 1.0-m3-SNAPSHOT + Apache ServiceMix Kernel :: GShell Log Commands + + + Provides the OSGi Log commands + + + + + org.apache.servicemix.kernel.gshell + org.apache.servicemix.kernel.gshell.core + ${pom.version} + + + + org.apache.felix + org.osgi.core + ${felix.osgi.version} + provided + + + + org.apache.felix + org.osgi.compendium + ${felix.compendium.version} + provided + + + org.apache.felix + org.osgi.foundation + + + org.apache.felix + javax.servlet + + + + + + org.springframework.osgi + spring-osgi-core + ${spring.osgi.version} + + + + org.ops4j.pax.logging + pax-logging-service + ${pax.logging.version} + + + + + + + + org.apache.felix + maven-bundle-plugin + + + ${artifactId} + org.apache.servicemix.gshell.log*;version=${project.version};-split-package:=merge-first + * + !* + *;publish-context:=false;create-asynchronously:=false + + + + + + Added: servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/DisplayLog.java URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/DisplayLog.java?rev=652336&view=auto ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/DisplayLog.java (added) +++ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/DisplayLog.java Wed Apr 30 04:26:15 2008 @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.servicemix.gshell.log; + +import org.apache.geronimo.gshell.clp.Option; +import org.apache.geronimo.gshell.command.annotation.CommandComponent; +import org.apache.geronimo.gshell.support.OsgiCommandSupport; +import org.apache.servicemix.gshell.log.layout.PatternConverter; +import org.apache.servicemix.gshell.log.layout.PatternParser; +import org.ops4j.pax.logging.spi.PaxLoggingEvent; + +@CommandComponent(id = "log:display", description = "Display log entries") +public class DisplayLog extends OsgiCommandSupport { + + @Option(name = "-n", description="Number of entries to display") + protected int entries; + + @Option(name = "-p", description="Output formatting pattern") + protected String overridenPattern; + + protected String pattern; + + protected LruList events; + + @Override + protected OsgiCommandSupport createCommand() throws Exception { + DisplayLog command = new DisplayLog(); + command.setEvents(getEvents()); + command.setPattern(getPattern()); + return command; + } + + public LruList getEvents() { + return events; + } + + public void setEvents(LruList events) { + this.events = events; + } + + public String getPattern() { + return pattern; + } + + public void setPattern(String pattern) { + this.pattern = pattern; + } + + protected Object doExecute() throws Exception { + PatternConverter cnv = new PatternParser(overridenPattern != null ? overridenPattern : pattern).parse(); + + Iterable le = events.getElements(entries == 0 ? Integer.MAX_VALUE : entries); + StringBuffer sb = new StringBuffer(); + for (PaxLoggingEvent event : le) { + sb.setLength(0); + for (PatternConverter pc = cnv; pc != null; pc = pc.next) { + pc.format(sb, event); + } + io.out.print(sb.toString()); + } + io.out.println(); + + return SUCCESS; + } + +} Added: servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/GetLogLevel.java URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/GetLogLevel.java?rev=652336&view=auto ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/GetLogLevel.java (added) +++ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/GetLogLevel.java Wed Apr 30 04:26:15 2008 @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.servicemix.gshell.log; + +import java.util.List; +import java.util.Dictionary; +import java.util.Map; +import java.util.TreeMap; +import java.util.Enumeration; + +import org.apache.geronimo.gshell.clp.Argument; +import org.apache.geronimo.gshell.command.annotation.CommandComponent; +import org.apache.geronimo.gshell.support.OsgiCommandSupport; +import org.osgi.framework.Bundle; +import org.osgi.framework.ServiceReference; +import org.osgi.service.log.LogReaderService; +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.cm.Configuration; + +/** + * User: ewoodman + * Date: March 3, 2008 + * Time: 11:10:10 AM + * To change this template use File | Settings | File Templates. + */ +@CommandComponent(id = "log:get", description = "Show Log Level") +public class GetLogLevel extends OsgiCommandSupport { + + @Argument(required = false, description = "Logger name, ALL or ROOT (default)") + String logger; + + static final String CONFIGURATION_PID = "org.ops4j.pax.logging"; + static final String ROOT_LOGGER_PREFIX = "log4j.rootLogger"; + static final String LOGGER_PREFIX = "log4j.logger."; + static final String ALL_LOGGER = "ALL"; + static final String ROOT_LOGGER = "ROOT"; + + protected Object doExecute() throws Exception { + ConfigurationAdmin cfgAdmin = getConfigAdmin(); + Configuration cfg = cfgAdmin.getConfiguration(CONFIGURATION_PID); + Dictionary props = cfg.getProperties(); + + if (ROOT_LOGGER.equalsIgnoreCase(this.logger)) { + this.logger = null; + } + if (ALL_LOGGER.equalsIgnoreCase(logger)) { + String root = getLevel((String) props.get(ROOT_LOGGER_PREFIX)); + Map loggers = new TreeMap(); + for (Enumeration e = props.keys(); e.hasMoreElements();) { + String prop = (String) e.nextElement(); + if (prop.startsWith(LOGGER_PREFIX)) { + String val = getLevel((String) props.get(prop)); + loggers.put(prop.substring(LOGGER_PREFIX.length()), val); + } + } + io.out.println("ROOT: " + root); + for (String logger : loggers.keySet()) { + io.out.println(logger + ": " + loggers.get(logger)); + } + } else { + String logger = this.logger; + String val; + for (;;) { + String prop; + if (logger == null) { + prop = ROOT_LOGGER_PREFIX; + } else { + prop = LOGGER_PREFIX + logger; + } + val = (String) props.get(prop); + val = getLevel(val); + if (val != null || logger == null) { + break; + } + int idx = logger.lastIndexOf('.'); + if (idx < 0) { + logger = null; + } else { + logger = logger.substring(0, idx); + } + } + String st = "Level: " + val; + if (logger != this.logger) { + st += " (inherited from " + (logger != null ? logger : "ROOT") + ")"; + } + io.out.println(st); + } + return SUCCESS; + } + + protected String getLevel(String prop) { + if (prop == null) { + return null; + } else { + String val = prop.trim(); + int idx = val.indexOf(","); + if (idx == 0) { + val = null; + } else if (idx > 0) { + val = val.substring(0, idx); + } + return val; + } + } + + protected ConfigurationAdmin getConfigAdmin() { + ServiceReference ref = getBundleContext().getServiceReference(ConfigurationAdmin.class.getName()); + return getService(ConfigurationAdmin.class, ref); + } + +} \ No newline at end of file Added: servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/LruList.java URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/LruList.java?rev=652336&view=auto ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/LruList.java (added) +++ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/LruList.java Wed Apr 30 04:26:15 2008 @@ -0,0 +1,88 @@ +package org.apache.servicemix.gshell.log; + +import java.util.AbstractList; +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Created by IntelliJ IDEA. + * User: gnodet + * Date: Apr 28, 2008 + * Time: 6:15:47 PM + * To change this template use File | Settings | File Templates. + */ +public class LruList { + + private E[] elements; + private transient int start = 0; + private transient int end = 0; + private transient boolean full = false; + private final int maxElements; + + public LruList(int size) { + if (size <= 0) { + throw new IllegalArgumentException("The size must be greater than 0"); + } + elements = (E[]) new Object[size]; + maxElements = elements.length; + } + + public int size() { + synchronized (elements) { + int size = 0; + if (end < start) { + size = maxElements - start + end; + } else if (end == start) { + size = (full ? maxElements : 0); + } else { + size = end - start; + } + return size; + } + } + + public void add(E element) { + synchronized (elements) { + if (null == element) { + throw new NullPointerException("Attempted to add null object to buffer"); + } + if (size() == maxElements) { + Object e = elements[start]; + if (null != e) { + elements[start++] = null; + if (start >= maxElements) { + start = 0; + } + full = false; + } + } + elements[end++] = element; + if (end >= maxElements) { + end = 0; + } + if (end == start) { + full = true; + } + } + } + + public Iterable getElements() { + synchronized (elements) { + return getElements(size()); + } + } + + public Iterable getElements(int nb) { + synchronized (elements) { + int s = size(); + nb = Math.min(Math.max(0, nb), s); + E[] e = (E[]) new Object[nb]; + for (int i = 0; i < nb; i++) { + e[i] = elements[(i + s - nb + start) % maxElements]; + } + return Arrays.asList(e); + } + } + +} Added: servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/SetLogLevel.java URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/SetLogLevel.java?rev=652336&view=auto ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/SetLogLevel.java (added) +++ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/SetLogLevel.java Wed Apr 30 04:26:15 2008 @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.servicemix.gshell.log; + +import java.util.Dictionary; + +import org.apache.geronimo.gshell.command.annotation.CommandComponent; +import org.apache.geronimo.gshell.support.OsgiCommandSupport; +import org.apache.geronimo.gshell.clp.Argument; +import org.apache.geronimo.gshell.clp.Option; +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.cm.Configuration; +import org.osgi.framework.ServiceReference; + +/** + * User: ewoodman + * Date: March 3, 2008 + * Time: 11:10:10 AM + * To change this template use File | Settings | File Templates. + */ +@CommandComponent(id = "log:set", description = "Change the log level") +public class SetLogLevel extends OsgiCommandSupport { + + @Argument(index = 0, required = true, description = "Level (TRACE, DEBUG, INFO, WARN, ERROR or - to unset") + String level; + + @Argument(index = 1, required = false, description = "Logger name or ROOT (default)") + String logger; + + static final String CONFIGURATION_PID = "org.ops4j.pax.logging"; + static final String ROOT_LOGGER_PREFIX = "log4j.rootLogger"; + static final String LOGGER_PREFIX = "log4j.logger."; + static final String ROOT_LOGGER = "ROOT"; + + static final String TRACE = "TRACE"; + static final String DEBUG = "DEBUG"; + static final String INFO = "INFO"; + static final String WARN = "WARN"; + static final String ERROR = "ERROR"; + static final String INHERITED = "-"; + + protected Object doExecute() throws Exception { + if (ROOT_LOGGER.equalsIgnoreCase(this.logger)) { + this.logger = null; + } + if (!TRACE.equals(level) && + !DEBUG.equals(level) && + !INFO.equals(level) && + !WARN.equals(level) && + !ERROR.equals(level) && + !INHERITED.equals(level)) { + io.err.println("level must be set to TRACE, DEBUG, INFO, WARN or ERROR (or - to unset it)"); + return FAILURE; + } + if (INHERITED.equals(level) && logger == null) { + io.err.println("Can not unset the ROOT logger"); + return FAILURE; + } + + ConfigurationAdmin cfgAdmin = getConfigAdmin(); + Configuration cfg = cfgAdmin.getConfiguration(CONFIGURATION_PID); + Dictionary props = cfg.getProperties(); + + String logger = this.logger; + String val; + String prop; + if (logger == null) { + prop = ROOT_LOGGER_PREFIX; + } else { + prop = LOGGER_PREFIX + logger; + } + val = (String) props.get(prop); + if (INHERITED.equals(level)) { + if (val != null) { + val = val.trim(); + int idx = val.indexOf(","); + if (idx > 0) { + val = val.substring(idx); + } else { + val = null; + } + } + } else { + if (val == null) { + val = level; + } else { + val = val.trim(); + int idx = val.indexOf(","); + if (idx == 0) { + val = level + val; + } else if (idx > 0) { + val = level + val.substring(idx); + } + } + } + if (val == null) { + props.remove(prop); + } else { + props.put(prop, val); + } + cfg.update(props); + + return SUCCESS; + } + + protected ConfigurationAdmin getConfigAdmin() { + ServiceReference ref = getBundleContext().getServiceReference(ConfigurationAdmin.class.getName()); + return getService(ConfigurationAdmin.class, ref); + } + +} \ No newline at end of file Added: servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/VmLogAppender.java URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/VmLogAppender.java?rev=652336&view=auto ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/VmLogAppender.java (added) +++ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/VmLogAppender.java Wed Apr 30 04:26:15 2008 @@ -0,0 +1,31 @@ +package org.apache.servicemix.gshell.log; + +import org.ops4j.pax.logging.spi.PaxAppender; +import org.ops4j.pax.logging.spi.PaxLoggingEvent; + +/** + * Created by IntelliJ IDEA. + * User: gnodet + * Date: Apr 28, 2008 + * Time: 5:13:39 PM + * To change this template use File | Settings | File Templates. + */ +public class VmLogAppender implements PaxAppender { + + protected LruList events; + + public LruList getEvents() { + return events; + } + + public void setEvents(LruList events) { + this.events = events; + } + + public void doAppend(PaxLoggingEvent event) { + if (events != null) { + events.add(event); + } + } + +} Added: servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/AbsoluteTimeDateFormat.java URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/AbsoluteTimeDateFormat.java?rev=652336&view=auto ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/AbsoluteTimeDateFormat.java (added) +++ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/AbsoluteTimeDateFormat.java Wed Apr 30 04:26:15 2008 @@ -0,0 +1,143 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.servicemix.gshell.log.layout; + +import java.util.Date; +import java.util.Calendar; +import java.util.TimeZone; +import java.text.FieldPosition; +import java.text.ParsePosition; +import java.text.DateFormat; + + +/** + Formats a {@link Date} in the format "HH:mm:ss,SSS" for example, + "15:49:37,459". + + @author Ceki Gülcü + @author Andrew Vajoczki + + @since 0.7.5 +*/ +public class AbsoluteTimeDateFormat extends DateFormat { + + /** + String constant used to specify {@link + org.apache.log4j.helpers.AbsoluteTimeDateFormat} in layouts. Current + value is ABSOLUTE. */ + public final static String ABS_TIME_DATE_FORMAT = "ABSOLUTE"; + + /** + String constant used to specify {@link + org.apache.log4j.helpers.DateTimeDateFormat} in layouts. Current + value is DATE. + */ + public final static String DATE_AND_TIME_DATE_FORMAT = "DATE"; + + /** + String constant used to specify {@link + org.apache.log4j.helpers.ISO8601DateFormat} in layouts. Current + value is ISO8601. + */ + public final static String ISO8601_DATE_FORMAT = "ISO8601"; + + public + AbsoluteTimeDateFormat() { + setCalendar(Calendar.getInstance()); + } + + public + AbsoluteTimeDateFormat(TimeZone timeZone) { + setCalendar(Calendar.getInstance(timeZone)); + } + + private static long previousTime; + private static char[] previousTimeWithoutMillis = new char[9]; // "HH:mm:ss." + + /** + Appends to sbuf the time in the format + "HH:mm:ss,SSS" for example, "15:49:37,459" + + @param date the date to format + @param sbuf the string buffer to write to + @param fieldPosition remains untouched + */ + public + StringBuffer format(Date date, StringBuffer sbuf, + FieldPosition fieldPosition) { + + long now = date.getTime(); + int millis = (int)(now % 1000); + + if ((now - millis) != previousTime) { + // We reach this point at most once per second + // across all threads instead of each time format() + // is called. This saves considerable CPU time. + + calendar.setTime(date); + + int start = sbuf.length(); + + int hour = calendar.get(Calendar.HOUR_OF_DAY); + if(hour < 10) { + sbuf.append('0'); + } + sbuf.append(hour); + sbuf.append(':'); + + int mins = calendar.get(Calendar.MINUTE); + if(mins < 10) { + sbuf.append('0'); + } + sbuf.append(mins); + sbuf.append(':'); + + int secs = calendar.get(Calendar.SECOND); + if(secs < 10) { + sbuf.append('0'); + } + sbuf.append(secs); + sbuf.append(','); + + // store the time string for next time to avoid recomputation + sbuf.getChars(start, sbuf.length(), previousTimeWithoutMillis, 0); + + previousTime = now - millis; + } + else { + sbuf.append(previousTimeWithoutMillis); + } + + + + if(millis < 100) + sbuf.append('0'); + if(millis < 10) + sbuf.append('0'); + + sbuf.append(millis); + return sbuf; + } + + /** + This method does not do anything but return null. + */ + public + Date parse(String s, ParsePosition pos) { + return null; + } +} Added: servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/DateTimeDateFormat.java URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/DateTimeDateFormat.java?rev=652336&view=auto ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/DateTimeDateFormat.java (added) +++ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/DateTimeDateFormat.java Wed Apr 30 04:26:15 2008 @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.servicemix.gshell.log.layout; + +import java.util.Calendar; +import java.util.TimeZone; +import java.util.Date; +import java.text.FieldPosition; +import java.text.ParsePosition; +import java.text.DateFormatSymbols; + +/** + Formats a {@link Date} in the format "dd MMM yyyy HH:mm:ss,SSS" for example, + "06 Nov 1994 15:49:37,459". + + @author Ceki Gülcü + @since 0.7.5 +*/ +public class DateTimeDateFormat extends AbsoluteTimeDateFormat { + + String[] shortMonths; + + public + DateTimeDateFormat() { + super(); + shortMonths = new DateFormatSymbols().getShortMonths(); + } + + public + DateTimeDateFormat(TimeZone timeZone) { + this(); + setCalendar(Calendar.getInstance(timeZone)); + } + + /** + Appends to sbuf the date in the format "dd MMM yyyy + HH:mm:ss,SSS" for example, "06 Nov 1994 08:49:37,459". + + @param sbuf the string buffer to write to + */ + public + StringBuffer format(Date date, StringBuffer sbuf, + FieldPosition fieldPosition) { + + calendar.setTime(date); + + int day = calendar.get(Calendar.DAY_OF_MONTH); + if(day < 10) + sbuf.append('0'); + sbuf.append(day); + sbuf.append(' '); + sbuf.append(shortMonths[calendar.get(Calendar.MONTH)]); + sbuf.append(' '); + + int year = calendar.get(Calendar.YEAR); + sbuf.append(year); + sbuf.append(' '); + + return super.format(date, sbuf, fieldPosition); + } + + /** + This method does not do anything but return null. + */ + public + Date parse(java.lang.String s, ParsePosition pos) { + return null; + } +} Added: servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/FormattingInfo.java URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/FormattingInfo.java?rev=652336&view=auto ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/FormattingInfo.java (added) +++ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/FormattingInfo.java Wed Apr 30 04:26:15 2008 @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.servicemix.gshell.log.layout; + + +/** + FormattingInfo instances contain the information obtained when parsing + formatting modifiers in conversion modifiers. + + @author Jim Cakalic + @author Ceki Gülcü + + @since 0.8.2 + */ +public class FormattingInfo { + int min = -1; + int max = 0x7FFFFFFF; + boolean leftAlign = false; + + void reset() { + min = -1; + max = 0x7FFFFFFF; + leftAlign = false; + } + + void dump() { + //LogLog.debug("min="+min+", max="+max+", leftAlign="+leftAlign); + } +} + Added: servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/ISO8601DateFormat.java URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/ISO8601DateFormat.java?rev=652336&view=auto ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/ISO8601DateFormat.java (added) +++ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/ISO8601DateFormat.java Wed Apr 30 04:26:15 2008 @@ -0,0 +1,153 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.servicemix.gshell.log.layout; + +import java.util.Calendar; +import java.util.TimeZone; +import java.util.Date; +import java.text.FieldPosition; +import java.text.ParsePosition; + +// Contributors: Arndt Schoenewald + +/** + Formats a {@link Date} in the format "yyyy-MM-dd HH:mm:ss,SSS" for example + "1999-11-27 15:49:37,459". + +

Refer to the summary of the + International Standard Date and Time Notation for more + information on this format. + + @author Ceki Gülcü + @author Andrew Vajoczki + + @since 0.7.5 +*/ +public class ISO8601DateFormat extends AbsoluteTimeDateFormat { + + public + ISO8601DateFormat() { + } + + public + ISO8601DateFormat(TimeZone timeZone) { + super(timeZone); + } + + static private long lastTime; + static private char[] lastTimeString = new char[20]; + + /** + Appends a date in the format "YYYY-mm-dd HH:mm:ss,SSS" + to sbuf. For example: "1999-11-27 15:49:37,459". + + @param sbuf the StringBuffer to write to + */ + public + StringBuffer format(Date date, StringBuffer sbuf, + FieldPosition fieldPosition) { + + long now = date.getTime(); + int millis = (int)(now % 1000); + + if ((now - millis) != lastTime) { + // We reach this point at most once per second + // across all threads instead of each time format() + // is called. This saves considerable CPU time. + + calendar.setTime(date); + + int start = sbuf.length(); + + int year = calendar.get(Calendar.YEAR); + sbuf.append(year); + + String month; + switch(calendar.get(Calendar.MONTH)) { + case Calendar.JANUARY: month = "-01-"; break; + case Calendar.FEBRUARY: month = "-02-"; break; + case Calendar.MARCH: month = "-03-"; break; + case Calendar.APRIL: month = "-04-"; break; + case Calendar.MAY: month = "-05-"; break; + case Calendar.JUNE: month = "-06-"; break; + case Calendar.JULY: month = "-07-"; break; + case Calendar.AUGUST: month = "-08-"; break; + case Calendar.SEPTEMBER: month = "-09-"; break; + case Calendar.OCTOBER: month = "-10-"; break; + case Calendar.NOVEMBER: month = "-11-"; break; + case Calendar.DECEMBER: month = "-12-"; break; + default: month = "-NA-"; break; + } + sbuf.append(month); + + int day = calendar.get(Calendar.DAY_OF_MONTH); + if(day < 10) + sbuf.append('0'); + sbuf.append(day); + + sbuf.append(' '); + + int hour = calendar.get(Calendar.HOUR_OF_DAY); + if(hour < 10) { + sbuf.append('0'); + } + sbuf.append(hour); + sbuf.append(':'); + + int mins = calendar.get(Calendar.MINUTE); + if(mins < 10) { + sbuf.append('0'); + } + sbuf.append(mins); + sbuf.append(':'); + + int secs = calendar.get(Calendar.SECOND); + if(secs < 10) { + sbuf.append('0'); + } + sbuf.append(secs); + + sbuf.append(','); + + // store the time string for next time to avoid recomputation + sbuf.getChars(start, sbuf.length(), lastTimeString, 0); + lastTime = now - millis; + } + else { + sbuf.append(lastTimeString); + } + + + if (millis < 100) + sbuf.append('0'); + if (millis < 10) + sbuf.append('0'); + + sbuf.append(millis); + return sbuf; + } + + /** + This method does not do anything but return null. + */ + public + Date parse(java.lang.String s, ParsePosition pos) { + return null; + } +} + Added: servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/PatternConverter.java URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/PatternConverter.java?rev=652336&view=auto ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/PatternConverter.java (added) +++ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/java/org/apache/servicemix/gshell/log/layout/PatternConverter.java Wed Apr 30 04:26:15 2008 @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.servicemix.gshell.log.layout; + +import org.ops4j.pax.logging.spi.PaxLoggingEvent; + +/** + +

PatternConverter is an abtract class that provides the + formatting functionality that derived classes need. + +

Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + @author James P. Cakalic + @author Ceki Gülcü + + @since 0.8.2 + */ +public abstract class PatternConverter { + public PatternConverter next; + int min = -1; + int max = 0x7FFFFFFF; + boolean leftAlign = false; + + protected + PatternConverter() { } + + protected + PatternConverter(FormattingInfo fi) { + min = fi.min; + max = fi.max; + leftAlign = fi.leftAlign; + } + + /** + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + */ + abstract + protected + String convert(PaxLoggingEvent event); + + /** + A template method for formatting in a converter specific way. + */ + public + void format(StringBuffer sbuf, PaxLoggingEvent e) { + String s = convert(e); + + if(s == null) { + if(0 < min) + spacePad(sbuf, min); + return; + } + + int len = s.length(); + + if(len > max) + sbuf.append(s.substring(len-max)); + else if(len < min) { + if(leftAlign) { + sbuf.append(s); + spacePad(sbuf, min-len); + } + else { + spacePad(sbuf, min-len); + sbuf.append(s); + } + } + else + sbuf.append(s); + } + + static String[] SPACES = {" ", " ", " ", " ", //1,2,4,8 spaces + " ", // 16 spaces + " " }; // 32 spaces + + /** + Fast space padding method. + */ + public + void spacePad(StringBuffer sbuf, int length) { + while(length >= 32) { + sbuf.append(SPACES[5]); + length -= 32; + } + + for(int i = 4; i >= 0; i--) { + if((length & (1< +// Igor E. Poteryaev +// Reinhard Deschler + +/** + Most of the work of the {@link org.apache.log4j.PatternLayout} class + is delegated to the PatternParser class. + + @author James P. Cakalic + @author Ceki Gülcü + @author Anders Kristensen + + @since 0.8.2 +*/ +public class PatternParser { + + private static final String LINE_SEP = System.getProperty("line.separator"); + + private static final char ESCAPE_CHAR = '%'; + + private static final int LITERAL_STATE = 0; + private static final int CONVERTER_STATE = 1; + private static final int MINUS_STATE = 2; + private static final int DOT_STATE = 3; + private static final int MIN_STATE = 4; + private static final int MAX_STATE = 5; + + static final int FULL_LOCATION_CONVERTER = 1000; + static final int METHOD_LOCATION_CONVERTER = 1001; + static final int CLASS_LOCATION_CONVERTER = 1002; + static final int LINE_LOCATION_CONVERTER = 1003; + static final int FILE_LOCATION_CONVERTER = 1004; + + static final int RELATIVE_TIME_CONVERTER = 2000; + static final int THREAD_CONVERTER = 2001; + static final int LEVEL_CONVERTER = 2002; + static final int NDC_CONVERTER = 2003; + static final int MESSAGE_CONVERTER = 2004; + + int state; + protected StringBuffer currentLiteral = new StringBuffer(32); + protected int patternLength; + protected int i; + PatternConverter head; + PatternConverter tail; + protected FormattingInfo formattingInfo = new FormattingInfo(); + protected String pattern; + + public + PatternParser(String pattern) { + this.pattern = pattern; + patternLength = pattern.length(); + state = LITERAL_STATE; + } + + private + void addToList(PatternConverter pc) { + if(head == null) { + head = tail = pc; + } else { + tail.next = pc; + tail = pc; + } + } + + protected + String extractOption() { + if((i < patternLength) && (pattern.charAt(i) == '{')) { + int end = pattern.indexOf('}', i); + if (end > i) { + String r = pattern.substring(i + 1, end); + i = end+1; + return r; + } + } + return null; + } + + + /** + The option is expected to be in decimal and positive. In case of + error, zero is returned. */ + protected + int extractPrecisionOption() { + String opt = extractOption(); + int r = 0; + if(opt != null) { + try { + r = Integer.parseInt(opt); + if(r <= 0) { + //LogLog.error("Precision option (" + opt + ") isn't a positive integer."); + r = 0; + } + } + catch (NumberFormatException e) { + //LogLog.error("Category option \""+opt+"\" not a decimal integer.", e); + } + } + return r; + } + + public + PatternConverter parse() { + char c; + i = 0; + while(i < patternLength) { + c = pattern.charAt(i++); + switch(state) { + case LITERAL_STATE: + // In literal state, the last char is always a literal. + if(i == patternLength) { + currentLiteral.append(c); + continue; + } + if(c == ESCAPE_CHAR) { + // peek at the next char. + switch(pattern.charAt(i)) { + case ESCAPE_CHAR: + currentLiteral.append(c); + i++; // move pointer + break; + case 'n': + currentLiteral.append(LINE_SEP); + i++; // move pointer + break; + default: + if(currentLiteral.length() != 0) { + addToList(new LiteralPatternConverter( + currentLiteral.toString())); + //LogLog.debug("Parsed LITERAL converter: \"" + // +currentLiteral+"\"."); + } + currentLiteral.setLength(0); + currentLiteral.append(c); // append % + state = CONVERTER_STATE; + formattingInfo.reset(); + } + } + else { + currentLiteral.append(c); + } + break; + case CONVERTER_STATE: + currentLiteral.append(c); + switch(c) { + case '-': + formattingInfo.leftAlign = true; + break; + case '.': + state = DOT_STATE; + break; + default: + if(c >= '0' && c <= '9') { + formattingInfo.min = c - '0'; + state = MIN_STATE; + } + else + finalizeConverter(c); + } // switch + break; + case MIN_STATE: + currentLiteral.append(c); + if(c >= '0' && c <= '9') + formattingInfo.min = formattingInfo.min*10 + (c - '0'); + else if(c == '.') + state = DOT_STATE; + else { + finalizeConverter(c); + } + break; + case DOT_STATE: + currentLiteral.append(c); + if(c >= '0' && c <= '9') { + formattingInfo.max = c - '0'; + state = MAX_STATE; + } + else { + //LogLog.error("Error occured in position "+i+".\n Was expecting digit, instead got char \""+c+"\"."); + state = LITERAL_STATE; + } + break; + case MAX_STATE: + currentLiteral.append(c); + if(c >= '0' && c <= '9') + formattingInfo.max = formattingInfo.max*10 + (c - '0'); + else { + finalizeConverter(c); + state = LITERAL_STATE; + } + break; + } // switch + } // while + if(currentLiteral.length() != 0) { + addToList(new LiteralPatternConverter(currentLiteral.toString())); + //LogLog.debug("Parsed LITERAL converter: \""+currentLiteral+"\"."); + } + return head; + } + + protected + void finalizeConverter(char c) { + PatternConverter pc = null; + switch(c) { + case 'c': + pc = new CategoryPatternConverter(formattingInfo, + extractPrecisionOption()); + //LogLog.debug("CATEGORY converter."); + //formattingInfo.dump(); + currentLiteral.setLength(0); + break; + case 'C': + pc = new ClassNamePatternConverter(formattingInfo, + extractPrecisionOption()); + //LogLog.debug("CLASS_NAME converter."); + //formattingInfo.dump(); + currentLiteral.setLength(0); + break; + case 'd': + String dateFormatStr = AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT; + DateFormat df; + String dOpt = extractOption(); + if(dOpt != null) + dateFormatStr = dOpt; + + if(dateFormatStr.equalsIgnoreCase( + AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT)) + df = new ISO8601DateFormat(); + else if(dateFormatStr.equalsIgnoreCase( + AbsoluteTimeDateFormat.ABS_TIME_DATE_FORMAT)) + df = new AbsoluteTimeDateFormat(); + else if(dateFormatStr.equalsIgnoreCase( + AbsoluteTimeDateFormat.DATE_AND_TIME_DATE_FORMAT)) + df = new DateTimeDateFormat(); + else { + try { + df = new SimpleDateFormat(dateFormatStr); + } + catch (IllegalArgumentException e) { + //LogLog.error("Could not instantiate SimpleDateFormat with " + dateFormatStr, e); + df = new ISO8601DateFormat(); + } + } + pc = new DatePatternConverter(formattingInfo, df); + //LogLog.debug("DATE converter {"+dateFormatStr+"}."); + //formattingInfo.dump(); + currentLiteral.setLength(0); + break; + case 'F': + pc = new LocationPatternConverter(formattingInfo, + FILE_LOCATION_CONVERTER); + //LogLog.debug("File name converter."); + //formattingInfo.dump(); + currentLiteral.setLength(0); + break; + /*case 'l': + pc = new LocationPatternConverter(formattingInfo, + FULL_LOCATION_CONVERTER); + //LogLog.debug("Location converter."); + //formattingInfo.dump(); + currentLiteral.setLength(0); + break;*/ + case 'L': + pc = new LocationPatternConverter(formattingInfo, + LINE_LOCATION_CONVERTER); + //LogLog.debug("LINE NUMBER converter."); + //formattingInfo.dump(); + currentLiteral.setLength(0); + break; + case 'm': + pc = new BasicPatternConverter(formattingInfo, MESSAGE_CONVERTER); + //LogLog.debug("MESSAGE converter."); + //formattingInfo.dump(); + currentLiteral.setLength(0); + break; + case 'M': + pc = new LocationPatternConverter(formattingInfo, + METHOD_LOCATION_CONVERTER); + //LogLog.debug("METHOD converter."); + //formattingInfo.dump(); + currentLiteral.setLength(0); + break; + case 'p': + pc = new BasicPatternConverter(formattingInfo, LEVEL_CONVERTER); + //LogLog.debug("LEVEL converter."); + //formattingInfo.dump(); + currentLiteral.setLength(0); + break; + case 'r': + pc = new BasicPatternConverter(formattingInfo, + RELATIVE_TIME_CONVERTER); + //LogLog.debug("RELATIVE time converter."); + //formattingInfo.dump(); + currentLiteral.setLength(0); + break; + case 't': + pc = new BasicPatternConverter(formattingInfo, THREAD_CONVERTER); + //LogLog.debug("THREAD converter."); + //formattingInfo.dump(); + currentLiteral.setLength(0); + break; + /*case 'u': + if(i < patternLength) { + char cNext = pattern.charAt(i); + if(cNext >= '0' && cNext <= '9') { + pc = new UserFieldPatternConverter(formattingInfo, cNext - '0'); + LogLog.debug("USER converter ["+cNext+"]."); + formattingInfo.dump(); + currentLiteral.setLength(0); + i++; + } + else + LogLog.error("Unexpected char" +cNext+" at position "+i); + } + break;*/ + /*case 'x': + pc = new BasicPatternConverter(formattingInfo, NDC_CONVERTER); + //LogLog.debug("NDC converter."); + currentLiteral.setLength(0); + break; + case 'X': + String xOpt = extractOption(); + pc = new MDCPatternConverter(formattingInfo, xOpt); + currentLiteral.setLength(0); + break;*/ + default: + //LogLog.error("Unexpected char [" +c+"] at position "+i+" in conversion patterrn."); + pc = new LiteralPatternConverter(currentLiteral.toString()); + currentLiteral.setLength(0); + } + + addConverter(pc); + } + + protected + void addConverter(PatternConverter pc) { + currentLiteral.setLength(0); + // Add the pattern converter to the list. + addToList(pc); + // Next pattern is assumed to be a literal. + state = LITERAL_STATE; + // Reset formatting info + formattingInfo.reset(); + } + + // --------------------------------------------------------------------- + // PatternConverters + // --------------------------------------------------------------------- + + private static class BasicPatternConverter extends PatternConverter { + int type; + + BasicPatternConverter(FormattingInfo formattingInfo, int type) { + super(formattingInfo); + this.type = type; + } + + public + String convert(PaxLoggingEvent event) { + switch(type) { + case RELATIVE_TIME_CONVERTER: + return (Long.toString(event.getTimeStamp() - LoggingEvent.getStartTime())); + case THREAD_CONVERTER: + return event.getThreadName(); + case LEVEL_CONVERTER: + return event.getLevel().toString(); + // case NDC_CONVERTER: + //return event.getNDC(); + case MESSAGE_CONVERTER: { + return event.getRenderedMessage(); + } + default: return null; + } + } + } + + private static class LiteralPatternConverter extends PatternConverter { + private String literal; + + LiteralPatternConverter(String value) { + literal = value; + } + + public + final + void format(StringBuffer sbuf, LoggingEvent event) { + sbuf.append(literal); + } + + public + String convert(PaxLoggingEvent event) { + return literal; + } + } + + private static class DatePatternConverter extends PatternConverter { + private DateFormat df; + private Date date; + + DatePatternConverter(FormattingInfo formattingInfo, DateFormat df) { + super(formattingInfo); + date = new Date(); + this.df = df; + } + + public + String convert(PaxLoggingEvent event) { + date.setTime(event.getTimeStamp()); + String converted = null; + try { + converted = df.format(date); + } + catch (Exception ex) { + //LogLog.error("Error occured while converting date.", ex); + } + return converted; + } + } + + private class LocationPatternConverter extends PatternConverter { + int type; + + LocationPatternConverter(FormattingInfo formattingInfo, int type) { + super(formattingInfo); + this.type = type; + } + + public + String convert(PaxLoggingEvent event) { + PaxLocationInfo locationInfo = event.getLocationInformation(); + switch(type) { + /*case FULL_LOCATION_CONVERTER: + return locationInfo.fullInfo;*/ + case METHOD_LOCATION_CONVERTER: + return locationInfo.getMethodName(); + case LINE_LOCATION_CONVERTER: + return locationInfo.getLineNumber(); + case FILE_LOCATION_CONVERTER: + return locationInfo.getFileName(); + default: return null; + } + } + } + + private static abstract class NamedPatternConverter extends PatternConverter { + int precision; + + NamedPatternConverter(FormattingInfo formattingInfo, int precision) { + super(formattingInfo); + this.precision = precision; + } + + abstract + String getFullyQualifiedName(PaxLoggingEvent event); + + public + String convert(PaxLoggingEvent event) { + String n = getFullyQualifiedName(event); + if(precision <= 0) + return n; + else { + int len = n.length(); + + // We substract 1 from 'len' when assigning to 'end' to avoid out of + // bounds exception in return r.substring(end+1, len). This can happen if + // precision is 1 and the category name ends with a dot. + int end = len -1 ; + for(int i = precision; i > 0; i--) { + end = n.lastIndexOf('.', end-1); + if(end == -1) + return n; + } + return n.substring(end+1, len); + } + } + } + + private class ClassNamePatternConverter extends NamedPatternConverter { + + ClassNamePatternConverter(FormattingInfo formattingInfo, int precision) { + super(formattingInfo, precision); + } + + String getFullyQualifiedName(PaxLoggingEvent event) { + return event.getLocationInformation().getClassName(); + } + } + + private class CategoryPatternConverter extends NamedPatternConverter { + + CategoryPatternConverter(FormattingInfo formattingInfo, int precision) { + super(formattingInfo, precision); + } + + String getFullyQualifiedName(PaxLoggingEvent event) { + return event.getLoggerName(); + } + } +} + Added: servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/resources/META-INF/spring/gshell-log.xml URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/resources/META-INF/spring/gshell-log.xml?rev=652336&view=auto ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/resources/META-INF/spring/gshell-log.xml (added) +++ servicemix/smx4/kernel/trunk/gshell/gshell-log/src/main/resources/META-INF/spring/gshell-log.xml Wed Apr 30 04:26:15 2008 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VmLogAppender + + + + + + + 500 + %d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n + + + + \ No newline at end of file Modified: servicemix/smx4/kernel/trunk/gshell/pom.xml URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/pom.xml?rev=652336&r1=652335&r2=652336&view=diff ============================================================================== --- servicemix/smx4/kernel/trunk/gshell/pom.xml (original) +++ servicemix/smx4/kernel/trunk/gshell/pom.xml Wed Apr 30 04:26:15 2008 @@ -39,6 +39,7 @@ gshell-obr gshell-wrapper gshell-features + gshell-log Modified: servicemix/smx4/kernel/trunk/pom.xml URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/pom.xml?rev=652336&r1=652335&r2=652336&view=diff ============================================================================== --- servicemix/smx4/kernel/trunk/pom.xml (original) +++ servicemix/smx4/kernel/trunk/pom.xml Wed Apr 30 04:26:15 2008 @@ -80,7 +80,7 @@ 0.9.93 1.2.14 1.1.6 - 1.0.0 + 1.1-SNAPSHOT 0.3.0 1.0 1.0-SNAPSHOT @@ -102,12 +102,20 @@ Apache ServiceMix Repository http://svn.apache.org/repos/asf/servicemix/m2-repo - + ops4j OPS4j Repository http://repository.ops4j.org/maven2 + + + ops4j-snapshots + OPS4j Snapshots Repository + http://repository.ops4j.org/mvn-snapshots + false + true +