Пример #1
0
        public BindingTypeHolder CheckForBindings(List<Binding> bindings)
        {
            BindingTypeHolder result = new BindingTypeHolder();

            foreach (Binding binding in bindings)
            {
                if (binding.Transport is RestTransportBindingElement)
                {
                    result.HasRestBinding = true;
                }
                else if (binding.Transport is WebSocketTransportBindingElement)
                {
                    result.HasWebSocketBinding = true;
                }
                else
                {
                    foreach (EncodingBindingElement encoding in binding.Encodings)
                    {
                        if (encoding is SoapEncodingBindingElement)
                        {
                            result.HasWebServiceBinding = true;
                        }
                    }
                }
            }

            return result;
        }
Пример #2
0
        public Dictionary<string, string> GenerateComponent(Namespace ns, List<Wire> wires, List<string> modules)
        {
            Dictionary<string, string> properties = new Dictionary<string, string>();
            foreach (Component component in ns.Declarations.OfType<Component>())
            {
                modules.Add(component.Name);
                ComponentType cType = ComponentType.IMPLEMENTATION;

                Dictionary<Reference, Component> dependencyMap = this.dependencyDiscoverer.GetherDependencyMap(ns, wires, component);

                List<string> dependencies = this.dependencyDiscoverer.GetherDependencies(dependencyMap);

                bool directDataAccess = this.dataAccessFinder.HasAnyDirectDataAccess(ns, wires, component);

                if (component.Services.Any())
                {
                    this.GenerateServiceImplementations(ns, modules, wires, component, dependencies, dependencyMap);
                }
                else
                {
                    if (component.Implementation != null && component.Implementation.Name.Equals("JSF"))
                    {
                        cType = ComponentType.WEB;
                        this.jSFGenerator.GenerateWebTier(ns, component, directDataAccess);
                    }
                    if (component is Composite)
                    {
                        string facadeDir = this.directoryHandler.createJavaDirectory(ns, component.Name, generatorUtil.Properties.serviceFacadePackage);
                        string facadeFile = Path.Combine(facadeDir, component.Name + "Facade.java");
                        using (StreamWriter writer = new StreamWriter(facadeFile))
                        {
                            writer.WriteLine(this.springClassGen.GenerateComponent(component));
                        }
                    }
                }
                BindingTypeHolder clientFor = new BindingTypeHolder();
                if (component.References.Any())
                {
                    clientFor = this.GenerateReferenceAccessors(ns, component, directDataAccess, dependencyMap, properties);
                }

                // generate pom.xml and spring-config.xml of Business Logic module
                this.directoryHandler.createJavaDirectory(ns, component.Name, "");
                string fileName = Path.Combine(ns.Name + "-" + component.Name, "pom.xml");
                using (StreamWriter writer = new StreamWriter(fileName))
                {
                    string s = this.springConfigGen.GenerateComponentPom(ns, component, dependencies,
                        clientFor.HasRestBinding, clientFor.HasWebServiceBinding, clientFor.HasWebSocketBinding, cType);
                    writer.WriteLine(s);
                }

                string javaDir = this.directoryHandler.createJavaDirectory(ns, component.Name, "", false);
                fileName = Path.Combine(javaDir, "spring-config.xml");
                using (StreamWriter writer = new StreamWriter(fileName))
                {
                    writer.WriteLine(this.springConfigGen.GenerateComponentSpringConfig(ns));
                }
            }
            return properties;
        }
Пример #3
0
        private void GenerateServiceImplementations(Namespace ns, List<string> modules, List<Wire> wires, Component component,
            List<string> dependencies, Dictionary<Reference, Component> dependencyMap)
        {
            modules.Add(component.Name + "-API");
            BindingTypeHolder bindingsOfModule = new BindingTypeHolder();

            string dataModule = "";
            string dataBinding = "";
            foreach (Reference reference in component.References)
            {
                if (reference.Interface is Database)
                {
                    dataModule = dependencyMap[reference].Name;
                    List<Binding> binds = bindingDiscoverer.GetBindings(ns, reference);
                    BindingTypeHolder binding = bindingDiscoverer.CheckForBindings(binds);
                    if (binding.HasRestBinding)
                        dataBinding = "Rest";
                    else if (binding.HasWebServiceBinding)
                        dataBinding = "WebService";
                    else if (binding.HasWebSocketBinding)
                        dataBinding = "WebSocket";
                }
            }

            bool hasDirectDataAccess = dataBinding == "" && this.dataAccessFinder.HasDirectDataAccess(ns, wires, component, dataModule);
            foreach (Service service in component.Services)
            {
                if (service.Interface is Database)
                {
                    hasDirectDataAccess = true; //itself
                }
            }

            ComponentType cType = ComponentType.API;

            foreach (Service service in component.Services)
            {
                Interface iface = service.Interface;

                if (iface is Database) { cType = ComponentType.DATA; continue; } // Repositry interfaces have been generated already

                string package = this.PackageOf(iface);
                string apiIfDirectory = this.directoryHandler.createJavaDirectory(ns, component.Name + "-API", package);
                string functionDirectory = this.directoryHandler.createJavaDirectory(ns, component.Name, component.Name.ToLower());

                string entityName = null;
                if (package == this.generatorUtil.Properties.interfacePackage)
                {
                    // interface goes to API
                    string interfaceFileName = Path.Combine(apiIfDirectory, iface.Name + ".java");
                    using (StreamWriter writer = new StreamWriter(interfaceFileName))
                    {
                        writer.WriteLine(this.springInterfaceGen.GenerateInterface(iface, "", package, null));
                    }

                    // implementaton goes to component
                    string javaFileName = Path.Combine(functionDirectory, iface.Name + "Impl.java");
                    using (StreamWriter writer = new StreamWriter(javaFileName))
                    {
                        writer.WriteLine(this.springInterfaceGen.GenerateInterfaceImplementation(iface, component.Name.ToLower(), dataBinding));
                    }
                }
                else // a Spring Repository
                {
                    Struct entity = null;
                    foreach (Operation op in iface.Operations)
                    {
                        if (op.Name == "delete")
                        {
                            if (op.Parameters.Count == 1)
                            {
                                SoalType type = op.Parameters[0].Type;
                                if (type is Struct)
                                {
                                    entity = type as Struct;
                                    break;
                                }
                            }
                        }
                    }
                    if (entity != null)
                    {
                        entityName = entity.Name;
                        string javaFileName = Path.Combine(apiIfDirectory, entityName + "Repository.java");
                        using (StreamWriter writer = new StreamWriter(javaFileName))
                        {
                            writer.WriteLine(this.springClassGen.GenerateRepository(entity));
                        }
                    }
                }

                List<Binding> bindings = this.bindingDiscoverer.GetBindings(ns, service);
                BindingTypeHolder bindingsOfService = this.bindingDiscoverer.CheckForBindings(bindings);

                this.CreateBindings(bindingsOfService, component, iface, apiIfDirectory, functionDirectory, package, entityName, dataBinding);

                bindingsOfModule.HasRestBinding |= bindingsOfService.HasRestBinding;
                bindingsOfModule.HasWebServiceBinding |= bindingsOfService.HasWebServiceBinding;
                bindingsOfModule.HasWebSocketBinding |= bindingsOfService.HasWebSocketBinding;

                foreach (Operation op in iface.Operations)
                {
                    foreach (Struct exception in op.Exceptions)
                    {
                        string apiExDirectory = this.directoryHandler.createJavaDirectory(ns, component.Name + "-API", generatorUtil.Properties.exceptionPackage);
                        string exFileName = Path.Combine(apiExDirectory, exception.Name + ".java");
                        using (StreamWriter writer = new StreamWriter(exFileName))
                        {
                            writer.WriteLine(this.springClassGen.GenerateException(exception));
                        }
                    }
                }
            }

            // pom.xml of API
            List<string> apiDependencies = new List<string>(dependencies);
            apiDependencies.Add("Model");
            this.directoryHandler.createJavaDirectory(ns, component.Name + "-API", "");
            string fileName = Path.Combine(ns.Name + "-" + component.Name + "-API", "pom.xml");
            using (StreamWriter writer = new StreamWriter(fileName))
            {
                // remove dependency from data module
                apiDependencies.Remove(dataModule);
                apiDependencies.Remove(dataModule + "-API");

                Component c = new ComponentImpl();
                c.Name = component.Name + "-API";
                string output = this.springConfigGen.GenerateComponentPom(ns, c, apiDependencies,
                    bindingsOfModule.HasRestBinding, bindingsOfModule.HasWebServiceBinding, bindingsOfModule.HasWebSocketBinding, cType);
                writer.WriteLine(output);
            }

            if (bindingsOfModule.hasAnyBinding())
            {
                GenerateRemoteAccessTier(ns, modules, component, hasDirectDataAccess);
            }

            dependencies.Add(component.Name + "-API");
        }
Пример #4
0
        private BindingTypeHolder GenerateReferenceAccessors(Namespace ns, Component component, bool directDataAccess,
            Dictionary<Reference, Component> dependencyMap, Dictionary<string, string> properties)
        {
            BindingTypeHolder clientFor = new BindingTypeHolder();
            foreach (Reference reference in component.References)
            {
                Component referencedComp = dependencyMap[reference];
                if (reference.Interface is Database)
                {
                    if (referencedComp.Name.EndsWith("API"))
                    {
                        referencedComp = referencedComp.BaseComponent;
                    }
                    foreach (Service service in referencedComp.Services)
                    {
                        if (!(service.Interface is Database))
                        {
                            List<Binding> binds = this.bindingDiscoverer.GetBindings(ns, reference);
                            BindingTypeHolder binding = this.bindingDiscoverer.CheckForBindings(binds);
                            this.GenerateAccessor(ns, component, referencedComp, binding, properties, clientFor, service);
                        }
                    }
                }
                else
                {
                    List<Binding> binds = this.bindingDiscoverer.GetBindings(ns, reference);
                    BindingTypeHolder binding = this.bindingDiscoverer.CheckForBindings(binds);
                    this.GenerateAccessor(ns, component, referencedComp, binding, properties, clientFor, reference);
                }
            }

            return clientFor;
        }
Пример #5
0
        private void GenerateAccessor(Namespace ns, Component component, Component referencedComp, BindingTypeHolder binding,
            Dictionary<string, string> properties, BindingTypeHolder clientFor, Port port)
        {
            if (binding.HasRestBinding)
            {
                clientFor.HasRestBinding = true;
                string package = this.PackageOf(port.Interface);
                string proxyDir = this.directoryHandler.createJavaDirectory(ns, component.Name, generatorUtil.Properties.proxyPackage);
                string accessorFile = Path.Combine(proxyDir, port.Interface.Name + "RestProxy.java");
                string currentComponent = component.Name;
                string targetComponent = referencedComp.Name;
                if (targetComponent.Contains("-API") || targetComponent.Contains("-WEB"))
                {
                    targetComponent = targetComponent.Split(new string[] { "-API", "-WEB" }, StringSplitOptions.RemoveEmptyEntries)[0];
                }

                KeyValuePair<string, string> keyValue;
                keyValue = new KeyValuePair<string, string>(targetComponent + "RestServer", "localhost");
                if (!properties.Contains(keyValue))
                {
                    properties.Add(keyValue.Key, keyValue.Value);
                }
                keyValue = new KeyValuePair<string, string>(targetComponent + "RestPort", "8080");
                if (!properties.Contains(keyValue))
                {
                    properties.Add(keyValue.Key, keyValue.Value);
                }

                using (StreamWriter writer = new StreamWriter(accessorFile))
                {
                    writer.WriteLine(this.springInterfaceGen.GenerateProxyForInterface(port.Interface, "Rest", package, currentComponent, targetComponent));
                }
            }
            // TODO Ws & Ws
        }
Пример #6
0
        private void CreateBindings(BindingTypeHolder bindings, Component component, Interface iface, string apiDirectory,
            string functionDirectory, string package, string entityName, string dataBinding)
        {
            if (bindings.HasRestBinding)
            {
                // interface extension goes to API
                string interfaceExtFileName = Path.Combine(apiDirectory, iface.Name + "Rest.java");
                using (StreamWriter writer = new StreamWriter(interfaceExtFileName))
                {
                    writer.WriteLine(this.springInterfaceGen.GenerateInterface(iface, "Rest", package, entityName));
                }

                // implementation of the above goes to component
                string implFileName = Path.Combine(functionDirectory, iface.Name + "RestImpl.java");
                using (StreamWriter writer = new StreamWriter(implFileName))
                {
                    writer.WriteLine(this.springInterfaceGen.GenerateProxyInterfaceImplementation(iface, component.Name.ToLower(), "Rest", package, dataBinding));
                }
            }

            if (bindings.HasWebServiceBinding)
            {
                // interface extension goes to API
                string interfaceExtFileName = Path.Combine(apiDirectory, iface.Name + "WebService.java");
                using (StreamWriter writer = new StreamWriter(interfaceExtFileName))
                {
                    writer.WriteLine(this.springInterfaceGen.GenerateInterface(iface, "WebService", package, entityName));
                }

                // implementation of the above goes to component
                string implFileName = Path.Combine(functionDirectory, iface.Name + "WebServiceImpl.java");
                using (StreamWriter writer = new StreamWriter(implFileName))
                {
                    writer.WriteLine(this.springInterfaceGen.GenerateProxyInterfaceImplementation(iface, component.Name.ToLower(), "WebService", package, dataBinding));
                }
            }

            if (bindings.HasWebSocketBinding)
            {
                // interface extension goes to API
                string interfaceExtFileName = Path.Combine(apiDirectory, iface.Name + "WebSocket.java");
                using (StreamWriter writer = new StreamWriter(interfaceExtFileName))
                {
                    writer.WriteLine(this.springInterfaceGen.GenerateInterface(iface, "WebSocket", package, entityName));
                }

                // implementation of the above goes to component
                string implFileName = Path.Combine(functionDirectory, iface.Name + "WebSocketImpl.java");
                using (StreamWriter writer = new StreamWriter(implFileName))
                {
                    writer.WriteLine(this.springInterfaceGen.GenerateProxyInterfaceImplementation(iface, component.Name.ToLower(), "WebSocket", package, dataBinding));
                }
            }
        }