commit c4578dc062e7610f400f33f1ad4bbdfc5aab532c
Author: Lennart Koopmann Usage examples: Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+ * of the LGPL license is available in the META-INF folder in all
+ * distributions of Syslog4j and in the base directory of the "doc" ZIP. First, create an implementation of SyslogConfigIF, such as UdpNetSyslogConfig. Second, configure that configuration instance. Third, call createInstance(protocol,config) using a short & simple
+ * String for the protocol argument. Fourth, either use the returned instance of SyslogIF, or in later code
+ * call getInstance(protocol) with the protocol chosen in the previous step. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Implementing the down(SyslogIF) method is an excellent way to add some sort of notification to
+* your application when a Syslog service is unavailable. Implementing the up(SyslogIF) method can be used to notify your application when a Syslog
+* service has returned. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+ * of the LGPL license is available in the META-INF folder in all
+ * distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. When used in "threaded" mode (see TCPNetSyslogConfig for the option),
+* a queuing mechanism is used (via LinkedList). Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Note: Syslog4jAppender does NOT extend Log4j's SyslogAppender. Example log4j.xml configuration: All available parameters are: Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+ * of the LGPL license is available in the META-INF folder in all
+ * distributions of Syslog4j and in the base directory of the "doc" ZIP. Classes which inherit Syslog4jAppenderSkeleton must implement the "initialize()" method,
+ * which sets up Syslog4j for use by the Log4j Appender. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+ * of the LGPL license is available in the META-INF folder in all
+ * distributions of Syslog4j and in the base directory of the "doc" ZIP. More information on the PCI DSS specification is available here: https://www.pcisecuritystandards.org/security_standards/pci_dss.shtml Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. This modifier is useful for applications that display log content in browsers without
+* properly escaping HTML characters. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. More information on the PCI DSS specification is available here: https://www.pcisecuritystandards.org/security_standards/pci_dss.shtml The PCI DSS specification is Copyright 2008 PCI Security Standards
+* Council LLC. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. More information on the PCI DSS specification is available here: https://www.pcisecuritystandards.org/security_standards/pci_dss.shtml The PCI DSS specification is Copyright 2008 PCI Security Standards
+* Council LLC. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Those wishing to replace (or improve upon) this implementation
+* can write a custom SyslogMessageProcessorIF and set it per
+* instance via the SyslogIF.setMessageProcessor(..) method or set it globally
+* via the SyslogMessageProcessor.setDefault(..) method. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. http://tools.ietf.org/html/draft-ietf-syslog-protocol-23 Those wishing to replace (or improve upon) this implementation
+ * can write a custom SyslogMessageProcessorIF and set it per
+ * instance via the SyslogIF.setStructuredMessageProcessor(..) method or set it globally
+ * via the StructuredSyslogMessageProcessor.setDefault(..) method.
+ * Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy of the
+ * LGPL license is available in the META-INF folder in all distributions of
+ * Syslog4j and in the base directory of the "doc" ZIP.
+ *
+ * http://tools.ietf.org/html/draft-ietf-syslog-protocol-23#section-6
+ *
+ * Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy of the
+ * LGPL license is available in the META-INF folder in all distributions of
+ * Syslog4j and in the base directory of the "doc" ZIP.
+ *
+ * http://tools.ietf.org/html/draft-ietf-syslog-protocol-23#section-6
+ *
+ * http://tools.ietf.org/html/draft-ietf-syslog-protocol-23#section-6
+ *
+ * http://tools.ietf.org/html/draft-ietf-syslog-protocol-23#section-6
+ *
+ * http://tools.ietf.org/html/draft-ietf-syslog-protocol-23#section-6
+ * Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP. Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy
+* of the LGPL license is available in the META-INF folder in all
+* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+ * Syslog.getInstance("udp").info("log message");
+ *
+ *
+ * Via Instance
+ *
+ * SyslogIF syslog = Syslog.getInstance("udp");
+ * syslog.info();
+ *
+ *
+ *
+ *
+ *
+ *
+ <appender name="Syslog4j" class="org.productivity.java.syslog4j.impl.log4j.Syslog4jAppender">
+ <param name="Facility" value="user"/>
+ <param name="Protocol" value="tcp"/>
+ <param name="Host" value="192.168.0.1"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m"/>
+ </layout>
+ </appender>
+ *
+ *
+ *
+ *
+ *
Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: AbstractNetSyslogConfig.java,v 1.12 2010/10/25 03:50:25 cvs Exp $ +*/ +public abstract class AbstractNetSyslogConfig extends AbstractSyslogConfig implements AbstractNetSyslogConfigIF { + private static final long serialVersionUID = 7240133962159244924L; + + protected String host = SYSLOG_HOST_DEFAULT; + protected int port = SYSLOG_PORT_DEFAULT; + + protected boolean cacheHostAddress = CACHE_HOST_ADDRESS_DEFAULT; + + protected int maxQueueSize = MAX_QUEUE_SIZE_DEFAULT; + + public AbstractNetSyslogConfig() { + // + } + + public AbstractNetSyslogConfig(int facility) { + this.facility = facility; + } + + public AbstractNetSyslogConfig(int facility, String host) { + this.facility = facility; + this.host = host; + } + + public AbstractNetSyslogConfig(String host) { + this.host = host; + } + + public AbstractNetSyslogConfig(int facility, String host, int port) { + this.facility = facility; + this.host = host; + this.port = port; + } + + public AbstractNetSyslogConfig(String host, int port) { + this.host = host; + this.port = port; + } + + public boolean isCacheHostAddress() { + return this.cacheHostAddress; + } + + public void setCacheHostAddress(boolean cacheHostAddress) { + this.cacheHostAddress = cacheHostAddress; + } + + public String getHost() { + return this.host; + } + + public void setHost(String host) { + this.host = host; + } + + public int getPort() { + return this.port; + } + + public void setPort(int port) { + this.port = port; + } + + public int getMaxQueueSize() { + return maxQueueSize; + } + + public void setMaxQueueSize(int maxQueueSize) { + this.maxQueueSize = maxQueueSize; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/AbstractNetSyslogConfigIF.java b/src/main/java/org/productivity/java/syslog4j/impl/net/AbstractNetSyslogConfigIF.java new file mode 100644 index 0000000..17d7940 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/AbstractNetSyslogConfigIF.java @@ -0,0 +1,19 @@ +package org.productivity.java.syslog4j.impl.net; + +import org.productivity.java.syslog4j.impl.AbstractSyslogConfigIF; + +/** +* AbstractNetSyslogConfigIF is a configuration interface supporting network-based +* Syslog implementations. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: AbstractNetSyslogConfigIF.java,v 1.4 2009/06/06 19:11:02 cvs Exp $ +*/ +public interface AbstractNetSyslogConfigIF extends AbstractSyslogConfigIF { + public boolean isCacheHostAddress(); + public void setCacheHostAddress(boolean cacheHostAddress); +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslog.java b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslog.java new file mode 100644 index 0000000..9d3e949 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslog.java @@ -0,0 +1,91 @@ +package org.productivity.java.syslog4j.impl.net.tcp; + +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.impl.AbstractSyslogWriter; +import org.productivity.java.syslog4j.impl.net.AbstractNetSyslog; + +/** +* TCPNetSyslog is an extension of AbstractSyslog that provides support for +* TCP/IP-based syslog clients. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: TCPNetSyslog.java,v 1.21 2010/11/28 04:43:31 cvs Exp $ +*/ +public class TCPNetSyslog extends AbstractNetSyslog { + private static final long serialVersionUID = -2157528355215068721L; + + protected TCPNetSyslogWriter writer = null; + + protected TCPNetSyslogConfigIF tcpNetSyslogConfig = null; + + public void initialize() throws SyslogRuntimeException { + super.initialize(); + + try { + this.tcpNetSyslogConfig = (TCPNetSyslogConfigIF) this.syslogConfig; + + } catch (ClassCastException cce) { + throw new SyslogRuntimeException("config must implement interface TCPNetSyslogConfigIF"); + } + } + + public AbstractSyslogWriter getWriter() { + return getWriter(true); + } + + public synchronized AbstractSyslogWriter getWriter(boolean create) { + if (this.writer != null || !create) { + return this.writer; + } + + this.writer = (TCPNetSyslogWriter) createWriter(); + + if (this.tcpNetSyslogConfig.isThreaded()) { + createWriterThread(this.writer); + } + + return this.writer; + } + + protected void write(int level, byte[] message) throws SyslogRuntimeException { + AbstractSyslogWriter syslogWriter = getWriter(); + + try { + if (syslogWriter.hasThread()) { + syslogWriter.queue(level,message); + + } else { + synchronized(syslogWriter) { + syslogWriter.write(message); + } + } + + } finally { + returnWriter(syslogWriter); + } + } + + public void flush() throws SyslogRuntimeException { + AbstractSyslogWriter syslogWriter = getWriter(false); + + if (syslogWriter != null) { + syslogWriter.flush(); + } + } + + public void shutdown() throws SyslogRuntimeException { + AbstractSyslogWriter syslogWriter = getWriter(false); + + if (syslogWriter != null) { + syslogWriter.shutdown(); + } + } + + public void returnWriter(AbstractSyslogWriter syslogWriter) { + // + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogConfig.java b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogConfig.java new file mode 100644 index 0000000..49d8436 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogConfig.java @@ -0,0 +1,156 @@ +package org.productivity.java.syslog4j.impl.net.tcp; + +import org.productivity.java.syslog4j.SyslogConstants; +import org.productivity.java.syslog4j.impl.net.AbstractNetSyslogConfig; +import org.productivity.java.syslog4j.util.SyslogUtility; + +/** +* TCPNetSyslogConfig is an extension of AbstractNetSyslogConfig that provides +* configuration support for TCP/IP-based syslog clients. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: TCPNetSyslogConfig.java,v 1.18 2010/10/29 03:14:12 cvs Exp $ +*/ +public class TCPNetSyslogConfig extends AbstractNetSyslogConfig implements TCPNetSyslogConfigIF { + private static final long serialVersionUID = 9023152050686365460L; + + public static byte[] SYSTEM_DELIMITER_SEQUENCE = null; + + static { + String delimiterSequence = System.getProperty("line.separator"); + + SYSTEM_DELIMITER_SEQUENCE = delimiterSequence.getBytes(); + + if (SYSTEM_DELIMITER_SEQUENCE == null || SYSTEM_DELIMITER_SEQUENCE.length < 1) { + SYSTEM_DELIMITER_SEQUENCE = SyslogConstants.TCP_DELIMITER_SEQUENCE_DEFAULT; + } + } + + protected byte[] delimiterSequence = SYSTEM_DELIMITER_SEQUENCE; + + protected boolean persistentConnection = TCP_PERSISTENT_CONNECTION_DEFAULT; + + protected boolean soLinger = TCP_SO_LINGER_DEFAULT; + protected int soLingerSeconds = TCP_SO_LINGER_SECONDS_DEFAULT; + + protected boolean keepAlive = TCP_KEEP_ALIVE_DEFAULT; + + protected boolean reuseAddress = TCP_REUSE_ADDRESS_DEFAULT; + + protected boolean setBufferSize = TCP_SET_BUFFER_SIZE_DEFAULT; + + protected int freshConnectionInterval = TCP_FRESH_CONNECTION_INTERVAL_DEFAULT; + + public TCPNetSyslogConfig() { + initialize(); + } + + protected void initialize() { + // + } + + public TCPNetSyslogConfig(int facility, String host, int port) { + super(facility, host, port); + initialize(); + } + + public TCPNetSyslogConfig(int facility, String host) { + super(facility, host); + initialize(); + } + + public TCPNetSyslogConfig(int facility) { + super(facility); + initialize(); + } + + public TCPNetSyslogConfig(String host, int port) { + super(host, port); + initialize(); + } + + public TCPNetSyslogConfig(String host) { + super(host); + initialize(); + } + + public Class getSyslogClass() { + return TCPNetSyslog.class; + } + + public byte[] getDelimiterSequence() { + return this.delimiterSequence; + } + + public void setDelimiterSequence(byte[] delimiterSequence) { + this.delimiterSequence = delimiterSequence; + } + + public void setDelimiterSequence(String delimiterSequence) { + this.delimiterSequence = SyslogUtility.getBytes(this,delimiterSequence); + } + + public boolean isPersistentConnection() { + return this.persistentConnection; + } + + public void setPersistentConnection(boolean persistentConnection) { + this.persistentConnection = persistentConnection; + } + + public boolean isSoLinger() { + return this.soLinger; + } + + public void setSoLinger(boolean soLinger) { + this.soLinger = soLinger; + } + + public int getSoLingerSeconds() { + return this.soLingerSeconds; + } + + public void setSoLingerSeconds(int soLingerSeconds) { + this.soLingerSeconds = soLingerSeconds; + } + + public boolean isKeepAlive() { + return this.keepAlive; + } + + public void setKeepAlive(boolean keepAlive) { + this.keepAlive = keepAlive; + } + + public boolean isReuseAddress() { + return this.reuseAddress; + } + + public void setReuseAddress(boolean reuseAddress) { + this.reuseAddress = reuseAddress; + } + + public boolean isSetBufferSize() { + return this.setBufferSize; + } + + public void setSetBufferSize(boolean setBufferSize) { + this.setBufferSize = setBufferSize; + } + + public int getFreshConnectionInterval() { + return freshConnectionInterval; + } + + public void setFreshConnectionInterval(int freshConnectionInterval) { + this.freshConnectionInterval = freshConnectionInterval; + } + + public Class getSyslogWriterClass() { + return TCPNetSyslogWriter.class; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogConfigIF.java b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogConfigIF.java new file mode 100644 index 0000000..82318ad --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogConfigIF.java @@ -0,0 +1,40 @@ +package org.productivity.java.syslog4j.impl.net.tcp; + +import org.productivity.java.syslog4j.impl.net.AbstractNetSyslogConfigIF; + +/** +* TCPNetSyslogConfigIF is a configuration interface supporting TCP/IP-based +* Syslog implementations. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: TCPNetSyslogConfigIF.java,v 1.6 2010/10/29 03:14:12 cvs Exp $ +*/ +public interface TCPNetSyslogConfigIF extends AbstractNetSyslogConfigIF { + public byte[] getDelimiterSequence(); + public void setDelimiterSequence(byte[] delimiterSequence); + + public boolean isPersistentConnection(); + public void setPersistentConnection(boolean persistentConnection); + + public boolean isSoLinger(); + public void setSoLinger(boolean soLinger); + + public int getSoLingerSeconds(); + public void setSoLingerSeconds(int soLingerSeconds); + + public boolean isKeepAlive(); + public void setKeepAlive(boolean keepAlive); + + public boolean isReuseAddress(); + public void setReuseAddress(boolean reuseAddress); + + public boolean isSetBufferSize(); + public void setSetBufferSize(boolean setBufferSize); + + public int getFreshConnectionInterval(); + public void setFreshConnectionInterval(int interval); +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogWriter.java b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogWriter.java new file mode 100644 index 0000000..3e178af --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogWriter.java @@ -0,0 +1,226 @@ +package org.productivity.java.syslog4j.impl.net.tcp; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetAddress; +import java.net.Socket; + +import javax.net.SocketFactory; + +import org.productivity.java.syslog4j.SyslogConstants; +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.impl.AbstractSyslog; +import org.productivity.java.syslog4j.impl.AbstractSyslogWriter; +import org.productivity.java.syslog4j.util.SyslogUtility; + +/** +* TCPNetSyslogWriter is an implementation of Runnable that supports sending +* TCP-based messages within a separate Thread. +* +*When used in "threaded" mode (see TCPNetSyslogConfig for the option), +* a queuing mechanism is used (via LinkedList).
+* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: TCPNetSyslogWriter.java,v 1.20 2010/11/28 01:38:08 cvs Exp $ +*/ +public class TCPNetSyslogWriter extends AbstractSyslogWriter { + private static final long serialVersionUID = -6388813866108482855L; + + protected TCPNetSyslog tcpNetSyslog = null; + + protected Socket socket = null; + + protected TCPNetSyslogConfigIF tcpNetSyslogConfig = null; + + protected long lastSocketCreationTimeMs = 0; + + public TCPNetSyslogWriter() { + // + } + + public void initialize(AbstractSyslog abstractSyslog) { + super.initialize(abstractSyslog); + + this.tcpNetSyslog = (TCPNetSyslog) abstractSyslog; + + this.tcpNetSyslogConfig = (TCPNetSyslogConfigIF) this.tcpNetSyslog.getConfig(); + } + + protected SocketFactory obtainSocketFactory() { + return SocketFactory.getDefault(); + } + + protected Socket createSocket(InetAddress hostAddress, int port, boolean keepalive) throws IOException { + SocketFactory socketFactory = obtainSocketFactory(); + + Socket newSocket = socketFactory.createSocket(hostAddress,port); + + if (this.tcpNetSyslogConfig.isSoLinger()) { + newSocket.setSoLinger(true,this.tcpNetSyslogConfig.getSoLingerSeconds()); + } + + if (this.tcpNetSyslogConfig.isKeepAlive()) { + newSocket.setKeepAlive(keepalive); + } + + if (this.tcpNetSyslogConfig.isReuseAddress()) { + newSocket.setReuseAddress(true); + } + + return newSocket; + } + + protected Socket getSocket() throws SyslogRuntimeException { + if (this.socket != null && this.socket.isConnected()) { + int freshConnectionInterval = this.tcpNetSyslogConfig.getFreshConnectionInterval(); + + if (freshConnectionInterval > 0) { + long currentTimeMs = System.currentTimeMillis(); + + if ((currentTimeMs - lastSocketCreationTimeMs) >= freshConnectionInterval) { + closeSocket(this.socket); + } + + } else { + return this.socket; + } + } + + if (this.socket == null) { + lastSocketCreationTimeMs = 0; + + try { + InetAddress hostAddress = this.tcpNetSyslog.getHostAddress(); + + this.socket = createSocket(hostAddress,this.syslog.getConfig().getPort(),this.tcpNetSyslogConfig.isPersistentConnection()); + lastSocketCreationTimeMs = System.currentTimeMillis(); + + } catch (IOException ioe) { + throw new SyslogRuntimeException(ioe); + } + } + + return this.socket; + } + + protected void closeSocket(Socket socketToClose) { + if (socketToClose == null) { + return; + } + + try { + socketToClose.close(); + + } catch (IOException ioe) { + if (!"Socket is closed".equalsIgnoreCase(ioe.getMessage())) { + throw new SyslogRuntimeException(ioe); + } + + } finally { + if (socketToClose == this.socket) { + this.socket = null; + } + } + } + + public void write(byte[] message) throws SyslogRuntimeException { + Socket currentSocket = null; + + int attempts = 0; + while(attempts != -1 && attempts < (this.tcpNetSyslogConfig.getWriteRetries() + 1)) { + try { + currentSocket = getSocket(); + + if (currentSocket == null) { + throw new SyslogRuntimeException("No socket available"); + } + + OutputStream os = currentSocket.getOutputStream(); + + if (this.tcpNetSyslogConfig.isSetBufferSize()) { + currentSocket.setSendBufferSize(message.length); + } + + os.write(message); + + byte[] delimiterSequence = this.tcpNetSyslogConfig.getDelimiterSequence(); + if (delimiterSequence != null && delimiterSequence.length > 0) { + os.write(delimiterSequence); + } + + this.syslog.setBackLogStatus(false); + + attempts = -1; + + if (!this.tcpNetSyslogConfig.isPersistentConnection()) { + closeSocket(currentSocket); + } + + } catch (IOException ioe) { + attempts++; + closeSocket(currentSocket); + + if (attempts >= (this.tcpNetSyslogConfig.getWriteRetries() + 1)) { + throw new SyslogRuntimeException(ioe); + } + } + } + } + + public synchronized void flush() throws SyslogRuntimeException { + if (this.socket == null) { + return; + } + + if (this.syslogConfig.isThreaded()) { + this.shutdown(); + this.syslog.createWriterThread(this); + + } else { + closeSocket(this.socket); + } + } + + public synchronized void shutdown() throws SyslogRuntimeException { + this.shutdown = true; + + if (this.syslogConfig.isThreaded()) { + long timeStart = System.currentTimeMillis(); + boolean done = false; + + while(!done) { + if (this.socket == null || this.socket.isClosed()) { + done = true; + + } else { + long now = System.currentTimeMillis(); + + if (now > (timeStart + this.tcpNetSyslogConfig.getMaxShutdownWait())) { + closeSocket(this.socket); + this.thread.interrupt(); + done = true; + } + + if (!done) { + SyslogUtility.sleep(SyslogConstants.SHUTDOWN_INTERVAL); + } + } + } + + } else { + if (this.socket == null || this.socket.isClosed()) { + return; + } + + closeSocket(this.socket); + } + } + + protected void runCompleted() { + closeSocket(this.socket); + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/pool/PooledTCPNetSyslog.java b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/pool/PooledTCPNetSyslog.java new file mode 100644 index 0000000..c1f7884 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/pool/PooledTCPNetSyslog.java @@ -0,0 +1,76 @@ +package org.productivity.java.syslog4j.impl.net.tcp.pool; + +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.impl.AbstractSyslogWriter; +import org.productivity.java.syslog4j.impl.net.tcp.TCPNetSyslog; +import org.productivity.java.syslog4j.impl.pool.AbstractSyslogPoolFactory; +import org.productivity.java.syslog4j.impl.pool.generic.GenericSyslogPoolFactory; + +/** +* PooledTCPNetSyslog is an extension of TCPNetSyslog which provides support +* for Apache Commons Pool. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: PooledTCPNetSyslog.java,v 1.5 2008/12/10 04:30:15 cvs Exp $ +*/ +public class PooledTCPNetSyslog extends TCPNetSyslog { + private static final long serialVersionUID = 4279960451141784200L; + + protected AbstractSyslogPoolFactory poolFactory = null; + + public void initialize() throws SyslogRuntimeException { + super.initialize(); + + this.poolFactory = createSyslogPoolFactory(); + + this.poolFactory.initialize(this); + } + + protected AbstractSyslogPoolFactory createSyslogPoolFactory() { + AbstractSyslogPoolFactory syslogPoolFactory = new GenericSyslogPoolFactory(); + + return syslogPoolFactory; + } + + public AbstractSyslogWriter getWriter() { + try { + AbstractSyslogWriter syslogWriter = this.poolFactory.borrowSyslogWriter(); + + return syslogWriter; + + } catch (Exception e) { + throw new SyslogRuntimeException(e); + } + } + + public void returnWriter(AbstractSyslogWriter syslogWriter) { + try { + this.poolFactory.returnSyslogWriter(syslogWriter); + + } catch (Exception e) { + throw new SyslogRuntimeException(e); + } + } + + public void flush() throws SyslogRuntimeException { + try { + this.poolFactory.clear(); + + } catch (Exception e) { + // + } + } + + public void shutdown() throws SyslogRuntimeException { + try { + this.poolFactory.close(); + + } catch (Exception e) { + // + } + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/pool/PooledTCPNetSyslogConfig.java b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/pool/PooledTCPNetSyslogConfig.java new file mode 100644 index 0000000..91a1ba4 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/pool/PooledTCPNetSyslogConfig.java @@ -0,0 +1,172 @@ +package org.productivity.java.syslog4j.impl.net.tcp.pool; + +import org.apache.commons.pool.impl.GenericObjectPool; +import org.productivity.java.syslog4j.SyslogPoolConfigIF; +import org.productivity.java.syslog4j.impl.net.tcp.TCPNetSyslogConfig; + +/** +* NetSyslogPoolFactory is an implementation of SyslogPoolConfigIF +* which provides configuration support for the Apache Commons Pool. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: PooledTCPNetSyslogConfig.java,v 1.3 2008/11/26 15:01:47 cvs Exp $ +*/ +public class PooledTCPNetSyslogConfig extends TCPNetSyslogConfig implements SyslogPoolConfigIF { + private static final long serialVersionUID = 2283355983363422888L; + + protected int maxActive = SYSLOG_POOL_CONFIG_MAX_ACTIVE_DEFAULT; + protected int maxIdle = SYSLOG_POOL_CONFIG_MAX_IDLE_DEFAULT; + protected long maxWait = SYSLOG_POOL_CONFIG_MAX_WAIT_DEFAULT; + protected long minEvictableIdleTimeMillis = SYSLOG_POOL_CONFIG_MIN_EVICTABLE_IDLE_TIME_MILLIS_DEFAULT; + protected int minIdle = SYSLOG_POOL_CONFIG_MIN_IDLE_DEFAULT; + protected int numTestsPerEvictionRun = SYSLOG_POOL_CONFIG_NUM_TESTS_PER_EVICTION_RUN_DEFAULT; + protected long softMinEvictableIdleTimeMillis = SYSLOG_POOL_CONFIG_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS_DEFAULT; + protected long timeBetweenEvictionRunsMillis = SYSLOG_POOL_CONFIG_TIME_BETWEEN_EVICTION_RUNS_MILLIS_DEFAULT; + protected byte whenExhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_BLOCK; + protected boolean testOnBorrow = SYSLOG_POOL_CONFIG_TEST_ON_BORROW_DEFAULT; + protected boolean testOnReturn = SYSLOG_POOL_CONFIG_TEST_ON_RETURN_DEFAULT; + protected boolean testWhileIdle = SYSLOG_POOL_CONFIG_TEST_WHILE_IDLE_DEFAULT; + + public PooledTCPNetSyslogConfig() { + // + } + + public PooledTCPNetSyslogConfig(int facility, String host, int port) { + super(facility, host, port); + } + + public PooledTCPNetSyslogConfig(int facility, String host) { + super(facility, host); + } + + public PooledTCPNetSyslogConfig(int facility) { + super(facility); + } + + public PooledTCPNetSyslogConfig(String host, int port) { + super(host, port); + } + + public PooledTCPNetSyslogConfig(String host) { + super(host); + } + + protected void configureThreadedValues(int value) { + if (isThreaded()) { + this.minIdle = value; + this.maxIdle = value; + this.maxActive = value; + } + } + + public int getMaxActive() { + return this.maxActive; + } + + public void setMaxActive(int maxActive) { + configureThreadedValues(maxActive); + + this.maxActive = maxActive; + } + + public int getMaxIdle() { + return this.maxIdle; + } + + public void setMaxIdle(int maxIdle) { + configureThreadedValues(maxIdle); + + this.maxIdle = maxIdle; + } + + public long getMaxWait() { + return this.maxWait; + } + + public void setMaxWait(long maxWait) { + this.maxWait = maxWait; + } + + public long getMinEvictableIdleTimeMillis() { + return this.minEvictableIdleTimeMillis; + } + + public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) { + this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; + } + + public int getMinIdle() { + return this.minIdle; + } + + public void setMinIdle(int minIdle) { + configureThreadedValues(minIdle); + + this.minIdle = minIdle; + } + + public int getNumTestsPerEvictionRun() { + return this.numTestsPerEvictionRun; + } + + public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) { + this.numTestsPerEvictionRun = numTestsPerEvictionRun; + } + + public long getSoftMinEvictableIdleTimeMillis() { + return this.softMinEvictableIdleTimeMillis; + } + + public void setSoftMinEvictableIdleTimeMillis( + long softMinEvictableIdleTimeMillis) { + this.softMinEvictableIdleTimeMillis = softMinEvictableIdleTimeMillis; + } + + public long getTimeBetweenEvictionRunsMillis() { + return this.timeBetweenEvictionRunsMillis; + } + + public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) { + this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; + } + + public byte getWhenExhaustedAction() { + return this.whenExhaustedAction; + } + + public void setWhenExhaustedAction(byte whenExhaustedAction) { + this.whenExhaustedAction = whenExhaustedAction; + } + + public boolean isTestOnBorrow() { + return this.testOnBorrow; + } + + public void setTestOnBorrow(boolean testOnBorrow) { + this.testOnBorrow = testOnBorrow; + } + + public boolean isTestOnReturn() { + return this.testOnReturn; + } + + public void setTestOnReturn(boolean testOnReturn) { + this.testOnReturn = testOnReturn; + } + + public boolean isTestWhileIdle() { + return this.testWhileIdle; + } + + public void setTestWhileIdle(boolean testWhileIdle) { + this.testWhileIdle = testWhileIdle; + } + + public Class getSyslogClass() { + return PooledTCPNetSyslog.class; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslog.java b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslog.java new file mode 100644 index 0000000..bb52c92 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslog.java @@ -0,0 +1,49 @@ +package org.productivity.java.syslog4j.impl.net.tcp.ssl; + +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.impl.net.tcp.TCPNetSyslog; + +/** +* SSLTCPNetSyslog is an extension of AbstractSyslog that provides support for +* TCP/IP-based (over SSL/TLS) syslog clients. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: SSLTCPNetSyslog.java,v 1.1 2009/03/29 17:38:58 cvs Exp $ +*/ +public class SSLTCPNetSyslog extends TCPNetSyslog { + private static final long serialVersionUID = 2766654802524487317L; + + public void initialize() throws SyslogRuntimeException { + super.initialize(); + + SSLTCPNetSyslogConfigIF sslTcpNetSyslogConfig = (SSLTCPNetSyslogConfigIF) this.tcpNetSyslogConfig; + + String keyStore = sslTcpNetSyslogConfig.getKeyStore(); + + if (keyStore != null && !"".equals(keyStore.trim())) { + System.setProperty("javax.net.ssl.keyStore",keyStore); + } + + String keyStorePassword = sslTcpNetSyslogConfig.getKeyStorePassword(); + + if (keyStorePassword != null && !"".equals(keyStorePassword.trim())) { + System.setProperty("javax.net.ssl.keyStorePassword",keyStorePassword); + } + + String trustStore = sslTcpNetSyslogConfig.getTrustStore(); + + if (trustStore != null && !"".equals(trustStore.trim())) { + System.setProperty("javax.net.ssl.trustStore",trustStore); + } + + String trustStorePassword = sslTcpNetSyslogConfig.getTrustStorePassword(); + + if (trustStorePassword != null && !"".equals(trustStorePassword.trim())) { + System.setProperty("javax.net.ssl.trustStorePassword",trustStorePassword); + } + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogConfig.java b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogConfig.java new file mode 100644 index 0000000..d1cf7de --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogConfig.java @@ -0,0 +1,88 @@ +package org.productivity.java.syslog4j.impl.net.tcp.ssl; + +import org.productivity.java.syslog4j.impl.net.tcp.TCPNetSyslogConfig; + +/** +* SSLTCPNetSyslogConfig is an extension of TCPNetSyslogConfig that provides +* configuration support for TCP/IP-based (over SSL/TLS) syslog clients. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: SSLTCPNetSyslogConfig.java,v 1.2 2009/03/29 17:38:58 cvs Exp $ +*/ +public class SSLTCPNetSyslogConfig extends TCPNetSyslogConfig implements SSLTCPNetSyslogConfigIF { + private static final long serialVersionUID = 5569086213824510834L; + + protected String keyStore = null; + protected String keyStorePassword = null; + + protected String trustStore = null; + protected String trustStorePassword = null; + + public SSLTCPNetSyslogConfig() { + // + } + + public SSLTCPNetSyslogConfig(int facility, String host, int port) { + super(facility, host, port); + } + + public SSLTCPNetSyslogConfig(int facility, String host) { + super(facility, host); + } + + public SSLTCPNetSyslogConfig(int facility) { + super(facility); + } + + public SSLTCPNetSyslogConfig(String host, int port) { + super(host, port); + } + + public SSLTCPNetSyslogConfig(String host) { + super(host); + } + + public String getKeyStore() { + return this.keyStore; + } + + public void setKeyStore(String keyStore) { + this.keyStore = keyStore; + } + + public String getKeyStorePassword() { + return this.keyStorePassword; + } + + public void setKeyStorePassword(String keyStorePassword) { + this.keyStorePassword = keyStorePassword; + } + + public String getTrustStore() { + return this.trustStore; + } + + public void setTrustStore(String trustStore) { + this.trustStore = trustStore; + } + + public String getTrustStorePassword() { + return this.trustStorePassword; + } + + public void setTrustStorePassword(String trustStorePassword) { + this.trustStorePassword = trustStorePassword; + } + + public Class getSyslogClass() { + return SSLTCPNetSyslog.class; + } + + public Class getSyslogWriterClass() { + return SSLTCPNetSyslogWriter.class; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogConfigIF.java b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogConfigIF.java new file mode 100644 index 0000000..967631a --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogConfigIF.java @@ -0,0 +1,28 @@ +package org.productivity.java.syslog4j.impl.net.tcp.ssl; + +import org.productivity.java.syslog4j.impl.net.tcp.TCPNetSyslogConfigIF; + +/** +* SSLTCPNetSyslogConfigIF is a configuration interface supporting TCP/IP-based +* (over SSL/TLS) Syslog implementations. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: SSLTCPNetSyslogConfigIF.java,v 1.1 2009/03/29 17:38:58 cvs Exp $ +*/ +public interface SSLTCPNetSyslogConfigIF extends TCPNetSyslogConfigIF { + public String getKeyStore(); + public void setKeyStore(String keyStore); + + public String getKeyStorePassword(); + public void setKeyStorePassword(String keyStorePassword); + + public String getTrustStore(); + public void setTrustStore(String trustStore); + + public String getTrustStorePassword(); + public void setTrustStorePassword(String trustStorePassword); +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogWriter.java b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogWriter.java new file mode 100644 index 0000000..61a9de0 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogWriter.java @@ -0,0 +1,28 @@ +package org.productivity.java.syslog4j.impl.net.tcp.ssl; + +import javax.net.SocketFactory; +import javax.net.ssl.SSLSocketFactory; + +import org.productivity.java.syslog4j.impl.net.tcp.TCPNetSyslogWriter; + +/** +* SSLTCPNetSyslogWriter is an implementation of Runnable that supports sending +* TCP/IP-based (over SSL/TLS) messages within a separate Thread. +* +*When used in "threaded" mode (see TCPNetSyslogConfig for the option), +* a queuing mechanism is used (via LinkedList).
+* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: SSLTCPNetSyslogWriter.java,v 1.4 2009/03/29 17:38:58 cvs Exp $ +*/ +public class SSLTCPNetSyslogWriter extends TCPNetSyslogWriter { + private static final long serialVersionUID = 8944446235285662244L; + + protected SocketFactory obtainSocketFactory() { + return SSLSocketFactory.getDefault(); + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/pool/PooledSSLTCPNetSyslogConfig.java b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/pool/PooledSSLTCPNetSyslogConfig.java new file mode 100644 index 0000000..fb3f3fe --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/tcp/ssl/pool/PooledSSLTCPNetSyslogConfig.java @@ -0,0 +1,91 @@ +package org.productivity.java.syslog4j.impl.net.tcp.ssl.pool; + +import org.productivity.java.syslog4j.impl.net.tcp.pool.PooledTCPNetSyslogConfig; +import org.productivity.java.syslog4j.impl.net.tcp.ssl.SSLTCPNetSyslog; +import org.productivity.java.syslog4j.impl.net.tcp.ssl.SSLTCPNetSyslogConfigIF; +import org.productivity.java.syslog4j.impl.net.tcp.ssl.SSLTCPNetSyslogWriter; + +/** +* PooledSSLTCPNetSyslogConfig is an extension of PooledTCPNetSyslogConfig +* which provides configuration support for the Apache Commons Pool. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: PooledSSLTCPNetSyslogConfig.java,v 1.2 2009/03/29 17:38:58 cvs Exp $ +*/ +public class PooledSSLTCPNetSyslogConfig extends PooledTCPNetSyslogConfig implements SSLTCPNetSyslogConfigIF { + private static final long serialVersionUID = 2092268298395023976L; + + protected String keyStore = null; + protected String keyStorePassword = null; + + protected String trustStore = null; + protected String trustStorePassword = null; + + public PooledSSLTCPNetSyslogConfig() { + super(); + } + + public PooledSSLTCPNetSyslogConfig(int facility, String host, int port) { + super(facility, host, port); + } + + public PooledSSLTCPNetSyslogConfig(int facility, String host) { + super(facility, host); + } + + public PooledSSLTCPNetSyslogConfig(int facility) { + super(facility); + } + + public PooledSSLTCPNetSyslogConfig(String host, int port) { + super(host, port); + } + + public PooledSSLTCPNetSyslogConfig(String host) { + super(host); + } + + public String getKeyStore() { + return this.keyStore; + } + + public void setKeyStore(String keyStore) { + this.keyStore = keyStore; + } + + public String getKeyStorePassword() { + return this.keyStorePassword; + } + + public void setKeyStorePassword(String keyStorePassword) { + this.keyStorePassword = keyStorePassword; + } + + public String getTrustStore() { + return this.trustStore; + } + + public void setTrustStore(String trustStore) { + this.trustStore = trustStore; + } + + public String getTrustStorePassword() { + return this.trustStorePassword; + } + + public void setTrustStorePassword(String trustStorePassword) { + this.trustStorePassword = trustStorePassword; + } + + public Class getSyslogClass() { + return SSLTCPNetSyslog.class; + } + + public Class getSyslogWriterClass() { + return SSLTCPNetSyslogWriter.class; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/udp/UDPNetSyslog.java b/src/main/java/org/productivity/java/syslog4j/impl/net/udp/UDPNetSyslog.java new file mode 100644 index 0000000..9b6f813 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/udp/UDPNetSyslog.java @@ -0,0 +1,104 @@ +package org.productivity.java.syslog4j.impl.net.udp; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; + +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.impl.AbstractSyslogWriter; +import org.productivity.java.syslog4j.impl.net.AbstractNetSyslog; + +/** +* UDPNetSyslog is an extension of AbstractSyslog that provides support for +* UDP/IP-based syslog clients. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: UDPNetSyslog.java,v 1.18 2010/10/27 06:18:10 cvs Exp $ +*/ +public class UDPNetSyslog extends AbstractNetSyslog { + private static final long serialVersionUID = 5259485504549037999L; + + protected DatagramSocket socket = null; + + public void initialize() throws SyslogRuntimeException { + super.initialize(); + + createDatagramSocket(true); + } + + protected synchronized void createDatagramSocket(boolean initialize) { + try { + this.socket = new DatagramSocket(); + + } catch (SocketException se) { + if (initialize) { + if (this.syslogConfig.isThrowExceptionOnInitialize()) { + throw new SyslogRuntimeException(se); + } + + } else { + throw new SyslogRuntimeException(se); + } + } + + if (this.socket == null) { + throw new SyslogRuntimeException("Cannot seem to get a Datagram socket"); + } + } + + protected void write(int level, byte[] message) throws SyslogRuntimeException { + if (this.socket == null) { + createDatagramSocket(false); + } + + InetAddress hostAddress = getHostAddress(); + + DatagramPacket packet = new DatagramPacket( + message, + message.length, + hostAddress, + this.syslogConfig.getPort() + ); + + int attempts = 0; + + while(attempts != -1 && attempts < (this.netSyslogConfig.getWriteRetries() + 1)) { + try { + this.socket.send(packet); + attempts = -1; + + } catch (IOException ioe) { + if (attempts == (this.netSyslogConfig.getWriteRetries() + 1)) { + throw new SyslogRuntimeException(ioe); + } + } + } + } + + public void flush() throws SyslogRuntimeException { + shutdown(); + + createDatagramSocket(true); + } + + public void shutdown() throws SyslogRuntimeException { + if (this.socket != null) { + this.socket.close(); + this.socket = null; + } + } + + public AbstractSyslogWriter getWriter() { + return null; + } + + public void returnWriter(AbstractSyslogWriter syslogWriter) { + // + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/net/udp/UDPNetSyslogConfig.java b/src/main/java/org/productivity/java/syslog4j/impl/net/udp/UDPNetSyslogConfig.java new file mode 100644 index 0000000..9ab98e4 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/net/udp/UDPNetSyslogConfig.java @@ -0,0 +1,46 @@ +package org.productivity.java.syslog4j.impl.net.udp; + +import org.productivity.java.syslog4j.impl.net.AbstractNetSyslogConfig; + +/** +* UDPNetSyslogConfig is an extension of AbstractNetSyslogConfig that provides +* configuration support for UDP/IP-based syslog clients. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: UDPNetSyslogConfig.java,v 1.6 2008/11/14 04:32:00 cvs Exp $ +*/ +public class UDPNetSyslogConfig extends AbstractNetSyslogConfig { + private static final long serialVersionUID = 4465067182562754345L; + + public UDPNetSyslogConfig() { + super(); + } + + public UDPNetSyslogConfig(int facility, String host, int port) { + super(facility,host,port); + } + + public UDPNetSyslogConfig(int facility, String host) { + super(facility,host); + } + + public UDPNetSyslogConfig(int facility) { + super(facility); + } + + public UDPNetSyslogConfig(String host, int port) { + super(host,port); + } + + public UDPNetSyslogConfig(String host) { + super(host); + } + + public Class getSyslogClass() { + return UDPNetSyslog.class; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/pool/AbstractSyslogPoolFactory.java b/src/main/java/org/productivity/java/syslog4j/impl/pool/AbstractSyslogPoolFactory.java new file mode 100644 index 0000000..14d3dfe --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/pool/AbstractSyslogPoolFactory.java @@ -0,0 +1,84 @@ +package org.productivity.java.syslog4j.impl.pool; + +import org.apache.commons.pool.BasePoolableObjectFactory; +import org.apache.commons.pool.ObjectPool; +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.impl.AbstractSyslog; +import org.productivity.java.syslog4j.impl.AbstractSyslogConfigIF; +import org.productivity.java.syslog4j.impl.AbstractSyslogWriter; + +/** +* AbstractSyslogPoolFactory is an abstract implementation of the Apache Commons Pool +* BasePoolableObjectFactory. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: AbstractSyslogPoolFactory.java,v 1.5 2008/12/10 04:15:11 cvs Exp $ +* @see org.productivity.java.syslog4j.impl.pool.generic.GenericSyslogPoolFactory +*/ +public abstract class AbstractSyslogPoolFactory extends BasePoolableObjectFactory { + private static final long serialVersionUID = -7441569603980981508L; + + protected AbstractSyslog syslog = null; + protected AbstractSyslogConfigIF syslogConfig = null; + + protected ObjectPool pool = null; + + public AbstractSyslogPoolFactory() { + // + } + + public void initialize(AbstractSyslog abstractSyslog) throws SyslogRuntimeException { + this.syslog = abstractSyslog; + + try { + this.syslogConfig = (AbstractSyslogConfigIF) this.syslog.getConfig(); + + } catch (ClassCastException cce) { + throw new SyslogRuntimeException("config must implement AbstractSyslogConfigIF"); + } + + this.pool = createPool(); + } + + public Object makeObject() throws Exception { + AbstractSyslogWriter syslogWriter = this.syslog.createWriter(); + + if (this.syslogConfig.isThreaded()) { + this.syslog.createWriterThread(syslogWriter); + } + + return syslogWriter; + } + + public void destroyObject(Object obj) throws Exception { + AbstractSyslogWriter writer = (AbstractSyslogWriter) obj; + + writer.shutdown(); + + super.destroyObject(writer); + } + + public abstract ObjectPool createPool() throws SyslogRuntimeException; + + public AbstractSyslogWriter borrowSyslogWriter() throws Exception { + AbstractSyslogWriter syslogWriter = (AbstractSyslogWriter) this.pool.borrowObject(); + + return syslogWriter; + } + + public void returnSyslogWriter(AbstractSyslogWriter syslogWriter) throws Exception { + this.pool.returnObject(syslogWriter); + } + + public void clear() throws Exception { + this.pool.clear(); + } + + public void close() throws Exception { + this.pool.close(); + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/pool/generic/GenericSyslogPoolFactory.java b/src/main/java/org/productivity/java/syslog4j/impl/pool/generic/GenericSyslogPoolFactory.java new file mode 100644 index 0000000..039eaf7 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/pool/generic/GenericSyslogPoolFactory.java @@ -0,0 +1,52 @@ +package org.productivity.java.syslog4j.impl.pool.generic; + +import org.apache.commons.pool.ObjectPool; +import org.apache.commons.pool.impl.GenericObjectPool; +import org.productivity.java.syslog4j.SyslogPoolConfigIF; +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.impl.pool.AbstractSyslogPoolFactory; + +/** +* GenericSyslogPoolFactory is an implementation of the Apache Commons Pool +* BasePoolableObjectFactory using a GenericObjectPool. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: GenericSyslogPoolFactory.java,v 1.5 2008/12/10 04:15:10 cvs Exp $ +*/ +public class GenericSyslogPoolFactory extends AbstractSyslogPoolFactory { + protected void configureGenericObjectPool(GenericObjectPool genericObjectPool) throws SyslogRuntimeException { + SyslogPoolConfigIF poolConfig = null; + + try { + poolConfig = (SyslogPoolConfigIF) this.syslog.getConfig(); + + } catch (ClassCastException cce) { + throw new SyslogRuntimeException("config must implement interface SyslogPoolConfigIF"); + } + + genericObjectPool.setMaxActive(poolConfig.getMaxActive()); + genericObjectPool.setMaxIdle(poolConfig.getMaxIdle()); + genericObjectPool.setMaxWait(poolConfig.getMaxWait()); + genericObjectPool.setMinEvictableIdleTimeMillis(poolConfig.getMinEvictableIdleTimeMillis()); + genericObjectPool.setMinIdle(poolConfig.getMinIdle()); + genericObjectPool.setNumTestsPerEvictionRun(poolConfig.getNumTestsPerEvictionRun()); + genericObjectPool.setSoftMinEvictableIdleTimeMillis(poolConfig.getSoftMinEvictableIdleTimeMillis()); + genericObjectPool.setTestOnBorrow(poolConfig.isTestOnBorrow()); + genericObjectPool.setTestOnReturn(poolConfig.isTestOnReturn()); + genericObjectPool.setTestWhileIdle(poolConfig.isTestWhileIdle()); + genericObjectPool.setTimeBetweenEvictionRunsMillis(poolConfig.getTimeBetweenEvictionRunsMillis()); + genericObjectPool.setWhenExhaustedAction(poolConfig.getWhenExhaustedAction()); + } + + public ObjectPool createPool() throws SyslogRuntimeException { + GenericObjectPool genericPool = new GenericObjectPool(this); + + configureGenericObjectPool(genericPool); + + return genericPool; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/unix/UnixSyslog.java b/src/main/java/org/productivity/java/syslog4j/impl/unix/UnixSyslog.java new file mode 100644 index 0000000..b5e56af --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/unix/UnixSyslog.java @@ -0,0 +1,125 @@ +package org.productivity.java.syslog4j.impl.unix; + +import org.productivity.java.syslog4j.SyslogMessageProcessorIF; +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.impl.AbstractSyslog; +import org.productivity.java.syslog4j.impl.AbstractSyslogWriter; +import org.productivity.java.syslog4j.util.OSDetectUtility; + +import com.sun.jna.Library; +import com.sun.jna.Memory; +import com.sun.jna.Native; + +/** +* UnixSyslog is an extension of AbstractSyslog that provides support for +* Unix-based syslog clients. +* +*This class requires the JNA (Java Native Access) library to directly +* access the native C libraries utilized on Unix platforms.
+* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: UnixSyslog.java,v 1.27 2010/10/25 04:21:19 cvs Exp $ +*/ +public class UnixSyslog extends AbstractSyslog { + private static final long serialVersionUID = 4973353204252276740L; + + protected UnixSyslogConfig unixSyslogConfig = null; + + protected interface CLibrary extends Library { + public void openlog(final Memory ident, int option, int facility); + public void syslog(int priority, final String format, final String message); + public void closelog(); + } + + protected static int currentFacility = -1; + protected static boolean openlogCalled = false; + + protected static CLibrary libraryInstance = null; + + protected static synchronized void loadLibrary(UnixSyslogConfig config) throws SyslogRuntimeException { + if (!OSDetectUtility.isUnix()) { + throw new SyslogRuntimeException("UnixSyslog not supported on non-Unix platforms"); + } + + if (libraryInstance == null) { + libraryInstance = (CLibrary) Native.loadLibrary(config.getLibrary(),CLibrary.class); + } + } + + public void initialize() throws SyslogRuntimeException { + try { + this.unixSyslogConfig = (UnixSyslogConfig) this.syslogConfig; + + } catch (ClassCastException cce) { + throw new SyslogRuntimeException("config must be of type UnixSyslogConfig"); + } + + loadLibrary(this.unixSyslogConfig); + } + + protected static void write(int level, String message, UnixSyslogConfig config) throws SyslogRuntimeException { + synchronized(libraryInstance) { + if (currentFacility != config.getFacility()) { + if (openlogCalled) { + libraryInstance.closelog(); + openlogCalled = false; + } + + currentFacility = config.getFacility(); + } + + if (!openlogCalled) { + String ident = config.getIdent(); + + if (ident != null && "".equals(ident.trim())) { + ident = null; + } + + Memory identBuffer = null; + + if (ident != null) { + identBuffer = new Memory(128); + identBuffer.setString(0, ident, false); + } + + libraryInstance.openlog(identBuffer,config.getOption(),currentFacility); + openlogCalled = true; + } + + int priority = currentFacility | level; + + libraryInstance.syslog(priority,"%s",message); + } + } + + protected void write(int level, byte[] message) throws SyslogRuntimeException { + // NO-OP + } + + public void log(SyslogMessageProcessorIF messageProcessor, int level, String message) { + write(level,message,this.unixSyslogConfig); + } + + public void flush() throws SyslogRuntimeException { + synchronized(libraryInstance) { + libraryInstance.closelog(); + openlogCalled = false; + } + } + + public void shutdown() throws SyslogRuntimeException { + flush(); + } + + public AbstractSyslogWriter getWriter() { + return null; + } + + public void returnWriter(AbstractSyslogWriter syslogWriter) { + // + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/unix/UnixSyslogConfig.java b/src/main/java/org/productivity/java/syslog4j/impl/unix/UnixSyslogConfig.java new file mode 100644 index 0000000..7db7c82 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/unix/UnixSyslogConfig.java @@ -0,0 +1,71 @@ +package org.productivity.java.syslog4j.impl.unix; + +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.impl.AbstractSyslogConfig; + +/** +* UnixSyslogConfig is an extension of AbstractNetSyslogConfig that provides +* configuration support for Unix-based syslog clients. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: UnixSyslogConfig.java,v 1.13 2010/10/25 03:50:25 cvs Exp $ +*/ +public class UnixSyslogConfig extends AbstractSyslogConfig { + private static final long serialVersionUID = -4805767812011660656L; + + protected String library = SYSLOG_LIBRARY_DEFAULT; + protected int option = OPTION_NONE; + + public UnixSyslogConfig() { + // Unix-based syslog does not need localName sent + this.setSendLocalName(false); + } + + public Class getSyslogClass() { + return UnixSyslog.class; + } + + public String getHost() { + return null; + } + + public int getPort() { + return 0; + } + + public void setHost(String host) throws SyslogRuntimeException { + throw new SyslogRuntimeException("Host not appropriate for class \"" + this.getClass().getName() + "\""); + } + + public void setPort(int port) throws SyslogRuntimeException { + throw new SyslogRuntimeException("Port not appropriate for class \"" + this.getClass().getName() + "\""); + } + + public String getLibrary() { + return this.library; + } + + public void setLibrary(String library) { + this.library = library; + } + + public int getOption() { + return this.option; + } + + public void setOption(int option) { + this.option = option; + } + + public int getMaxQueueSize() { + throw new SyslogRuntimeException("UnixSyslog protocol does not uses a queueing mechanism"); + } + + public void setMaxQueueSize(int maxQueueSize) { + throw new SyslogRuntimeException("UnixSyslog protocol does not uses a queueing mechanism"); + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslog.java b/src/main/java/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslog.java new file mode 100644 index 0000000..eee1581 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslog.java @@ -0,0 +1,143 @@ +package org.productivity.java.syslog4j.impl.unix.socket; + +import java.nio.ByteBuffer; + +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.impl.AbstractSyslog; +import org.productivity.java.syslog4j.impl.AbstractSyslogWriter; +import org.productivity.java.syslog4j.util.OSDetectUtility; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Structure; + +/** +* UnixSocketSyslog is an extension of AbstractSyslog that provides support for +* Unix socket-based syslog clients. +* +*This class requires the JNA (Java Native Access) library to directly +* access the native C libraries utilized on Unix platforms.
+* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: UnixSocketSyslog.java,v 1.13 2010/11/16 00:52:01 cvs Exp $ +*/ +public class UnixSocketSyslog extends AbstractSyslog { + private static final long serialVersionUID = 39878807911936785L; + + protected static class SockAddr extends Structure { + public final static int SUN_PATH_SIZE = 108; + public final static byte[] ZERO_BYTE = new byte[] { 0 }; + + public short sun_family = 1; + public byte[] sun_path = new byte[SUN_PATH_SIZE]; + + public void setSunPath(String sunPath) { + System.arraycopy(sunPath.getBytes(), 0,this.sun_path, 0, sunPath.length()); + System.arraycopy(ZERO_BYTE,0,this.sun_path,sunPath.length(),1); + } + } + + protected interface CLibrary extends Library { + public int socket(int domain, int type, int protocol); + public int connect(int sockfd, SockAddr sockaddr, int addrlen); + public int write(int fd, ByteBuffer buffer, int count); + public int close(int fd); + public String strerror(int errno); + } + + protected boolean libraryLoaded = false; + protected CLibrary libraryInstance = null; + + protected UnixSocketSyslogConfig unixSocketSyslogConfig = null; + protected int fd = -1; + + protected synchronized void loadLibrary() { + if (!OSDetectUtility.isUnix()) { + throw new SyslogRuntimeException("UnixSyslog not supported on non-Unix platforms"); + } + + if (!this.libraryLoaded) { + this.libraryInstance = (CLibrary) Native.loadLibrary(this.unixSocketSyslogConfig.getLibrary(),CLibrary.class); + this.libraryLoaded = true; + } + } + + public void initialize() throws SyslogRuntimeException { + try { + this.unixSocketSyslogConfig = (UnixSocketSyslogConfig) this.syslogConfig; + + } catch (ClassCastException cce) { + throw new SyslogRuntimeException("config must be of type UnixSocketSyslogConfig"); + } + + loadLibrary(); + + } + + protected synchronized void connect() { + if (this.fd != -1) { + return; + } + + this.fd = this.libraryInstance.socket(this.unixSocketSyslogConfig.getFamily(),this.unixSocketSyslogConfig.getType(),this.unixSocketSyslogConfig.getProtocol()); + + if (this.fd == -1) { + this.fd = -1; + return; + } + + SockAddr sockAddr = new SockAddr(); + + sockAddr.sun_family = this.unixSocketSyslogConfig.getFamily(); + sockAddr.setSunPath(this.unixSocketSyslogConfig.getPath()); + + int c = this.libraryInstance.connect(this.fd, sockAddr, sockAddr.size()); + + if (c == -1) { + this.fd = -1; + return; + } + } + + protected void write(int level, byte[] message) throws SyslogRuntimeException { + if (this.fd == -1) { + connect(); + } + + if (this.fd == -1) { + return; + } + + ByteBuffer byteBuffer = ByteBuffer.wrap(message); + + this.libraryInstance.write(this.fd,byteBuffer,message.length); + } + + public void flush() throws SyslogRuntimeException { + shutdown(); + + this.fd = this.libraryInstance.socket(this.unixSocketSyslogConfig.getFamily(),this.unixSocketSyslogConfig.getType(),this.unixSocketSyslogConfig.getProtocol()); + } + + public void shutdown() throws SyslogRuntimeException { + if (this.fd == -1) { + return; + } + + this.libraryInstance.close(this.fd); + + this.fd = -1; + } + + public AbstractSyslogWriter getWriter() { + return null; + } + + public void returnWriter(AbstractSyslogWriter syslogWriter) { + // + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslogConfig.java b/src/main/java/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslogConfig.java new file mode 100644 index 0000000..65effb5 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslogConfig.java @@ -0,0 +1,141 @@ +package org.productivity.java.syslog4j.impl.unix.socket; + +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.impl.AbstractSyslogConfig; + +/** +* UnixSocketSyslogConfig is an extension of AbstractNetSyslogConfig that provides +* configuration support for Unix socket-based syslog clients. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: UnixSocketSyslogConfig.java,v 1.8 2010/11/12 03:43:12 cvs Exp $ +*/ +public class UnixSocketSyslogConfig extends AbstractSyslogConfig { + private static final long serialVersionUID = -3145794243736015707L; + + protected int type = SYSLOG_SOCKET_TYPE_DEFAULT; + protected short family = SYSLOG_SOCKET_FAMILY_DEFAULT; + protected int protocol = SYSLOG_SOCKET_PROTOCOL_DEFAULT; + protected String library = SYSLOG_SOCKET_LIBRARY_DEFAULT; + protected String path = SYSLOG_SOCKET_PATH_DEFAULT; + + public UnixSocketSyslogConfig() { + // Unix-based socket does not need localName sent + this.setSendLocalName(false); + this.setIdent("java"); + } + + public Class getSyslogClass() { + return UnixSocketSyslog.class; + } + + public UnixSocketSyslogConfig(int facility) { + this.facility = facility; + } + + public UnixSocketSyslogConfig(int facility, String path) { + this.facility = facility; + this.path = path; + } + + public UnixSocketSyslogConfig(String path) { + this.path = path; + } + + public String getHost() { + return null; + } + + public int getPort() { + return -1; + } + + public void setHost(String host) throws SyslogRuntimeException { + throw new SyslogRuntimeException("Host not appropriate for class \"" + this.getClass().getName() + "\""); + } + + public void setPort(int port) throws SyslogRuntimeException { + throw new SyslogRuntimeException("Port not appropriate for class \"" + this.getClass().getName() + "\""); + } + + public String getLibrary() { + return this.library; + } + + public void setLibrary(String library) { + this.library = library; + } + + public String getPath() { + return this.path; + } + + public void setPath(String path) { + this.path = path; + } + + public int getType() { + return this.type; + } + + public void setType(int type) { + this.type = type; + } + + public void setType(String type) { + if (type == null) { + throw new SyslogRuntimeException("Type cannot be null for class \"" + this.getClass().getName() + "\""); + } + + if ("SOCK_STREAM".equalsIgnoreCase(type.trim())) { + this.type = SOCK_STREAM; + + } else if ("SOCK_DGRAM".equalsIgnoreCase(type.trim())) { + this.type = SOCK_DGRAM; + + } else { + throw new SyslogRuntimeException("Type must be \"SOCK_STREAM\" or \"SOCK_DGRAM\" for class \"" + this.getClass().getName() + "\""); + } + } + + public short getFamily() { + return this.family; + } + + public void setFamily(short family) { + this.family = family; + } + + public void setFamily(String family) { + if (family == null) { + throw new SyslogRuntimeException("Family cannot be null for class \"" + this.getClass().getName() + "\""); + } + + if ("AF_UNIX".equalsIgnoreCase(family.trim())) { + this.family = AF_UNIX; + + } else { + throw new SyslogRuntimeException("Family must be \"AF_UNIX\" for class \"" + this.getClass().getName() + "\""); + } + } + + public int getProtocol() { + return this.protocol; + } + + public void setProtocol(int protocol) { + this.protocol = protocol; + } + + public int getMaxQueueSize() { + return -1; + } + + public void setMaxQueueSize(int maxQueueSize) { + throw new SyslogRuntimeException("UnixSyslog protocol does not uses a queueing mechanism"); + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/SyslogServer.java b/src/main/java/org/productivity/java/syslog4j/server/SyslogServer.java new file mode 100644 index 0000000..19a70ed --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/SyslogServer.java @@ -0,0 +1,239 @@ +package org.productivity.java.syslog4j.server; + +import java.util.Hashtable; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.productivity.java.syslog4j.Syslog4jVersion; +import org.productivity.java.syslog4j.SyslogConstants; +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.server.impl.net.tcp.TCPNetSyslogServerConfig; +import org.productivity.java.syslog4j.server.impl.net.udp.UDPNetSyslogServerConfig; +import org.productivity.java.syslog4j.util.SyslogUtility; + +/** + * This class provides a Singleton-based interface for Syslog4j + * server implementations. + * + *Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy + * of the LGPL license is available in the META-INF folder in all + * distributions of Syslog4j and in the base directory of the "doc" ZIP.
+ * + * @author <syslog4j@productivity.org> + * @version $Id: SyslogServer.java,v 1.14 2011/01/23 20:49:12 cvs Exp $ + */ +public class SyslogServer implements SyslogConstants { + private static final long serialVersionUID = -2260889360828258602L; + + private static boolean SUPPRESS_RUNTIME_EXCEPTIONS = false; + + protected static final Map instances = new Hashtable(); + + static { + initialize(); + } + + private SyslogServer() { + // + } + + /** + * @return Returns the current version identifier for Syslog4j. + */ + public static final String getVersion() { + return Syslog4jVersion.VERSION; + } + + + /** + * @param suppress - true to suppress throwing SyslogRuntimeException in many methods of this class, false to throw exceptions (default) + */ + public static void setSuppressRuntimeExceptions(boolean suppress) { + SUPPRESS_RUNTIME_EXCEPTIONS = suppress; + } + + /** + * @return Returns whether or not to suppress throwing SyslogRuntimeException in many methods of this class + */ + public static boolean getSuppressRuntimeExceptions() { + return SUPPRESS_RUNTIME_EXCEPTIONS; + } + + /** + * Throws SyslogRuntimeException unless it has been suppressed via setSuppressRuntimeException(boolean). + * + * @param message + * @throws SyslogRuntimeException + */ + private static void throwRuntimeException(String message) throws SyslogRuntimeException { + if (SUPPRESS_RUNTIME_EXCEPTIONS) { + return; + + } else { + throw new SyslogRuntimeException(message.toString()); + } + } + + public static final SyslogServerIF getInstance(String protocol) throws SyslogRuntimeException { + String syslogProtocol = protocol.toLowerCase(); + + if (instances.containsKey(syslogProtocol)) { + return (SyslogServerIF) instances.get(syslogProtocol); + + } else { + throwRuntimeException("SyslogServer instance \"" + syslogProtocol + "\" not defined; use \"tcp\" or \"udp\" or call SyslogServer.createInstance(protocol,config) first"); + return null; + } + } + + public static final SyslogServerIF getThreadedInstance(String protocol) throws SyslogRuntimeException { + SyslogServerIF server = getInstance(protocol); + + if (server.getThread() == null) { + Thread thread = new Thread(server); + thread.setName("SyslogServer: " + protocol); + thread.setDaemon(server.getConfig().isUseDaemonThread()); + if (server.getConfig().getThreadPriority() > -1) { + thread.setPriority(server.getConfig().getThreadPriority()); + } + + server.setThread(thread); + thread.start(); + } + + return server; + } + + public static final boolean exists(String protocol) { + if (protocol == null || "".equals(protocol.trim())) { + return false; + } + + return instances.containsKey(protocol.toLowerCase()); + } + + public static final SyslogServerIF createInstance(String protocol, SyslogServerConfigIF config) throws SyslogRuntimeException { + if (protocol == null || "".equals(protocol.trim())) { + throwRuntimeException("Instance protocol cannot be null or empty"); + return null; + } + + if (config == null) { + throwRuntimeException("SyslogServerConfig cannot be null"); + return null; + } + + String syslogProtocol = protocol.toLowerCase(); + + SyslogServerIF syslogServer = null; + + synchronized(instances) { + if (instances.containsKey(syslogProtocol)) { + throwRuntimeException("SyslogServer instance \"" + syslogProtocol + "\" already defined."); + return null; + } + + try { + Class syslogClass = config.getSyslogServerClass(); + + syslogServer = (SyslogServerIF) syslogClass.newInstance(); + + } catch (ClassCastException cse) { + throw new SyslogRuntimeException(cse); + + } catch (IllegalAccessException iae) { + throw new SyslogRuntimeException(iae); + + } catch (InstantiationException ie) { + throw new SyslogRuntimeException(ie); + } + + syslogServer.initialize(syslogProtocol,config); + + instances.put(syslogProtocol,syslogServer); + } + + return syslogServer; + } + + public static final SyslogServerIF createThreadedInstance(String protocol, SyslogServerConfigIF config) throws SyslogRuntimeException { + createInstance(protocol,config); + + SyslogServerIF server = getThreadedInstance(protocol); + + return server; + } + + public synchronized static final void destroyInstance(String protocol) { + if (protocol == null || "".equals(protocol.trim())) { + return; + } + + String _protocol = protocol.toLowerCase(); + + if (instances.containsKey(_protocol)) { + SyslogUtility.sleep(SyslogConstants.THREAD_LOOP_INTERVAL_DEFAULT); + + SyslogServerIF syslogServer = (SyslogServerIF) instances.get(_protocol); + + try { + syslogServer.shutdown(); + + } finally { + instances.remove(_protocol); + } + + } else { + throwRuntimeException("Cannot destroy server protocol \"" + protocol + "\" instance; call shutdown instead"); + return; + } + } + + public synchronized static final void destroyInstance(SyslogServerIF syslogServer) { + if (syslogServer == null) { + return; + } + + String protocol = syslogServer.getProtocol().toLowerCase(); + + if (instances.containsKey(protocol)) { + SyslogUtility.sleep(SyslogConstants.THREAD_LOOP_INTERVAL_DEFAULT); + + try { + syslogServer.shutdown(); + + } finally { + instances.remove(protocol); + } + + } else { + throwRuntimeException("Cannot destroy server protocol \"" + protocol + "\" instance; call shutdown instead"); + } + } + + public synchronized static void initialize() { + createInstance(UDP,new UDPNetSyslogServerConfig()); + createInstance(TCP,new TCPNetSyslogServerConfig()); + } + + public synchronized static final void shutdown() throws SyslogRuntimeException { + Set protocols = instances.keySet(); + + Iterator i = protocols.iterator(); + + while(i.hasNext()) { + String protocol = (String) i.next(); + + SyslogServerIF syslogServer = (SyslogServerIF) instances.get(protocol); + + syslogServer.shutdown(); + } + + instances.clear(); + } + + public static void main(String[] args) throws Exception { + SyslogServerMain.main(args); + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/SyslogServerConfigIF.java b/src/main/java/org/productivity/java/syslog4j/server/SyslogServerConfigIF.java new file mode 100644 index 0000000..f0e5491 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/SyslogServerConfigIF.java @@ -0,0 +1,50 @@ +package org.productivity.java.syslog4j.server; + +import java.util.List; + +import org.productivity.java.syslog4j.SyslogCharSetIF; +import org.productivity.java.syslog4j.SyslogConstants; +import org.productivity.java.syslog4j.SyslogRuntimeException; + +/** +* SyslogServerConfigIF provides a common, extensible configuration interface for all +* implementations of SyslogServerIF. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: SyslogServerConfigIF.java,v 1.12 2011/01/11 05:11:13 cvs Exp $ +*/ +public interface SyslogServerConfigIF extends SyslogConstants, SyslogCharSetIF { + public Class getSyslogServerClass(); + + public String getHost(); + public void setHost(String host) throws SyslogRuntimeException; + + public int getPort(); + public void setPort(int port) throws SyslogRuntimeException; + + public boolean isUseDaemonThread(); + public void setUseDaemonThread(boolean useDaemonThread); + + public int getThreadPriority(); + public void setThreadPriority(int threadPriority); + + public List getEventHandlers(); + + public long getShutdownWait(); + public void setShutdownWait(long shutdownWait); + + public void addEventHandler(SyslogServerEventHandlerIF eventHandler); + public void insertEventHandler(int pos, SyslogServerEventHandlerIF eventHandler); + public void removeEventHandler(SyslogServerEventHandlerIF eventHandler); + public void removeAllEventHandlers(); + + public boolean isUseStructuredData(); + public void setUseStructuredData(boolean useStructuredData); + + public Object getDateTimeFormatter(); + public void setDateTimeFormatter(Object dateTimeFormatter); +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/SyslogServerEventHandlerIF.java b/src/main/java/org/productivity/java/syslog4j/server/SyslogServerEventHandlerIF.java new file mode 100644 index 0000000..5d60558 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/SyslogServerEventHandlerIF.java @@ -0,0 +1,8 @@ +package org.productivity.java.syslog4j.server; + +import java.io.Serializable; + +public abstract interface SyslogServerEventHandlerIF extends Serializable { + public void initialize(SyslogServerIF syslogServer); + public void destroy(SyslogServerIF syslogServer); +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/SyslogServerEventIF.java b/src/main/java/org/productivity/java/syslog4j/server/SyslogServerEventIF.java new file mode 100644 index 0000000..cc578e0 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/SyslogServerEventIF.java @@ -0,0 +1,41 @@ +package org.productivity.java.syslog4j.server; + +import java.util.Date; + +import org.productivity.java.syslog4j.SyslogCharSetIF; + +/** +* SyslogServerEventIF provides an extensible interface for Syslog4j +* server events. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: SyslogServerEventIF.java,v 1.4 2010/11/28 01:38:08 cvs Exp $ +*/ +public interface SyslogServerEventIF extends SyslogCharSetIF { + /** + * Note: getRaw() may use System.arraycopy(..) each time it is called; best to call it once and store the result. + * + * @return Returns the raw data received from the client. + */ + public byte[] getRaw(); + + public int getFacility(); + public void setFacility(int facility); + + public Date getDate(); + public void setDate(Date date); + + public int getLevel(); + public void setLevel(int level); + + public String getHost(); + public void setHost(String host); + public boolean isHostStrippedFromMessage(); + + public String getMessage(); + public void setMessage(String message); +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/SyslogServerIF.java b/src/main/java/org/productivity/java/syslog4j/server/SyslogServerIF.java new file mode 100644 index 0000000..42f4433 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/SyslogServerIF.java @@ -0,0 +1,27 @@ +package org.productivity.java.syslog4j.server; + +import org.productivity.java.syslog4j.SyslogRuntimeException; + +/** +* SyslogServerIF provides a common interface for all Syslog4j server implementations. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: SyslogServerIF.java,v 1.5 2008/11/07 15:15:41 cvs Exp $ +*/ +public interface SyslogServerIF extends Runnable { + public void initialize(String protocol, SyslogServerConfigIF config) throws SyslogRuntimeException; + + public String getProtocol(); + public SyslogServerConfigIF getConfig(); + + public void run(); + + public Thread getThread(); + public void setThread(Thread thread); + + public void shutdown(); +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/SyslogServerMain.java b/src/main/java/org/productivity/java/syslog4j/server/SyslogServerMain.java new file mode 100644 index 0000000..6637f94 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/SyslogServerMain.java @@ -0,0 +1,165 @@ +package org.productivity.java.syslog4j.server; + +import org.productivity.java.syslog4j.server.impl.event.printstream.FileSyslogServerEventHandler; +import org.productivity.java.syslog4j.server.impl.event.printstream.SystemOutSyslogServerEventHandler; +import org.productivity.java.syslog4j.server.impl.net.tcp.TCPNetSyslogServerConfigIF; +import org.productivity.java.syslog4j.util.SyslogUtility; + +/** + * This class provides a command-line interface for Syslog4j + * server implementations. + * + *Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy + * of the LGPL license is available in the META-INF folder in all + * distributions of Syslog4j and in the base directory of the "doc" ZIP.
+ * + * @author <syslog4j@productivity.org> + * @version $Id: SyslogServerMain.java,v 1.3 2010/11/28 01:38:08 cvs Exp $ + */ +public class SyslogServerMain { + public static boolean CALL_SYSTEM_EXIT_ON_FAILURE = true; + + public static class Options { + public String protocol = null; + public String fileName = null; + public boolean append = false; + public boolean quiet = false; + + public String host = null; + public String port = null; + public String timeout = null; + + public String usage = null; + } + + public static void usage(String problem) { + if (problem != null) { + System.out.println("Error: " + problem); + System.out.println(); + } + + System.out.println("Usage:"); + System.out.println(); + System.out.println("SyslogServer [-hSyslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: SyslogServerSessionlessEventHandlerIF.java,v 1.1 2010/11/12 02:56:44 cvs Exp $ +*/ +public interface SyslogServerSessionlessEventHandlerIF extends SyslogServerEventHandlerIF { + public void event(SyslogServerIF syslogServer, SocketAddress socketAddress, SyslogServerEventIF event); + public void exception(SyslogServerIF syslogServer, SocketAddress socketAddress, Exception exception); +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/AbstractSyslogServer.java b/src/main/java/org/productivity/java/syslog4j/server/impl/AbstractSyslogServer.java new file mode 100644 index 0000000..d8cc44b --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/AbstractSyslogServer.java @@ -0,0 +1,339 @@ +package org.productivity.java.syslog4j.server.impl; + +import java.net.DatagramPacket; +import java.net.InetAddress; +import java.net.Socket; +import java.net.SocketAddress; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.productivity.java.syslog4j.SyslogCharSetIF; +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.server.SyslogServerConfigIF; +import org.productivity.java.syslog4j.server.SyslogServerEventHandlerIF; +import org.productivity.java.syslog4j.server.SyslogServerEventIF; +import org.productivity.java.syslog4j.server.SyslogServerIF; +import org.productivity.java.syslog4j.server.SyslogServerSessionEventHandlerIF; +import org.productivity.java.syslog4j.server.SyslogServerSessionlessEventHandlerIF; +import org.productivity.java.syslog4j.server.impl.event.SyslogServerEvent; +import org.productivity.java.syslog4j.server.impl.event.structured.StructuredSyslogServerEvent; +import org.productivity.java.syslog4j.util.SyslogUtility; + +/** +* AbstractSyslogServer provides a base abstract implementation of the SyslogServerIF. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: AbstractSyslogServer.java,v 1.12 2011/01/11 05:11:13 cvs Exp $ +*/ +public abstract class AbstractSyslogServer implements SyslogServerIF { + public static class Sessions extends HashMap { + private static final long serialVersionUID = -4438949276263772580L; + + public static final Object syncObject = new Object(); + + public void addSocket(Socket socket) { + synchronized(syncObject) { + put(socket,new HashMap()); + } + } + + public Iterator getSockets() { + if (size() > 0) { + return keySet().iterator(); + + } else { + return null; + } + } + + public void addSession(Socket socket, SyslogServerEventHandlerIF eventHandler, Object session) { + synchronized(syncObject) { + Map handlerMap = getHandlerMap(socket); + + if (handlerMap == null) { + handlerMap = new HashMap(); + } + + handlerMap.put(eventHandler,session); + } + } + + public void removeSocket(Socket socket) { + synchronized(syncObject) { + Map handlerMap = getHandlerMap(socket); + + if (handlerMap != null) { + handlerMap.clear(); + } + } + } + + protected Map getHandlerMap(Socket socket) { + Map handlerMap = null; + + if (containsKey(socket)) { + handlerMap = (Map) get(socket); + } + + return handlerMap; + } + + public Object getSession(Socket socket, SyslogServerEventHandlerIF eventHandler) { + synchronized(syncObject) { + Map handlerMap = getHandlerMap(socket); + + Object session = handlerMap.get(eventHandler); + + return session; + } + } + } + + protected String syslogProtocol = null; + protected AbstractSyslogServerConfig syslogServerConfig = null; + protected Thread thread = null; + + protected boolean shutdown = false; + + public void initialize(String protocol, SyslogServerConfigIF config) throws SyslogRuntimeException { + this.syslogProtocol = protocol; + + try { + this.syslogServerConfig = (AbstractSyslogServerConfig) config; + + } catch (ClassCastException cce) { + throw new SyslogRuntimeException(cce); + } + + initialize(); + } + + public String getProtocol() { + return this.syslogProtocol; + } + + public SyslogServerConfigIF getConfig() { + return this.syslogServerConfig; + } + + protected abstract void initialize() throws SyslogRuntimeException; + + public void shutdown() throws SyslogRuntimeException { + this.shutdown = true; + } + + public Thread getThread() { + return this.thread; + } + + public void setThread(Thread thread) { + this.thread = thread; + } + + protected static boolean isStructuredMessage(SyslogCharSetIF syslogCharSet, byte[] receiveData) { + String receiveDataString = SyslogUtility.newString(syslogCharSet, receiveData); + + boolean isStructuredMessage = isStructuredMessage(syslogCharSet,receiveDataString); + + return isStructuredMessage; + } + + protected static boolean isStructuredMessage(SyslogCharSetIF syslogCharSet, String receiveData) { + int idx = receiveData.indexOf('>'); + + if (idx != -1) { + // If there's a numerical VERSION field after theSyslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: SyslogServerEvent.java,v 1.9 2011/01/11 06:21:15 cvs Exp $ +*/ +public class SyslogServerEvent implements SyslogServerEventIF { + private static final long serialVersionUID = 6136043067089899962L; + + public static final String DATE_FORMAT = "MMM dd HH:mm:ss yyyy"; + public static final String DATE_FORMAT_S = "MMM d HH:mm:ss yyyy"; + + protected String charSet = SyslogConstants.CHAR_SET_DEFAULT; + protected String rawString = null; + protected byte[] rawBytes = null; + protected int rawLength = -1; + protected Date date = null; + protected int level = -1; + protected int facility = -1; + protected String host = null; + protected boolean isHostStrippedFromMessage = false; + protected String message = null; + protected InetAddress inetAddress = null; + + protected SyslogServerEvent() { } + + public SyslogServerEvent(final String message, InetAddress inetAddress) { + initialize(message,inetAddress); + + parse(); + } + + public SyslogServerEvent(final byte[] message, int length, InetAddress inetAddress) { + initialize(message,length,inetAddress); + + parse(); + } + + protected void initialize(final String message, InetAddress inetAddress) { + this.rawString = message; + this.rawLength = message.length(); + this.inetAddress = inetAddress; + + this.message = message; + } + + protected void initialize(final byte[] message, int length, InetAddress inetAddress) { + this.rawBytes = message; + this.rawLength = length; + this.inetAddress = inetAddress; + } + + protected void parseHost() { + int i = this.message.indexOf(' '); + + if (i > -1) { + this.host = this.message.substring(0,i).trim(); + } + } + + protected void parseDate() { + int datelength = 16; + String dateFormatS = DATE_FORMAT; + + if (this.message.length() > datelength) { + + // http://jira.graylog2.org/browse/SERVER-287 + if (this.message.charAt(5) == ' ') { + datelength = 15; + dateFormatS = DATE_FORMAT_S; + } + + String year = Integer.toString(Calendar.getInstance().get(Calendar.YEAR)); + + String originalDate = this.message.substring(0,datelength-1) + " " + year; + DateFormat dateFormat = new SimpleDateFormat(dateFormatS); + try { + this.date = dateFormat.parse(originalDate); + + this.message = this.message.substring(datelength); + + } catch (ParseException pe) { + this.date = new Date(); + } + } + + parseHost(); + } + + protected void parsePriority() { + if (this.message.charAt(0) == '<') { + int i = this.message.indexOf(">"); + + if (i <= 4 && i > -1) { + String priorityStr = this.message.substring(1,i); + + int priority = 0; + try { + priority = Integer.parseInt(priorityStr); + this.facility = priority >> 3; + this.level = priority - (this.facility << 3); + + this.message = this.message.substring(i+1); + + parseDate(); + + } catch (NumberFormatException nfe) { + // + } + + parseHost(); + } + } + } + + protected void parse() { + if (this.message == null) { + this.message = SyslogUtility.newString(this,this.rawBytes,this.rawLength); + } + + parsePriority(); + } + + public int getFacility() { + return this.facility; + } + + public void setFacility(int facility) { + this.facility = facility; + } + + public byte[] getRaw() { + if (this.rawString != null) { + byte[] rawStringBytes = SyslogUtility.getBytes(this,this.rawString); + + return rawStringBytes; + + } else if (this.rawBytes.length == this.rawLength) { + return this.rawBytes; + + } else { + byte[] newRawBytes = new byte[this.rawLength]; + System.arraycopy(this.rawBytes,0,newRawBytes,0,this.rawLength); + + return newRawBytes; + } + } + + public int getRawLength() { + return this.rawLength; + } + + public Date getDate() { + return this.date; + } + + public void setDate(Date date) { + this.date = date; + } + + public int getLevel() { + return this.level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getHost() { + return this.host; + } + + public void setHost(String host) { + this.host = host; + } + + public boolean isHostStrippedFromMessage() { + return isHostStrippedFromMessage; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getCharSet() { + return this.charSet; + } + + public void setCharSet(String charSet) { + this.charSet = charSet; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/event/printstream/FileSyslogServerEventHandler.java b/src/main/java/org/productivity/java/syslog4j/server/impl/event/printstream/FileSyslogServerEventHandler.java new file mode 100644 index 0000000..7bf53b4 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/event/printstream/FileSyslogServerEventHandler.java @@ -0,0 +1,29 @@ +package org.productivity.java.syslog4j.server.impl.event.printstream; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; + +public class FileSyslogServerEventHandler extends PrintStreamSyslogServerEventHandler { + private static final long serialVersionUID = -755824686809731430L; + + protected static PrintStream createPrintStream(String fileName, boolean append) throws IOException { + File file = new File(fileName); + + OutputStream os = new FileOutputStream(file,append); + + PrintStream printStream = new PrintStream(os); + + return printStream; + } + + public FileSyslogServerEventHandler(String fileName) throws IOException { + super(createPrintStream(fileName,true)); + } + + public FileSyslogServerEventHandler(String fileName, boolean append) throws IOException { + super(createPrintStream(fileName,append)); + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/event/printstream/PrintStreamSyslogServerEventHandler.java b/src/main/java/org/productivity/java/syslog4j/server/impl/event/printstream/PrintStreamSyslogServerEventHandler.java new file mode 100644 index 0000000..d161916 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/event/printstream/PrintStreamSyslogServerEventHandler.java @@ -0,0 +1,59 @@ +package org.productivity.java.syslog4j.server.impl.event.printstream; + +import java.io.PrintStream; +import java.net.SocketAddress; +import java.util.Date; + +import org.productivity.java.syslog4j.server.SyslogServerEventIF; +import org.productivity.java.syslog4j.server.SyslogServerIF; +import org.productivity.java.syslog4j.server.SyslogServerSessionEventHandlerIF; +import org.productivity.java.syslog4j.util.SyslogUtility; + +/** +* SystemOutSyslogServerEventHandler provides a simple example implementation +* of the SyslogServerEventHandlerIF which writes the events to System.out. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: PrintStreamSyslogServerEventHandler.java,v 1.7 2010/11/28 22:07:57 cvs Exp $ +*/ +public class PrintStreamSyslogServerEventHandler implements SyslogServerSessionEventHandlerIF { + private static final long serialVersionUID = 6036415838696050746L; + + protected PrintStream stream = null; + + public PrintStreamSyslogServerEventHandler(PrintStream stream) { + this.stream = stream; + } + + public void initialize(SyslogServerIF syslogServer) { + return; + } + + public Object sessionOpened(SyslogServerIF syslogServer, SocketAddress socketAddress) { + return null; + } + + public void event(Object session, SyslogServerIF syslogServer, SocketAddress socketAddress, SyslogServerEventIF event) { + String date = (event.getDate() == null ? new Date() : event.getDate()).toString(); + String facility = SyslogUtility.getFacilityString(event.getFacility()); + String level = SyslogUtility.getLevelString(event.getLevel()); + + this.stream.println("{" + facility + "} " + date + " " + level + " " + event.getMessage()); + } + + public void exception(Object session, SyslogServerIF syslogServer, SocketAddress socketAddress, Exception exception) { + // + } + + public void sessionClosed(Object session, SyslogServerIF syslogServer, SocketAddress socketAddress, boolean timeout) { + // + } + + public void destroy(SyslogServerIF syslogServer) { + return; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/event/printstream/SystemErrSyslogServerEventHandler.java b/src/main/java/org/productivity/java/syslog4j/server/impl/event/printstream/SystemErrSyslogServerEventHandler.java new file mode 100644 index 0000000..e61052e --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/event/printstream/SystemErrSyslogServerEventHandler.java @@ -0,0 +1,15 @@ +package org.productivity.java.syslog4j.server.impl.event.printstream; + +import org.productivity.java.syslog4j.server.SyslogServerSessionEventHandlerIF; + +public class SystemErrSyslogServerEventHandler extends PrintStreamSyslogServerEventHandler { + private static final long serialVersionUID = -3496862887351690575L; + + public static SyslogServerSessionEventHandlerIF create() { + return new SystemErrSyslogServerEventHandler(); + } + + public SystemErrSyslogServerEventHandler() { + super(System.err); + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/event/printstream/SystemOutSyslogServerEventHandler.java b/src/main/java/org/productivity/java/syslog4j/server/impl/event/printstream/SystemOutSyslogServerEventHandler.java new file mode 100644 index 0000000..bfe38b8 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/event/printstream/SystemOutSyslogServerEventHandler.java @@ -0,0 +1,15 @@ +package org.productivity.java.syslog4j.server.impl.event.printstream; + +import org.productivity.java.syslog4j.server.SyslogServerSessionEventHandlerIF; + +public class SystemOutSyslogServerEventHandler extends PrintStreamSyslogServerEventHandler { + private static final long serialVersionUID = 1690551409588182601L; + + public static SyslogServerSessionEventHandlerIF create() { + return new SystemOutSyslogServerEventHandler(); + } + + public SystemOutSyslogServerEventHandler() { + super(System.out); + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/event/structured/StructuredSyslogServerEvent.java b/src/main/java/org/productivity/java/syslog4j/server/impl/event/structured/StructuredSyslogServerEvent.java new file mode 100644 index 0000000..476f3ab --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/event/structured/StructuredSyslogServerEvent.java @@ -0,0 +1,151 @@ +package org.productivity.java.syslog4j.server.impl.event.structured; + +import java.net.InetAddress; + +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormatter; +import org.joda.time.format.ISODateTimeFormat; +import org.productivity.java.syslog4j.SyslogConstants; +import org.productivity.java.syslog4j.impl.message.structured.StructuredSyslogMessage; +import org.productivity.java.syslog4j.server.impl.event.SyslogServerEvent; + +/** + * SyslogServerStructuredEvent provides an implementation of the + * SyslogServerEventIF interface that supports receiving of structured syslog + * messages, as defined in: + * + *+ * http://tools.ietf.org/html/draft-ietf-syslog-protocol-23#section-6 + *
+ * + *+ * Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy of the + * LGPL license is available in the META-INF folder in all distributions of + * Syslog4j and in the base directory of the "doc" ZIP. + *
+ * + * @author Manish Motwani + * @version $Id: StructuredSyslogServerEvent.java,v 1.6 2011/01/11 05:11:13 cvs Exp $ + */ +public class StructuredSyslogServerEvent extends SyslogServerEvent { + private static final long serialVersionUID = 1676499796406044315L; + + protected String applicationName = SyslogConstants.STRUCTURED_DATA_APP_NAME_DEFAULT_VALUE; + protected String processId = null; + protected DateTime dateTime = null; + protected DateTimeFormatter dateTimeFormatter = null; + + public StructuredSyslogServerEvent(final byte[] message, int length, InetAddress inetAddress) { + super(); + + initialize(message,length,inetAddress); + parse(); + } + + public StructuredSyslogServerEvent(final String message, InetAddress inetAddress) { + super(); + + initialize(message,inetAddress); + parse(); + } + + public DateTimeFormatter getDateTimeFormatter() { + if (dateTimeFormatter == null) { + this.dateTimeFormatter = ISODateTimeFormat.dateTime(); + } + + return dateTimeFormatter; + } + + public void setDateTimeFormatter(Object dateTimeFormatter) { + this.dateTimeFormatter = (DateTimeFormatter) dateTimeFormatter; + } + + protected void parseApplicationName() { + int i = this.message.indexOf(' '); + + if (i > -1) { + this.applicationName = this.message.substring(0, i).trim(); + this.message = this.message.substring(i + 1); + parseProcessId(); + } + + if (SyslogConstants.STRUCTURED_DATA_NILVALUE.equals(this.applicationName)) { + this.applicationName = null; + } + } + + protected void parseProcessId() { + int i = this.message.indexOf(' '); + + if (i > -1) { + this.processId = this.message.substring(0, i).trim(); + this.message = this.message.substring(i + 1); + } + + if (SyslogConstants.STRUCTURED_DATA_NILVALUE.equals(this.processId)) { + this.processId = null; + } + } + + protected void parseDate() { + // skip VERSION field + int i = this.message.indexOf(' '); + this.message = this.message.substring(i + 1); + + // parse the date + i = this.message.indexOf(' '); + + if (i > -1) { + String dateString = this.message.substring(0, i).trim(); + + try { + DateTimeFormatter formatter = getDateTimeFormatter(); + + this.dateTime = formatter.parseDateTime(dateString); + this.date = this.dateTime.toDate(); + + this.message = this.message.substring(dateString.length() + 1); + + } catch (Exception e) { + // Not structured date format, try super one + super.parseDate(); + } + } + } + + protected void parseHost() { + int i = this.message.indexOf(' '); + + if (i > -1) { + this.host = this.message.substring(0,i).trim(); + this.message = this.message.substring(i+1); + + parseApplicationName(); + } + } + + public String getApplicationName() { + return this.applicationName; + } + + public String getProcessId() { + return this.processId; + } + + public DateTime getDateTime() { + return this.dateTime; + } + + public StructuredSyslogMessage getStructuredMessage() { + try { + return StructuredSyslogMessage.fromString(getMessage()); + + } catch (IllegalArgumentException e) { + // throw new SyslogRuntimeException( + // "Message received is not a valid structured message: " + // + getMessage(), e); + return new StructuredSyslogMessage(null,null,getMessage()); + } + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/net/AbstractNetSyslogServerConfig.java b/src/main/java/org/productivity/java/syslog4j/server/impl/net/AbstractNetSyslogServerConfig.java new file mode 100644 index 0000000..31067f4 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/net/AbstractNetSyslogServerConfig.java @@ -0,0 +1,37 @@ +package org.productivity.java.syslog4j.server.impl.net; + +import org.productivity.java.syslog4j.server.impl.AbstractSyslogServerConfig; + +/** +* AbstractNetSyslogServerConfig provides a base abstract implementation of the AbstractSyslogServerConfig +* configuration interface. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: AbstractNetSyslogServerConfig.java,v 1.4 2008/11/07 15:15:41 cvs Exp $ +*/ +public abstract class AbstractNetSyslogServerConfig extends AbstractSyslogServerConfig { + private static final long serialVersionUID = -3363374941938350263L; + + protected String host = null; + protected int port = SYSLOG_PORT_DEFAULT; + + public String getHost() { + return this.host; + } + + public void setHost(String host) { + this.host = host; + } + + public int getPort() { + return this.port; + } + + public void setPort(int port) { + this.port = port; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServer.java b/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServer.java new file mode 100644 index 0000000..9e47937 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServer.java @@ -0,0 +1,252 @@ +package org.productivity.java.syslog4j.server.impl.net.tcp; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketException; +import java.net.SocketTimeoutException; +import java.util.Iterator; + +import javax.net.ServerSocketFactory; + +import org.productivity.java.syslog4j.SyslogConstants; +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.server.SyslogServerEventIF; +import org.productivity.java.syslog4j.server.SyslogServerIF; +import org.productivity.java.syslog4j.server.impl.AbstractSyslogServer; +import org.productivity.java.syslog4j.util.SyslogUtility; + +/** +* TCPNetSyslogServer provides a simple threaded TCP/IP server implementation. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: TCPNetSyslogServer.java,v 1.23 2010/11/28 22:07:57 cvs Exp $ +*/ +public class TCPNetSyslogServer extends AbstractSyslogServer { + public static class TCPNetSyslogSocketHandler implements Runnable { + protected SyslogServerIF server = null; + protected Socket socket = null; + protected Sessions sessions = null; + + public TCPNetSyslogSocketHandler(Sessions sessions, SyslogServerIF server, Socket socket) { + this.sessions = sessions; + this.server = server; + this.socket = socket; + + synchronized(this.sessions) { + this.sessions.addSocket(socket); + } + } + + public void run() { + boolean timeout = false; + + try { + BufferedReader br = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); + + String line = br.readLine(); + + if (line != null) { + AbstractSyslogServer.handleSessionOpen(this.sessions,this.server,this.socket); + } + + while (line != null && line.length() != 0) { + SyslogServerEventIF event = createEvent(this.server.getConfig(),line,this.socket.getInetAddress()); + + AbstractSyslogServer.handleEvent(this.sessions,this.server,this.socket,event); + + line = br.readLine(); + } + + } catch (SocketTimeoutException ste) { + timeout = true; + + } catch (SocketException se) { + AbstractSyslogServer.handleException(this.sessions,this.server,this.socket.getRemoteSocketAddress(),se); + + if ("Socket closed".equals(se.getMessage())) { + // + + } else { + // + } + + } catch (IOException ioe) { + AbstractSyslogServer.handleException(this.sessions,this.server,this.socket.getRemoteSocketAddress(),ioe); + } + + try { + AbstractSyslogServer.handleSessionClosed(this.sessions,this.server,this.socket,timeout); + + this.sessions.removeSocket(this.socket); + + this.socket.close(); + + } catch (IOException ioe) { + AbstractSyslogServer.handleException(this.sessions,this.server,this.socket.getRemoteSocketAddress(),ioe); + } + } + } + + protected ServerSocket serverSocket = null; + + protected final Sessions sessions = new Sessions(); + + protected TCPNetSyslogServerConfigIF tcpNetSyslogServerConfig = null; + + public void initialize() throws SyslogRuntimeException { + this.tcpNetSyslogServerConfig = null; + + try { + this.tcpNetSyslogServerConfig = (TCPNetSyslogServerConfigIF) this.syslogServerConfig; + + } catch (ClassCastException cce) { + throw new SyslogRuntimeException("config must be of type TCPNetSyslogServerConfig"); + } + + if (this.syslogServerConfig == null) { + throw new SyslogRuntimeException("config cannot be null"); + } + + if (this.tcpNetSyslogServerConfig.getBacklog() < 1) { + this.tcpNetSyslogServerConfig.setBacklog(SyslogConstants.SERVER_SOCKET_BACKLOG_DEFAULT); + } + } + + public Sessions getSessions() { + return this.sessions; + } + + public synchronized void shutdown() { + super.shutdown(); + + try { + if (this.serverSocket != null) { + if (this.syslogServerConfig.getShutdownWait() > 0) { + SyslogUtility.sleep(this.syslogServerConfig.getShutdownWait()); + } + + this.serverSocket.close(); + } + + synchronized(this.sessions) { + Iterator i = this.sessions.getSockets(); + + if (i != null) { + while(i.hasNext()) { + Socket s = (Socket) i.next(); + + s.close(); + } + } + } + + } catch (IOException ioe) { + // + } + + if (this.thread != null) { + this.thread.interrupt(); + this.thread = null; + } + } + + protected ServerSocketFactory getServerSocketFactory() throws IOException { + ServerSocketFactory serverSocketFactory = ServerSocketFactory.getDefault(); + + return serverSocketFactory; + } + + protected ServerSocket createServerSocket() throws IOException { + ServerSocket newServerSocket = null; + + ServerSocketFactory factory = getServerSocketFactory(); + + if (this.syslogServerConfig.getHost() != null) { + InetAddress inetAddress = InetAddress.getByName(this.syslogServerConfig.getHost()); + + newServerSocket = factory.createServerSocket(this.syslogServerConfig.getPort(),this.tcpNetSyslogServerConfig.getBacklog(),inetAddress); + + } else { + if (this.tcpNetSyslogServerConfig.getBacklog() < 1) { + newServerSocket = factory.createServerSocket(this.syslogServerConfig.getPort()); + + } else { + newServerSocket = factory.createServerSocket(this.syslogServerConfig.getPort(),this.tcpNetSyslogServerConfig.getBacklog()); + } + } + + return newServerSocket; + } + + public void run() { + try { + this.serverSocket = createServerSocket(); + this.shutdown = false; + + } catch (SocketException se) { + throw new SyslogRuntimeException(se); + + } catch (IOException ioe) { + throw new SyslogRuntimeException(ioe); + } + + handleInitialize(this); + + while(!this.shutdown) { + try { + Socket socket = this.serverSocket.accept(); + + if (this.tcpNetSyslogServerConfig.getTimeout() > 0) { + socket.setSoTimeout(this.tcpNetSyslogServerConfig.getTimeout()); + } + + if (this.tcpNetSyslogServerConfig.getMaxActiveSockets() > 0 && this.sessions.size() >= this.tcpNetSyslogServerConfig.getMaxActiveSockets()) { + if (this.tcpNetSyslogServerConfig.getMaxActiveSocketsBehavior() == TCPNetSyslogServerConfigIF.MAX_ACTIVE_SOCKETS_BEHAVIOR_REJECT) { + try { + socket.close(); + + } catch (Exception e) { + // + } + + socket = null; + + } else if (this.tcpNetSyslogServerConfig.getMaxActiveSocketsBehavior() == TCPNetSyslogServerConfigIF.MAX_ACTIVE_SOCKETS_BEHAVIOR_BLOCK) { + while (!this.shutdown && this.sessions.size() >= this.tcpNetSyslogServerConfig.getMaxActiveSockets() && socket.isConnected() && !socket.isClosed()) { + SyslogUtility.sleep(SyslogConstants.THREAD_LOOP_INTERVAL_DEFAULT); + } + } + } + + if (socket != null) { + TCPNetSyslogSocketHandler handler = new TCPNetSyslogSocketHandler(this.sessions,this,socket); + + Thread t = new Thread(handler); + + t.start(); + } + + } catch (SocketException se) { + if ("Socket closed".equals(se.getMessage())) { + this.shutdown = true; + + } else { + // + } + + } catch (IOException ioe) { + // + } + } + + handleDestroy(this); + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServerConfig.java b/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServerConfig.java new file mode 100644 index 0000000..aabe4d9 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServerConfig.java @@ -0,0 +1,86 @@ +package org.productivity.java.syslog4j.server.impl.net.tcp; + +import org.productivity.java.syslog4j.server.impl.net.AbstractNetSyslogServerConfig; + +/** +* TCPNetSyslogServerConfig provides configuration for TCPNetSyslogServer. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: TCPNetSyslogServerConfig.java,v 1.8 2010/11/28 01:38:08 cvs Exp $ +*/ +public class TCPNetSyslogServerConfig extends AbstractNetSyslogServerConfig implements TCPNetSyslogServerConfigIF { + private static final long serialVersionUID = -1546696301177599370L; + + protected int timeout = 0; + protected int backlog = 0; + protected int maxActiveSockets = TCP_MAX_ACTIVE_SOCKETS_DEFAULT; + protected byte maxActiveSocketsBehavior = TCP_MAX_ACTIVE_SOCKETS_BEHAVIOR_DEFAULT; + + public TCPNetSyslogServerConfig() { + // + } + + public TCPNetSyslogServerConfig(int port) { + this.port = port; + } + + public TCPNetSyslogServerConfig(int port, int backlog) { + this.port = port; + this.backlog = backlog; + } + + public TCPNetSyslogServerConfig(String host) { + this.host = host; + } + + public TCPNetSyslogServerConfig(String host, int port) { + this.host = host; + this.port = port; + } + + public TCPNetSyslogServerConfig(String host, int port, int backlog) { + this.host = host; + this.port = port; + this.backlog = backlog; + } + + public Class getSyslogServerClass() { + return TCPNetSyslogServer.class; + } + + public int getTimeout() { + return timeout; + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + + public int getBacklog() { + return this.backlog; + } + + public void setBacklog(int backlog) { + this.backlog = backlog; + } + + public int getMaxActiveSockets() { + return maxActiveSockets; + } + + public void setMaxActiveSockets(int maxActiveSockets) { + this.maxActiveSockets = maxActiveSockets; + } + + public byte getMaxActiveSocketsBehavior() { + return maxActiveSocketsBehavior; + } + + public void setMaxActiveSocketsBehavior(byte maxActiveSocketsBehavior) { + this.maxActiveSocketsBehavior = maxActiveSocketsBehavior; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServerConfigIF.java b/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServerConfigIF.java new file mode 100644 index 0000000..090d79b --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServerConfigIF.java @@ -0,0 +1,30 @@ +package org.productivity.java.syslog4j.server.impl.net.tcp; + +import org.productivity.java.syslog4j.server.SyslogServerConfigIF; + +/** +* TCPNetSyslogServerConfigIF provides configuration for TCPNetSyslogServer. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: TCPNetSyslogServerConfigIF.java,v 1.3 2010/11/28 01:38:08 cvs Exp $ +*/ +public interface TCPNetSyslogServerConfigIF extends SyslogServerConfigIF { + public final static byte MAX_ACTIVE_SOCKETS_BEHAVIOR_BLOCK = 0; + public final static byte MAX_ACTIVE_SOCKETS_BEHAVIOR_REJECT = 1; + + public int getTimeout(); + public void setTimeout(int timeout); + + public int getBacklog(); + public void setBacklog(int backlog); + + public int getMaxActiveSockets(); + public void setMaxActiveSockets(int maxActiveSockets); + + public byte getMaxActiveSocketsBehavior(); + public void setMaxActiveSocketsBehavior(byte maxActiveSocketsBehavior); +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServer.java b/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServer.java new file mode 100644 index 0000000..7c45993 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServer.java @@ -0,0 +1,58 @@ +package org.productivity.java.syslog4j.server.impl.net.tcp.ssl; + +import java.io.IOException; + +import javax.net.ServerSocketFactory; +import javax.net.ssl.SSLServerSocketFactory; + +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.server.impl.net.tcp.TCPNetSyslogServer; + +/** +* SSLTCPNetSyslogServer provides a simple threaded TCP/IP server implementation +* which uses SSL/TLS. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: SSLTCPNetSyslogServer.java,v 1.1 2009/03/29 17:38:58 cvs Exp $ +*/ +public class SSLTCPNetSyslogServer extends TCPNetSyslogServer { + public void initialize() throws SyslogRuntimeException { + super.initialize(); + + SSLTCPNetSyslogServerConfigIF sslTcpNetSyslogServerConfig = (SSLTCPNetSyslogServerConfigIF) this.tcpNetSyslogServerConfig; + + String keyStore = sslTcpNetSyslogServerConfig.getKeyStore(); + + if (keyStore != null && !"".equals(keyStore.trim())) { + System.setProperty("javax.net.ssl.keyStore",keyStore); + } + + String keyStorePassword = sslTcpNetSyslogServerConfig.getKeyStorePassword(); + + if (keyStorePassword != null && !"".equals(keyStorePassword.trim())) { + System.setProperty("javax.net.ssl.keyStorePassword",keyStorePassword); + } + + String trustStore = sslTcpNetSyslogServerConfig.getTrustStore(); + + if (trustStore != null && !"".equals(trustStore.trim())) { + System.setProperty("javax.net.ssl.trustStore",trustStore); + } + + String trustStorePassword = sslTcpNetSyslogServerConfig.getTrustStorePassword(); + + if (trustStorePassword != null && !"".equals(trustStorePassword.trim())) { + System.setProperty("javax.net.ssl.trustStorePassword",trustStorePassword); + } + } + + protected ServerSocketFactory getServerSocketFactory() throws IOException { + ServerSocketFactory serverSocketFactory = SSLServerSocketFactory.getDefault(); + + return serverSocketFactory; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServerConfig.java b/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServerConfig.java new file mode 100644 index 0000000..e0beb66 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServerConfig.java @@ -0,0 +1,59 @@ +package org.productivity.java.syslog4j.server.impl.net.tcp.ssl; + +import org.productivity.java.syslog4j.server.impl.net.tcp.TCPNetSyslogServerConfig; + +/** +* SSLTCPNetSyslogServerConfig provides configuration for SSLTCPNetSyslogServer. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: SSLTCPNetSyslogServerConfig.java,v 1.1 2009/03/29 17:38:58 cvs Exp $ +*/ +public class SSLTCPNetSyslogServerConfig extends TCPNetSyslogServerConfig implements SSLTCPNetSyslogServerConfigIF { + private static final long serialVersionUID = -840102682868286462L; + + protected String keyStore = null; + protected String keyStorePassword = null; + + protected String trustStore = null; + protected String trustStorePassword = null; + + public String getKeyStore() { + return this.keyStore; + } + + public void setKeyStore(String keyStore) { + this.keyStore = keyStore; + } + + public String getKeyStorePassword() { + return this.keyStorePassword; + } + + public void setKeyStorePassword(String keyStorePassword) { + this.keyStorePassword = keyStorePassword; + } + + public String getTrustStore() { + return this.trustStore; + } + + public void setTrustStore(String trustStore) { + this.trustStore = trustStore; + } + + public String getTrustStorePassword() { + return this.trustStorePassword; + } + + public void setTrustStorePassword(String trustStorePassword) { + this.trustStorePassword = trustStorePassword; + } + + public Class getSyslogServerClass() { + return SSLTCPNetSyslogServer.class; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServerConfigIF.java b/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServerConfigIF.java new file mode 100644 index 0000000..cab8079 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServerConfigIF.java @@ -0,0 +1,27 @@ +package org.productivity.java.syslog4j.server.impl.net.tcp.ssl; + +import org.productivity.java.syslog4j.server.impl.net.tcp.TCPNetSyslogServerConfigIF; + +/** +* SSLTCPNetSyslogServerConfigIF provides configuration for SSLTCPNetSyslogServer. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: SSLTCPNetSyslogServerConfigIF.java,v 1.1 2009/03/29 17:38:58 cvs Exp $ +*/ +public interface SSLTCPNetSyslogServerConfigIF extends TCPNetSyslogServerConfigIF { + public String getKeyStore(); + public void setKeyStore(String keyStore); + + public String getKeyStorePassword(); + public void setKeyStorePassword(String keyStorePassword); + + public String getTrustStore(); + public void setTrustStore(String trustStore); + + public String getTrustStorePassword(); + public void setTrustStorePassword(String trustStorePassword); +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/net/udp/UDPNetSyslogServer.java b/src/main/java/org/productivity/java/syslog4j/server/impl/net/udp/UDPNetSyslogServer.java new file mode 100644 index 0000000..f5b803d --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/net/udp/UDPNetSyslogServer.java @@ -0,0 +1,102 @@ +package org.productivity.java.syslog4j.server.impl.net.udp; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.net.UnknownHostException; + +import org.productivity.java.syslog4j.SyslogConstants; +import org.productivity.java.syslog4j.SyslogRuntimeException; +import org.productivity.java.syslog4j.server.SyslogServerEventIF; +import org.productivity.java.syslog4j.server.impl.AbstractSyslogServer; +import org.productivity.java.syslog4j.util.SyslogUtility; + +/** +* UDPNetSyslogServer provides a simple non-threaded UDP/IP server implementation. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: UDPNetSyslogServer.java,v 1.16 2010/11/12 03:43:15 cvs Exp $ +*/ +public class UDPNetSyslogServer extends AbstractSyslogServer { + protected DatagramSocket ds = null; + + public void initialize() throws SyslogRuntimeException { + // + } + + public void shutdown() { + super.shutdown(); + + if (this.syslogServerConfig.getShutdownWait() > 0) { + SyslogUtility.sleep(this.syslogServerConfig.getShutdownWait()); + } + + if (this.ds != null && !this.ds.isClosed()) { + this.ds.close(); + } + } + + protected DatagramSocket createDatagramSocket() throws SocketException, UnknownHostException { + DatagramSocket datagramSocket = null; + + if (this.syslogServerConfig.getHost() != null) { + InetAddress inetAddress = InetAddress.getByName(this.syslogServerConfig.getHost()); + + datagramSocket = new DatagramSocket(this.syslogServerConfig.getPort(),inetAddress); + + } else { + datagramSocket = new DatagramSocket(this.syslogServerConfig.getPort()); + } + + return datagramSocket; + } + + public void run() { + try { + this.ds = createDatagramSocket(); + this.shutdown = false; + + } catch (SocketException se) { + return; + + } catch (UnknownHostException uhe) { + return; + } + + byte[] receiveData = new byte[SyslogConstants.SYSLOG_BUFFER_SIZE]; + + handleInitialize(this); + + while(!this.shutdown) { + DatagramPacket dp = null; + + try { + dp = new DatagramPacket(receiveData,receiveData.length); + + this.ds.receive(dp); + + SyslogServerEventIF event = createEvent(this.getConfig(),receiveData,dp.getLength(),dp.getAddress()); + + handleEvent(null,this,dp,event); + + } catch (SocketException se) { + int i = se.getMessage() == null ? -1 : se.getMessage().toLowerCase().indexOf("socket closed"); + + if (i == -1) { + handleException(null,this,dp.getSocketAddress(),se); + } + + } catch (IOException ioe) { + handleException(null,this,dp.getSocketAddress(),ioe); + } + } + + handleDestroy(this); + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/server/impl/net/udp/UDPNetSyslogServerConfig.java b/src/main/java/org/productivity/java/syslog4j/server/impl/net/udp/UDPNetSyslogServerConfig.java new file mode 100644 index 0000000..bd56c2f --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/server/impl/net/udp/UDPNetSyslogServerConfig.java @@ -0,0 +1,38 @@ +package org.productivity.java.syslog4j.server.impl.net.udp; + +import org.productivity.java.syslog4j.server.impl.net.AbstractNetSyslogServerConfig; + +/** +* UDPNetSyslogServerConfig provides configuration for UDPNetSyslogServer. +* +*Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: UDPNetSyslogServerConfig.java,v 1.6 2010/10/28 05:10:57 cvs Exp $ +*/ +public class UDPNetSyslogServerConfig extends AbstractNetSyslogServerConfig { + private static final long serialVersionUID = -2005919161187055486L; + + public UDPNetSyslogServerConfig() { + // + } + + public UDPNetSyslogServerConfig(int port) { + this.port = port; + } + + public UDPNetSyslogServerConfig(String host) { + this.host = host; + } + + public UDPNetSyslogServerConfig(String host, int port) { + this.host = host; + this.port = port; + } + + public Class getSyslogServerClass() { + return UDPNetSyslogServer.class; + } +} diff --git a/src/main/java/org/productivity/java/syslog4j/util/Base64.java b/src/main/java/org/productivity/java/syslog4j/util/Base64.java new file mode 100644 index 0000000..cb385e5 --- /dev/null +++ b/src/main/java/org/productivity/java/syslog4j/util/Base64.java @@ -0,0 +1,1815 @@ +package org.productivity.java.syslog4j.util; + +/** + *Encodes and decodes to and from Base64 notation.
+ *Homepage: http://iharder.net/base64.
+ * + *The options parameter, which appears in a few places, is used to pass + * several pieces of information to the encoder. In the "higher level" methods such as + * encodeBytes( bytes, options ) the options parameter can be used to indicate such + * things as first gzipping the bytes before encoding them, not inserting linefeeds + * (though that breaks strict Base64 compatibility), and encoding using the URL-safe + * and Ordered dialects.
+ * + *The constants defined in Base64 can be OR-ed together to combine options, so you + * might make a call like this:
+ * + *String encoded = Base64.encodeBytes( mybytes, Base64.GZIP | Base64.DONT_BREAK_LINES );
+ *
+ * to compress the data before encoding it and then making the output have no newline characters.
+ * + * + *+ * Change Log: + *
+ *+ * I am placing this code in the Public Domain. Do with it as you will. + * This software comes with no guarantees or warranties but with + * plenty of well-wishing instead! + * Please visit http://iharder.net/base64 + * periodically to check for updates or to contribute improvements. + *
+ * + * @author Robert Harder + * @author rob@iharder.net + * @version 2.2.2 + */ +public class Base64 +{ + +/* ******** P U B L I C F I E L D S ******** */ + + + /** No options specified. Value is zero. */ + public final static int NO_OPTIONS = 0; + + /** Specify encoding. */ + public final static int ENCODE = 1; + + + /** Specify decoding. */ + public final static int DECODE = 0; + + + /** Specify that data should be gzip-compressed. */ + public final static int GZIP = 2; + + + /** Don't break lines when encoding (violates strict Base64 specification) */ + public final static int DONT_BREAK_LINES = 8; + + /** + * Encode using Base64-like encoding that is URL- and Filename-safe as described + * in Section 4 of RFC3548: + * http://www.faqs.org/rfcs/rfc3548.html. + * It is important to note that data encoded this way is not officially valid Base64, + * or at the very least should not be called Base64 without also specifying that is + * was encoded using the URL- and Filename-safe dialect. + */ + public final static int URL_SAFE = 16; + + + /** + * Encode using the special "ordered" dialect of Base64 described here: + * http://www.faqs.org/qa/rfcc-1940.html. + */ + public final static int ORDERED = 32; + + +/* ******** P R I V A T E F I E L D S ******** */ + + + /** Maximum line length (76) of Base64 output. */ + private final static int MAX_LINE_LENGTH = 76; + + + /** The equals sign (=) as a byte. */ + private final static byte EQUALS_SIGN = (byte)'='; + + + /** The new line character (\n) as a byte. */ + private final static byte NEW_LINE = (byte)'\n'; + + + /** Preferred encoding. */ + private final static String PREFERRED_ENCODING = "UTF-8"; + + + // I think I end up not using the BAD_ENCODING indicator. + //private final static byte BAD_ENCODING = -9; // Indicates error in encoding + private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding + private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding + + +/* ******** S T A N D A R D B A S E 6 4 A L P H A B E T ******** */ + + /** The 64 valid Base64 values. */ + //private final static byte[] ALPHABET; + /* Host platform me be something funny like EBCDIC, so we hardcode these values. */ + private final static byte[] _STANDARD_ALPHABET = + { + (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', + (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', + (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', + (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', + (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', + (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', + (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', + (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z', + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', + (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'+', (byte)'/' + }; + + + /** + * Translates a Base64 value to either its 6-bit reconstruction value + * or a negative number indicating some other meaning. + **/ + private final static byte[] _STANDARD_DECODABET = + { + -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 + -5,-5, // Whitespace: Tab and Linefeed + -9,-9, // Decimal 11 - 12 + -5, // Whitespace: Carriage Return + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 + -9,-9,-9,-9,-9, // Decimal 27 - 31 + -5, // Whitespace: Space + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 + 62, // Plus sign at decimal 43 + -9,-9,-9, // Decimal 44 - 46 + 63, // Slash at decimal 47 + 52,53,54,55,56,57,58,59,60,61, // Numbers zero through nine + -9,-9,-9, // Decimal 58 - 60 + -1, // Equals sign at decimal 61 + -9,-9,-9, // Decimal 62 - 64 + 0,1,2,3,4,5,6,7,8,9,10,11,12,13, // Letters 'A' through 'N' + 14,15,16,17,18,19,20,21,22,23,24,25, // Letters 'O' through 'Z' + -9,-9,-9,-9,-9,-9, // Decimal 91 - 96 + 26,27,28,29,30,31,32,33,34,35,36,37,38, // Letters 'a' through 'm' + 39,40,41,42,43,44,45,46,47,48,49,50,51, // Letters 'n' through 'z' + -9,-9,-9,-9 // Decimal 123 - 126 + /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */ + }; + + +/* ******** U R L S A F E B A S E 6 4 A L P H A B E T ******** */ + + /** + * Used in the URL- and Filename-safe dialect described in Section 4 of RFC3548: + * http://www.faqs.org/rfcs/rfc3548.html. + * Notice that the last two bytes become "hyphen" and "underscore" instead of "plus" and "slash." + */ + private final static byte[] _URL_SAFE_ALPHABET = + { + (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', + (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', + (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', + (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', + (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', + (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', + (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', + (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z', + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', + (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'-', (byte)'_' + }; + + /** + * Used in decoding URL- and Filename-safe dialects of Base64. + */ + private final static byte[] _URL_SAFE_DECODABET = + { + -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 + -5,-5, // Whitespace: Tab and Linefeed + -9,-9, // Decimal 11 - 12 + -5, // Whitespace: Carriage Return + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 + -9,-9,-9,-9,-9, // Decimal 27 - 31 + -5, // Whitespace: Space + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 + -9, // Plus sign at decimal 43 + -9, // Decimal 44 + 62, // Minus sign at decimal 45 + -9, // Decimal 46 + -9, // Slash at decimal 47 + 52,53,54,55,56,57,58,59,60,61, // Numbers zero through nine + -9,-9,-9, // Decimal 58 - 60 + -1, // Equals sign at decimal 61 + -9,-9,-9, // Decimal 62 - 64 + 0,1,2,3,4,5,6,7,8,9,10,11,12,13, // Letters 'A' through 'N' + 14,15,16,17,18,19,20,21,22,23,24,25, // Letters 'O' through 'Z' + -9,-9,-9,-9, // Decimal 91 - 94 + 63, // Underscore at decimal 95 + -9, // Decimal 96 + 26,27,28,29,30,31,32,33,34,35,36,37,38, // Letters 'a' through 'm' + 39,40,41,42,43,44,45,46,47,48,49,50,51, // Letters 'n' through 'z' + -9,-9,-9,-9 // Decimal 123 - 126 + /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */ + }; + + + +/* ******** O R D E R E D B A S E 6 4 A L P H A B E T ******** */ + + /** + * I don't get the point of this technique, but it is described here: + * http://www.faqs.org/qa/rfcc-1940.html. + */ + private final static byte[] _ORDERED_ALPHABET = + { + (byte)'-', + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', + (byte)'5', (byte)'6', (byte)'7', (byte)'8', (byte)'9', + (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', + (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', + (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', + (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', + (byte)'_', + (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', + (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', + (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', + (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z' + }; + + /** + * Used in decoding the "ordered" dialect of Base64. + */ + private final static byte[] _ORDERED_DECODABET = + { + -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 + -5,-5, // Whitespace: Tab and Linefeed + -9,-9, // Decimal 11 - 12 + -5, // Whitespace: Carriage Return + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 + -9,-9,-9,-9,-9, // Decimal 27 - 31 + -5, // Whitespace: Space + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 + -9, // Plus sign at decimal 43 + -9, // Decimal 44 + 0, // Minus sign at decimal 45 + -9, // Decimal 46 + -9, // Slash at decimal 47 + 1,2,3,4,5,6,7,8,9,10, // Numbers zero through nine + -9,-9,-9, // Decimal 58 - 60 + -1, // Equals sign at decimal 61 + -9,-9,-9, // Decimal 62 - 64 + 11,12,13,14,15,16,17,18,19,20,21,22,23, // Letters 'A' through 'M' + 24,25,26,27,28,29,30,31,32,33,34,35,36, // Letters 'N' through 'Z' + -9,-9,-9,-9, // Decimal 91 - 94 + 37, // Underscore at decimal 95 + -9, // Decimal 96 + 38,39,40,41,42,43,44,45,46,47,48,49,50, // Letters 'a' through 'm' + 51,52,53,54,55,56,57,58,59,60,61,62,63, // Letters 'n' through 'z' + -9,-9,-9,-9 // Decimal 123 - 126 + /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */ + }; + + +/* ******** D E T E R M I N E W H I C H A L H A B E T ******** */ + + + /** + * Returns one of the _SOMETHING_ALPHABET byte arrays depending on + * the options specified. + * It's possible, though silly, to specify ORDERED and URLSAFE + * in which case one of them will be picked, though there is + * no guarantee as to which one will be picked. + */ + private final static byte[] getAlphabet( int options ) + { + if( (options & URL_SAFE) == URL_SAFE ) return _URL_SAFE_ALPHABET; + else if( (options & ORDERED) == ORDERED ) return _ORDERED_ALPHABET; + else return _STANDARD_ALPHABET; + + } // end getAlphabet + + + /** + * Returns one of the _SOMETHING_DECODABET byte arrays depending on + * the options specified. + * It's possible, though silly, to specify ORDERED and URL_SAFE + * in which case one of them will be picked, though there is + * no guarantee as to which one will be picked. + */ + private final static byte[] getDecodabet( int options ) + { + if( (options & URL_SAFE) == URL_SAFE ) return _URL_SAFE_DECODABET; + else if( (options & ORDERED) == ORDERED ) return _ORDERED_DECODABET; + else return _STANDARD_DECODABET; + + } // end getAlphabet + + + + /** Defeats instantiation. */ + private Base64(){} + + + /** + * Encodes or decodes two files from the command line; + * feel free to delete this method (in fact you probably should) + * if you're embedding this code into a larger program. + */ + public final static void main( String[] args ) + { + if( args.length < 3 ){ + usage("Not enough arguments."); + } // end if: args.length < 3 + else { + String flag = args[0]; + String infile = args[1]; + String outfile = args[2]; + if( flag.equals( "-e" ) ){ + Base64.encodeFileToFile( infile, outfile ); + } // end if: encode + else if( flag.equals( "-d" ) ) { + Base64.decodeFileToFile( infile, outfile ); + } // end else if: decode + else { + usage( "Unknown flag: " + flag ); + } // end else + } // end else + } // end main + + /** + * Prints command line usage. + * + * @param msg A message to include with usage info. + */ + private final static void usage( String msg ) + { + System.err.println( msg ); + System.err.println( "Usage: java Base64 -e|-d inputfile outputfile" ); + } // end usage + + +/* ******** E N C O D I N G M E T H O D S ******** */ + + + /** + * Encodes up to the first three bytes of array threeBytes + * and returns a four-byte array in Base64 notation. + * The actual number of significant bytes in your array is + * given by numSigBytes. + * The array threeBytes needs only be as big as + * numSigBytes. + * Code can reuse a byte array by passing a four-byte array as b4. + * + * @param b4 A reusable byte array to reduce array instantiation + * @param threeBytes the array to convert + * @param numSigBytes the number of significant bytes in your array + * @return four byte array in Base64 notation. + * @since 1.5.1 + */ + private static byte[] encode3to4( byte[] b4, byte[] threeBytes, int numSigBytes, int options ) + { + encode3to4( threeBytes, 0, numSigBytes, b4, 0, options ); + return b4; + } // end encode3to4 + + + /** + *Encodes up to three bytes of the array source + * and writes the resulting four Base64 bytes to destination. + * The source and destination arrays can be manipulated + * anywhere along their length by specifying + * srcOffset and destOffset. + * This method does not check to make sure your arrays + * are large enough to accomodate srcOffset + 3 for + * the source array or destOffset + 4 for + * the destination array. + * The actual number of significant bytes in your array is + * given by numSigBytes.
+ *This is the lowest level of the encoding methods with + * all possible parameters.
+ * + * @param source the array to convert + * @param srcOffset the index where conversion begins + * @param numSigBytes the number of significant bytes in your array + * @param destination the array to hold the conversion + * @param destOffset the index where output will be put + * @return the destination array + * @since 1.3 + */ + private static byte[] encode3to4( + byte[] source, int srcOffset, int numSigBytes, + byte[] destination, int destOffset, int options ) + { + byte[] ALPHABET = getAlphabet( options ); + + // 1 2 3 + // 01234567890123456789012345678901 Bit position + // --------000000001111111122222222 Array position from threeBytes + // --------| || || || | Six bit groups to index ALPHABET + // >>18 >>12 >> 6 >> 0 Right shift necessary + // 0x3f 0x3f 0x3f Additional AND + + // Create buffer with zero-padding if there are only one or two + // significant bytes passed in the array. + // We have to shift left 24 in order to flush out the 1's that appear + // when Java treats a value as negative that is cast from a byte to an int. + int inBuff = ( numSigBytes > 0 ? ((source[ srcOffset ] << 24) >>> 8) : 0 ) + | ( numSigBytes > 1 ? ((source[ srcOffset + 1 ] << 24) >>> 16) : 0 ) + | ( numSigBytes > 2 ? ((source[ srcOffset + 2 ] << 24) >>> 24) : 0 ); + + switch( numSigBytes ) + { + case 3: + destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; + destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; + destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ]; + destination[ destOffset + 3 ] = ALPHABET[ (inBuff ) & 0x3f ]; + return destination; + + case 2: + destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; + destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; + destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ]; + destination[ destOffset + 3 ] = EQUALS_SIGN; + return destination; + + case 1: + destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; + destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; + destination[ destOffset + 2 ] = EQUALS_SIGN; + destination[ destOffset + 3 ] = EQUALS_SIGN; + return destination; + + default: + return destination; + } // end switch + } // end encode3to4 + + + + /** + * Serializes an object and returns the Base64-encoded + * version of that serialized object. If the object + * cannot be serialized or there is another error, + * the method will return null. + * The object is not GZip-compressed before being encoded. + * + * @param serializableObject The object to encode + * @return The Base64-encoded object + * @since 1.4 + */ + public static String encodeObject( java.io.Serializable serializableObject ) + { + return encodeObject( serializableObject, NO_OPTIONS ); + } // end encodeObject + + + + /** + * Serializes an object and returns the Base64-encoded + * version of that serialized object. If the object + * cannot be serialized or there is another error, + * the method will return null. + *+ * Valid options:
+ * GZIP: gzip-compresses object before encoding it. + * DONT_BREAK_LINES: don't break lines at 76 characters + * Note: Technically, this makes your encoding non-compliant. + *+ *
+ * Example: encodeObject( myObj, Base64.GZIP )
or
+ *
+ * Example: encodeObject( myObj, Base64.GZIP | Base64.DONT_BREAK_LINES )
+ *
+ * @param serializableObject The object to encode
+ * @param options Specified options
+ * @return The Base64-encoded object
+ * @see Base64#GZIP
+ * @see Base64#DONT_BREAK_LINES
+ * @since 2.0
+ */
+ public static String encodeObject( java.io.Serializable serializableObject, int options )
+ {
+ // Streams
+ java.io.ByteArrayOutputStream baos = null;
+ java.io.OutputStream b64os = null;
+ java.io.ObjectOutputStream oos = null;
+ java.util.zip.GZIPOutputStream gzos = null;
+
+ // Isolate options
+ int gzip = (options & GZIP);
+
+ try
+ {
+ // ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream
+ baos = new java.io.ByteArrayOutputStream();
+ b64os = new Base64.OutputStream( baos, ENCODE | options );
+
+ // GZip?
+ if( gzip == GZIP )
+ {
+ gzos = new java.util.zip.GZIPOutputStream( b64os );
+ oos = new java.io.ObjectOutputStream( gzos );
+ } // end if: gzip
+ else
+ oos = new java.io.ObjectOutputStream( b64os );
+
+ oos.writeObject( serializableObject );
+ } // end try
+ catch( java.io.IOException e )
+ {
+ e.printStackTrace();
+ return null;
+ } // end catch
+ finally
+ {
+ try{ if (oos != null) oos.close(); } catch( Exception e ){}
+ try{ if (gzos != null) gzos.close(); } catch( Exception e ){}
+ try{ if (b64os != null) b64os.close(); } catch( Exception e ){}
+ try{ if (baos != null) baos.close(); } catch( Exception e ){}
+ } // end finally
+
+ // Return value according to relevant encoding.
+ try
+ {
+ if (baos != null) {
+ return new String( baos.toByteArray(), PREFERRED_ENCODING );
+ }
+ } // end try
+ catch (java.io.UnsupportedEncodingException uue)
+ {
+ if (baos != null) {
+ return new String( baos.toByteArray() );
+ }
+ } // end catch
+
+ return null;
+ } // end encode
+
+
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ * Does not GZip-compress data.
+ *
+ * @param source The data to convert
+ * @since 1.4
+ */
+ public static String encodeBytes( byte[] source )
+ {
+ return encodeBytes( source, 0, source.length, NO_OPTIONS );
+ } // end encodeBytes
+
+
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ *
+ * Valid options:
+ * GZIP: gzip-compresses object before encoding it. + * DONT_BREAK_LINES: don't break lines at 76 characters + * Note: Technically, this makes your encoding non-compliant. + *+ *
+ * Example: encodeBytes( myData, Base64.GZIP )
or
+ *
+ * Example: encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )
+ *
+ *
+ * @param source The data to convert
+ * @param options Specified options
+ * @see Base64#GZIP
+ * @see Base64#DONT_BREAK_LINES
+ * @since 2.0
+ */
+ public static String encodeBytes( byte[] source, int options )
+ {
+ return encodeBytes( source, 0, source.length, options );
+ } // end encodeBytes
+
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ * Does not GZip-compress data.
+ *
+ * @param source The data to convert
+ * @param off Offset in array where conversion should begin
+ * @param len Length of data to convert
+ * @since 1.4
+ */
+ public static String encodeBytes( byte[] source, int off, int len )
+ {
+ return encodeBytes( source, off, len, NO_OPTIONS );
+ } // end encodeBytes
+
+
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ *
+ * Valid options:
+ * GZIP: gzip-compresses object before encoding it. + * DONT_BREAK_LINES: don't break lines at 76 characters + * Note: Technically, this makes your encoding non-compliant. + *+ *
+ * Example: encodeBytes( myData, Base64.GZIP )
or
+ *
+ * Example: encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )
+ *
+ *
+ * @param source The data to convert
+ * @param off Offset in array where conversion should begin
+ * @param len Length of data to convert
+ * @param options Specified options -- alphabet type is pulled from this (standard, url-safe, ordered)
+ * @see Base64#GZIP
+ * @see Base64#DONT_BREAK_LINES
+ * @since 2.0
+ */
+ public static String encodeBytes( byte[] source, int off, int len, int options )
+ {
+ // Isolate options
+ int dontBreakLines = ( options & DONT_BREAK_LINES );
+ int gzip = ( options & GZIP );
+
+ // Compress?
+ if( gzip == GZIP )
+ {
+ java.io.ByteArrayOutputStream baos = null;
+ java.util.zip.GZIPOutputStream gzos = null;
+ Base64.OutputStream b64os = null;
+
+
+ try
+ {
+ // GZip -> Base64 -> ByteArray
+ baos = new java.io.ByteArrayOutputStream();
+ b64os = new Base64.OutputStream( baos, ENCODE | options );
+ gzos = new java.util.zip.GZIPOutputStream( b64os );
+
+ gzos.write( source, off, len );
+ gzos.close();
+ } // end try
+ catch( java.io.IOException e )
+ {
+ e.printStackTrace();
+ return null;
+ } // end catch
+ finally
+ {
+ try{ if (gzos != null) gzos.close(); } catch( Exception e ){}
+ try{ if (b64os != null) b64os.close(); } catch( Exception e ){}
+ try{ if (baos != null) baos.close(); } catch( Exception e ){}
+ } // end finally
+
+ // Return value according to relevant encoding.
+ try
+ {
+ if (baos != null) {
+ return new String( baos.toByteArray(), PREFERRED_ENCODING );
+ }
+ } // end try
+ catch (java.io.UnsupportedEncodingException uue)
+ {
+ if (baos != null) {
+ return new String( baos.toByteArray() );
+ }
+ } // end catch
+
+ return null;
+ } // end if: compress
+
+ // Else, don't compress. Better not to use streams at all then.
+ else
+ {
+ // Convert option to boolean in way that code likes it.
+ boolean breakLines = dontBreakLines == 0;
+
+ int len43 = len * 4 / 3;
+ byte[] outBuff = new byte[ ( len43 ) // Main 4:3
+ + ( (len % 3) > 0 ? 4 : 0 ) // Account for padding
+ + (breakLines ? ( len43 / MAX_LINE_LENGTH ) : 0) ]; // New lines
+ int d = 0;
+ int e = 0;
+ int len2 = len - 2;
+ int lineLength = 0;
+ for( ; d < len2; d+=3, e+=4 )
+ {
+ encode3to4( source, d+off, 3, outBuff, e, options );
+
+ lineLength += 4;
+ if( breakLines && lineLength == MAX_LINE_LENGTH )
+ {
+ outBuff[e+4] = NEW_LINE;
+ e++;
+ lineLength = 0;
+ } // end if: end of line
+ } // en dfor: each piece of array
+
+ if( d < len )
+ {
+ encode3to4( source, d+off, len - d, outBuff, e, options );
+ e += 4;
+ } // end if: some padding needed
+
+
+ // Return value according to relevant encoding.
+ try
+ {
+ return new String( outBuff, 0, e, PREFERRED_ENCODING );
+ } // end try
+ catch (java.io.UnsupportedEncodingException uue)
+ {
+ return new String( outBuff, 0, e );
+ } // end catch
+
+ } // end else: don't compress
+
+ } // end encodeBytes
+
+
+
+
+
+/* ******** D E C O D I N G M E T H O D S ******** */
+
+
+ /**
+ * Decodes four bytes from array source
+ * and writes the resulting bytes (up to three of them)
+ * to destination.
+ * The source and destination arrays can be manipulated
+ * anywhere along their length by specifying
+ * srcOffset and destOffset.
+ * This method does not check to make sure your arrays
+ * are large enough to accomodate srcOffset + 4 for
+ * the source array or destOffset + 3 for
+ * the destination array.
+ * This method returns the actual number of bytes that
+ * were converted from the Base64 encoding.
+ *
This is the lowest level of the decoding methods with + * all possible parameters.
+ * + * + * @param source the array to convert + * @param srcOffset the index where conversion begins + * @param destination the array to hold the conversion + * @param destOffset the index where output will be put + * @param options alphabet type is pulled from this (standard, url-safe, ordered) + * @return the number of decoded bytes converted + * @since 1.3 + */ + private static int decode4to3( byte[] source, int srcOffset, byte[] destination, int destOffset, int options ) + { + byte[] DECODABET = getDecodabet( options ); + + // Example: Dk== + if( source[ srcOffset + 2] == EQUALS_SIGN ) + { + // Two ways to do the same thing. Don't know which way I like best. + //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) + // | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 ); + int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) + | ( ( DECODABET[ source[ srcOffset + 1] ] & 0xFF ) << 12 ); + + destination[ destOffset ] = (byte)( outBuff >>> 16 ); + return 1; + } + + // Example: DkL= + else if( source[ srcOffset + 3 ] == EQUALS_SIGN ) + { + // Two ways to do the same thing. Don't know which way I like best. + //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) + // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 ) + // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 ); + int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) + | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 ) + | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6 ); + + destination[ destOffset ] = (byte)( outBuff >>> 16 ); + destination[ destOffset + 1 ] = (byte)( outBuff >>> 8 ); + return 2; + } + + // Example: DkLE + else + { + try{ + // Two ways to do the same thing. Don't know which way I like best. + //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) + // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 ) + // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 ) + // | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 ); + int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) + | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 ) + | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6) + | ( ( DECODABET[ source[ srcOffset + 3 ] ] & 0xFF ) ); + + + destination[ destOffset ] = (byte)( outBuff >> 16 ); + destination[ destOffset + 1 ] = (byte)( outBuff >> 8 ); + destination[ destOffset + 2 ] = (byte)( outBuff ); + + return 3; + }catch( Exception e){ + System.out.println(""+source[srcOffset]+ ": " + ( DECODABET[ source[ srcOffset ] ] ) ); + System.out.println(""+source[srcOffset+1]+ ": " + ( DECODABET[ source[ srcOffset + 1 ] ] ) ); + System.out.println(""+source[srcOffset+2]+ ": " + ( DECODABET[ source[ srcOffset + 2 ] ] ) ); + System.out.println(""+source[srcOffset+3]+ ": " + ( DECODABET[ source[ srcOffset + 3 ] ] ) ); + return -1; + } // end catch + } + } // end decodeToBytes + + + + + /** + * Very low-level access to decoding ASCII characters in + * the form of a byte array. Does not support automatically + * gunzipping or any other "fancy" features. + * + * @param source The Base64 encoded data + * @param off The offset of where to begin decoding + * @param len The length of characters to decode + * @return decoded data + * @since 1.3 + */ + public static byte[] decode( byte[] source, int off, int len, int options ) + { + byte[] DECODABET = getDecodabet( options ); + + int len34 = len * 3 / 4; + byte[] outBuff = new byte[ len34 ]; // Upper limit on size of output + int outBuffPosn = 0; + + byte[] b4 = new byte[4]; + int b4Posn = 0; + int i = 0; + byte sbiCrop = 0; + byte sbiDecode = 0; + for( i = off; i < off+len; i++ ) + { + sbiCrop = (byte)(source[i] & 0x7f); // Only the low seven bits + sbiDecode = DECODABET[ sbiCrop ]; + + if( sbiDecode >= WHITE_SPACE_ENC ) // White space, Equals sign or better + { + if( sbiDecode >= EQUALS_SIGN_ENC ) + { + b4[ b4Posn++ ] = sbiCrop; + if( b4Posn > 3 ) + { + outBuffPosn += decode4to3( b4, 0, outBuff, outBuffPosn, options ); + b4Posn = 0; + + // If that was the equals sign, break out of 'for' loop + if( sbiCrop == EQUALS_SIGN ) + break; + } // end if: quartet built + + } // end if: equals sign or better + + } // end if: white space, equals sign or better + else + { + System.err.println( "Bad Base64 input character at " + i + ": " + source[i] + "(decimal)" ); + return null; + } // end else: + } // each input character + + byte[] out = new byte[ outBuffPosn ]; + System.arraycopy( outBuff, 0, out, 0, outBuffPosn ); + return out; + } // end decode + + + + + /** + * Decodes data from Base64 notation, automatically + * detecting gzip-compressed data and decompressing it. + * + * @param s the string to decode + * @return the decoded data + * @since 1.4 + */ + public static byte[] decode( String s ) + { + return decode( s, NO_OPTIONS ); + } + + + /** + * Decodes data from Base64 notation, automatically + * detecting gzip-compressed data and decompressing it. + * + * @param s the string to decode + * @param options encode options such as URL_SAFE + * @return the decoded data + * @since 1.4 + */ + public static byte[] decode( String s, int options ) + { + byte[] bytes; + try + { + bytes = s.getBytes( PREFERRED_ENCODING ); + } // end try + catch( java.io.UnsupportedEncodingException uee ) + { + bytes = s.getBytes(); + } // end catch + // + + // Decode + bytes = decode( bytes, 0, bytes.length, options ); + + + // Check to see if it's gzip-compressed + // GZIP Magic Two-Byte Number: 0x8b1f (35615) + if( bytes != null && bytes.length >= 4 ) + { + + int head = ((int)bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00); + if( java.util.zip.GZIPInputStream.GZIP_MAGIC == head ) + { + java.io.ByteArrayInputStream bais = null; + java.util.zip.GZIPInputStream gzis = null; + java.io.ByteArrayOutputStream baos = null; + byte[] buffer = new byte[2048]; + int length = 0; + + try + { + baos = new java.io.ByteArrayOutputStream(); + bais = new java.io.ByteArrayInputStream( bytes ); + gzis = new java.util.zip.GZIPInputStream( bais ); + + while( ( length = gzis.read( buffer ) ) >= 0 ) + { + baos.write(buffer,0,length); + } // end while: reading input + + // No error? Get new bytes. + bytes = baos.toByteArray(); + + } // end try + catch( java.io.IOException e ) + { + // Just return originally-decoded bytes + } // end catch + finally + { + try{ if (baos != null) baos.close(); } catch( Exception e ){} + try{ if (gzis != null) gzis.close(); } catch( Exception e ){} + try{ if (bais != null) bais.close(); } catch( Exception e ){} + } // end finally + + } // end if: gzipped + } // end if: bytes.length >= 2 + + return bytes; + } // end decode + + + + + /** + * Attempts to decode Base64 data and deserialize a Java + * Object within. Returns null if there was an error. + * + * @param encodedObject The Base64 data to decode + * @return The decoded and deserialized object + * @since 1.5 + */ + public static Object decodeToObject( String encodedObject ) + { + // Decode and gunzip if necessary + byte[] objBytes = decode( encodedObject ); + + java.io.ByteArrayInputStream bais = null; + java.io.ObjectInputStream ois = null; + Object obj = null; + + try + { + bais = new java.io.ByteArrayInputStream( objBytes ); + ois = new java.io.ObjectInputStream( bais ); + + obj = ois.readObject(); + } // end try + catch( java.io.IOException e ) + { + e.printStackTrace(); + obj = null; + } // end catch + catch( java.lang.ClassNotFoundException e ) + { + e.printStackTrace(); + obj = null; + } // end catch + finally + { + try{ if (bais != null) bais.close(); } catch( Exception e ){} + try{ if (ois != null) ois.close(); } catch( Exception e ){} + } // end finally + + return obj; + } // end decodeObject + + + + /** + * Convenience method for encoding data to a file. + * + * @param dataToEncode byte array of data to encode in base64 form + * @param filename Filename for saving encoded data + * @return true if successful, false otherwise + * + * @since 2.1 + */ + public static boolean encodeToFile( byte[] dataToEncode, String filename ) + { + boolean success = false; + Base64.OutputStream bos = null; + try + { + bos = new Base64.OutputStream( + new java.io.FileOutputStream( filename ), Base64.ENCODE ); + bos.write( dataToEncode ); + success = true; + } // end try + catch( java.io.IOException e ) + { + + success = false; + } // end catch: IOException + finally + { + try{ if (bos != null) bos.close(); } catch( Exception e ){} + } // end finally + + return success; + } // end encodeToFile + + + /** + * Convenience method for decoding data to a file. + * + * @param dataToDecode Base64-encoded data as a string + * @param filename Filename for saving decoded data + * @return true if successful, false otherwise + * + * @since 2.1 + */ + public static boolean decodeToFile( String dataToDecode, String filename ) + { + boolean success = false; + Base64.OutputStream bos = null; + try + { + bos = new Base64.OutputStream( + new java.io.FileOutputStream( filename ), Base64.DECODE ); + bos.write( dataToDecode.getBytes( PREFERRED_ENCODING ) ); + success = true; + } // end try + catch( java.io.IOException e ) + { + success = false; + } // end catch: IOException + finally + { + try{ if (bos != null) bos.close(); } catch( Exception e ){} + } // end finally + + return success; + } // end decodeToFile + + + + + /** + * Convenience method for reading a base64-encoded + * file and decoding it. + * + * @param filename Filename for reading encoded data + * @return decoded byte array or null if unsuccessful + * + * @since 2.1 + */ + public static byte[] decodeFromFile( String filename ) + { + byte[] decodedData = null; + Base64.InputStream bis = null; + try + { + // Set up some useful variables + java.io.File file = new java.io.File( filename ); + byte[] buffer = null; + int length = 0; + int numBytes = 0; + + // Check for size of file + if( file.length() > Integer.MAX_VALUE ) + { + System.err.println( "File is too big for this convenience method (" + file.length() + " bytes)." ); + return null; + } // end if: file too big for int index + buffer = new byte[ (int)file.length() ]; + + // Open a stream + bis = new Base64.InputStream( + new java.io.BufferedInputStream( + new java.io.FileInputStream( file ) ), Base64.DECODE ); + + // Read until done + while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 ) + length += numBytes; + + // Save in a variable to return + decodedData = new byte[ length ]; + System.arraycopy( buffer, 0, decodedData, 0, length ); + + } // end try + catch( java.io.IOException e ) + { + System.err.println( "Error decoding from file " + filename ); + } // end catch: IOException + finally + { + try{ if (bis != null) bis.close(); } catch( Exception e) {} + } // end finally + + return decodedData; + } // end decodeFromFile + + + + /** + * Convenience method for reading a binary file + * and base64-encoding it. + * + * @param filename Filename for reading binary data + * @return base64-encoded string or null if unsuccessful + * + * @since 2.1 + */ + public static String encodeFromFile( String filename ) + { + String encodedData = null; + Base64.InputStream bis = null; + try + { + // Set up some useful variables + java.io.File file = new java.io.File( filename ); + byte[] buffer = new byte[ Math.max((int)(file.length() * 1.4),40) ]; // Need max() for math on small files (v2.2.1) + int length = 0; + int numBytes = 0; + + // Open a stream + bis = new Base64.InputStream( + new java.io.BufferedInputStream( + new java.io.FileInputStream( file ) ), Base64.ENCODE ); + + // Read until done + while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 ) + length += numBytes; + + // Save in a variable to return + encodedData = new String( buffer, 0, length, Base64.PREFERRED_ENCODING ); + + } // end try + catch( java.io.IOException e ) + { + System.err.println( "Error encoding from file " + filename ); + } // end catch: IOException + finally + { + try{ if (bis != null) bis.close(); } catch( Exception e) {} + } // end finally + + return encodedData; + } // end encodeFromFile + + + + + /** + * Reads infile and encodes it to outfile. + * + * @param infile Input file + * @param outfile Output file + * @return true if the operation is successful + * @since 2.2 + */ + public static boolean encodeFileToFile( String infile, String outfile ) + { + boolean success = false; + java.io.InputStream in = null; + java.io.OutputStream out = null; + try{ + in = new Base64.InputStream( + new java.io.BufferedInputStream( + new java.io.FileInputStream( infile ) ), + Base64.ENCODE ); + out = new java.io.BufferedOutputStream( new java.io.FileOutputStream( outfile ) ); + byte[] buffer = new byte[65536]; // 64K + int read = -1; + while( ( read = in.read(buffer) ) >= 0 ){ + out.write( buffer,0,read ); + } // end while: through file + success = true; + } catch( java.io.IOException exc ){ + exc.printStackTrace(); + } finally{ + try{ if (in != null) in.close(); } catch( Exception exc ){} + try{ if (out != null) out.close(); } catch( Exception exc ){} + } // end finally + + return success; + } // end encodeFileToFile + + + + /** + * Reads infile and decodes it to outfile. + * + * @param infile Input file + * @param outfile Output file + * @return true if the operation is successful + * @since 2.2 + */ + public static boolean decodeFileToFile( String infile, String outfile ) + { + boolean success = false; + java.io.InputStream in = null; + java.io.OutputStream out = null; + try{ + in = new Base64.InputStream( + new java.io.BufferedInputStream( + new java.io.FileInputStream( infile ) ), + Base64.DECODE ); + out = new java.io.BufferedOutputStream( new java.io.FileOutputStream( outfile ) ); + byte[] buffer = new byte[65536]; // 64K + int read = -1; + while( ( read = in.read(buffer) ) >= 0 ){ + out.write( buffer,0,read ); + } // end while: through file + success = true; + } catch( java.io.IOException exc ){ + exc.printStackTrace(); + } finally{ + try{ if (in != null) in.close(); } catch( Exception exc ){} + try{ if (out != null) out.close(); } catch( Exception exc ){} + } // end finally + + return success; + } // end decodeFileToFile + + + /* ******** I N N E R C L A S S I N P U T S T R E A M ******** */ + + + + /** + * A {@link Base64.InputStream} will read data from another + * java.io.InputStream, given in the constructor, + * and encode/decode to/from Base64 notation on the fly. + * + * @see Base64 + * @since 1.3 + */ + public static class InputStream extends java.io.FilterInputStream + { + private boolean encode; // Encoding or decoding + private int position; // Current position in the buffer + private byte[] buffer; // Small buffer holding converted data + private int bufferLength; // Length of buffer (3 or 4) + private int numSigBytes; // Number of meaningful bytes in the buffer + private int lineLength; + private boolean breakLines; // Break lines at less than 80 characters + private int options; // Record options used to create the stream. + private byte[] decodabet; // Local copies to avoid extra method calls + + + /** + * Constructs a {@link Base64.InputStream} in DECODE mode. + * + * @param in the java.io.InputStream from which to read data. + * @since 1.3 + */ + public InputStream( java.io.InputStream in ) + { + this( in, DECODE ); + } // end constructor + + + /** + * Constructs a {@link Base64.InputStream} in + * either ENCODE or DECODE mode. + *+ * Valid options:
+ * ENCODE or DECODE: Encode or Decode as data is read. + * DONT_BREAK_LINES: don't break lines at 76 characters + * (only meaningful when encoding) + * Note: Technically, this makes your encoding non-compliant. + *+ *
+ * Example: new Base64.InputStream( in, Base64.DECODE )
+ *
+ *
+ * @param in the java.io.InputStream from which to read data.
+ * @param options Specified options
+ * @see Base64#ENCODE
+ * @see Base64#DECODE
+ * @see Base64#DONT_BREAK_LINES
+ * @since 2.0
+ */
+ public InputStream( java.io.InputStream in, int options )
+ {
+ super( in );
+ this.breakLines = (options & DONT_BREAK_LINES) != DONT_BREAK_LINES;
+ this.encode = (options & ENCODE) == ENCODE;
+ this.bufferLength = this.encode ? 4 : 3;
+ this.buffer = new byte[ this.bufferLength ];
+ this.position = -1;
+ this.lineLength = 0;
+ this.options = options; // Record for later, mostly to determine which alphabet to use
+ this.decodabet = getDecodabet(options);
+ } // end constructor
+
+ /**
+ * Reads enough of the input stream to convert
+ * to/from Base64 and returns the next byte.
+ *
+ * @return next byte
+ * @since 1.3
+ */
+ public int read() throws java.io.IOException
+ {
+ // Do we need to get data?
+ if( this.position < 0 )
+ {
+ if( this.encode )
+ {
+ byte[] b3 = new byte[3];
+ int numBinaryBytes = 0;
+ for( int i = 0; i < 3; i++ )
+ {
+ try
+ {
+ int b = this.in.read();
+
+ // If end of stream, b is -1.
+ if( b >= 0 )
+ {
+ b3[i] = (byte)b;
+ numBinaryBytes++;
+ } // end if: not end of stream
+
+ } // end try: read
+ catch( java.io.IOException e )
+ {
+ // Only a problem if we got no data at all.
+ if( i == 0 )
+ throw e;
+
+ } // end catch
+ } // end for: each needed input byte
+
+ if( numBinaryBytes > 0 )
+ {
+ encode3to4( b3, 0, numBinaryBytes, this.buffer, 0, this.options );
+ this.position = 0;
+ this.numSigBytes = 4;
+ } // end if: got data
+ else
+ {
+ return -1;
+ } // end else
+ } // end if: encoding
+
+ // Else decoding
+ else
+ {
+ byte[] b4 = new byte[4];
+ int i = 0;
+ for( i = 0; i < 4; i++ )
+ {
+ // Read four "meaningful" bytes:
+ int b = 0;
+ do{ b = this.in.read(); }
+ while( b >= 0 && this.decodabet[ b & 0x7f ] <= WHITE_SPACE_ENC );
+
+ if( b < 0 )
+ break; // Reads a -1 if end of stream
+
+ b4[i] = (byte)b;
+ } // end for: each needed input byte
+
+ if( i == 4 )
+ {
+ this.numSigBytes = decode4to3( b4, 0, this.buffer, 0, this.options );
+ this.position = 0;
+ } // end if: got four characters
+ else if( i == 0 ){
+ return -1;
+ } // end else if: also padded correctly
+ else
+ {
+ // Must have broken out from above.
+ throw new java.io.IOException( "Improperly padded Base64 input." );
+ } // end
+
+ } // end else: decode
+ } // end else: get data
+
+ // Got data?
+ if( this.position >= 0 )
+ {
+ // End of relevant data?
+ if( /*!encode &&*/ this.position >= this.numSigBytes )
+ return -1;
+
+ if( this.encode && this.breakLines && this.lineLength >= MAX_LINE_LENGTH )
+ {
+ this.lineLength = 0;
+ return '\n';
+ } // end if
+ else
+ {
+ this.lineLength++; // This isn't important when decoding
+ // but throwing an extra "if" seems
+ // just as wasteful.
+
+ int b = this.buffer[ this.position++ ];
+
+ if( this.position >= this.bufferLength )
+ this.position = -1;
+
+ return b & 0xFF; // This is how you "cast" a byte that's
+ // intended to be unsigned.
+ } // end else
+ } // end if: position >= 0
+
+ // Else error
+ else
+ {
+ // When JDK1.4 is more accepted, use an assertion here.
+ throw new java.io.IOException( "Error in Base64 code reading stream." );
+ } // end else
+ } // end read
+
+
+ /**
+ * Calls {@link #read()} repeatedly until the end of stream
+ * is reached or len bytes are read.
+ * Returns number of bytes read into array or -1 if
+ * end of stream is encountered.
+ *
+ * @param dest array to hold values
+ * @param off offset for array
+ * @param len max number of bytes to read into array
+ * @return bytes read into array or -1 if end of stream is encountered.
+ * @since 1.3
+ */
+ public int read( byte[] dest, int off, int len ) throws java.io.IOException
+ {
+ int i;
+ int b;
+ for( i = 0; i < len; i++ )
+ {
+ b = read();
+
+ //if( b < 0 && i == 0 )
+ // return -1;
+
+ if( b >= 0 )
+ dest[off + i] = (byte)b;
+ else if( i == 0 )
+ return -1;
+ else
+ break; // Out of 'for' loop
+ } // end for: each byte read
+ return i;
+ } // end read
+
+ } // end inner class InputStream
+
+
+
+
+
+
+ /* ******** I N N E R C L A S S O U T P U T S T R E A M ******** */
+
+
+
+ /**
+ * A {@link Base64.OutputStream} will write data to another
+ * java.io.OutputStream, given in the constructor,
+ * and encode/decode to/from Base64 notation on the fly.
+ *
+ * @see Base64
+ * @since 1.3
+ */
+ public static class OutputStream extends java.io.FilterOutputStream
+ {
+ private boolean encode;
+ private int position;
+ private byte[] buffer;
+ private int bufferLength;
+ private int lineLength;
+ private boolean breakLines;
+ private byte[] b4; // Scratch used in a few places
+ private boolean suspendEncoding;
+ private int options; // Record for later
+ private byte[] decodabet; // Local copies to avoid extra method calls
+
+ /**
+ * Constructs a {@link Base64.OutputStream} in ENCODE mode.
+ *
+ * @param out the java.io.OutputStream to which data will be written.
+ * @since 1.3
+ */
+ public OutputStream( java.io.OutputStream out )
+ {
+ this( out, ENCODE );
+ } // end constructor
+
+
+ /**
+ * Constructs a {@link Base64.OutputStream} in
+ * either ENCODE or DECODE mode.
+ *
+ * Valid options:
+ * ENCODE or DECODE: Encode or Decode as data is read. + * DONT_BREAK_LINES: don't break lines at 76 characters + * (only meaningful when encoding) + * Note: Technically, this makes your encoding non-compliant. + *+ *
+ * Example: new Base64.OutputStream( out, Base64.ENCODE )
+ *
+ * @param out the java.io.OutputStream to which data will be written.
+ * @param options Specified options.
+ * @see Base64#ENCODE
+ * @see Base64#DECODE
+ * @see Base64#DONT_BREAK_LINES
+ * @since 1.3
+ */
+ public OutputStream( java.io.OutputStream out, int options )
+ {
+ super( out );
+ this.breakLines = (options & DONT_BREAK_LINES) != DONT_BREAK_LINES;
+ this.encode = (options & ENCODE) == ENCODE;
+ this.bufferLength = this.encode ? 3 : 4;
+ this.buffer = new byte[ this.bufferLength ];
+ this.position = 0;
+ this.lineLength = 0;
+ this.suspendEncoding = false;
+ this.b4 = new byte[4];
+ this.options = options;
+ this.decodabet = getDecodabet(options);
+ } // end constructor
+
+
+ /**
+ * Writes the byte to the output stream after
+ * converting to/from Base64 notation.
+ * When encoding, bytes are buffered three
+ * at a time before the output stream actually
+ * gets a write() call.
+ * When decoding, bytes are buffered four
+ * at a time.
+ *
+ * @param theByte the byte to write
+ * @since 1.3
+ */
+ public void write(int theByte) throws java.io.IOException
+ {
+ // Encoding suspended?
+ if( this.suspendEncoding )
+ {
+ super.out.write( theByte );
+ return;
+ } // end if: supsended
+
+ // Encode?
+ if( this.encode )
+ {
+ this.buffer[ this.position++ ] = (byte)theByte;
+ if( this.position >= this.bufferLength ) // Enough to encode.
+ {
+ this.out.write( encode3to4( this.b4, this.buffer, this.bufferLength, this.options ) );
+
+ this.lineLength += 4;
+ if( this.breakLines && this.lineLength >= MAX_LINE_LENGTH )
+ {
+ this.out.write( NEW_LINE );
+ this.lineLength = 0;
+ } // end if: end of line
+
+ this.position = 0;
+ } // end if: enough to output
+ } // end if: encoding
+
+ // Else, Decoding
+ else
+ {
+ // Meaningful Base64 character?
+ if( this.decodabet[ theByte & 0x7f ] > WHITE_SPACE_ENC )
+ {
+ this.buffer[ this.position++ ] = (byte)theByte;
+ if( this.position >= this.bufferLength ) // Enough to output.
+ {
+ int len = Base64.decode4to3( this.buffer, 0, this.b4, 0, this.options );
+ this.out.write( this.b4, 0, len );
+ //out.write( Base64.decode4to3( buffer ) );
+ this.position = 0;
+ } // end if: enough to output
+ } // end if: meaningful base64 character
+ else if( this.decodabet[ theByte & 0x7f ] != WHITE_SPACE_ENC )
+ {
+ throw new java.io.IOException( "Invalid character in Base64 data." );
+ } // end else: not white space either
+ } // end else: decoding
+ } // end write
+
+
+
+ /**
+ * Calls {@link #write(int)} repeatedly until len
+ * bytes are written.
+ *
+ * @param theBytes array from which to read bytes
+ * @param off offset for array
+ * @param len max number of bytes to read into array
+ * @since 1.3
+ */
+ public void write( byte[] theBytes, int off, int len ) throws java.io.IOException
+ {
+ // Encoding suspended?
+ if( this.suspendEncoding )
+ {
+ super.out.write( theBytes, off, len );
+ return;
+ } // end if: supsended
+
+ for( int i = 0; i < len; i++ )
+ {
+ write( theBytes[ off + i ] );
+ } // end for: each byte written
+
+ } // end write
+
+
+
+ /**
+ * Method added by PHIL. [Thanks, PHIL. -Rob]
+ * This pads the buffer without closing the stream.
+ */
+ public void flushBase64() throws java.io.IOException
+ {
+ if( this.position > 0 )
+ {
+ if( this.encode )
+ {
+ this.out.write( encode3to4( this.b4, this.buffer, this.position, this.options ) );
+ this.position = 0;
+ } // end if: encoding
+ else
+ {
+ throw new java.io.IOException( "Base64 input not properly padded." );
+ } // end else: decoding
+ } // end if: buffer partially full
+
+ } // end flush
+
+
+ /**
+ * Flushes and closes (I think, in the superclass) the stream.
+ *
+ * @since 1.3
+ */
+ public void close() throws java.io.IOException
+ {
+ // 1. Ensure that pending characters are written
+ flushBase64();
+
+ // 2. Actually close the stream
+ // Base class both flushes and closes.
+ super.close();
+
+ this.buffer = null;
+ this.out = null;
+ } // end close
+
+
+
+ /**
+ * Suspends encoding of the stream.
+ * May be helpful if you need to embed a piece of
+ * base640-encoded data in a stream.
+ *
+ * @since 1.5.1
+ */
+ public void suspendEncoding() throws java.io.IOException
+ {
+ flushBase64();
+ this.suspendEncoding = true;
+ } // end suspendEncoding
+
+
+ /**
+ * Resumes encoding of the stream.
+ * May be helpful if you need to embed a piece of
+ * base640-encoded data in a stream.
+ *
+ * @since 1.5.1
+ */
+ public void resumeEncoding()
+ {
+ this.suspendEncoding = false;
+ } // end resumeEncoding
+
+
+
+ } // end inner class OutputStream
+
+
+} // end class Base64
diff --git a/src/main/java/org/productivity/java/syslog4j/util/OSDetectUtility.java b/src/main/java/org/productivity/java/syslog4j/util/OSDetectUtility.java
new file mode 100644
index 0000000..f76145e
--- /dev/null
+++ b/src/main/java/org/productivity/java/syslog4j/util/OSDetectUtility.java
@@ -0,0 +1,77 @@
+package org.productivity.java.syslog4j.util;
+
+/**
+* OSDetectUtility provides operating system detection used to determine
+* whether Syslog4j is running on a Unix platform.
+*
+*
Syslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: OSDetectUtility.java,v 1.4 2008/11/14 04:31:59 cvs Exp $ +*/ +public final class OSDetectUtility { + private final static String[] UNIX_PLATFORMS = { + "Linux", + "Mac OS", + "Solaris", + "SunOS", + "MPE/iX", + "HP-UX", + "AIX", + "OS/390", + "FreeBSD", + "Irix", + "Digital Unix", + "FreeBSD", + "OSF1", + "OpenVMS" + }; + + private final static String[] WINDOWS_PLATFORMS = { + "Windows", + "OS/2" + }; + + private static boolean UNIX = false; + private static boolean WINDOWS = false; + + private OSDetectUtility() { + // + } + + private static boolean isMatch(String[] platforms) { + boolean match = false; + + String osName = System.getProperty("os.name"); + + if (osName != null && !"".equals(osName.trim())) { + osName = osName.toLowerCase(); + + for(int i=0; iSyslog4j is licensed under the Lesser GNU Public License v2.1. A copy +* of the LGPL license is available in the META-INF folder in all +* distributions of Syslog4j and in the base directory of the "doc" ZIP.
+* +* @author <syslog4j@productivity.org> +* @version $Id: SyslogUtility.java,v 1.21 2010/11/28 01:38:08 cvs Exp $ +*/ +public final class SyslogUtility implements SyslogConstants { + private static final long serialVersionUID = 915031554586613648L; + + private SyslogUtility() { + // + } + + public static final InetAddress getInetAddress(String host) throws SyslogRuntimeException { + InetAddress address = null; + + try { + address = InetAddress.getByName(host); + + } catch (UnknownHostException uhe) { + throw new SyslogRuntimeException(uhe); + } + + return address; + } + + public static final String getFacilityString(int syslogFacility) { + switch(syslogFacility) { + case FACILITY_KERN: return "kern"; + case FACILITY_USER: return "user"; + case FACILITY_MAIL: return "mail"; + case FACILITY_DAEMON: return "daemon"; + case FACILITY_AUTH: return "auth"; + case FACILITY_SYSLOG: return "syslog"; + case FACILITY_LPR: return "lpr"; + case FACILITY_NEWS: return "news"; + case FACILITY_UUCP: return "uucp"; + case FACILITY_CRON: return "cron"; + case FACILITY_AUTHPRIV: return "authpriv"; + case FACILITY_FTP: return "ftp"; + case FACILITY_LOCAL0: return "local0"; + case FACILITY_LOCAL1: return "local1"; + case FACILITY_LOCAL2: return "local2"; + case FACILITY_LOCAL3: return "local3"; + case FACILITY_LOCAL4: return "local4"; + case FACILITY_LOCAL5: return "local5"; + case FACILITY_LOCAL6: return "local6"; + case FACILITY_LOCAL7: return "local7"; + + default: return "UNKNOWN"; + } + } + + public static final int getFacility(String facilityName) { + String _facilityName = facilityName; + + if (facilityName == null) { + return -1; + + } else { + _facilityName = facilityName.trim(); + } + + if("KERN".equalsIgnoreCase(_facilityName)) { return FACILITY_KERN; + } else if("USER".equalsIgnoreCase(facilityName)) { return FACILITY_USER; + } else if("MAIL".equalsIgnoreCase(facilityName)) { return FACILITY_MAIL; + } else if("DAEMON".equalsIgnoreCase(facilityName)) { return FACILITY_DAEMON; + } else if("AUTH".equalsIgnoreCase(facilityName)) { return FACILITY_AUTH; + } else if("SYSLOG".equalsIgnoreCase(facilityName)) { return FACILITY_SYSLOG; + } else if("LPR".equalsIgnoreCase(facilityName)) { return FACILITY_LPR; + } else if("NEWS".equalsIgnoreCase(facilityName)) { return FACILITY_NEWS; + } else if("UUCP".equalsIgnoreCase(facilityName)) { return FACILITY_UUCP; + } else if("CRON".equalsIgnoreCase(facilityName)) { return FACILITY_CRON; + } else if("AUTHPRIV".equalsIgnoreCase(facilityName)) { return FACILITY_AUTHPRIV; + } else if("FTP".equalsIgnoreCase(facilityName)) { return FACILITY_FTP; + } else if("LOCAL0".equalsIgnoreCase(facilityName)) { return FACILITY_LOCAL0; + } else if("LOCAL1".equalsIgnoreCase(facilityName)) { return FACILITY_LOCAL1; + } else if("LOCAL2".equalsIgnoreCase(facilityName)) { return FACILITY_LOCAL2; + } else if("LOCAL3".equalsIgnoreCase(facilityName)) { return FACILITY_LOCAL3; + } else if("LOCAL4".equalsIgnoreCase(facilityName)) { return FACILITY_LOCAL4; + } else if("LOCAL5".equalsIgnoreCase(facilityName)) { return FACILITY_LOCAL5; + } else if("LOCAL6".equalsIgnoreCase(facilityName)) { return FACILITY_LOCAL6; + } else if("LOCAL7".equalsIgnoreCase(facilityName)) { return FACILITY_LOCAL7; + } else { return -1; + } + } + + public static final int getLevel(String levelName) { + String _levelName = levelName; + + if (levelName == null) { + return -1; + + } else { + _levelName = levelName.trim(); + } + + if("DEBUG".equalsIgnoreCase(_levelName)) { return LEVEL_DEBUG; + } else if("INFO".equalsIgnoreCase(_levelName)) { return LEVEL_INFO; + } else if("NOTICE".equalsIgnoreCase(_levelName)) { return LEVEL_NOTICE; + } else if("WARN".equalsIgnoreCase(_levelName)) { return LEVEL_WARN; + } else if("ERROR".equalsIgnoreCase(_levelName)) { return LEVEL_ERROR; + } else if("CRITICAL".equalsIgnoreCase(_levelName)) { return LEVEL_CRITICAL; + } else if("ALERT".equalsIgnoreCase(_levelName)) { return LEVEL_ALERT; + } else if("EMERGENCY".equalsIgnoreCase(_levelName)) { return LEVEL_EMERGENCY; + } else { return -1; + } + } + + public static final boolean isClassExists(String className) { + try { + Class.forName(className); + return true; + + } catch (ClassNotFoundException cnfe) { + // + } + + return false; + } + + public static final String getLocalName() { + String localName = SEND_LOCAL_NAME_DEFAULT_VALUE; + + try { + InetAddress addr = InetAddress.getLocalHost(); + localName = addr.getHostName(); + + } catch (UnknownHostException uhe) { + // + } + + return localName; + } + + public static final byte[] getBytes(SyslogCharSetIF syslogCharSet, String data) { + byte[] dataBytes = null; + + try { + dataBytes = data.getBytes(syslogCharSet.getCharSet()); + + } catch (UnsupportedEncodingException uee) { + dataBytes = data.getBytes(); + } + + return dataBytes; + } + + public static final String newString(SyslogCharSetIF syslogCharSet, byte[] dataBytes) { + String data = newString(syslogCharSet,dataBytes,dataBytes.length); + + return data; + } + + public static final String newString(SyslogCharSetIF syslogCharSet, byte[] dataBytes, int dataLength) { + String data = null; + + try { + data = new String(dataBytes,0,dataLength,syslogCharSet.getCharSet()); + + } catch (UnsupportedEncodingException uee) { + data = new String(dataBytes); + } + + return data; + } + + public static final String getLevelString(int level) { + switch(level) { + case SyslogConstants.LEVEL_DEBUG: return "DEBUG"; + case SyslogConstants.LEVEL_INFO: return "INFO"; + case SyslogConstants.LEVEL_NOTICE: return "NOTICE"; + case SyslogConstants.LEVEL_WARN: return "WARN"; + case SyslogConstants.LEVEL_ERROR: return "ERROR"; + case SyslogConstants.LEVEL_CRITICAL: return "CRITICAL"; + case SyslogConstants.LEVEL_ALERT: return "ALERT"; + case SyslogConstants.LEVEL_EMERGENCY: return "EMERGENCY"; + + default: + return "UNKNOWN"; + } + } + + + public static void sleep(long duration) { + try { + Thread.sleep(duration); + + } catch (InterruptedException ie) { + // + } + } +} diff --git a/target/classes/org/productivity/java/syslog4j/Syslog.class b/target/classes/org/productivity/java/syslog4j/Syslog.class new file mode 100644 index 0000000..ef637f1 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/Syslog.class differ diff --git a/target/classes/org/productivity/java/syslog4j/Syslog4jVersion.class b/target/classes/org/productivity/java/syslog4j/Syslog4jVersion.class new file mode 100644 index 0000000..8ee1177 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/Syslog4jVersion.class differ diff --git a/target/classes/org/productivity/java/syslog4j/SyslogBackLogHandlerIF.class b/target/classes/org/productivity/java/syslog4j/SyslogBackLogHandlerIF.class new file mode 100644 index 0000000..11b49ed Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/SyslogBackLogHandlerIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/SyslogCharSetIF.class b/target/classes/org/productivity/java/syslog4j/SyslogCharSetIF.class new file mode 100644 index 0000000..7cfed83 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/SyslogCharSetIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/SyslogConfigIF.class b/target/classes/org/productivity/java/syslog4j/SyslogConfigIF.class new file mode 100644 index 0000000..8436b78 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/SyslogConfigIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/SyslogConstants.class b/target/classes/org/productivity/java/syslog4j/SyslogConstants.class new file mode 100644 index 0000000..ff9cc01 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/SyslogConstants.class differ diff --git a/target/classes/org/productivity/java/syslog4j/SyslogIF.class b/target/classes/org/productivity/java/syslog4j/SyslogIF.class new file mode 100644 index 0000000..3cb56ea Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/SyslogIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/SyslogMain$Options.class b/target/classes/org/productivity/java/syslog4j/SyslogMain$Options.class new file mode 100644 index 0000000..bbaedb9 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/SyslogMain$Options.class differ diff --git a/target/classes/org/productivity/java/syslog4j/SyslogMain.class b/target/classes/org/productivity/java/syslog4j/SyslogMain.class new file mode 100644 index 0000000..52f8f44 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/SyslogMain.class differ diff --git a/target/classes/org/productivity/java/syslog4j/SyslogMessageIF.class b/target/classes/org/productivity/java/syslog4j/SyslogMessageIF.class new file mode 100644 index 0000000..89572ff Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/SyslogMessageIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/SyslogMessageModifierConfigIF.class b/target/classes/org/productivity/java/syslog4j/SyslogMessageModifierConfigIF.class new file mode 100644 index 0000000..43d31df Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/SyslogMessageModifierConfigIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/SyslogMessageModifierIF.class b/target/classes/org/productivity/java/syslog4j/SyslogMessageModifierIF.class new file mode 100644 index 0000000..7b67d0c Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/SyslogMessageModifierIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/SyslogMessageProcessorIF.class b/target/classes/org/productivity/java/syslog4j/SyslogMessageProcessorIF.class new file mode 100644 index 0000000..426bf36 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/SyslogMessageProcessorIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/SyslogPoolConfigIF.class b/target/classes/org/productivity/java/syslog4j/SyslogPoolConfigIF.class new file mode 100644 index 0000000..4e8c1b3 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/SyslogPoolConfigIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/SyslogRuntimeException.class b/target/classes/org/productivity/java/syslog4j/SyslogRuntimeException.class new file mode 100644 index 0000000..b8f1519 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/SyslogRuntimeException.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/AbstractSyslog.class b/target/classes/org/productivity/java/syslog4j/impl/AbstractSyslog.class new file mode 100644 index 0000000..4d4d64b Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/AbstractSyslog.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/AbstractSyslogConfig.class b/target/classes/org/productivity/java/syslog4j/impl/AbstractSyslogConfig.class new file mode 100644 index 0000000..2acdb13 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/AbstractSyslogConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/AbstractSyslogConfigIF.class b/target/classes/org/productivity/java/syslog4j/impl/AbstractSyslogConfigIF.class new file mode 100644 index 0000000..6000938 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/AbstractSyslogConfigIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/AbstractSyslogWriter.class b/target/classes/org/productivity/java/syslog4j/impl/AbstractSyslogWriter.class new file mode 100644 index 0000000..a065dc2 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/AbstractSyslogWriter.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/backlog/AbstractSyslogBackLogHandler.class b/target/classes/org/productivity/java/syslog4j/impl/backlog/AbstractSyslogBackLogHandler.class new file mode 100644 index 0000000..2448297 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/backlog/AbstractSyslogBackLogHandler.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/backlog/NullSyslogBackLogHandler.class b/target/classes/org/productivity/java/syslog4j/impl/backlog/NullSyslogBackLogHandler.class new file mode 100644 index 0000000..511e9bd Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/backlog/NullSyslogBackLogHandler.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/backlog/Syslog4jBackLogHandler.class b/target/classes/org/productivity/java/syslog4j/impl/backlog/Syslog4jBackLogHandler.class new file mode 100644 index 0000000..083128f Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/backlog/Syslog4jBackLogHandler.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/backlog/log4j/Log4jSyslogBackLogHandler.class b/target/classes/org/productivity/java/syslog4j/impl/backlog/log4j/Log4jSyslogBackLogHandler.class new file mode 100644 index 0000000..0ed81a7 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/backlog/log4j/Log4jSyslogBackLogHandler.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/backlog/printstream/PrintStreamSyslogBackLogHandler.class b/target/classes/org/productivity/java/syslog4j/impl/backlog/printstream/PrintStreamSyslogBackLogHandler.class new file mode 100644 index 0000000..2c8dd04 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/backlog/printstream/PrintStreamSyslogBackLogHandler.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/backlog/printstream/SystemErrSyslogBackLogHandler.class b/target/classes/org/productivity/java/syslog4j/impl/backlog/printstream/SystemErrSyslogBackLogHandler.class new file mode 100644 index 0000000..5147ac2 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/backlog/printstream/SystemErrSyslogBackLogHandler.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/backlog/printstream/SystemOutSyslogBackLogHandler.class b/target/classes/org/productivity/java/syslog4j/impl/backlog/printstream/SystemOutSyslogBackLogHandler.class new file mode 100644 index 0000000..79484a1 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/backlog/printstream/SystemOutSyslogBackLogHandler.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/log4j/Syslog4jAppender.class b/target/classes/org/productivity/java/syslog4j/impl/log4j/Syslog4jAppender.class new file mode 100644 index 0000000..4ae888c Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/log4j/Syslog4jAppender.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/log4j/Syslog4jAppenderSkeleton.class b/target/classes/org/productivity/java/syslog4j/impl/log4j/Syslog4jAppenderSkeleton.class new file mode 100644 index 0000000..c351c1f Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/log4j/Syslog4jAppenderSkeleton.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/AbstractSyslogMessage.class b/target/classes/org/productivity/java/syslog4j/impl/message/AbstractSyslogMessage.class new file mode 100644 index 0000000..051fb11 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/AbstractSyslogMessage.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/AbstractSyslogMessageModifier.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/AbstractSyslogMessageModifier.class new file mode 100644 index 0000000..c196000 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/AbstractSyslogMessageModifier.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/AbstractSyslogMessageModifierConfig.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/AbstractSyslogMessageModifierConfig.class new file mode 100644 index 0000000..0cbd781 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/AbstractSyslogMessageModifierConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/checksum/ChecksumSyslogMessageModifier.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/checksum/ChecksumSyslogMessageModifier.class new file mode 100644 index 0000000..f4bcd77 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/checksum/ChecksumSyslogMessageModifier.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/checksum/ChecksumSyslogMessageModifierConfig.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/checksum/ChecksumSyslogMessageModifierConfig.class new file mode 100644 index 0000000..e5476d7 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/checksum/ChecksumSyslogMessageModifierConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/escape/HTMLEntityEscapeSyslogMessageModifier.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/escape/HTMLEntityEscapeSyslogMessageModifier.class new file mode 100644 index 0000000..11b7379 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/escape/HTMLEntityEscapeSyslogMessageModifier.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/hash/HashSyslogMessageModifier.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/hash/HashSyslogMessageModifier.class new file mode 100644 index 0000000..1558d3f Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/hash/HashSyslogMessageModifier.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/hash/HashSyslogMessageModifierConfig.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/hash/HashSyslogMessageModifierConfig.class new file mode 100644 index 0000000..e7566c4 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/hash/HashSyslogMessageModifierConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/mac/MacSyslogMessageModifier.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/mac/MacSyslogMessageModifier.class new file mode 100644 index 0000000..e8886a7 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/mac/MacSyslogMessageModifier.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/mac/MacSyslogMessageModifierConfig.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/mac/MacSyslogMessageModifierConfig.class new file mode 100644 index 0000000..57d3fa3 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/mac/MacSyslogMessageModifierConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/sequential/SequentialSyslogMessageModifier.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/sequential/SequentialSyslogMessageModifier.class new file mode 100644 index 0000000..a0cb415 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/sequential/SequentialSyslogMessageModifier.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/sequential/SequentialSyslogMessageModifierConfig.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/sequential/SequentialSyslogMessageModifierConfig.class new file mode 100644 index 0000000..0abde74 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/sequential/SequentialSyslogMessageModifierConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/text/PrefixSyslogMessageModifier.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/text/PrefixSyslogMessageModifier.class new file mode 100644 index 0000000..de0a2dc Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/text/PrefixSyslogMessageModifier.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/text/StringCaseSyslogMessageModifier.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/text/StringCaseSyslogMessageModifier.class new file mode 100644 index 0000000..9a8ae95 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/text/StringCaseSyslogMessageModifier.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/modifier/text/SuffixSyslogMessageModifier.class b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/text/SuffixSyslogMessageModifier.class new file mode 100644 index 0000000..3cc7e24 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/modifier/text/SuffixSyslogMessageModifier.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/pci/PCISyslogMessage.class b/target/classes/org/productivity/java/syslog4j/impl/message/pci/PCISyslogMessage.class new file mode 100644 index 0000000..e6f8d87 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/pci/PCISyslogMessage.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/pci/PCISyslogMessageIF.class b/target/classes/org/productivity/java/syslog4j/impl/message/pci/PCISyslogMessageIF.class new file mode 100644 index 0000000..8fc7437 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/pci/PCISyslogMessageIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/processor/AbstractSyslogMessageProcessor.class b/target/classes/org/productivity/java/syslog4j/impl/message/processor/AbstractSyslogMessageProcessor.class new file mode 100644 index 0000000..ef40679 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/processor/AbstractSyslogMessageProcessor.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/processor/SyslogMessageProcessor.class b/target/classes/org/productivity/java/syslog4j/impl/message/processor/SyslogMessageProcessor.class new file mode 100644 index 0000000..219a129 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/processor/SyslogMessageProcessor.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/processor/structured/StructuredSyslogMessageProcessor.class b/target/classes/org/productivity/java/syslog4j/impl/message/processor/structured/StructuredSyslogMessageProcessor.class new file mode 100644 index 0000000..00a3f37 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/processor/structured/StructuredSyslogMessageProcessor.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/structured/StructuredSyslogMessage.class b/target/classes/org/productivity/java/syslog4j/impl/message/structured/StructuredSyslogMessage.class new file mode 100644 index 0000000..95f1fd5 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/structured/StructuredSyslogMessage.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/message/structured/StructuredSyslogMessageIF.class b/target/classes/org/productivity/java/syslog4j/impl/message/structured/StructuredSyslogMessageIF.class new file mode 100644 index 0000000..faaf1b7 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/message/structured/StructuredSyslogMessageIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/multiple/MultipleSyslog.class b/target/classes/org/productivity/java/syslog4j/impl/multiple/MultipleSyslog.class new file mode 100644 index 0000000..258f79a Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/multiple/MultipleSyslog.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/multiple/MultipleSyslogConfig.class b/target/classes/org/productivity/java/syslog4j/impl/multiple/MultipleSyslogConfig.class new file mode 100644 index 0000000..5bcb186 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/multiple/MultipleSyslogConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/AbstractNetSyslog.class b/target/classes/org/productivity/java/syslog4j/impl/net/AbstractNetSyslog.class new file mode 100644 index 0000000..b582da1 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/AbstractNetSyslog.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/AbstractNetSyslogConfig.class b/target/classes/org/productivity/java/syslog4j/impl/net/AbstractNetSyslogConfig.class new file mode 100644 index 0000000..0e0b90a Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/AbstractNetSyslogConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/AbstractNetSyslogConfigIF.class b/target/classes/org/productivity/java/syslog4j/impl/net/AbstractNetSyslogConfigIF.class new file mode 100644 index 0000000..06fcb98 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/AbstractNetSyslogConfigIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslog.class b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslog.class new file mode 100644 index 0000000..256d1c7 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslog.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogConfig.class b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogConfig.class new file mode 100644 index 0000000..d21413b Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogConfigIF.class b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogConfigIF.class new file mode 100644 index 0000000..bcd9463 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogConfigIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogWriter.class b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogWriter.class new file mode 100644 index 0000000..1f2e61b Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/TCPNetSyslogWriter.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/tcp/pool/PooledTCPNetSyslog.class b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/pool/PooledTCPNetSyslog.class new file mode 100644 index 0000000..04f4045 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/pool/PooledTCPNetSyslog.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/tcp/pool/PooledTCPNetSyslogConfig.class b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/pool/PooledTCPNetSyslogConfig.class new file mode 100644 index 0000000..5a1475c Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/pool/PooledTCPNetSyslogConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslog.class b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslog.class new file mode 100644 index 0000000..e1f3ff5 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslog.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogConfig.class b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogConfig.class new file mode 100644 index 0000000..535131e Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogConfigIF.class b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogConfigIF.class new file mode 100644 index 0000000..a4c80e8 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogConfigIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogWriter.class b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogWriter.class new file mode 100644 index 0000000..c3adf49 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/SSLTCPNetSyslogWriter.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/pool/PooledSSLTCPNetSyslogConfig.class b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/pool/PooledSSLTCPNetSyslogConfig.class new file mode 100644 index 0000000..bbbabc4 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/tcp/ssl/pool/PooledSSLTCPNetSyslogConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/udp/UDPNetSyslog.class b/target/classes/org/productivity/java/syslog4j/impl/net/udp/UDPNetSyslog.class new file mode 100644 index 0000000..731eaaa Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/udp/UDPNetSyslog.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/net/udp/UDPNetSyslogConfig.class b/target/classes/org/productivity/java/syslog4j/impl/net/udp/UDPNetSyslogConfig.class new file mode 100644 index 0000000..3e9b0ca Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/net/udp/UDPNetSyslogConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/pool/AbstractSyslogPoolFactory.class b/target/classes/org/productivity/java/syslog4j/impl/pool/AbstractSyslogPoolFactory.class new file mode 100644 index 0000000..38cb3ca Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/pool/AbstractSyslogPoolFactory.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/pool/generic/GenericSyslogPoolFactory.class b/target/classes/org/productivity/java/syslog4j/impl/pool/generic/GenericSyslogPoolFactory.class new file mode 100644 index 0000000..07fc357 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/pool/generic/GenericSyslogPoolFactory.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/unix/UnixSyslog$CLibrary.class b/target/classes/org/productivity/java/syslog4j/impl/unix/UnixSyslog$CLibrary.class new file mode 100644 index 0000000..5307cf4 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/unix/UnixSyslog$CLibrary.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/unix/UnixSyslog.class b/target/classes/org/productivity/java/syslog4j/impl/unix/UnixSyslog.class new file mode 100644 index 0000000..3329554 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/unix/UnixSyslog.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/unix/UnixSyslogConfig.class b/target/classes/org/productivity/java/syslog4j/impl/unix/UnixSyslogConfig.class new file mode 100644 index 0000000..4e15762 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/unix/UnixSyslogConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslog$CLibrary.class b/target/classes/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslog$CLibrary.class new file mode 100644 index 0000000..3930ec8 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslog$CLibrary.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslog$SockAddr.class b/target/classes/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslog$SockAddr.class new file mode 100644 index 0000000..aba04c3 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslog$SockAddr.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslog.class b/target/classes/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslog.class new file mode 100644 index 0000000..0fdd077 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslog.class differ diff --git a/target/classes/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslogConfig.class b/target/classes/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslogConfig.class new file mode 100644 index 0000000..6aace1d Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/impl/unix/socket/UnixSocketSyslogConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/SyslogServer.class b/target/classes/org/productivity/java/syslog4j/server/SyslogServer.class new file mode 100644 index 0000000..1744168 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/SyslogServer.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/SyslogServerConfigIF.class b/target/classes/org/productivity/java/syslog4j/server/SyslogServerConfigIF.class new file mode 100644 index 0000000..3ec69f7 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/SyslogServerConfigIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/SyslogServerEventHandlerIF.class b/target/classes/org/productivity/java/syslog4j/server/SyslogServerEventHandlerIF.class new file mode 100644 index 0000000..a8ee304 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/SyslogServerEventHandlerIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/SyslogServerEventIF.class b/target/classes/org/productivity/java/syslog4j/server/SyslogServerEventIF.class new file mode 100644 index 0000000..40a1e88 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/SyslogServerEventIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/SyslogServerIF.class b/target/classes/org/productivity/java/syslog4j/server/SyslogServerIF.class new file mode 100644 index 0000000..f0b1a48 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/SyslogServerIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/SyslogServerMain$Options.class b/target/classes/org/productivity/java/syslog4j/server/SyslogServerMain$Options.class new file mode 100644 index 0000000..962b9d3 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/SyslogServerMain$Options.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/SyslogServerMain.class b/target/classes/org/productivity/java/syslog4j/server/SyslogServerMain.class new file mode 100644 index 0000000..b2acc3b Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/SyslogServerMain.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/SyslogServerSessionEventHandlerIF.class b/target/classes/org/productivity/java/syslog4j/server/SyslogServerSessionEventHandlerIF.class new file mode 100644 index 0000000..560accd Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/SyslogServerSessionEventHandlerIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/SyslogServerSessionlessEventHandlerIF.class b/target/classes/org/productivity/java/syslog4j/server/SyslogServerSessionlessEventHandlerIF.class new file mode 100644 index 0000000..7a8c8f1 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/SyslogServerSessionlessEventHandlerIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/AbstractSyslogServer$Sessions.class b/target/classes/org/productivity/java/syslog4j/server/impl/AbstractSyslogServer$Sessions.class new file mode 100644 index 0000000..1ec6d3c Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/AbstractSyslogServer$Sessions.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/AbstractSyslogServer.class b/target/classes/org/productivity/java/syslog4j/server/impl/AbstractSyslogServer.class new file mode 100644 index 0000000..c9e8901 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/AbstractSyslogServer.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/AbstractSyslogServerConfig.class b/target/classes/org/productivity/java/syslog4j/server/impl/AbstractSyslogServerConfig.class new file mode 100644 index 0000000..c6799e8 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/AbstractSyslogServerConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/event/SyslogServerEvent.class b/target/classes/org/productivity/java/syslog4j/server/impl/event/SyslogServerEvent.class new file mode 100644 index 0000000..789318c Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/event/SyslogServerEvent.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/event/printstream/FileSyslogServerEventHandler.class b/target/classes/org/productivity/java/syslog4j/server/impl/event/printstream/FileSyslogServerEventHandler.class new file mode 100644 index 0000000..c4dcb20 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/event/printstream/FileSyslogServerEventHandler.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/event/printstream/PrintStreamSyslogServerEventHandler.class b/target/classes/org/productivity/java/syslog4j/server/impl/event/printstream/PrintStreamSyslogServerEventHandler.class new file mode 100644 index 0000000..3c79c0e Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/event/printstream/PrintStreamSyslogServerEventHandler.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/event/printstream/SystemErrSyslogServerEventHandler.class b/target/classes/org/productivity/java/syslog4j/server/impl/event/printstream/SystemErrSyslogServerEventHandler.class new file mode 100644 index 0000000..5a91bf5 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/event/printstream/SystemErrSyslogServerEventHandler.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/event/printstream/SystemOutSyslogServerEventHandler.class b/target/classes/org/productivity/java/syslog4j/server/impl/event/printstream/SystemOutSyslogServerEventHandler.class new file mode 100644 index 0000000..46b616e Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/event/printstream/SystemOutSyslogServerEventHandler.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/event/structured/StructuredSyslogServerEvent.class b/target/classes/org/productivity/java/syslog4j/server/impl/event/structured/StructuredSyslogServerEvent.class new file mode 100644 index 0000000..d7db926 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/event/structured/StructuredSyslogServerEvent.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/net/AbstractNetSyslogServerConfig.class b/target/classes/org/productivity/java/syslog4j/server/impl/net/AbstractNetSyslogServerConfig.class new file mode 100644 index 0000000..e3a24d8 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/net/AbstractNetSyslogServerConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServer$TCPNetSyslogSocketHandler.class b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServer$TCPNetSyslogSocketHandler.class new file mode 100644 index 0000000..176180b Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServer$TCPNetSyslogSocketHandler.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServer.class b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServer.class new file mode 100644 index 0000000..6b8ca90 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServer.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServerConfig.class b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServerConfig.class new file mode 100644 index 0000000..beda12a Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServerConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServerConfigIF.class b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServerConfigIF.class new file mode 100644 index 0000000..299025a Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/TCPNetSyslogServerConfigIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServer.class b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServer.class new file mode 100644 index 0000000..9c8e4c0 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServer.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServerConfig.class b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServerConfig.class new file mode 100644 index 0000000..e25a1cc Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServerConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServerConfigIF.class b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServerConfigIF.class new file mode 100644 index 0000000..d2bc099 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/net/tcp/ssl/SSLTCPNetSyslogServerConfigIF.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/net/udp/UDPNetSyslogServer.class b/target/classes/org/productivity/java/syslog4j/server/impl/net/udp/UDPNetSyslogServer.class new file mode 100644 index 0000000..6da1637 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/net/udp/UDPNetSyslogServer.class differ diff --git a/target/classes/org/productivity/java/syslog4j/server/impl/net/udp/UDPNetSyslogServerConfig.class b/target/classes/org/productivity/java/syslog4j/server/impl/net/udp/UDPNetSyslogServerConfig.class new file mode 100644 index 0000000..ea6db62 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/server/impl/net/udp/UDPNetSyslogServerConfig.class differ diff --git a/target/classes/org/productivity/java/syslog4j/util/Base64$InputStream.class b/target/classes/org/productivity/java/syslog4j/util/Base64$InputStream.class new file mode 100644 index 0000000..1153c51 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/util/Base64$InputStream.class differ diff --git a/target/classes/org/productivity/java/syslog4j/util/Base64$OutputStream.class b/target/classes/org/productivity/java/syslog4j/util/Base64$OutputStream.class new file mode 100644 index 0000000..293a22d Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/util/Base64$OutputStream.class differ diff --git a/target/classes/org/productivity/java/syslog4j/util/Base64.class b/target/classes/org/productivity/java/syslog4j/util/Base64.class new file mode 100644 index 0000000..0a7fece Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/util/Base64.class differ diff --git a/target/classes/org/productivity/java/syslog4j/util/OSDetectUtility.class b/target/classes/org/productivity/java/syslog4j/util/OSDetectUtility.class new file mode 100644 index 0000000..40187b2 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/util/OSDetectUtility.class differ diff --git a/target/classes/org/productivity/java/syslog4j/util/SyslogUtility.class b/target/classes/org/productivity/java/syslog4j/util/SyslogUtility.class new file mode 100644 index 0000000..c574eb0 Binary files /dev/null and b/target/classes/org/productivity/java/syslog4j/util/SyslogUtility.class differ diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000..e903f05 --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Tue Feb 19 00:49:45 CET 2013 +version=0.9.48-graylog2 +groupId=org.productivity.java +artifactId=syslog4j-graylog2 diff --git a/target/syslog4j-graylog2-0.9.48-graylog2.jar b/target/syslog4j-graylog2-0.9.48-graylog2.jar new file mode 100644 index 0000000..81a5113 Binary files /dev/null and b/target/syslog4j-graylog2-0.9.48-graylog2.jar differ