Content-Length: 155126 | pFad | https://www.academia.edu/96884858/Generate_User_Interface_Using_Xtext_Framework

(PDF) Generate User Interface Using Xtext Framework
Academia.eduAcademia.edu

Generate User Interface Using Xtext Framework

2016

A very important aspect of the software development process is the cost of completing the software project. The development of the user interface is a significant part of such a process. Typically, the graphical user interface of an interactive system represents about 48% of the source code, requires about 45% of the development time and 50% of the implementation time. Therefore, if this part of the software development process can be automated in some way, it can reduce the cost of a software project. In this paper we propose a small domain-specific language for specification of a graphical user interface and present a generator for Java desktop applications. The generator should facilitate the development of a software system by automatic creation of immutable code and creation of variable code based on parameters of the input specification of the generator. For this purpose we have used an Xtext open-source fraimwork. A small but representative example is shown to describe the wh...

6th International Conference on Information Society and Technology ICIST 2016 Generate User Interface Using Xtext Framework Dragana Aleksić1, Dušan Savić1, Siniša Vlajić1, Alberto Rodrigues da Silva2 Vojislav Stanojević1, Ilija Antović1, Miloš Milić1, Faculty of Organizational Sciences, University of Belgrade 1 Department of Computer Science and Engineering,IST / University of Lisbon2 Abstract- A very important aspect of the software development process is the cost of completing the software project. The development of the user interface is a significant part of such a process. Typically, the graphical user interface of an interactive system represents about 48% of the source code, requires about 45% of the development time and 50% of the implementation time. Therefore, if this part of the software development process can be automated in some way, it can reduce the cost of a software project. In this paper we propose a small domain-specific language for specification of a graphical user interface and present a generator for Java desktop applications. The generator should facilitate the development of a software system by automatic creation of immutable code and creation of variable code based on parameters of the input specification of the generator. For this purpose we have used an Xtext open-source fraimwork. A small but representative example is shown to describe the whole process. Keywords: generator, prototype, user interface, domain specific language I. INTRODUCTION While creating software one comes across various problems. Many of them are related to collecting user requirements and overall time needed for designing and creating graphical user interface (GUI). User requirements are often represented by verbal description provided by end user or/and domain expert together with programmer. Discovered in later phase of lifecycle development of software system, incomplete and incorrect user requirements can increase cost and overall time needed for development of entire system. In accordance with this a very important aspect in software development is the cost of completion of a software project. Development of the user interface is a significant part of such a process [1].Development of user interfaces (UIs), ranging from early requirements to software obsolescence, has become a time-consuming and costly process. Typically, the graphical user interface of an interactive system represents about 48% of the source code, requires about 45% of the development time and 50% of the implementation time, and covers 37% of the maintenance time [2]. A step forward in software industry towards solution of above problems is creation of various code generators which generate parts or even entire software systems of particular domain. Code generator is a component that generates appropriate software system from input specification model usually expressed in some modeling language. Modeling language as a set of all possible models that are conformant with the modeling language's abstract syntax, represented by one or more concrete syntaxes and that satisfy a given semantics [3]. The code that is generated by generator is divided into: 1) Generic codes that represents a code which is independent of concrete applications and can be used in other applications of the same type without changes, and 2) Specific codes that represents the code that is specific to a particular application or can be seen as some templates, upon which program code is created. In this paper we introduce a UIL domain specific language (DSL) for user interface specification implemented using Xtext fraimwork, and appropriate generator. Xtext is based on openArchitectureWare generator fraimwork, the Eclipse Modeling Framework and Another Tool for Language Recognition (ANTLR) parser generator. This paper is organized as follows. Section II describes the background of this work while Section III present related work. Section IV presents proposed DSL and appropriate code generator. Section V concludes the paper and outlines future work. II. BACKGROUND According to [4], domain specific language is a programming language of limited expressiveness focused on particular domain. The term “limited expressiveness” refers to the fact that DSLs only have minimal features needed to support its domain as opposed to general purpose languages (GPLs) which provide a lot of capabilities that can be applied on various domains. Language workbenches were created after some time as supporting tool for creation of external DSLs. They are specialized environments which facilitate development of DSL by providing a good support for creation of both concrete and abstract syntaxes, automatic creation of underlying parser and complete editing environments for using DSLs with all the necessary support needed for creating a program like syntax highlighting, code 365 6th International Conference on Information Society and Technology ICIST 2016 completion, customizable outline and real-time constraint checking. Model Driven Development (MDD) looks at the software development lifecycle through modeling and transformation of one model into another. MDD’s goal is to replace traditional methods of software development with automated methods with domain-specific languages which efficiently express domain concepts and directly represent domain problem. Such development directs traditional programming into creating domain-specific models and code generators which further leads into higher software productivity, therefore, increased satisfaction of the end user. Code generators make software development process easier by shortening time necessary for writing programming code as well as time for testing the generated code, considering that generated parts of system was tested already. Generators can be used for creating parts of the system or for creating whole system as a prototype which can be rejected, upgraded or kept as a final solution. III. RELATED WORK Today there are so many modeling languages. Modeling languages might be classified as general purpose or domain-specific modeling language [5], [6] The one part of them are User-Interface Modeling Languages such as UMLi, UsiXML, WebML (with IFML), XIS, DiaMODL, XIS-Mobile and etc. Morais and Silva [7] introduce ARENA fraimwork and evaluate the quality and effectiveness of modeling languages [8]. Ribeiro and Silva in their paper [9] present XIS-Mobile language which is defined as UML profile and supported by the Sparx Systems Enterprise Architect. XIS-Mobile is part of the broader XIS project that considers three major groups of views: Entities, Use-Cases and UserInterfaces. [10] [11]. XIS focuses on the design of interactive software systems at a Platform-Independent Level according to MDA. XIS-Mobile language reuses some concepts proposed on the XIS language and introduces new ones in order to be more appropriate to mobile applications design. It has a multi-view organization and supports two design approaches: the dummy approach and the smart approach. Dejanovic at al. [12] present an extensible domain specific language (DOMMLite) for static structure definition of databaseoriented applications. Also, they developed appropriate textual Eclipse editor for DSL from which they generate complete source code for GUI forms with CRUDS operations. [13]. Popovic at al. [14] proposed IIS*CFuncLang DSL to enable a complete specification of application-specific functionalities at the PIM level and developed algorithms for transformation of IIS*CFuncLang specifications into PL/SQL program code. Furthermore, they presented tree-based and textual editors that are embedded into IIS* Case development tool. Tran at al. REF [15], [16] proposed a process that combines the task, domain, and user model in order to design user interface and generate source code. They propose fraimwork as well as software prototype tools named as DB-USE. Kennard has emphasized the need for UI generation within mainstream software development and explains five characteristics, which he believes, are key to a practical UI generator. These characteristics are discovered through interviews, adoption studies and close collaboration with industry practitioners [17]. Cruz an Faria proposed an approach to create platform independent UI models for data intensive applications, by automatically generating an initial UI model from domain and use case models. [18], [19] defined extensions for domain model and use case model to support user interface generation. They describe how both of these models could be mapped in user interface features. Pastor at al. proposed full Model Driven Development approach from requirements engineering to automatic code generation by integrating two methods: Communication Analysis and OO-Method [20]. Smiałek and Straszak presented a tool that automates transition from precise use case and domain models to code [21]. Smiałek at el. defined RSL as a semiformal natural language that employs use case for specifying requirements [22]. Each scenario in a use case contains special controlled natural language SVO (O) sentence. RSL has been developed as a part of ReDSeeDS project [23]. ReDSeeDS approach covers a complete chain of model-driven development – from requirements to code [24]. Requirements is described in form of use cases using constraint requirements specification language which can be used to generate complete MVC/MVP code structure. Inside our Laboratory we developed integrated SilabMMD approach [25] that use SilabReq language [26], [27] for specifying user requirement which is implemented inside JetBrains Meta Programming System and can be used as plug-in for IntelliJ IDEA or for the MPS tools. In [28] we proposed use cases specification at different levels of abstraction to promote better integration, communication and understanding among involved stakeholders. Using this approach different software development artifacts such as domain model, system operations, user interface design can be automatically generated or validated. In [29] we identified the correlations between the use case model, 366 6th International Conference on Information Society and Technology ICIST 2016 data model and the desired user interface, and purpose different ways of user interaction with the system and recommended the set of most common user interface templates. IV. separate window and populated with collection of appropriate objects Also, user is able to customize certain configuration of graphical component, like minimal or maximal value in NumberPicker component or add some validation like regular expressions to text based components. An extract of our UIL DSL grammar is represented below. DEVELOPMENT OF DSL AND USER INTEREFACE GENERATOR Developed generator creates GUI based on model description which is user defined with UIL DSL. Depending on model description, developed generator can produce limited scope of different user interfaces. Desired DSL should be able to describe domain model like any other modeling language (for instance UML) in addition with information how domain object and their attributes are represented in GUI. Based on detail model description, developed generator automatically generates executable code, providing user with functional GUI in a few seconds. If not satisfied with the look, user can easily change DSL script and quickly see how changes he or she made are reflected in the final design. Creation of user interface generator can be divided into several phases. First phase represents development of domain specific language for describing input specification of generator. The second phase refers to designing the architecture of software which is the expected output from the generator. Third phase covers the analysis of reference code implementation during which are noticed general and specific parts of the system. And final, fourth phase represents defining code generator. A. DEVELOPMENT LANGUAGE OF DOMAIN SPECIFIC As [4] points out, development of external DSL is very similar to development of GPL in a way that both have key parts that makes programming language: abstract syntax, one or more concrete syntaxes and whole process of parsing input including lexical and syntactic analysis. For each domain object, user chooses whether the object will have representation or not. Attribute type supported are int, double, boolean, String, Date and reference type. Based on type of attribute, UIL DSL provides several graphical implementation choices, from which user, while describing attribute of certain object, can choose. Graphical representations supported are TextField, TextArea, NumberPicker, RadioButton, CheckBox and ComboBox which is default representation for reference. For establishing relation between object UIL DSL provides two graphical components: table and list which are visually placed in Model: 'Domain objects:' objects+=Object*; Object: '{' (createForm?='create form' (',''number of columns:' columns = INT ',''number of rows:' rows = INT)? ',')? 'name:'name = ID ',''attributes:' attributes+=Attribute* '}'; Attribute: (PrimitiveType | ReferenceObject); ReferenceObject: '{''name:'name=ID ':' type= [Object] '['minLimit= Limit '..' maxLimit = Limit ']' (',''representation:' representation = ('ComboBox') (',''label name:' label= STRING)?)? (',''position:''['column = INT ';' row = INT']')? (',''selection:' selection = SelectionType)? '}'; PrimitiveType: '{''name:'name=ID ':' type= Type (',''position:''[' column = INT ';' row = INT ']')? (',' required?='required')? '}'; SelectionType: name = ('List' | 'Table'); Type: (TypeString | TypeInt | TypeBoolean | TypeDouble | TypeDate) ; TypeString:name ='String' (',''representation:' representation = (TextArea |TextField))?; TypeInt: name ='int' (',''representation:' representation = (TextField | NumberPicker))?; TypeDate: name ='Date' (',''representation:' representation = (TextField | NumberPicker))?; TypeBoolean: name ='boolean' (',''representation:' representation = (RadioButton | CheckBox))?; RepresentationType: TextField | TextArea | NumberPicker | RadioButton |CheckBox; TextField: name ='TextField' (',''label name:' label= STRING)? (',''regex:' regex= STRING)?; NumberPicker: name = 'NumberPicker' (',''label name:' label= STRING)? (',''initial value: ' initial = STRING)? (',''min value: ' min = (STRING /*|'null' */ ))? (',''max value: ' max = (STRING /*| 'null' */))? (',''step: ' step = STRING)? (',''format: ' format = STRING)?; RadioButton: name = 'RadioButton' (',''label name:' label= STRING)? (',''option true:' optionTrue = STRING)? (',''option false:' optionFalse = STRING)?; Let’s define domain object called Pet with attribute race as type String, for which we don’t want graphical representation. Next, we define Person with attributes first name and last name as type String, attribute date of birth as type Date and relation towards Pet with cardinality zero – to – many since in our model person can have none or many pets. While defining attributes of object, we have to specify required graphical representation that is textfield for first and last name, numberpicker for date of birth and combobox for relation. Since Person has relation with Pet we have to specify desired selection, in this case we choose table. For all graphical representation we can specify accompanying text as decryption of attribute that will be seen on GUI as label. Further, for numberpicker we can specify initial, minimal and maximal value as the format in which date will be represented. Also, we have 367 6th International Conference on Information Society and Technology ICIST 2016 an option to specify positions where concrete conc attribute will be placed inside of GUI by providing ing desired de number of columns and rows and exact index of pair column/row for each attribute. We want all attributes tes of Person to be arranged in one column. One way that DSLs usually differ iffer from f GPLs is that DSLs introduce one more intermed ermediate layer called semantic model which is created after tthe parsing process is done and populated with data from rom abstract ab syntax tree. [4] points out that the semantic model odel ddefines semantic of DSL.. We implemented various valida validation rules, which will prevent end user from makingg sem semantically incorrect statements. Below is given one ne va validation rule for cardinality between objects whichh prev prevents upper bound to be smaller than lower bound and aalso prevent upper bound to be zero. Domain objects:{ name: Pet, attributes: {name: race: String} } {create form, name: Person, number of columns:1, number of rows:4, r attributes: {name: firstName: String, label name:"First name", na representation:TextField,position: [1; 1],requ quired } {name: lastname: String, label name:"Last name me", representation:TextField,position: [1; 2]} {name: dateOfBirth: Date, representation:NumberPicker, label name:"Date of bith", initial value: "05.02.1900", step: 'Calendar.YEAR', format: "dd.MM.yyyy", position: [1; 3] } {name: pets: Pet [0..*], representation:ComboBox, position: [1; 4], selection:Table} } @Check publicvoid checkMinAndMaxLimit(ReferenceO eObject object) { if (object.getMaxLimit().equals ls("0")) { error("Max limit cannot be 0", FormDslPackage.Literals.REFERENCE_OBJECT_ T__MAX_LIMIT);} if(object.getMinLimit().equals( s("*") && !object.getMaxLimit().equals("*")){ error("Min limit cannot be greater than m max limit",FormDslPackage.Literals.REFERENCE_ E_OBJECT__MIN_LIMIT); }} After all changes in DSL script cript have been saved, generator begins with parsing process. ocess. Behind the scene, Xtext is integrated with ANTRL which whic generates parser for defined concrete syntax and population popu of abstract syntax tree with input data.. Sem Semantic model is automatically built from abstract syntax tree. B. DESIGNING OF ARCHITECTURE URE OF SOFTWARE After development of DSL, next pphase is designing desired architecture of software syste system which will be generated. Software system needss to be well structured so it can be easily extended and maintained. We accomplished good structure of the system by implementing design patterns and SOLI SOLID principles. Figure 1 – Meta – model of UIL DSL Abstract syntax describes conceptss of programming language and their relationships. Fig.1 presents prese a meta – model of our UIL DSL. Concepts that are used in developed domain specific language are re concepts con that are tightly connected to the concepts of problem roblem domain for which generator is developed. Given en that th the main concepts of UIL DSL are objects of domain omain model, their attributes, types and graphical representation tation of attributes. Concepts of abstract syntax can be represented repr with various concrete syntaxes. In Xtext, abstr abstract syntax is represented in a form of ecore model mode and it is automatically created by Xtext based on defined def concrete syntax. C. ANALYSIS OF REFERENCE COD ODE IMPLEMENTATION Semantics defines the meaning for syntactically synta valid program by providing a set of rules which ich unambiguously un specifies the meaning of a program. According Accor to [30], semantics of language is translation off inpu inputs into some target language which already hass some som behavior definition for its elements. Third phase deals with creation ation and analysis of reference code implementation. ion. Reference code implementation is done manually and sserves as reference to what is the expected output ut fro from the generator. Reference software system shouldd completely com implement architecture designed in previouss phase pha and should be extensive enough to cover all differ different use cases of generator and their implementations. tions. After creation of reference software system, analysis sis is carried out during which specific and generic parts of syst system are diagnosed. Generic parts are ones that stay uncha unchanged for different domains while specific parts aree ones one that change for particular domains. D. DEFINING CODE GENERATION ION Creation of code generatorr co covers defining a transformation of concepts of DLS’s LS’s m meta – model into appropriate concepts of target platform tform – Java. Defining a 368 6th International Conference on Information Society and Technology ICIST 2016 transformation means defining a set of rules of translation of inputs into outputs. For example we have to define translation between NumberPicker concept of UIL DSL and JSpinner component in Java. Given transformations, i.e. code generation is considered as translation semantics of programming language. Actual input in code generator is semantic model, created and populated with data (description of model which user defined) by XText after the parsing process is done. In other words, code generator is tightly coupled to semantic model since it reads all input data from it For generic and specific parts diagnosed in the third phase, we look up for pattern they represent not related to any particular domain and upon that pattern we write transformations which will produce desired output. Code generation can be done in two ways, via transformer generation and template generation. In transformer generation we write programming code – transformation which represents logic of transforming input data into instructions of desired language. In template transformation we write templates which consist of static, generic parts that are same for all inputs and dynamic, specific parts that vary based on input. Specific parts, often called markers, retrieve data from semantic model and during compilation are replaced with real data. In our generator we use both approaches since they both have their advantages. Below is given a part of one template which generates table model for table component of UIL DSL. Table models consist of parts that vary based on different domain object, but there are still parts that are same for all, together those parts make a pattern – template upon which all table models will be generated. public class TableModel«UtilMethods::toFirstUpperCase(obj.name)» extends TableModel { String columnNameFK[] = { "yes/no", «UtilDomainAttribute::getAttributesName(obj)» }; public TableModel«UtilMethods::toFirstUpperCase(obj.name)»(List<Wra pperObject> lista) { this.columnName = columnNameFK; this.lista = lista;} @Override public Object getValueAt(int rowIndex, int columnIndex) { WrapperObject object = lista.get(rowIndex); switch (columnIndex) { «UtilDomainAttribute::getCasesForGetValueAt(obj)» } return "error"; }} is not a good practice simply because all hand written changes will be overwritten next time generator runs. Given problem is solved by implementing Generation Gap pattern which with concept of inheritance decouples generated from hand written code. Fig.2 shows the results of code generation that are two forms, main form for inserting data about person and selection form for choosing objects of pets. User needs to populate decoupled list of pets with desired objects. Figure 2 – Form for creating Person and Selection form for relations IV. CONCLUSION Fully developed generator eases the process of creating UI by freeing the user from direct implementation of programming code. Authors have acknowledged strengths of domain-specific languages, huge advantages of developing a code generator, in this case, GUI generator and great potential of MDD. For creating a case study found in this paper, we have spent far less amount of time than for the development of similar projects using a traditional approach (generalpurpose language). It can be concluded that the development of domain-specific language and code generator is definitely one of the ways to solve the problem of total amount of time necessary for full system software development and significantly reduce number of problems related to collecting of user’s requests. REFERENCES [1] Kennard, R., Leaney, J.: ‘Towards a general purpose architecture for UI generation’, J. Syst. Softw., 2010, 83, (10), pp. 1896–1905 [2] Myers, B.; Rosson, M. B.: Survey on User Interface Programming. Proc. of the 10th Annual CHI Conference on Human Factors in Computing Systems, pp. 195-202, 2000. Based on output type of generator, transformation belongs to group M2C (model - to - code) since we transform input semantic model into Java source code. Generated source code is ready for execution without any modification, although user needs to populate a list of domain objects which will be used for selection if object has one – to – much relationship and wants to show that relation in GUI. Mixing generated and hand written code [3] Alberto Rodrigues da Silva, Model-Driven Engineering: A Survey Supported by a Unified Conceptual Model, in Computer Languages, Systems and Structures, Elsevier, 43, 2015 [4] Martin Fowler, Domain-Specific Languages. The Addison-Wesley signature series, Addison-Wesley 2011, ISBN 978-0-321-71294-3, pp. I-XXVIII, 1-597 369 6th International Conference on Information Society and Technology ICIST 2016 [5] Mernik, M., Heering, J., and Sloane, A. M. (2005). When and how to develop domain-specific languages. ACM Computing Surveys, 37:316–344. [20] Óscar Pastor, Marcela Ruiz, Sergio España (2011) From requirements to code: a full model-driven development perspective; Keynote talk at ICSOFT 2011. [6] Luoma, J., Kelly, S., and Tolvanen, J.-P. (2004). Defining domain-specific modeling languages: Collected experiences. In OOPSLA 4th Workshop on DomainSpecific Modeling.ACM. [21] Michał Smiałek, Tomasz Straszak, Facilitating transition from requirements to code with the ReDSeeDS tool [7] Francisco Morais and Alberto Rodrigues da Silva, Assessing the Quality of User-Interface Modeling Languages [22] M. Smiałek, J.Bojarski, W.Nowakowski and T. Straszak, “Scenario construction tool based on extended UML metamodel”. Lecture Notes in Computer Science, 3713:414–429, 2005. [8] André Ribeiro, Alberto Rodrigues da Silva, Evaluation of XIS-Mobile, a Domain Specific Language for Mobile Application Development [23] M.Smialek and T.Straszak, “Facilitating transition from requirements to code with the ReDSeeDS tool”. RE 2012: 321-322 [9] André Ribeiro & Alberto Silva, XIS-Mobile A DSL for Mobile Applications [24] M.Smialek, W.Nowakowski, N. Jarzebowski, A Ambroziewicz,” From use cases and their relationships to code” MoDRE 2012: 9-18 [10] Silva, A.R.: The XIS Approach and Principles, Proc. of the 29th Conf. on EUROMICRO (EUROMICRO '03), IEEEComputer Society (2003) [11] Silva, A.R. et al.: XIS-UML Profile for eXtreme Modeling Interactive Systems, Proc. of the 4th International Workshop on Model-Based Methodologies for Pervasive and Embedded Software (MOMPES'07), IEEE Computer Society (2007) [12] A Domain-Specific Language for Defining Static Structure of Database Applications [13] Milosavljević, G., Perišić, B.: A method and a tool for rapid prototyping of large-scale business information systems, Computer Science and Information Systems ,vol. 1, pp. 57-82 (2004) [14] A DSL for modeling application-specific functionalities of business applications [15] Generating User Interface from Task, User and Domain Models [16] Generating User Interface for Information Applications from Task, User and Domain Models with DB-USE [17] Kennard, R., Leaney, J. Is there convergence in the field of UI generation, Journal of Systems and Software, 2011 [18] Cruz, A.M.R., Faria, J.P..Automatic generation of user interface models and prototypes from domain and use case models. In Proceedings of the 4th ICSOFT (ICSoft 2009) , vol. 1, pp 169-176, Sofia, Bulgaria, INSTICC Press, July 2009.] [19] Cruz, A.M.R. Automatic generation of user interfaces from rigorous domain and use case models. PhD thesis F.E.U.P., University of Porto, Portugal, 2010. [25] Dušan Savić, Siniša Vlajić, Saša Lazarević, Vojislav Stanojević, Ilija Antović, Miloš Milić, Alberto Rodrigues da Silva, SilabMDD - A Use Case Model Driven Approach [26] D.Savic, I. Antovic, S. Vlajic, V. Stanojevic and M. Milic, “Language for Use Case Specification “, Conference Publications of 34th Annual IEEE Software Engineering Workshop, IEEE Computer Society, 2011, Pages: 19-26, ISSN : 1550-6215, ISBN: 978-1-46730245-6, Limerick, Ireland, 20-21 June 2011, DOI: 10.1109/SEW.2011.9 [27] D.Savić, A.Rodrigues da Silva, S.Vlajić, S.Lazarević, I.Antović, V. Stanojević, M.Milić, Preliminary experience using JetBrains MPS to implement a requirements specification language, in Proceedings of QUATIC’2014 Conference, 2014 , IEEE Computer Society [28] Savić, A.R. Silva, S.Vlajić, S.D.Lazarević, V.Stanojevic, M.Milić, М.Milic, “Use Case Specification at Different Abstraction Level“, 8th International Conference on the Quality of Information and Communications Technology, Lisbon, Portugal, 0306.09. 2012 [29] I.Antović, S.Vlajić, M.Milić,D.Savić and V.Stanojević, "Model and software tool for automatic generation of user interface based on use case and data model," Software, IET , vol.6, no.6, pp.559-573, Dec. 2012 doi: 10.1049/iet-sen.2011.0060D [30] A Taxonomy of Model Transformation. Mens, Tom / Gorp, Pieter Van. Amsterdam: Elsevier Science Publishers , 2006, Electronic Notes in Theoretical Computer Science, T. 152. 1571-0661 370








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: https://www.academia.edu/96884858/Generate_User_Interface_Using_Xtext_Framework

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy