Himachandra
Himachandra

Reputation: 1

Pattern Matcher IllegalStateException

I am developing an UDP Listening program with adventnet SNMPAPI. Now i need to save the listening data into Database. While i am doing that, i got errors. Can anybody help on this plzz...

Here is my code.

import com.adventnet.snmp.beans.*; 
import com.adventnet.snmp.snmp2.*; 
import com.adventnet.snmp.snmp2.usm.*; 
import java.io.*; 
import java.net.*; 
import java.sql.*; 
import java.util.regex.*; 

public class trapreceiver { 

private static int MIBS = 0; 
private static int COMMUNITY = 1; 
private static int PORT = 2; 

private static int USER_NAME = 3; 
private static int ENGID = 4; 
private static int AUTH_PROTOCOL = 5; 
private static int AUTH_PASSWORD = 6; 
private static int PRIV_PASSWORD = 7; 
private static int DEBUG = 8; 
private static int CONTEXT_NAME = 9; 
private static int CONTEXT_ID = 10; 
private static int PRIV_PROTOCOL = 11; 
private static String Data; 
public static void main(String args[]) { 

// Take care of getting options 

String usage = "trapreceiver [-m MIB_files] [-c community] [-p port] [-u user] [-e engineID(1234.../0x1234...)] [-a authProtocol(MD5/SHA)] [-w auth_password] [-s priv_password] [-d] [-n contextName] [-i contextId] [ -pp priv_protocol(DES/AES-128/AES-192/AES-256/3DES) ]"; 
String options[] = { "-m" , "-c", "-p", "-u", "-e", "-a", "-w", "-s", "-d", "-n", "-i", "-pp" }; 
String values[] = { null, null, null, null, null, null, null, null, "None", null, null, null}; 
String DataReceived = null; 
String userName = null; 
int authProtocol = USMUserEntry.NO_AUTH; 
String authPassword = new String (""); 
String privPassword = new String (""); 
String engineID = null; 

int privProtocol = USMUserEntry.NO_PRIV; 
byte secLevel = 0; 

ParseOptions opt = new ParseOptions(args,options,values, usage); 
if (opt.remArgs.length!=0) opt.usage_error(); 

// instantiate a receiver object 
SnmpTrapReceiver receiver = new SnmpTrapReceiver(); 

//To load MIBs from compiled file 
receiver.getMibOperations().setLoadFromCompiledMibs(true); 

if (values[COMMUNITY] != null) receiver.setCommunity( values[COMMUNITY] ); 
try { // set trap port to listen on if specified - else port 162 

if (values[PORT] != null) { 
receiver.setPortWithExceptionMsg( Integer.parseInt(values[PORT]) ); 
} else { 
System.out.println("Trying to set port 162 as the receiver port..."); 
receiver.setPortWithExceptionMsg( 162 ); 
} 


if (values[USER_NAME] != null) { 
userName = values[USER_NAME]; 
receiver.setPrincipal(userName); 
} 

if (values[ENGID] != null) { 
engineID = values[ENGID]; 
if(engineID.startsWith("0x") || engineID.startsWith("0X")) 
engineID = new String(gethexValue(values[ENGID])); 
} 

if (values[AUTH_PROTOCOL] != null) { 
if(engineID == null)    { 
System.out.println("EngineID is missing"); 
opt.usage_error(); 
} 
if ( values[AUTH_PROTOCOL].equals("SHA")) 
authProtocol = USMUserEntry.SHA_AUTH; 
else if ( values[AUTH_PROTOCOL].equals("MD5")) 
authProtocol = USMUserEntry.MD5_AUTH; 
else 
authProtocol = USMUserEntry.NO_AUTH; 
receiver.setAuthProtocol(authProtocol); 
receiver.setTrapAuthEnable(true); 
secLevel |= 0x01; 
} 

if (values[AUTH_PASSWORD] != null) { 
if(engineID == null)    { 
System.out.println("EngineID is missing"); 
opt.usage_error(); 
} 
if (secLevel == 0x01) { 
authPassword = values[AUTH_PASSWORD]; 
receiver.setAuthPassword(authPassword); 
} 
else 
opt.usage_error(); 
} 

if(values[PRIV_PASSWORD] != null) { 
if(engineID == null)    { 
System.out.println("EngineID is missing"); 
opt.usage_error(); 
} 
if (secLevel == 0x01) 
{ 
privPassword = values[PRIV_PASSWORD]; 
if(values[PRIV_PROTOCOL] != null) 
{ 
if(values[PRIV_PROTOCOL].equals("AES-128")) 
{ 
privProtocol = USMUserEntry.CFB_AES_128; 
} 
else if(values[PRIV_PROTOCOL].equals("AES-192")) 
{ 
privProtocol = USMUserEntry.CFB_AES_192; 
} 
else if(values[PRIV_PROTOCOL].equals("AES-256")) 
{ 
privProtocol = USMUserEntry.CFB_AES_256; 
} 
else if(values[PRIV_PROTOCOL].equals("3DES")) 
{ 
privProtocol = USMUserEntry.CBC_3DES; 
} 
else if(values[PRIV_PROTOCOL].equals("DES")) 
{ 
privProtocol = USMUserEntry.CBC_DES; 
} 
else 
{ 
System.out.println(" Invalid PrivProtocol "+values[PRIV_PROTOCOL]); 
opt.usage_error(); 
} 
} 

receiver.setPrivPassword(privPassword); 
receiver.setPrivProtocol(privProtocol); 

if(values[CONTEXT_NAME]!= null) 
receiver.setContextName(values[CONTEXT_NAME]); 
if(values[CONTEXT_ID]!= null) 
receiver.setContextID((values[CONTEXT_ID]).getBytes()); 

secLevel |= 0x02; 
} 
else 
opt.usage_error(); 
} 

} catch (NumberFormatException ex) { 
System.err.println("Invalid Integer Arg"); 
} catch (SnmpException se) { 
System.err.println(se); 
System.exit(1); 
} 

if(values[DEBUG].equals("Set")) 
receiver.setDebug(true); 

if(userName != null) 
receiver.createUserEntry(engineID.getBytes(),secLevel); 

if (values[MIBS] != null) try { // load MIB files 
System.err.println("Loading MIBs: "+values[MIBS]); 
receiver.loadMibs(values[MIBS]); 
System.err.println("Done."); 
} catch (Exception ex) { 
System.err.println("Error loading MIBs: "+ex); 
} 

// we need to instantiate a trap listener to listen for trap events 
TrapListener listener = new TrapListener() { 

// This method is called when trap is received by SnmpTrapReceiver 
public void receivedTrap(TrapEvent trap) { 
System.out.println("Got a trap from: "+trap.getRemoteHost()); 
// print PDU details 
String DataReceived = ((SnmpTrapReceiver)trap.getSource()).getMibOperations().toString(trap.getTrapPDU()); 
System.out.println(((SnmpTrapReceiver)trap.getSource()) 
.getMibOperations().toString(trap.getTrapPDU()) ); 
System.out.println("DataReceived :::: " + DataReceived); 
Pattern p = Pattern.compile("\\STRING.*?)\\."); 
Matcher m = p.matcher(DataReceived); 
m.find(); 
Data = m.group(1); 
System.out.println(Data); 

/*Connection con = null; 
String url = "jdbc:mysql://localhost:3306/"; 
String db = "snmp"; 
String driver = "com.mysql.jdbc.Driver"; 
Class.forName(driver); 
con = DriverManager.getConnection(url + db,"root","root"); 
Statement st = con.createStatement(); 
String sql = "INSERT INTO DataReceived(data) " + 
"VALUES ('"+m.group(1)+"')"; 
try 
{ 
int val = st.executeUpdate(sql); 
System.out.println("1 row affected"); 
catch (SQLException s) 
{ 
System.out.println("SQL statement is not executed!"); 
} 
}*/ 
if( trap.getTrapPDU().getCommand() == SnmpAPI.TRP_REQ_MSG) 
{ 
com.adventnet.snmp.mibs.MibTrap trapDefn = // get trap defn 
trap.getTrapDefinition(); 

if (trapDefn != null) // print name and description 
System.out.println("Trap Name: "+trapDefn.getName()+ 
"\nDescr: "+trapDefn.getDescription()); 
} 
else if( trap.getTrapPDU().getCommand() == SnmpAPI.TRP2_REQ_MSG) 
{ 

com.adventnet.snmp.mibs.MibNode notification = trap.getNotificationDefinition(); 
if(notification != null) 
System.out.println("Notification Name: "+notification.getLabel()+ 
"\nObjects: "+ notification.getObjects()+ 
"\nStatus: "+ notification.getStatus()+ 
"\nDescr: "+notification.getDescription()+ 
"\nParent: "+ notification.getParent()); 

} 
} 
/* 
Connection con = null; 
String url = "jdbc:mysql://localhost:3306/"; 
String db = "snmp"; 
String driver = "com.mysql.jdbc.Driver"; 

Class.forName(driver); 
con = DriverManager.getConnection(url + db,"root","root"); 
Statement st = con.createStatement(); 
String sql = "INSERT INTO DataReceived(data) " + 
"VALUES ('"+Data+"')"; 

int val = st.executeUpdate(sql); 
//System.out.println("1 row affected");*/ 
}; 

receiver.addTrapListener(listener); 

System.out.println("Trap Receiver started at port "+receiver.getPort()); 
} 


private static byte[] gethexValue(String value) 
{ 
byte temp; 
byte[] Key=new byte[value.length()/2 - 1]; 
String ss,str; 

ss = value.substring(2); 
for(int i = 0; i < ss.length(); i+=2) 
{ 
str = ss.substring(i,i+2); 
temp = (byte)Integer.parseInt(str,16); 
Key[i/2] = temp; 
} 
return Key; 
} 

} 

Thanks in Adv..

With Regards, Himachandra C.

Upvotes: 0

Views: 1440

Answers (1)

acdcjunior
acdcjunior

Reputation: 135762

From the exception:

Exception in thread "Thread-1" java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.group(Matcher.java:468)
at snmpv3trapd.callback(snmpv3trapd.java:305)

And the code:

String DataReceived = ...
...
Pattern p = Pattern.compile("\\STRING.*?)\\.");
Matcher m = p.matcher(DataReceived); 
m.find(); 
Data = m.group(1); 

The exception is thrown at the m.group(1) line. The error No match found at java.util.regex.Matcher.group(...) is simply stating that the received string (the variable DataReceived) does not match the regex in any place.

Now I believe there's something else to your code. Taking a look at the "\\STRING.*?)\\." string, which is the following regex:

\STRING.*?)\.

This should be giving an error due to the occurrence of an unmatched closing ). Now even if you correct that, this regex is probably not matching what you thing it is.

The first char \S is not matching the letter S, but rather the negated version of the character class \s (which matches whitespaces). This way, strings starting with xTRING or #TRING (and so on) would match your regex.

To sum it up:

I believe you want to match the strings after the sequence STRING and before the char .. For this, use the regex:

STRING(.*?)\.

And thus the pattern as:

Pattern p = Pattern.compile("STRING(.*?)\\.");

Now m.group(1); will work when there's a match.

If you want to avoid the exception when there are no matches, should check m.find()'s result:

Pattern p = Pattern.compile("STRING(.*?)\\.");
Matcher m = p.matcher(DataReceived); 
Data = null;
if (m.find()) {
    Data = m.group(1);
}

Note: If you can, please stop starting you variables' name with uppercase. That's not the Java convention.

Upvotes: 1

Related Questions