{"id":390603,"date":"2024-06-29T09:20:28","date_gmt":"2024-06-29T09:20:28","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=390603"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=390603","title":{"rendered":"<span>lsFusion: Open-Source Rapid Application Development Platform<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><a href=\"https:\/\/lsfusion.org\/\"><u>lsFusion<\/u><\/a> platform is designed for rapid development of business applications. It is distributed under the terms of a Lesser General Public License (LGPLv3). The source code of the platform is available on\u00a0<a href=\"https:\/\/github.com\/lsfusion\/platform\"><u>Github<\/u><\/a>.<\/p>\n<p>lsFusion is best suited for creating complex systems with large numbers of entities and forms, where users need to input and process large amounts of data. However, the platform can also be used to quickly create simple applications instead of spreadsheets when Excel\u2019s functionality is not enough.<\/p>\n<p>At the same time the use of the platform will not give a great advantage when developing applications aimed at interaction with a large number of \u201cexternal\u201d users or without the need for any complex calculations. You should also take into account that the web interface is a single page application using JavaScript. Therefore, the lsFusion platform is not well-suited for creating websites, for example.<\/p>\n<h3>Alternatives<\/h3>\n<p>Currently, there are several platforms on the market to solve similar problems. Of those that have been in use for a long time, Access and Visual Foxpro can be singled out. More modern analogues are low-code platforms like Power Apps. However, lsFusion takes a fundamentally different approach to application development. In particular, it uses almost no visual programming, and all logic is set using a high-level language.<\/p>\n<h3>Paradigm<\/h3>\n<p>Most modern platforms use standard relational logic, in which the application structure is defined by entities and the relationships between them. In lsFusion,\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Classes\/\"><u>classes<\/u><\/a>\u00a0that can inherit from each other are used instead of entities. Fields and relations are defined by\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Properties\/\"><u>properties<\/u><\/a>. Properties are essentially functions that accept class objects as parameters, returning either primitive type values (fields) or other objects (relations). A field in a table with multiple keys from relational logic will be represented as a property with the corresponding objects as parameters.<\/p>\n<p>All properties fall into two categories :<\/p>\n<p><a href=\"https:\/\/docs.lsfusion.org\/Data_properties_DATA\/\"><u>Primary<\/u><\/a>. Entered directly by the user, and do not directly depend on any other properties. Computed. Computed using\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Property_operators_paradigm\/\"><u>operators<\/u><\/a>\u00a0based on other properties. A similar scheme is used in spreadsheets. Primary properties correspond to cells that store values. Cells that contain formulas are similar to computed properties.<\/p>\n<p>The user interface is created using\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Forms\/\"><u>forms<\/u><\/a>\u00a0to which objects and properties are added, and their relationships specified by expressions.<\/p>\n<p>With the help of the\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Events\"><u>event<\/u><\/a>\u00a0mechanism, it is possible to perform certain\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Actions\/\"><u>actions<\/u><\/a>\u00a0upon the occurrence of given conditions.<\/p>\n<p>Thus, when using lsFusion platform, most of the logic is not set in a sequence of commands, but as a specification of the solution to the problem. That is, the expected result is described, but not how to get it. This approach is called declarative, and has several advantages over the classic imperative.<\/p>\n<h3>Language<\/h3>\n<p>Since the platform paradigm differs significantly from existing approaches, a specialized language was created to specify the logic. SQL-like syntax with keywords instead of symbols was chosen to lower the entry threshold into development.<\/p>\n<p>The application logic is specified in the form of flat text files called\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Modules\/\"><u>modules<\/u><\/a>. These files contain the source code in an internal language. Each module can simultaneously contain declarations of classes and properties as well as forms, events, constraints, designs, and so on. Dependencies can be specified between modules. The source code can only use elements from the modules it depends on (including recursively).<\/p>\n<p>Here are few examples :<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/9ad\/f0d\/9a5\/9adf0d9a518b85f3a1e4571d07e7d79e.jpeg\" alt=\"Classes and Primary Properties\" width=\"664\" height=\"340\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9ad\/f0d\/9a5\/9adf0d9a518b85f3a1e4571d07e7d79e.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>Classes and Primary Properties<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/449\/af0\/fa2\/449af0fa2c29c4ff458ba31d1a22361e.jpeg\" alt=\"Computed Properties\" title=\"Computed Properties\" width=\"716\" height=\"108\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/449\/af0\/fa2\/449af0fa2c29c4ff458ba31d1a22361e.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>Computed Properties<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/29c\/813\/b50\/29c813b50ffacbe61773a876a791de77.jpeg\" alt=\"Actions and Events\" title=\"Actions and Events\" width=\"527\" height=\"298\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/29c\/813\/b50\/29c813b50ffacbe61773a876a791de77.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>Actions and Events<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/958\/7f6\/889\/9587f68894d70ef7220876c474f9f9ca.jpeg\" alt=\"Forms\" title=\"Forms\" width=\"454\" height=\"278\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/958\/7f6\/889\/9587f68894d70ef7220876c474f9f9ca.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>Forms<\/figcaption><\/div>\n<\/figure>\n<p>More different examples of language syntax and use cases can be found\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Examples\/\"><u>here<\/u><\/a>.<\/p>\n<h3>Architecture<\/h3>\n<p>lsFusion platform consists of two Java applications. A Java virtual machine must be installed in the operating system to run them.<\/p>\n<p>The first is an application server that reads the program logic created by the developer from specific files. These files have the extension lsf, and contain the source code written in the internal language of the platform. They describe both the domain logic and the user interface. The project structure is as follows:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/b3e\/e06\/e4b\/b3ee06e4b79f06578955b84f84744f43.jpeg\" alt=\"MyCompany Project Structure\" title=\"MyCompany Project Structure\" width=\"786\" height=\"586\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b3e\/e06\/e4b\/b3ee06e4b79f06578955b84f84744f43.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>MyCompany Project Structure<\/figcaption><\/div>\n<\/figure>\n<p>The second application is Apache Tomcat, with a web server deployed on it that runs the web application. It communicates with the application server through RMI requests using an internal protocol.<\/p>\n<h3>How to develop<\/h3>\n<p>Applications in lsFusion are developed using a special\u00a0<a href=\"https:\/\/plugins.jetbrains.com\/plugin\/7601-lsfusion\"><u>plugin<\/u><\/a>\u00a0for IntelliJ IDEA Community Edition. The plugin highlights syntax and errors, supports navigation and refactoring of source code.<\/p>\n<p>The project structure on lsFusion is similar to that of any java application. The source code in the internal language acts as regular resource files that do not need to be compiled.<\/p>\n<p>Due to the fact that the platform is based on Java and the source code has a flat text structure, you can use Git, Maven, and connect external Java classes and libraries to solve highly specialized problems.<\/p>\n<h3>How it works<\/h3>\n<p>The relational DBMS PostgreSQL is used as a data storage system.<\/p>\n<p>When the application server starts, the platform reads the system logic from the required modules and synchronizes the database structure with it. The user interface is automatically generated based on the specified forms.<\/p>\n<p>Based on the lsFusion code, the platform automatically generates all SQL queries to read and write data without using any ORM patterns. Thus, almost all calculations are done in PostgreSQL instead of on the application server.<\/p>\n<p>Changes made within a\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Change_sessions\/\"><u>session<\/u><\/a>\u00a0(e.g. when a user edits data on a form) are written to temporary tables. At the moment of saving session changes (e.g., when Save button is pressed) a transaction is started, events are executed, and changes are written to the database.<\/p>\n<p>A distinctive feature of the lsFusion platform is that you can set\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Materializations\/\"><u>MATERIALIZED<\/u><\/a>\u00a0flag for any calculated property. A separate field is created for such a property in the table, which is automatically recalculated when the data on which it depends changes. At the same time, when calculating the values of dependent properties, the already calculated value from this field will be used. Thus you can easily balance the load on the database for writing and reading without changing the logic of the system. This feature is similar to\u00a0<a href=\"https:\/\/docs.oracle.com\/database\/121\/DWHSG\/refresh.htm#DWHSG8361\"><u>Materialized View with Fast Refresh<\/u><\/a>\u00a0in Oracle only without any restrictions.<\/p>\n<h3>Who can develop<\/h3>\n<p>The complexity of development in lsFusion is slightly higher than development in SQL, but much lower than in the classical general-purpose programming languages. The developer does not need to manually manage the memory, locks, transactions, the interaction between client and server, or application server and database. All of this is done automatically by the platform based on logic defined in a single, uniform language.<\/p>\n<p>This high-level approach greatly reduces the entry threshold into application development. As a result, applications can be created by people without any programming experience. One week is enough for a basic study of the lsFusion platform, and in a month a developer can already create rather complicated applications. This is achieved due to the fact that the platform operates with a small number of abstractions, on the basis of which you can set almost any business logic. A developer just needs to learn how to define classes (entities), build properties using a few basic operators, and assemble forms from them.<\/p>\n<h3>Features<\/h3>\n<h4>Object Oriented Programming<\/h4>\n<p>The lsFusion platform supports multiple class inheritance and polymorphism over several parameters. For example :<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/7af\/8e6\/c08\/7af8e6c081d11dabc8f4864cc54f3217.jpeg\" alt=\"Polymorphism over several parameters\" title=\"Polymorphism over several parameters\" width=\"416\" height=\"392\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7af\/8e6\/c08\/7af8e6c081d11dabc8f4864cc54f3217.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>Polymorphism over several parameters<\/figcaption><\/div>\n<\/figure>\n<p>The declaration of an abstract property and its implementation can reside in different modules. This makes it possible to develop a system with a Low Coupling \/ High Cohesion architecture.<\/p>\n<h4>Print forms<\/h4>\n<p>Print forms, text documents and spreadsheets are\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Print_view\/\"><u>generated<\/u><\/a>\u00a0using the JasperReports library. The platform can automatically generate complex structure of reports and subreports, and the developer only needs to adjust the arrangement of elements visually using JasperSoft Studio.<\/p>\n<h4>API<\/h4>\n<p>The platform supports sending and receiving requests via\u00a0<a href=\"https:\/\/docs.lsfusion.org\/How-to_Interaction_via_HTTP_protocol\/\"><u>HTTP protocol<\/u><\/a>. Combined with the built-in mechanism for\u00a0<a href=\"https:\/\/docs.lsfusion.org\/How-to_Working_with_external_formats\/\"><u>exporting and importing<\/u><\/a>\u00a0JSON\/XML files it\u2019s easy to interact with any external systems.<\/p>\n<p>Extension If the task can not be solved by the standard functionality of the platform, you can use the underlying programming languages. In particular, you can create properties which calculations are implemented in\u00a0<a href=\"https:\/\/docs.lsfusion.org\/FORMULA_operator\/\"><u>PL\/pgSQL<\/u><\/a>\u00a0language, which are then built into SQL queries.\u00a0<a href=\"https:\/\/docs.lsfusion.org\/How-to_INTERNAL\/\"><u>Using Java<\/u><\/a>\u00a0you can create highly specialized actions. With JavaScript you can create custom visual elements for displaying\u00a0<a href=\"https:\/\/docs.lsfusion.org\/How-to_Custom_components_properties\/\"><u>properties<\/u><\/a>\u00a0and\u00a0<a href=\"https:\/\/docs.lsfusion.org\/How-to_Custom_components_objects\/\"><u>objects<\/u><\/a>.<\/p>\n<h3>Interface<\/h3>\n<p>In any table in a form the user can sort and select rows, hide columns and change their order. Filtered data from any table can be easily exported into spreadsheets with a single button. Navigation through the table rows is implemented as \u201cinfinite scrolling\u201d.<\/p>\n<p>In addition to changing the value of any cell, the user can change values in all records using the group editing mechanism. Pasting into any table from the clipboard is also supported.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/eb2\/569\/d3d\/eb2569d3df888ddbe2a458f8f82d32d8.jpeg\" alt=\"Interface example\" title=\"Interface example\" width=\"1400\" height=\"677\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eb2\/569\/d3d\/eb2569d3df888ddbe2a458f8f82d32d8.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>Interface example<\/figcaption><\/div>\n<\/figure>\n<p>Pivoting mode is automatically available in each table of the form, which allows user to group data and build diagrams in any slice on their own.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/bc7\/906\/baa\/bc7906baad47d36545abfd082a1b3f67.jpeg\" alt=\"Pivoting example\" title=\"Pivoting example\" width=\"786\" height=\"338\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bc7\/906\/baa\/bc7906baad47d36545abfd082a1b3f67.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>Pivoting example<\/figcaption><\/div>\n<\/figure>\n<h3>First steps<\/h3>\n<p>First you need to install lsFusion on your local computer. Under Windows, there is an\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Development_auto\/\"><u>installer<\/u><\/a>\u00a0that will install PostgreSQL, Java, IntelliJ IDEA, and the platform itself on the computer. Then you need to create an empty\u00a0<a href=\"https:\/\/docs.lsfusion.org\/IDE\/\"><u>lsFusion project<\/u><\/a>\u00a0in IDEA.<\/p>\n<p>The best way to start studying lsFusion is to use the examples described in the\u00a0<a href=\"https:\/\/docs.lsfusion.org\/How-to\/\"><u>How-to section<\/u><\/a>\u00a0and two simple examples:\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Score_table\/\"><u>Score table<\/u><\/a>\u00a0and\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Materials_management\/\"><u>Materials Management<\/u><\/a>.<\/p>\n<p>You can then explore the source code for\u00a0<a href=\"https:\/\/github.com\/lsfusion-solutions\/mycompany\"><u>MyCompany<\/u><\/a>, which implements the basic logic of a simple ERP system. This solution is distributed under the Apache-2.0 license, and can be used as a basis for developing your own system.<\/p>\n<p>You can view the demo version at:\u00a0<a href=\"https:\/\/demo.lsfusion.org\/mycompany\"><u>https:\/\/demo.lsfusion.org\/mycompany<\/u><\/a>.<\/p>\n<h3>Support<\/h3>\n<p>The lsFusion platform has been developed for 12 years by a distributed team of programmers from different countries. During this time, a large number of applications based on it were implemented, from simple applications with a few forms to complex ERP systems with thousands of users and processes. The development of the platform is funded by companies creating their own commercial solutions based on it.<\/p>\n<p>lsFusion is suitable for application development by individual programmers as well as large teams, due to its high declarability, OOP support and the possibility of using Git. The license enables both in-house application development and commercial products based on it.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/741890\/\"> https:\/\/habr.com\/ru\/articles\/741890\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><a href=\"https:\/\/lsfusion.org\/\"><u>lsFusion<\/u><\/a> platform is designed for rapid development of business applications. It is distributed under the terms of a Lesser General Public License (LGPLv3). The source code of the platform is available on\u00a0<a href=\"https:\/\/github.com\/lsfusion\/platform\"><u>Github<\/u><\/a>.<\/p>\n<p>lsFusion is best suited for creating complex systems with large numbers of entities and forms, where users need to input and process large amounts of data. However, the platform can also be used to quickly create simple applications instead of spreadsheets when Excel\u2019s functionality is not enough.<\/p>\n<p>At the same time the use of the platform will not give a great advantage when developing applications aimed at interaction with a large number of \u201cexternal\u201d users or without the need for any complex calculations. You should also take into account that the web interface is a single page application using JavaScript. Therefore, the lsFusion platform is not well-suited for creating websites, for example.<\/p>\n<h3>Alternatives<\/h3>\n<p>Currently, there are several platforms on the market to solve similar problems. Of those that have been in use for a long time, Access and Visual Foxpro can be singled out. More modern analogues are low-code platforms like Power Apps. However, lsFusion takes a fundamentally different approach to application development. In particular, it uses almost no visual programming, and all logic is set using a high-level language.<\/p>\n<h3>Paradigm<\/h3>\n<p>Most modern platforms use standard relational logic, in which the application structure is defined by entities and the relationships between them. In lsFusion,\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Classes\/\"><u>classes<\/u><\/a>\u00a0that can inherit from each other are used instead of entities. Fields and relations are defined by\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Properties\/\"><u>properties<\/u><\/a>. Properties are essentially functions that accept class objects as parameters, returning either primitive type values (fields) or other objects (relations). A field in a table with multiple keys from relational logic will be represented as a property with the corresponding objects as parameters.<\/p>\n<p>All properties fall into two categories :<\/p>\n<p><a href=\"https:\/\/docs.lsfusion.org\/Data_properties_DATA\/\"><u>Primary<\/u><\/a>. Entered directly by the user, and do not directly depend on any other properties. Computed. Computed using\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Property_operators_paradigm\/\"><u>operators<\/u><\/a>\u00a0based on other properties. A similar scheme is used in spreadsheets. Primary properties correspond to cells that store values. Cells that contain formulas are similar to computed properties.<\/p>\n<p>The user interface is created using\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Forms\/\"><u>forms<\/u><\/a>\u00a0to which objects and properties are added, and their relationships specified by expressions.<\/p>\n<p>With the help of the\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Events\"><u>event<\/u><\/a>\u00a0mechanism, it is possible to perform certain\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Actions\/\"><u>actions<\/u><\/a>\u00a0upon the occurrence of given conditions.<\/p>\n<p>Thus, when using lsFusion platform, most of the logic is not set in a sequence of commands, but as a specification of the solution to the problem. That is, the expected result is described, but not how to get it. This approach is called declarative, and has several advantages over the classic imperative.<\/p>\n<h3>Language<\/h3>\n<p>Since the platform paradigm differs significantly from existing approaches, a specialized language was created to specify the logic. SQL-like syntax with keywords instead of symbols was chosen to lower the entry threshold into development.<\/p>\n<p>The application logic is specified in the form of flat text files called\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Modules\/\"><u>modules<\/u><\/a>. These files contain the source code in an internal language. Each module can simultaneously contain declarations of classes and properties as well as forms, events, constraints, designs, and so on. Dependencies can be specified between modules. The source code can only use elements from the modules it depends on (including recursively).<\/p>\n<p>Here are few examples :<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Classes and Primary Properties<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\">\n<div><figcaption>Computed Properties<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\">\n<div><figcaption>Actions and Events<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\">\n<div><figcaption>Forms<\/figcaption><\/div>\n<\/figure>\n<p>More different examples of language syntax and use cases can be found\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Examples\/\"><u>here<\/u><\/a>.<\/p>\n<h3>Architecture<\/h3>\n<p>lsFusion platform consists of two Java applications. A Java virtual machine must be installed in the operating system to run them.<\/p>\n<p>The first is an application server that reads the program logic created by the developer from specific files. These files have the extension lsf, and contain the source code written in the internal language of the platform. They describe both the domain logic and the user interface. The project structure is as follows:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>MyCompany Project Structure<\/figcaption><\/div>\n<\/figure>\n<p>The second application is Apache Tomcat, with a web server deployed on it that runs the web application. It communicates with the application server through RMI requests using an internal protocol.<\/p>\n<h3>How to develop<\/h3>\n<p>Applications in lsFusion are developed using a special\u00a0<a href=\"https:\/\/plugins.jetbrains.com\/plugin\/7601-lsfusion\"><u>plugin<\/u><\/a>\u00a0for IntelliJ IDEA Community Edition. The plugin highlights syntax and errors, supports navigation and refactoring of source code.<\/p>\n<p>The project structure on lsFusion is similar to that of any java application. The source code in the internal language acts as regular resource files that do not need to be compiled.<\/p>\n<p>Due to the fact that the platform is based on Java and the source code has a flat text structure, you can use Git, Maven, and connect external Java classes and libraries to solve highly specialized problems.<\/p>\n<h3>How it works<\/h3>\n<p>The relational DBMS PostgreSQL is used as a data storage system.<\/p>\n<p>When the application server starts, the platform reads the system logic from the required modules and synchronizes the database structure with it. The user interface is automatically generated based on the specified forms.<\/p>\n<p>Based on the lsFusion code, the platform automatically generates all SQL queries to read and write data without using any ORM patterns. Thus, almost all calculations are done in PostgreSQL instead of on the application server.<\/p>\n<p>Changes made within a\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Change_sessions\/\"><u>session<\/u><\/a>\u00a0(e.g. when a user edits data on a form) are written to temporary tables. At the moment of saving session changes (e.g., when Save button is pressed) a transaction is started, events are executed, and changes are written to the database.<\/p>\n<p>A distinctive feature of the lsFusion platform is that you can set\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Materializations\/\"><u>MATERIALIZED<\/u><\/a>\u00a0flag for any calculated property. A separate field is created for such a property in the table, which is automatically recalculated when the data on which it depends changes. At the same time, when calculating the values of dependent properties, the already calculated value from this field will be used. Thus you can easily balance the load on the database for writing and reading without changing the logic of the system. This feature is similar to\u00a0<a href=\"https:\/\/docs.oracle.com\/database\/121\/DWHSG\/refresh.htm#DWHSG8361\"><u>Materialized View with Fast Refresh<\/u><\/a>\u00a0in Oracle only without any restrictions.<\/p>\n<h3>Who can develop<\/h3>\n<p>The complexity of development in lsFusion is slightly higher than development in SQL, but much lower than in the classical general-purpose programming languages. The developer does not need to manually manage the memory, locks, transactions, the interaction between client and server, or application server and database. All of this is done automatically by the platform based on logic defined in a single, uniform language.<\/p>\n<p>This high-level approach greatly reduces the entry threshold into application development. As a result, applications can be created by people without any programming experience. One week is enough for a basic study of the lsFusion platform, and in a month a developer can already create rather complicated applications. This is achieved due to the fact that the platform operates with a small number of abstractions, on the basis of which you can set almost any business logic. A developer just needs to learn how to define classes (entities), build properties using a few basic operators, and assemble forms from them.<\/p>\n<h3>Features<\/h3>\n<h4>Object Oriented Programming<\/h4>\n<p>The lsFusion platform supports multiple class inheritance and polymorphism over several parameters. For example :<\/p>\n<figure class=\"\">\n<div><figcaption>Polymorphism over several parameters<\/figcaption><\/div>\n<\/figure>\n<p>The declaration of an abstract property and its implementation can reside in different modules. This makes it possible to develop a system with a Low Coupling \/ High Cohesion architecture.<\/p>\n<h4>Print forms<\/h4>\n<p>Print forms, text documents and spreadsheets are\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Print_view\/\"><u>generated<\/u><\/a>\u00a0using the JasperReports library. The platform can automatically generate complex structure of reports and subreports, and the developer only needs to adjust the arrangement of elements visually using JasperSoft Studio.<\/p>\n<h4>API<\/h4>\n<p>The platform supports sending and receiving requests via\u00a0<a href=\"https:\/\/docs.lsfusion.org\/How-to_Interaction_via_HTTP_protocol\/\"><u>HTTP protocol<\/u><\/a>. Combined with the built-in mechanism for\u00a0<a href=\"https:\/\/docs.lsfusion.org\/How-to_Working_with_external_formats\/\"><u>exporting and importing<\/u><\/a>\u00a0JSON\/XML files it\u2019s easy to interact with any external systems.<\/p>\n<p>Extension If the task can not be solved by the standard functionality of the platform, you can use the underlying programming languages. In particular, you can create properties which calculations are implemented in\u00a0<a href=\"https:\/\/docs.lsfusion.org\/FORMULA_operator\/\"><u>PL\/pgSQL<\/u><\/a>\u00a0language, which are then built into SQL queries.\u00a0<a href=\"https:\/\/docs.lsfusion.org\/How-to_INTERNAL\/\"><u>Using Java<\/u><\/a>\u00a0you can create highly specialized actions. With JavaScript you can create custom visual elements for displaying\u00a0<a href=\"https:\/\/docs.lsfusion.org\/How-to_Custom_components_properties\/\"><u>properties<\/u><\/a>\u00a0and\u00a0<a href=\"https:\/\/docs.lsfusion.org\/How-to_Custom_components_objects\/\"><u>objects<\/u><\/a>.<\/p>\n<h3>Interface<\/h3>\n<p>In any table in a form the user can sort and select rows, hide columns and change their order. Filtered data from any table can be easily exported into spreadsheets with a single button. Navigation through the table rows is implemented as \u201cinfinite scrolling\u201d.<\/p>\n<p>In addition to changing the value of any cell, the user can change values in all records using the group editing mechanism. Pasting into any table from the clipboard is also supported.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Interface example<\/figcaption><\/div>\n<\/figure>\n<p>Pivoting mode is automatically available in each table of the form, which allows user to group data and build diagrams in any slice on their own.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Pivoting example<\/figcaption><\/div>\n<\/figure>\n<h3>First steps<\/h3>\n<p>First you need to install lsFusion on your local computer. Under Windows, there is an\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Development_auto\/\"><u>installer<\/u><\/a>\u00a0that will install PostgreSQL, Java, IntelliJ IDEA, and the platform itself on the computer. Then you need to create an empty\u00a0<a href=\"https:\/\/docs.lsfusion.org\/IDE\/\"><u>lsFusion project<\/u><\/a>\u00a0in IDEA.<\/p>\n<p>The best way to start studying lsFusion is to use the examples described in the\u00a0<a href=\"https:\/\/docs.lsfusion.org\/How-to\/\"><u>How-to section<\/u><\/a>\u00a0and two simple examples:\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Score_table\/\"><u>Score table<\/u><\/a>\u00a0and\u00a0<a href=\"https:\/\/docs.lsfusion.org\/Materials_management\/\"><u>Materials Management<\/u><\/a>.<\/p>\n<p>You can then explore the source code for\u00a0<a href=\"https:\/\/github.com\/lsfusion-solutions\/mycompany\"><u>MyCompany<\/u><\/a>, which implements the basic logic of a simple ERP system. This solution is distributed under the Apache-2.0 license, and can be used as a basis for developing your own system.<\/p>\n<p>You can<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-390603","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/390603","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=390603"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/390603\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=390603"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=390603"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=390603"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}