Revision: bfa75fb11ad1
Author:   unknown <yulian@Venera.(none)>
Date:     Mon Dec 10 15:44:18 2012
Log:      Optimized mgcp client stack

http://code.google.com/p/mediaserver/source/detail?r=bfa75fb11ad1

Modified:
 /client/jsr-309/tck/server.log
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/parser/MgcpMessageParser.java /client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/parser/Utils.java /media-server-docs/sources-mobicents/src/main/resources/META-INF/MANIFEST.MF /media-server-docs/sources-mobicents/src/main/resources/META-INF/maven/org.mobicents.media.docs/mobicents-mms-docs-sources/pom.properties

=======================================
--- /client/jsr-309/tck/server.log      Sat Dec  8 15:29:16 2012
+++ /client/jsr-309/tck/server.log      Mon Dec 10 15:44:18 2012
@@ -1,6 +1,6 @@
-2012-12-08 22:09:14,323 DEBUG [TestBase] (main) Loading file:/opt/mobsource/medianew/client/jsr-309/tck/exclude-list.properties -2012-12-08 22:09:14,325 INFO [Runner] (main) Start mandatory.functional.mediagroup.PlayerTest.test_2_1_1_1_Play javadoc::Joinable::1 javadoc::MediaGroup::1 javadoc::MediaGroup::6 javadoc::Player::1 javadoc::PlayerEvent::15 -2012-12-08 22:09:14,325 DEBUG [TestBase] (main) Getting a MsControlFactory instance -2012-12-08 22:09:14,347 INFO [DriverImpl] (main) Initializing MGCP on /127.0.0.1:2729 -2012-12-08 22:09:14,360 WARN [JainMgcpStackImpl] (main) Failed to locate properties file, using default values -2012-12-08 22:09:14,370 INFO [JainMgcpStackImpl] (main) Jain Mgcp stack bound to IP /127.0.0.1 and UDP port 2729 +2012-12-11 00:49:12,933 DEBUG [TestBase] (main) Loading file:/opt/mobsource/medianew/client/jsr-309/tck/exclude-list.properties +2012-12-11 00:49:12,934 INFO [Runner] (main) Start mandatory.functional.mediagroup.PlayerTest.test_2_1_1_1_Play javadoc::Joinable::1 javadoc::MediaGroup::1 javadoc::MediaGroup::6 javadoc::Player::1 javadoc::PlayerEvent::15 +2012-12-11 00:49:12,935 DEBUG [TestBase] (main) Getting a MsControlFactory instance +2012-12-11 00:49:12,956 INFO [DriverImpl] (main) Initializing MGCP on /127.0.0.1:2729 +2012-12-11 00:49:12,969 WARN [JainMgcpStackImpl] (main) Failed to locate properties file, using default values +2012-12-11 00:49:12,979 INFO [JainMgcpStackImpl] (main) Jain Mgcp stack bound to IP /127.0.0.1 and UDP port 2729
=======================================
--- /client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/parser/MgcpMessageParser.java Sat Sep 15 16:38:09 2012 +++ /client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/parser/MgcpMessageParser.java Mon Dec 10 15:44:18 2012
@@ -49,14 +49,13 @@
 /**
  * Provides processing of the MGCP message.
  *
- * @author Oleg Kulikov
- * @author Pavel Mitrenko
+ * @author Yulian Oifa
  */
 public class MgcpMessageParser {

     private MgcpContentHandler contentHandler;
private static final Logger logger = Logger.getLogger(MgcpMessageParser.class);
-
+    private long totalTime=0;
     /** Creates a new instance of MgcpMessageParser */
     public MgcpMessageParser(MgcpContentHandler contentHandler) {
         if (contentHandler == null) {
@@ -66,60 +65,221 @@
     }

     public void parse(String message) throws IOException, ParseException {
-        StringReader stringReader = new StringReader(message);
-        BufferedReader reader = new BufferedReader(stringReader);
-
-        String header = reader.readLine();
-
-//        if (logger.isDebugEnabled()) {
-//            logger.debug("Read header: " + header);
-//        }
-        contentHandler.header(header);
+       int currIndex=0;
+       ParamLineValue paramOutput=new ParamLineValue();
+       LineValue output=new LineValue();
+       readLineWithTrim(message,currIndex,output);
+       String header=output.output;
+       currIndex=output.newIndex;
+       contentHandler.header(header);

-        boolean sdpPresent = false;
-        String line = null;
-
-        while ((line = reader.readLine()) != null) {
-            line = line.trim();
-//            if (logger.isDebugEnabled()) {
-//                logger.debug("Read line: " + line);
-//            }
-
-            sdpPresent = line.length() == 0;
+        boolean sdpPresent = false;
+       String line=null;
+       while (currIndex<message.length()) {
+               readParamLineWithTrim(message,currIndex,paramOutput);
+               currIndex=paramOutput.newIndex;
+
+ sdpPresent = (paramOutput.name==null || paramOutput.name.length()==0);
             if (sdpPresent) break;

-            int pos = line.indexOf(':');
-
-            if (pos < 0) {
+            if (paramOutput.value==null) {
                 logger.warn("Unrecognized parameter: " + line);
                 continue;
             }
-
-
-            String parmName = line.substring(0, pos).trim();
-            String parmValue = line.substring(pos + 1).trim();
-
-            contentHandler.param(parmName, parmValue);
+
+            contentHandler.param(paramOutput.name, paramOutput.value);
         }

-        boolean hasMore = false;
-        String ss = null;
-        try {
-            ss = reader.readLine();
-        } catch (IOException e) {
-
-        }
-        hasMore = ss != null;
-
-        if (sdpPresent || hasMore) {
-            String sdp = ss + "\n";
-            while ((line = reader.readLine()) != null) {
-                sdp = sdp + line.trim() + "\r\n";
+        if(sdpPresent)
+        {
+               long startTime=System.nanoTime();
+               StringBuilder sdp=new StringBuilder();
+               while (currIndex<message.length()) {
+                       readLineWithTrim(message,currIndex,output);
+               line=output.output;
+               currIndex=output.newIndex;
+               sdp.append(line);
+               }
+
+               if (logger.isDebugEnabled()) {
+ logger.debug("Read session description: " + sdp.toString());
             }
-            if (logger.isDebugEnabled()) {
-                logger.debug("Read session description: " + sdp);
-            }
-            contentHandler.sessionDescription(sdp);
+
+               contentHandler.sessionDescription(sdp.toString());
         }
     }
+
+ private void readParamLineWithTrim(String source,int startIndex,ParamLineValue result)
+    {
+       result.name=null;
+       result.value=null;
+       char currChar;
+       int i=startIndex;
+       for(;i<source.length();i++)
+       {
+               currChar=source.charAt(i);
+               if(currChar!=' ' && currChar!='\t')
+                       break;
+
+               startIndex++;
+       }
+
+       int endIndex=i;
+       for(;i<source.length();i++)
+       {
+               currChar=source.charAt(i);
+               if(currChar==':')
+               {
+                       i++;
+               break;
+               }
+
+               switch(currChar)
+               {
+                       case ' ':
+                       case '\t':
+                               break;
+                       case '\n':
+                               
result.name=source.substring(startIndex,endIndex);
+                               result.newIndex=i+1;
+                               return;
+                       case '\r':
+                               
result.name=source.substring(startIndex,endIndex);
+                               if(source.length()>i+1 && 
source.charAt(i+1)=='\n')
+                                       result.newIndex=i+1;
+                               else
+                                       result.newIndex=i+2;
+                               return;
+                       default:
+                               endIndex=i+1;
+                               break;
+               }
+       }
+
+       if(i==source.length())
+       {
+               result.name=source.substring(startIndex);
+               result.newIndex=source.length();
+               return;
+       }
+       else
+               result.name=source.substring(startIndex,endIndex);
+
+        startIndex=i;
+       for(;i<source.length();i++)
+       {
+               currChar=source.charAt(i);
+               if(currChar!=' ' && currChar!='\t')
+                       break;
+
+               startIndex++;
+       }
+
+       endIndex=i;
+       for(;i<source.length();i++)
+       {
+               currChar=source.charAt(i);
+               switch(currChar)
+               {
+                       case ' ':
+                       case '\t':
+                               break;
+                       case '\n':
+                               
result.value=source.substring(startIndex,endIndex);
+                               result.newIndex=i+1;
+                               return;
+                       case '\r':
+                               
result.value=source.substring(startIndex,endIndex);
+                               if(source.length()>i+1 && 
source.charAt(i+1)=='\n')
+                                       result.newIndex=i+1;
+                               else
+                                       result.newIndex=i+2;
+                               return;
+                       default:
+                               endIndex=i+1;
+                               break;
+               }
+       }
+
+       if(result.name==null)
+       {
+               if(endIndex==source.length())
+                               result.name=source.substring(startIndex);
+                       else
+                               
result.name=source.substring(startIndex,endIndex);
+       }
+       else
+       {
+               if(endIndex==source.length())
+                       result.value=source.substring(startIndex);
+               else
+                       result.value=source.substring(startIndex,endIndex);
+       }
+
+       result.newIndex=source.length();
+    }
+
+ private void readLineWithTrim(String source,int startIndex,LineValue result)
+    {
+       char currChar;
+       int i=startIndex;
+       for(;i<source.length();i++)
+       {
+               currChar=source.charAt(i);
+               if(currChar!=' ' && currChar!='\t')
+                       break;
+
+               startIndex++;
+       }
+
+       int endIndex=i;
+       for(;i<source.length();i++)
+       {
+               currChar=source.charAt(i);
+               switch(currChar)
+               {
+                       case ':':
+
+                               break;
+                       case ' ':
+                       case '\t':
+                               break;
+                       case '\n':
+                               
result.output=source.substring(startIndex,endIndex);
+                               result.newIndex=i+1;
+                               return;
+                       case '\r':
+                               
result.output=source.substring(startIndex,endIndex);
+                               if(source.length()>i+1 && 
source.charAt(i+1)=='\n')
+                                       result.newIndex=i+1;
+                               else
+                                       result.newIndex=i+2;
+
+                               return;
+                       default:
+                               endIndex=i+1;
+                               break;
+               }
+       }
+
+       if(endIndex==source.length())
+               result.output=source.substring(startIndex);
+       else
+               result.output=source.substring(startIndex,endIndex);
+
+       result.newIndex=source.length();
+    }
+
+    private class ParamLineValue
+    {
+       protected int newIndex;
+       protected String name;
+       protected String value;
+    }
+
+    private class LineValue
+    {
+       protected int newIndex;
+       protected String output;
+    }
 }
=======================================
--- /client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/parser/Utils.java Sat Sep 15 16:38:09 2012 +++ /client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/parser/Utils.java Mon Dec 10 15:44:18 2012
@@ -79,6 +79,7 @@
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.StringTokenizer;

 import org.apache.log4j.Logger;
 import org.mobicents.protocols.mgcp.jain.pkg.AUMgcpEvent;
@@ -123,18 +124,33 @@
        }

        public String[] splitStringBySpace(String value) {
-               // return spacePattern.split(value, 0);
-               try {
-                       String[] token = null;
-                       this.split(' ', value, decdEventName);
-                       token = new String[decdEventName.size()];
-                       decdEventName.toArray(token);
-                       return token;
-               } finally {
-                       decdEventName.clear();
-               }
-       }
-
+               long startTime=System.nanoTime();
+               decdEventName.clear();
+               int startIndex=0;
+               boolean hasData=false;
+               for(int i=0;i<value.length();i++)
+                       if(value.charAt(i)==' ')
+                       {
+                               if(hasData)
+                               {
+                                       
decdEventName.add(value.substring(startIndex,i));
+                                       startIndex=i+1;
+                                       hasData=false;
+                               }
+                               else
+                                       startIndex++;
+                       }
+                       else
+                               hasData=true;
+
+               if(startIndex<value.length()-1)
+                       decdEventName.add(value.substring(startIndex));
+
+               String[] token = new String[decdEventName.size()];
+               decdEventName.toArray(token);
+               return token;
+       }
+
        /**
         * Create ConnectionMode object from given text value.
         *
=======================================
--- /media-server-docs/sources-mobicents/src/main/resources/META-INF/MANIFEST.MF Sat Dec 8 15:29:16 2012 +++ /media-server-docs/sources-mobicents/src/main/resources/META-INF/MANIFEST.MF Mon Dec 10 15:44:18 2012
@@ -13,7 +13,7 @@
 Bundle-Vendor: TeleStax, Inc.
 Implementation-Vendor-Id: TeleStax, Inc.
 Bundle-Version: 3.0.0.FINAL
-Bnd-LastModified: 1354997083364
+Bnd-LastModified: 1355177063505
 Bundle-ManifestVersion: 2
 Bundle-License: http://www.gnu.org/licenses/lgpl-2.1.html
 Bundle-Description: Mobicents :: Parent pom for 2.x releases
=======================================
--- /media-server-docs/sources-mobicents/src/main/resources/META-INF/maven/org.mobicents.media.docs/mobicents-mms-docs-sources/pom.properties Sat Dec 8 15:29:16 2012 +++ /media-server-docs/sources-mobicents/src/main/resources/META-INF/maven/org.mobicents.media.docs/mobicents-mms-docs-sources/pom.properties Mon Dec 10 15:44:18 2012
@@ -1,5 +1,5 @@
 #Generated by Maven
-#Sat Dec 08 22:04:43 IST 2012
+#Tue Dec 11 00:04:23 IST 2012
 version=3.0.0.FINAL
 groupId=org.mobicents.media.docs
 artifactId=mobicents-mms-docs-sources

Reply via email to