I haven't used Netty.... But architecturally the seem quite similar. Why not do both.
But yes this is completely mina, I kinda mapped the structure after HL7 /je On Oct 19, 2010, at 5:34 AM, Willem Jiang wrote: > I think this decoder is related to camel-mina component, maybe we can put it > into camel-mina component. > BTW, we also have the camel-netty component, and netty is more active than > mina, a netty version of syslog decoder could be more useful. > > On 10/19/10 9:20 AM, Johan Edstrom wrote: >> Something like this... >> >> Writing the tests and the encoder right now... >> >> /** >> * Licensed to the Apache Software Foundation (ASF) under one or more >> * contributor license agreements. See the NOTICE file distributed with >> * this work for additional information regarding copyright ownership. >> * The ASF licenses this file to You under the Apache License, Version 2.0 >> * (the "License"); you may not use this file except in compliance with >> * the License. You may obtain a copy of the License at >> * >> * http://www.apache.org/licenses/LICENSE-2.0 >> * >> * Unless required by applicable law or agreed to in writing, software >> * distributed under the License is distributed on an "AS IS" BASIS, >> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. >> * See the License for the specific language governing permissions and >> * limitations under the License. >> */ >> >> package org.apache.camel.component.syslog; >> >> import java.net.InetSocketAddress; >> import java.util.Calendar; >> import java.util.GregorianCalendar; >> import java.util.HashMap; >> import java.util.Map; >> >> import org.apache.commons.logging.Log; >> import org.apache.commons.logging.LogFactory; >> import org.apache.mina.common.ByteBuffer; >> import org.apache.mina.common.IoSession; >> import org.apache.mina.filter.codec.ProtocolDecoderAdapter; >> import org.apache.mina.filter.codec.ProtocolDecoderOutput; >> >> public class SyslogDecoder extends ProtocolDecoderAdapter { >> >> private static final transient Log LOG = >> LogFactory.getLog(SyslogDecoder.class); >> >> private final SyslogMessage syslogMessage = new SyslogMessage(); >> >> private static enum MONTHS { >> jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec >> } >> >> private final static Map<String, MONTHS> MONTH_VALUE_MAP = new >> HashMap<String, MONTHS>() { >> { >> put("jan", MONTHS.jan); >> put("feb", MONTHS.feb); >> put("mar", MONTHS.mar); >> put("apr", MONTHS.apr); >> put("may", MONTHS.may); >> put("jun", MONTHS.jun); >> put("jul", MONTHS.jul); >> put("aug", MONTHS.aug); >> put("sep", MONTHS.sep); >> put("oct", MONTHS.oct); >> put("nov", MONTHS.nov); >> put("dec", MONTHS.dec); >> } >> }; >> >> public void decode(IoSession ioSession, ByteBuffer byteBuffer, >> ProtocolDecoderOutput protocolDecoderOutput) throws Exception { >> >> syslogMessage.setDestination((InetSocketAddress) >> ioSession.getLocalAddress()); >> syslogMessage.setSource((InetSocketAddress) >> ioSession.getLocalAddress()); >> syslogMessage.setRawMessage(byteBuffer.toString()); >> >> //Rewind so we actually can parse this >> byteBuffer.rewind(); >> >> Character charFound = (char) byteBuffer.get(); >> >> while (charFound != '<') { >> //Ignore noise in beginning of message. >> charFound = (char) byteBuffer.get(); >> } >> char priChar = 0; >> if (charFound == '<') { >> int facility = 0; >> >> while (Character.isDigit(priChar = (char) (byteBuffer.get()& >> 0xff))) { >> facility *= 10; >> facility += Character.digit(priChar, 10); >> } >> syslogMessage.setFacility(SyslogFacility.values()[facility>> >> 3]); >> syslogMessage.setSeverity(SyslogSeverity.values()[facility& >> 0x07]); >> } >> >> if (priChar != '>') { >> //Invalid character - this is not a well defined syslog message. >> LOG.error("Invalid syslog message, missing a> in the >> Facility/Priority part"); >> } >> >> //Done parsing severity and facility >> //<169>Oct 22 10:52:01 TZ-6 scapegoat.dmz.example.org 10.1.2.3 >> sched[0]: That's All Folks! >> //Need to parse the date. >> >> /** >> The TIMESTAMP field is the local time and is in the format of "Mmm >> dd >> hh:mm:ss" (without the quote marks) where: >> >> Mmm is the English language abbreviation for the month of the >> year with the first character in uppercase and the other two >> characters in lowercase. The following are the only acceptable >> values: >> >> Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec >> >> dd is the day of the month. If the day of the month is less >> than 10, then it MUST be represented as a space and then the >> number. For example, the 7th day of August would be >> represented as "Aug 7", with two spaces between the "g" and >> the "7". >> >> hh:mm:ss is the local time. The hour (hh) is represented in a >> 24-hour format. Valid entries are between 00 and 23, >> inclusive. The minute (mm) and second (ss) entries are between >> 00 and 59 inclusive. >> >> >> */ >> >> char[] month = new char[3]; >> for (int i = 0; i< 3; i++) { >> month[i] = (char) byteBuffer.get(); >> } >> charFound = (char) byteBuffer.get(); >> if (charFound != ' ') { >> //Invalid Message - missing mandatory space. >> LOG.error("Invalid syslog message, missing a mandatory space >> after month"); >> } >> charFound = (char) byteBuffer.get(); >> >> int day = 0; >> if (charFound == ' ') { >> //Extra space for the day - this is okay. >> //Just ignored per the spec. >> } else { >> day *= 10; >> day += Character.digit(charFound, 10); >> } >> >> while (Character.isDigit(charFound = (char) (byteBuffer.get()& >> 0xff))) { >> System.out.println("Char " + charFound); >> day *= 10; >> day += Character.digit(charFound, 10); >> } >> >> int hour = 0; >> while (Character.isDigit(charFound = (char) (byteBuffer.get()& >> 0xff))) { >> System.out.println("Hour " + charFound); >> hour *= 10; >> hour += Character.digit(charFound, 10); >> } >> >> int minute = 0; >> while (Character.isDigit(charFound = (char) (byteBuffer.get()& >> 0xff))) { >> System.out.println("Hour " + charFound); >> minute *= 10; >> minute += Character.digit(charFound, 10); >> } >> >> int second = 0; >> while (Character.isDigit(charFound = (char) (byteBuffer.get()& >> 0xff))) { >> System.out.println("Hour " + charFound); >> second *= 10; >> second += Character.digit(charFound, 10); >> } >> >> //The host is the char sequence until the next ' ' >> >> StringBuilder host = new StringBuilder(); >> while ((charFound = (char) (byteBuffer.get()& 0xff)) != ' ') { >> host.append(charFound); >> } >> >> StringBuilder msg = new StringBuilder(); >> while (byteBuffer.hasRemaining()) { >> charFound = (char) (byteBuffer.get()& 0xff); >> msg.append(charFound); >> } >> >> //Insert a correct Date/Timestamp based on the parsing. >> //Add the message to the SyslogMessage Body. >> String parsedMonth = String.valueOf(month).toLowerCase(); >> System.out.println("Paresed " + parsedMonth); >> System.out.println("Month number " + String.valueOf(month) + " " + >> MONTH_VALUE_MAP.get(parsedMonth)); >> >> Calendar calendar = new GregorianCalendar(); >> calendar.set(Calendar.MONTH, >> MONTH_VALUE_MAP.get((String.valueOf(month).toLowerCase())).ordinal()); >> calendar.set(Calendar.DAY_OF_MONTH, day); >> calendar.set(Calendar.HOUR, hour); >> calendar.set(Calendar.MINUTE, minute); >> calendar.set(Calendar.SECOND, second); >> >> syslogMessage.setMessageTime(calendar.getTime()); >> >> syslogMessage.setContent(msg.toString()); >> if (LOG.isTraceEnabled()) { >> LOG.trace("Syslog message : " + syslogMessage.toString()); >> } >> >> protocolDecoderOutput.write(syslogMessage); >> } >> >> >> } >> >> >> On Oct 16, 2010, at 8:55 PM, Willem Jiang wrote: >> >>> Hi Johan, >>> >>> I guess you didn't past the link of you parser code :) >>> >>> On 10/17/10 10:31 AM, Johan Edstrom wrote: >>>> Gents! >>>> >>>> Syslog, anyone have comments on this? I am writing a simple parser for >>>> Mina/Camel that I want to re-use in opennms. (A GPL Project) >>>> But I wanted to put the parsing parts here so it is ASF license. (I think >>>> it is stupid that all the parsers are GPL). >>>> In an input if you look at the RFC mostly used, it is 99% best effort, >>>> would thinks like SyslogHeader.Priority be sufficient? >>>> >>>> >>>> Johan Edstrom >>>> [email protected] >>>> They that can give up essential liberty to purchase a little temporary >>>> safety, deserve neither liberty nor safety. >>>> Benjamin Franklin, Historical Review of Pennsylvania, 1759 >>>> >>>> >>>> >>>> >>>> >>>> >>> >>> >>> -- >>> Willem >>> ---------------------------------- >>> Open Source Integration: http://www.fusesource.com >>> Blog: http://willemjiang.blogspot.com (English) >>> http://jnn.javaeye.com (Chinese) >>> Twitter: http://twitter.com/willemjiang >> >> Johan Edstrom >> >> [email protected] >> >> They that can give up essential liberty to purchase a little temporary >> safety, deserve neither liberty nor safety. >> >> Benjamin Franklin, Historical Review of Pennsylvania, 1759 >> >> >> >> >> >> > > > -- > Willem > ---------------------------------- > Open Source Integration: http://www.fusesource.com > Blog: http://willemjiang.blogspot.com (English) > http://jnn.javaeye.com (Chinese) > Twitter: http://twitter.com/willemjiang Johan Edstrom [email protected] They that can give up essential liberty to purchase a little temporary safety, deserve neither liberty nor safety. Benjamin Franklin, Historical Review of Pennsylvania, 1759
