- Moved the integration tests to the remoting module as they require remoting to run (not ideal solution)
- Enabled the integation tests again
- Implemented a new serialization option "allow-xml" which is disabled per default which completely disables deserialization of xml documents.
diff --git a/core/pom.xml b/core/pom.xml
index 5a642bf..54761cd 100755
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -60,20 +60,6 @@
     </dependency>
 
     <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <version>9.1.0.v20131115</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <version>9.1.0.v20131115</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>
diff --git a/core/src/main/java/flex/messaging/endpoints/AbstractEndpoint.java b/core/src/main/java/flex/messaging/endpoints/AbstractEndpoint.java
index c265ea9..6bc8c88 100644
--- a/core/src/main/java/flex/messaging/endpoints/AbstractEndpoint.java
+++ b/core/src/main/java/flex/messaging/endpoints/AbstractEndpoint.java
@@ -109,6 +109,7 @@
     private static final String LEGACY_THROWABLE = "legacy-throwable";
     private static final String LEGACY_BIG_NUMBERS = "legacy-big-numbers";
     private static final String LEGACY_EXTERNALIZABLE = "legacy-externalizable";
+    private static final String ALLOW_XML = "allow-xml";
     private static final String ALLOW_XML_DOCTYPE_DECLARATION = "allow-xml-doctype-declaration";
     private static final String ALLOW_XML_EXTERNAL_ENTITY_EXPANSION = "allow-xml-external-entity-expansion";
 
@@ -279,6 +280,7 @@
             serializationContext.legacyThrowable = serialization.getPropertyAsBoolean(LEGACY_THROWABLE, false);
             serializationContext.legacyBigNumbers = serialization.getPropertyAsBoolean(LEGACY_BIG_NUMBERS, false);
             serializationContext.legacyExternalizable = serialization.getPropertyAsBoolean(LEGACY_EXTERNALIZABLE, false);
+            serializationContext.allowXml = serialization.getPropertyAsBoolean(ALLOW_XML, false);
             serializationContext.allowXmlDoctypeDeclaration = serialization.getPropertyAsBoolean(ALLOW_XML_DOCTYPE_DECLARATION, false);
             serializationContext.allowXmlExternalEntityExpansion = serialization.getPropertyAsBoolean(ALLOW_XML_EXTERNAL_ENTITY_EXPANSION, false);
             serializationContext.maxObjectNestLevel = (int)serialization.getPropertyAsLong(MAX_OBJECT_NEST_LEVEL, 512);
diff --git a/core/src/main/java/flex/messaging/io/SerializationContext.java b/core/src/main/java/flex/messaging/io/SerializationContext.java
index 9ffe17c..79bb2d7 100644
--- a/core/src/main/java/flex/messaging/io/SerializationContext.java
+++ b/core/src/main/java/flex/messaging/io/SerializationContext.java
@@ -80,6 +80,7 @@
     // Similarly like how many dimensional matrix that we support for serialization.
     public int maxCollectionNestLevel = 15;
 
+    public boolean allowXml = false;
     public boolean allowXmlDoctypeDeclaration = false;
     public boolean allowXmlExternalEntityExpansion = false;
 
@@ -228,6 +229,7 @@
             context.deserializationValidator = deserializationValidator;
             context.maxObjectNestLevel = maxObjectNestLevel;
             context.maxCollectionNestLevel = maxCollectionNestLevel;
+            context.allowXml = allowXml;
             context.allowXmlDoctypeDeclaration = allowXmlDoctypeDeclaration;
             context.allowXmlExternalEntityExpansion = allowXmlExternalEntityExpansion;
             context.preferVectors = preferVectors;
diff --git a/core/src/main/java/flex/messaging/io/amf/Amf0Input.java b/core/src/main/java/flex/messaging/io/amf/Amf0Input.java
index fa66ae9..619f453 100644
--- a/core/src/main/java/flex/messaging/io/amf/Amf0Input.java
+++ b/core/src/main/java/flex/messaging/io/amf/Amf0Input.java
@@ -29,6 +29,8 @@
 import flex.messaging.io.SerializationContext;
 import flex.messaging.io.SerializationException;
 import flex.messaging.io.UnknownTypeException;
+import flex.messaging.log.Log;
+import flex.messaging.log.LogCategories;
 import flex.messaging.util.ClassUtil;
 
 /**
@@ -510,10 +512,18 @@
     {
         String xml = readLongUTF();
 
-        if (isDebug)
+        if (isDebug) {
             trace.write(xml);
+        }
 
-        return stringToDocument(xml);
+        // Only deserialize xml if this is enabled.
+        if (context.allowXml) {
+            return stringToDocument(xml);
+        } else {
+            Log.getLogger(LogCategories.CONFIGURATION).warn(
+                    "Xml deserialization is disabled, please enable by setting allowXml to 'true'");
+            return null;
+        }
     }
 
 
diff --git a/core/src/main/java/flex/messaging/io/amf/Amf3Input.java b/core/src/main/java/flex/messaging/io/amf/Amf3Input.java
index 0e62b88..33109f6 100644
--- a/core/src/main/java/flex/messaging/io/amf/Amf3Input.java
+++ b/core/src/main/java/flex/messaging/io/amf/Amf3Input.java
@@ -33,6 +33,8 @@
 import flex.messaging.io.SerializationException;
 import flex.messaging.io.UnknownTypeException;
 import flex.messaging.io.amf.AmfTrace.VectorType;
+import flex.messaging.log.Log;
+import flex.messaging.log.LogCategories;
 import flex.messaging.util.ClassUtil;
 import flex.messaging.util.Trace;
 
@@ -982,7 +984,14 @@
                 trace.write(xml);
         }
 
-        return stringToDocument(xml);
+        // Only deserialize xml if this is enabled.
+        if (context.allowXml) {
+            return stringToDocument(xml);
+        } else {
+            Log.getLogger(LogCategories.CONFIGURATION).warn(
+                    "Xml deserialization is disabled, please enable by setting allowXml to 'true'");
+            return null;
+        }
     }
 
     /**
diff --git a/core/src/main/java/flex/messaging/io/amf/client/AMFConnection.java b/core/src/main/java/flex/messaging/io/amf/client/AMFConnection.java
index eae4ca3..134a431 100644
--- a/core/src/main/java/flex/messaging/io/amf/client/AMFConnection.java
+++ b/core/src/main/java/flex/messaging/io/amf/client/AMFConnection.java
@@ -565,6 +565,27 @@
      */
     public void connect(String connectUrl) throws ClientStatusException
     {
+        SerializationContext serializationContext = new SerializationContext();
+        serializationContext.createASObjectForMissingType = true;
+        // Make sure collections are written out as Arrays (vs. ArrayCollection),
+        // in case the server does not recognize ArrayCollections.
+        serializationContext.legacyCollection = true;
+        // When legacyMap is true, Java Maps are serialized as ECMA arrays
+        // instead of anonymous Object.
+        serializationContext.legacyMap = true;
+        connect(connectUrl, serializationContext);
+    }
+
+    /**
+     * Connects to the URL provided. Any previous connections are closed.
+     *
+     * @param connectUrl The url to connect to.
+     * @param serializationContext The serialization context used to configure the serialization.
+     *
+     * @throws ClientStatusException If there is a client side exception.
+     */
+    public void connect(String connectUrl, SerializationContext serializationContext) throws ClientStatusException
+    {
         if (connected)
             close();
 
@@ -586,15 +607,7 @@
         try
         {
             urlObject = new URL(encodedUrl != null? encodedUrl : url);
-
-            serializationContext = new SerializationContext();
-            serializationContext.createASObjectForMissingType = true;
-            // Make sure collections are written out as Arrays (vs. ArrayCollection),
-            // in case the server does not recognize ArrayCollections.
-            serializationContext.legacyCollection = true;
-            // When legacyMap is true, Java Maps are serialized as ECMA arrays
-            // instead of anonymous Object.
-            serializationContext.legacyMap = true;
+            this.serializationContext = serializationContext;
             internalConnect();
         }
         catch (IOException e)
diff --git a/pom.xml b/pom.xml
index 0ccc7e1..823f6d9 100755
--- a/pom.xml
+++ b/pom.xml
@@ -181,8 +181,7 @@
         </configuration>
       </plugin>
 
-      <!-- FIXME: Disabled the integrationtests for now -->
-      <!--plugin>
+      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-failsafe-plugin</artifactId>
         <executions>
@@ -193,7 +192,7 @@
             </goals>
           </execution>
         </executions>
-      </plugin-->
+      </plugin>
 
       <!-- Turned off till the JavaDoc tags are all correctly set -->
       <plugin>
diff --git a/remoting/pom.xml b/remoting/pom.xml
index 245fd8c..9d48643 100755
--- a/remoting/pom.xml
+++ b/remoting/pom.xml
@@ -37,6 +37,20 @@
     </dependency>
 
     <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+      <version>9.1.0.v20131115</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlet</artifactId>
+      <version>9.1.0.v20131115</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>
diff --git a/core/src/test/java/amfclient/ClientCustomType.java b/remoting/src/test/java/amfclient/ClientCustomType.java
similarity index 100%
rename from core/src/test/java/amfclient/ClientCustomType.java
rename to remoting/src/test/java/amfclient/ClientCustomType.java
diff --git a/core/src/test/java/flex/messaging/io/amf/client/AMFConnectionIT.java b/remoting/src/test/java/flex/messaging/io/amf/client/AMFConnectionIT.java
similarity index 100%
rename from core/src/test/java/flex/messaging/io/amf/client/AMFConnectionIT.java
rename to remoting/src/test/java/flex/messaging/io/amf/client/AMFConnectionIT.java
diff --git a/core/src/test/java/flex/messaging/io/amf/client/AMFDataTypeIT.java b/remoting/src/test/java/flex/messaging/io/amf/client/AMFDataTypeIT.java
similarity index 86%
rename from core/src/test/java/flex/messaging/io/amf/client/AMFDataTypeIT.java
rename to remoting/src/test/java/flex/messaging/io/amf/client/AMFDataTypeIT.java
index e7706b0..0347a20 100644
--- a/core/src/test/java/flex/messaging/io/amf/client/AMFDataTypeIT.java
+++ b/remoting/src/test/java/flex/messaging/io/amf/client/AMFDataTypeIT.java
@@ -19,6 +19,7 @@
 import java.util.Date;
 import java.util.List;
 
+import flex.messaging.io.SerializationContext;
 import flex.messaging.util.TestServerWrapper;
 import junit.extensions.TestSetup;
 import org.w3c.dom.Document;
@@ -49,6 +50,7 @@
 
     private static TestServerWrapper serverWrapper;
     private static int serverPort;
+    private static SerializationContext serializationContext;
 
     /**
      * Given a remote method name, returns the AMF connection call needed using
@@ -88,7 +90,9 @@
         suite.addTest(new AMFDataTypeIT("testCallDoubleArgDoubleReturn"));
         suite.addTest(new AMFDataTypeIT("testCallIntArrayArgIntArrayReturn"));
         suite.addTest(new AMFDataTypeIT("testCallObjectArrayArgObjectArrayReturn"));
-        suite.addTest(new AMFDataTypeIT("testXMLDocument"));
+        suite.addTest(new AMFDataTypeIT("testXMLDocumentEnabledXml"));
+        suite.addTest(new AMFDataTypeIT("testXMLDocumentDisabledXml"));
+
 
         return new TestSetup(suite) {
             protected void setUp() throws Exception {
@@ -100,6 +104,17 @@
                 AMFConnection.registerAlias(
                         "remoting.amfclient.ServerCustomType" /* server type */,
                         "amfclient.ClientCustomType" /* client type */);
+
+                serializationContext = new SerializationContext();
+                serializationContext.createASObjectForMissingType = true;
+                // Make sure collections are written out as Arrays (vs. ArrayCollection),
+                // in case the server does not recognize ArrayCollections.
+                serializationContext.legacyCollection = true;
+                // When legacyMap is true, Java Maps are serialized as ECMA arrays
+                // instead of anonymous Object.
+                serializationContext.legacyMap = true;
+                // Disable serialization of xml documents.
+                serializationContext.allowXml = false;
             }
             protected void tearDown() throws Exception {
                 serverWrapper.stopServer();
@@ -421,11 +436,14 @@
         }
     }
 
-  
-    public void testXMLDocument()
+
+    public void testXMLDocumentEnabledXml()
     {
         try
         {
+            // Temporarily enable xml serialization/deserialization.
+            serializationContext.allowXml = true;
+
             String method = "echoObject1";
             final StringBuffer xml = new StringBuffer(512);
             xml.append("<test>    <item id=\"1\">        <sweet/>    </item></test>");
@@ -452,6 +470,43 @@
         {
             fail(UNEXPECTED_EXCEPTION_STRING + e);
         }
+        finally {
+            // Disable xml serialization/deserialization again.
+            serializationContext.allowXml = false;
+        }
+    }
+
+
+    public void testXMLDocumentDisabledXml()
+    {
+        try
+        {
+            String method = "echoObject1";
+            final StringBuffer xml = new StringBuffer(512);
+            xml.append("<test>    <item id=\"1\">        <sweet/>    </item></test>");
+
+            Document xmlDoc = XMLUtil.stringToDocument(xml.toString());
+            final Object methodArg = xmlDoc;
+            internalTestCall(getOperationCall(method), methodArg, new CallResultHandler(){
+                public void onResult(Object result)
+                {
+                    try
+                    {
+                        Document retXmlDoc = (Document)result;
+                        String retXML = XMLUtil.documentToString(retXmlDoc);
+                        Assert.assertEquals("", retXML);
+                    }
+                    catch (Exception e)
+                    {
+                        fail(UNEXPECTED_EXCEPTION_STRING + e);
+                    }
+                }
+            });
+        }
+        catch (Exception e)
+        {
+            fail(UNEXPECTED_EXCEPTION_STRING + e);
+        }
     }
 
     // A simple interface to handle AMF call results.
@@ -466,7 +521,7 @@
     {
         AMFConnection amfConnection = new AMFConnection();
         // Connect.
-        amfConnection.connect(getConnectionUrl());
+        amfConnection.connect(getConnectionUrl(), serializationContext);
         // Make a remoting call and retrieve the result.
         Object result;
         if (methodArg == null)
diff --git a/core/src/test/java/flex/messaging/util/TestServer.java b/remoting/src/test/java/flex/messaging/util/TestServer.java
similarity index 93%
rename from core/src/test/java/flex/messaging/util/TestServer.java
rename to remoting/src/test/java/flex/messaging/util/TestServer.java
index 197db97..df21561 100644
--- a/core/src/test/java/flex/messaging/util/TestServer.java
+++ b/remoting/src/test/java/flex/messaging/util/TestServer.java
@@ -45,7 +45,12 @@
         servlet.setInitParameter("services.configuration.file", configPath);
         context.addServlet(servlet, "/messagebroker/amf/*");
         server.setHandler(context);
-        server.start();
+        server.setDumpAfterStart(true);
+        try {
+            server.start();
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
 
         int port = ((ServerConnector) server.getConnectors()[0]).getLocalPort();
         System.out.println("Port:" + port);
diff --git a/core/src/test/java/flex/messaging/util/TestServerWrapper.java b/remoting/src/test/java/flex/messaging/util/TestServerWrapper.java
similarity index 96%
rename from core/src/test/java/flex/messaging/util/TestServerWrapper.java
rename to remoting/src/test/java/flex/messaging/util/TestServerWrapper.java
index cbde0e4..b9fb954 100644
--- a/core/src/test/java/flex/messaging/util/TestServerWrapper.java
+++ b/remoting/src/test/java/flex/messaging/util/TestServerWrapper.java
@@ -39,7 +39,7 @@
         final String path = System.getProperty("java.home") + separator + "bin" + separator + "java";
         System.out.print("Starting test-server");
         final ProcessBuilder processBuilder = new ProcessBuilder(path,
-                /*"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005",*/
+                "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005",
                 "-cp", /*"\"" +*/ classpath /*+ "\""*/,
                 TestServer.class.getCanonicalName(), /*"\"" +*/ configPath /*+ "\""*/);
         processBuilder.redirectErrorStream(true);
diff --git a/core/src/test/resources/WEB-INF/flex/remoting-config.xml b/remoting/src/test/resources/WEB-INF/flex/remoting-config.xml
similarity index 100%
rename from core/src/test/resources/WEB-INF/flex/remoting-config.xml
rename to remoting/src/test/resources/WEB-INF/flex/remoting-config.xml
diff --git a/core/src/test/resources/WEB-INF/flex/services-config.xml b/remoting/src/test/resources/WEB-INF/flex/services-config.xml
similarity index 91%
rename from core/src/test/resources/WEB-INF/flex/services-config.xml
rename to remoting/src/test/resources/WEB-INF/flex/services-config.xml
index 30277dd..2bbf7d7 100644
--- a/core/src/test/resources/WEB-INF/flex/services-config.xml
+++ b/remoting/src/test/resources/WEB-INF/flex/services-config.xml
@@ -26,6 +26,11 @@
     <channels>
         <channel-definition id="amf" class="mx.messaging.channels.AMFChannel">
             <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
+            <properties>
+                <serialization>
+                    <allow-xml>true</allow-xml>
+                </serialization>
+            </properties>
         </channel-definition>
     </channels>