public Activity Parse(XElement inputElement)
        {
            var activity = new JavaActivity ();

            activity.Name = inputElement.Attribute ("name").Value;
            activity.Type = (ActivityType) inputElement.Element (XmlnsConstant.tibcoProcessNameSpace + "type").Value;

            var configElement = inputElement.Element ("config");

            activity.FileName = XElementParserUtils.GetStringValue(configElement.Element("fileName"));
            activity.PackageName = XElementParserUtils.GetStringValue(configElement.Element("packageName"));
            activity.FullSource = XElementParserUtils.GetStringValue(configElement.Element("fullsource"));

            activity.InputData = this.GetInputOrOutputData(configElement.Element("inputData"));
            activity.OutputData = this.GetInputOrOutputData(configElement.Element("outputData"));

            activity.InputBindings = inputElement.Element (XmlnsConstant.tibcoProcessNameSpace + "inputBindings").Nodes();

            if (inputElement.Element(XmlnsConstant.tibcoProcessNameSpace + "inputBindings") != null && inputElement.Element(XmlnsConstant.tibcoProcessNameSpace + "inputBindings").Element("javaCodeActivityInput") != null)
            {
                activity.InputBindings = inputElement.Element(XmlnsConstant.tibcoProcessNameSpace + "inputBindings").Element("javaCodeActivityInput").Nodes();
                activity.Parameters = new XslParser().Build(activity.InputBindings);
            }

            return activity;
        }
        public CodeTypeDeclaration GenerateClass(JavaActivity activity)
        {
            var javaClass = new CodeTypeDeclaration(activity.FileName);
            javaClass.IsClass = true;
            javaClass.TypeAttributes = TypeAttributes.Public;
            javaClass.BaseTypes.Add(new CodeTypeReference("IJavaActivtyService"));

            javaClass.Comments.Add(new CodeCommentStatement(activity.FullSource));

            return javaClass;
        }
        public void SetUp()
        {
            this.activityBuilder = new JavaActivityBuilder(new XslBuilder(new XpathBuilder()));
            this.activity = new JavaActivity( "My Activity Name",ActivityType.javaActivityType);
            this.activity.FileName = "MyJavaFileName";
            this.activity.PackageName = "My.Package.Name";
            this.activity.FullSource = @" package My.Package.Name
            import java.util.*;
            import java.io.*;
            public class MyJavaFileName{
            protected String platform = "";
            public String getplatform(){return platform;}
            public String setplatform(String val){platform = val;}

            protected Date lastDate = null;
            public String getlastDate(){return lastDate;}
            public String setlastDate(Date val){lastDate = val;}

            public MyJavaFileName(){}

            public void invoke () throws Exception{
            setlastDate(System.getDate());
            }

            }

            ";
            var xml =
                @"
            <javaCodeActivityInput xmlns:xsl=""http://w3.org/1999/XSL/Transform"" >
            <platform>
            <xsl:value-of select=""'testvalue'""/>
            </platform>
            </javaCodeActivityInput>
            ";
            XElement doc = XElement.Parse(xml);
            this.activity.InputBindings = doc.Nodes();
            this.activity.Parameters = new List<ClassParameter>{
                new ClassParameter{
                    Name = "platform",
                    Type= "string"}
            };
            this.activity.InputData = new List<ClassParameter>{
                new ClassParameter{
                    Name = "platform",
                    Type= "string"}
            };
            this.activity.OutputData = new List<ClassParameter>{
                new ClassParameter{
                    Name = "lastDate",
                    Type= "date"}
            };
        }
        public CodeStatementCollection GenerateCodeInvocation(JavaActivity javaActivity)
        {
            var invocationCodeCollection = new CodeStatementCollection();
            invocationCodeCollection.AddRange(DefaultActivityBuilder.LogActivity(javaActivity));

            invocationCodeCollection.AddRange(this.xslBuilder.Build(javaActivity.InputBindings));

            var variableReturnType = new CodeTypeReference(javaActivity.PackageName + "." + javaActivity.FileName);
            var creation = new CodeObjectCreateExpression (variableReturnType, new CodeExpression[0]);

            string javaClassVariableName = VariableHelper.ToVariableName(javaActivity.FileName);
            var codeInvocation = new CodeVariableDeclarationStatement(variableReturnType, javaClassVariableName, creation);

            invocationCodeCollection.Add(codeInvocation);

            CodeVariableReferenceExpression javaClassReference = new CodeVariableReferenceExpression();
            javaClassReference.VariableName = javaClassVariableName;

            //add input to java class
            invocationCodeCollection.AddRange(this.GenerateInputCallOnJavaClass(javaActivity, javaClassReference));

            // add call ti invoke methode
            invocationCodeCollection.Add(this.GenerateInvokeCallOnJavaClass(javaClassReference));

            // instanciate the result class
            var activityReturnType = new CodeTypeReference(javaActivity.PackageName + "." + VariableHelper.ToClassName(javaActivity.Name));
            var creationActivityReturn = new CodeObjectCreateExpression (activityReturnType, new CodeExpression[0]);

            string activityClassVariableName = VariableHelper.ToVariableName(javaActivity.Name);
            var codeActivityInvocation = new CodeVariableDeclarationStatement(activityReturnType, activityClassVariableName, creationActivityReturn);

            invocationCodeCollection.Add(codeActivityInvocation);

            // retrieve the output
            CodeVariableReferenceExpression activityClassReference = new CodeVariableReferenceExpression();
            activityClassReference.VariableName = activityClassVariableName;

            invocationCodeCollection.AddRange(this.GenerateOutputCallOnJavaClass(javaActivity, javaClassReference, activityClassReference));

            return invocationCodeCollection;
        }
        public CodeNamespaceCollection Build(JavaActivity activity)
        {
            var javaNamespace = new CodeNamespace(activity.PackageName);

            // Generate the Service
            javaNamespace.Imports.AddRange(this.GenerateImports());
            var javaClass = this.GenerateClass(activity);
            javaClass.Members.Add(this.GenerateInvokeMethod());
            javaNamespace.Types.Add(javaClass);

            var codeNameSpaces =  new CodeNamespaceCollection {javaNamespace};

            // Generate the corresponding interface
            if (ConfigurationApp.GetProperty ("IsJavaInterfaceAlreadyGenerated") != "true")
            {
                //TODO : Refactor because it's a bit dirty
                var javaServiceInterfaceNameSpace = InterfaceExtractorFromClass.Extract(javaClass, TargetAppNameSpaceService.javaToolsNameSpace);
                javaServiceInterfaceNameSpace.Types[0].Name = "IJavaActivtyService";
                codeNameSpaces.Add(javaServiceInterfaceNameSpace);
                ConfigurationApp.SaveProperty("IsJavaInterfaceAlreadyGenerated", "true");
            }

            return codeNameSpaces;
        }
        private CodeStatementCollection GenerateOutputCallOnJavaClass(JavaActivity javaActivity, CodeVariableReferenceExpression javaClassReference, CodeVariableReferenceExpression activityClassReference)
        {
            var invocationCodeCollection = new CodeStatementCollection();
            foreach (var parameter in javaActivity.OutputData)
            {
                CodeAssignStatement _assign1 = new CodeAssignStatement();

                CodePropertyReferenceExpression _prop1 = new CodePropertyReferenceExpression();
                _prop1.PropertyName = parameter.Name;
                _prop1.TargetObject = activityClassReference;
                _assign1.Left = _prop1;
             //           CodePrimitiveExpression _value1 = new CodePrimitiveExpression();
              //          _value1.Value = "testvalue";
               //         _assign1.Right = _value1;
            //        __ctor_ctor1.Statements.Add(_assign1);

                CodeMethodInvokeExpression getterCall = new CodeMethodInvokeExpression();
                getterCall.Parameters.AddRange(new CodeExpression[0]);
                CodeMethodReferenceExpression getterMethod = new CodeMethodReferenceExpression();
                getterMethod.MethodName = "get" + parameter.Name;
                getterMethod.TargetObject = javaClassReference;
                getterCall.Method = getterMethod;
                _assign1.Right = getterCall;
                invocationCodeCollection.Add(_assign1);
            }

            return invocationCodeCollection;
        }
        private CodeStatementCollection GenerateInputCallOnJavaClass(JavaActivity javaActivity, CodeVariableReferenceExpression javaClassReference)
        {
            var invocationCodeCollection = new CodeStatementCollection();
            foreach (var parameter in javaActivity.Parameters)
            {
                CodeMethodInvokeExpression setterCall = new CodeMethodInvokeExpression();
                setterCall.Parameters.AddRange(new List<CodeExpression> {
                    new CodeSnippetExpression(parameter.Name)
                }.ToArray());
                CodeMethodReferenceExpression setterMethod = new CodeMethodReferenceExpression();
                setterMethod.MethodName = "set" + parameter.Name;
                setterMethod.TargetObject = javaClassReference;
                setterCall.Method = setterMethod;
                invocationCodeCollection.Add(setterCall);
            }

            return invocationCodeCollection;
        }