{"id":58494,"date":"2016-07-18T17:41:52","date_gmt":"2016-07-18T14:41:52","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=58494"},"modified":"2016-07-26T02:29:32","modified_gmt":"2016-07-25T23:29:32","slug":"how-extensible-is-your-framework","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html","title":{"rendered":"How extensible is your framework?"},"content":{"rendered":"<p>Attending conferences we always get to meet highly qualified decision makers, who frequently ask the same question: \u2018<strong><em>How extensible is your framework and what if I need more than you offer out-of-the-box?<\/em><\/strong>\u2018. The question is very reasonable, as they simply don\u2019t want to be stuck right in the middle of the development curve, then realise\u00a0 that the framework just doesn\u2019t allow implementing some features or, likely, if you use open source product, it requires an unpredictably long time to dig deeper to poorly documented parts of the framework.<\/p>\n<p>Significant attention is usually paid to the user interface part: how many components does the framework have? Is there an ability to integrate 3rd party widgets? Finally, how easy can those be integrated into your applications.<\/p>\n<p>Even if the framework gives you an enormous number of the components out-of-the-box, occasionally you may need to have something very specific, not generally used, hence, not implemented in the framework.<\/p>\n<p>In this article I will illustrate how you can integrate 3rd party visual components into the <a href=\"https:\/\/www.cuba-platform.com\/\">CUBA Platform<\/a>.<\/p>\n<h1>Generic User Interface in the CUBA Platform<\/h1>\n<p>To give you a brief idea of what visual components you have out-of-the-box with the CUBA Platform have a look at the pictures below:<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/1.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58495 size-large\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/1-1024x640.png\" alt=\"1\" width=\"620\" height=\"388\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/1-1024x640.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/1-300x188.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/1-768x480.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/1.png 1280w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/2.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58496 size-large\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/2-1024x641.png\" alt=\"2\" width=\"620\" height=\"388\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/2-1024x641.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/2-300x188.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/2-768x481.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/2.png 1278w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><\/a><\/p>\n<p>As you see, there is an extensive component set available out-of-the-box, but all of the components are very generic, widely used for enterprise applications. Let\u2019s now assume that we need to integrate something more specific.<\/p>\n<p>From version 2.1 of the CUBA Studio, this process has been massively simplified for Vaadin, JavaScript and GWT components, because Studio scaffolds stubs and adds all required definitions for a new component. There are three levels of integration of a new component into the platform:<\/p>\n<ol>\n<li>As generic UI of the framework is built over Vaadin, the new component becomes available as a native Vaadin component. Developers can already use this component in CUBA applications, adding it into an unwrapped CUBA container.<\/li>\n<li>The new component is integrated into CUBA Generic UI. In this case, from an application developer perspective, it looks the same as a standard component from the visual components library. The developer can define the component in a screen XML descriptor or create it through <em>ComponentsFactory<\/em> in a controller.<\/li>\n<li>The new component is available on the Studio components palette and can be used in the WYSIWYG layout editor, as it is shown in the picture below.<\/li>\n<\/ol>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/3.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58497 size-full\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/3.png\" alt=\"3\" width=\"932\" height=\"587\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/3.png 932w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/3-300x189.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/3-768x484.png 768w\" sizes=\"(max-width: 932px) 100vw, 932px\" \/><\/a><\/p>\n<p>In this article we will have a look at the first level integration for a Vaadin component and create a sample application to see how it can be used in your CUBA application at this stage.<\/p>\n<h1>Integrating Vaadin Components<\/h1>\n<p>As I previously mentioned, the generic UI in the CUBA Platform is built over the Vaadin framework, it is very easy to integrate its components into your CUBA application:<\/p>\n<ol>\n<li>Add dependency to the 3rd party Vaadin add-on artifact.<\/li>\n<li>Create the <strong>web-toolkit<\/strong> module in your project. This module contains a GWT widgetset file and allows you to create client-side parts of visual components. Just include the add-on widgetset to the widgetset of your project.<\/li>\n<li>If look and feel of the component does not fit the application theme, create a theme extension and define some CSS for the new component.<\/li>\n<\/ol>\n<p>Let\u2019s take the <a href=\"https:\/\/vaadin.com\/directory\/-\/directory\/addon\/stepper\">Stepper<\/a> component as an example and have a look how it works in the CUBA Studio:<\/p>\n<p>As the first step we click on <strong>Create web toolkit module<\/strong>, to be able to integrate Vaadin components, then we click on <strong>Create new UI component<\/strong>:<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/4.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58498 size-full\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/4.png\" alt=\"4\" width=\"366\" height=\"357\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/4.png 366w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/4-300x293.png 300w\" sizes=\"(max-width: 366px) 100vw, 366px\" \/><\/a><\/p>\n<p>Now we are about 10 minutes far from having a new Vaadin component in CUBA:<\/p>\n<ol>\n<li>Select <strong>Vaadin add-on<\/strong> in the <strong>Component type <\/strong>group box.<\/li>\n<li>To define <strong>Add-on Maven dependency<\/strong> value go to the <a href=\"https:\/\/vaadin.com\/directory#!addon\/stepper\">stepper add-on page<\/a>, press the <strong>Install<\/strong> green button, copy it from the appearing textbox and paste into the <strong>Add-on Maven dependency <\/strong>field in the CUBA Studio.<br \/>\n<a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/5.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58499 size-full\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/5.png\" alt=\"5\" width=\"800\" height=\"260\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/5.png 800w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/5-300x98.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/5-768x250.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/li>\n<li>The most tricky and confusing part, especially for those who are using Vaadin for the first time, is <strong>Inherited widgetset <\/strong>(You can learn more about Vaadin WidgetSets <a href=\"https:\/\/dev.vaadin.com\/wiki\/WidgetSet\">here<\/a>, but you don\u2019t really need to have deep understanding about it to keep going through this article). There is a <strong>Source code<\/strong> link in the <strong>Related links<\/strong> section of the <a href=\"https:\/\/vaadin.com\/directory#!addon\/stepper\">stepper add-on page<\/a>, click on it. The link will lead you to the <a href=\"https:\/\/github.com\/ripla\/Stepper\/\">GitHub repository<\/a> of the component. To define a widgetset of a Vaadin component you need to find <em>*.gwt.xml<\/em> file in the sources. Continue to the <a href=\"https:\/\/github.com\/ripla\/Stepper\/tree\/master\/addon\/src\/main\/resources\"><em>addon\/src\/main\/resources<\/em><\/a> folder. Here you see the <a href=\"https:\/\/github.com\/ripla\/Stepper\/tree\/master\/addon\/src\/main\/resources\/org\/vaadin\/risto\/stepper\/widgetset\">org\/vaadin\/risto\/stepper\/<\/a><a href=\"https:\/\/github.com\/ripla\/Stepper\/tree\/master\/addon\/src\/main\/resources\/org\/vaadin\/risto\/stepper\/widgetset\">widgetset<\/a> containing the <a href=\"https:\/\/github.com\/ripla\/Stepper\/blob\/master\/addon\/src\/main\/resources\/org\/vaadin\/risto\/stepper\/widgetset\/StepperWidgetset.gwt.xml\">StepperWidgetset.gwt.xml<\/a> file. That\u2019s enough to construct our <strong>Inherited widgetset<\/strong> value: <em>org.vaadin.risto.stepper.widgetset.StepperWidgetset<\/em>. Simply put, it\u2019s the path to the <em>*.gwt.xml <\/em>file written as importing class in Java.<br \/>\n<a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/6.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58500 size-full\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/6.png\" alt=\"6\" width=\"595\" height=\"212\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/6.png 595w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/6-300x107.png 300w\" sizes=\"(max-width: 595px) 100vw, 595px\" \/><\/a><\/li>\n<li>Uncheck the <strong>Integrate into generic UI<\/strong> box for now and say <strong>OK<\/strong>.<\/li>\n<li>The Studio will show notification \u201c<strong>Component created<\/strong>\u201d and rebuild the project, because it needs to add new dependency to the gradle build script, download required library and re-compile widgetset. So, we just wait a couple of minutes until the process is finished.<\/li>\n<li>As a final touch we adjust the component to fit our application theme.<\/li>\n<\/ol>\n<p>If we have a look at the <a href=\"https:\/\/github.com\/ripla\/Stepper\/tree\/master\/addon\/src\/main\/resources\/VAADIN\/addons\/stepper\">source code<\/a>, we can see that this component is <em>SCSS<\/em> styled, so we need to add its style to the project dependencies. To do so, go to the <strong>Project Properties<\/strong> section, click <strong>IDE<\/strong>. IDE will show <strong>build.gradle<\/strong>, where you should add themes(&#8220;org.vaadin.addons:stepper:2.3.0&#8221;) line to the dependencies clause of the configure(webModule) task, as it is shown in the picture below.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/7.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58501 size-large\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/7-1024x295.png\" alt=\"7\" width=\"620\" height=\"179\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/7-1024x295.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/7-300x87.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/7-768x222.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/7.png 1300w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><\/a><\/p>\n<p>Now we can apply the styling we want. Go to the <strong>Project Properties<\/strong> section and click <strong>Create theme extension<\/strong>. Select <strong>halo<\/strong>, as the default one, and click <strong>Create<\/strong>. The Studio will add the <em>themes\/halo\/halo-ext.scss<\/em> file in the <strong>web<\/strong> module of your application, where you can specify styles for new components or modify existing ones. It will also make necessary changes in the build script and recreate project files for your IDE.<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/8.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58502 size-full\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/8.png\" alt=\"8\" width=\"373\" height=\"359\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/8.png 373w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/8-300x289.png 300w\" sizes=\"(max-width: 373px) 100vw, 373px\" \/><\/a><\/p>\n<p>Open the halo-ext.scss file in your IDE and paste the following CSS as it is shown in the picture below:<\/p>\n<pre class=\"brush:java\">\u2026\r\n@import \"..\/VAADIN\/addons\/stepper\/stepper\";\r\n\u2026\r\n\r\n@include stepper;\r\n    \r\n\/* Basic styles for stepper inner textbox *\/\r\n    .stepper input[type=\"text\"] {\r\n       @include box-defaults;\r\n       @include valo-textfield-style;\r\n       &amp;:focus {\r\n         @include valo-textfield-focus-style;\r\n       }\r\n    }\r\n\u2026\r\n<\/pre>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/9.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58503 size-full\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/9.png\" alt=\"9\" width=\"789\" height=\"319\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/9.png 789w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/9-300x121.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/9-768x311.png 768w\" sizes=\"(max-width: 789px) 100vw, 789px\" \/><\/a><\/p>\n<p><strong>That\u2019s it! Now we already can use the component in our CUBA application!<\/strong><\/p>\n<h1>Using 3rd Party Vaadin Component in your CUBA Application<\/h1>\n<p>Let\u2019s finally create a screen with the stepper. As we have completed only the first level of integration it is still not a part of generic CUBA UI, so it cannot be used directly from xml screen descriptor, but it can already be created programmatically.<\/p>\n<p>Let\u2019s get started:<\/p>\n<ol>\n<li><a href=\"https:\/\/www.cuba-platform.com\/\">Download<\/a> the CUBA Studio from our website, install it, launch CUBA Studio server and open the studio in your browser. If you have any complications at this stage just follow the <a href=\"https:\/\/www.cuba-platform.com\/quickstart\">video guide<\/a> (Part 1 from the Quick Start page).<\/li>\n<li>Create a project named <strong>vaadin-component<\/strong>. The Studio automatically names project namespace and root package.<br \/>\n<a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/10.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58504 size-full\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/10.png\" alt=\"10\" width=\"517\" height=\"305\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/10.png 517w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/10-300x177.png 300w\" sizes=\"(max-width: 517px) 100vw, 517px\" \/><\/a><\/li>\n<li>Follow the steps from the <strong>Integrating Vaadin Components<\/strong><\/li>\n<li>Since step 3 is completed go to the <strong>Screens<\/strong> section in the left panel of the Studio, focus on <strong>Web Module<\/strong> item and click <strong>New<\/strong>. The Studio will prompt you to choose if you want to create a new screen from scratch or extend an existing screen (e.g. User editor or File Upload dialog). We will go for a new screen <strong>from scratch<\/strong>.<\/li>\n<li>Let\u2019s now go straight to the <strong>Layout<\/strong> tab, where we can visually design our screen. We need to use some container, that will act as a placeholder for the stepper. Type \u2018<em>hbox<\/em>\u2019 in the component search field, the studio will filter UI components by name. Drag and drop the <strong>HBox<\/strong> component to the form or the <strong>Hierarchy<br \/>\n<a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/11.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58505 size-full\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/11.png\" alt=\"11\" width=\"556\" height=\"351\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/11.png 556w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/11-300x189.png 300w\" sizes=\"(max-width: 556px) 100vw, 556px\" \/><\/a><\/strong><\/li>\n<li>Right click on the component representation, located in the visual form layout; or select component in the <strong>Hierarchy<\/strong> section and switch to the <strong>Properties<\/strong> tab (next to the <strong>Palette<\/strong> one).<\/li>\n<\/ol>\n<p>We will need to use our Hbox from the screen controller, to be able to reach a CUBA component from the controller we will need to define its <strong>id<\/strong>. Simply press right hand button in the <strong>id<\/strong> field and the Studio will generate an id automatically.<\/p>\n<p>Also we would like our stepper to be 250px wide, so we specify this size to its container.<\/p>\n<p>Apply all the changes we\u2019ve done.<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/12.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58506 size-full\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/12.png\" alt=\"12\" width=\"290\" height=\"356\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/12.png 290w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/12-244x300.png 244w\" sizes=\"(max-width: 290px) 100vw, 290px\" \/><\/a><\/p>\n<ol start=\"7\">\n<li>Launch your IDE, go to the <strong>Controller<\/strong> tab of the screen designer and press the <strong>IDE<\/strong> The Studio will generate project files and open the screen controller in your IDE.<br \/>\n<a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/13.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58507 size-full\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/13.png\" alt=\"13\" width=\"809\" height=\"387\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/13.png 809w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/13-300x144.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/13-768x367.png 768w\" sizes=\"(max-width: 809px) 100vw, 809px\" \/><\/a><\/li>\n<li>Move to the IDE, where we already have our screen controller scaffolded by the Studio. Let\u2019s code a bit. All rows you need to add are annotated with detailed comments:<\/li>\n<\/ol>\n<pre class=\"brush:java\">package com.company.vaadincomponent.web.screens;\r\n\r\nimport com.haulmont.cuba.gui.vaadincomponent.AbstractWindow;\r\nimport com.haulmont.cuba.gui.vaadincomponent.HBoxLayout;\r\nimport com.vaadin.ui.Layout;\r\nimport org.vaadin.risto.stepper.DateStepper;\r\n\r\nimport javax.inject.Inject;\r\nimport java.util.Map;\r\n\r\npublic class Screen extends AbstractWindow {\r\n   \/* Getting access to the hbox component, using CUBA mechanism for UI components injection *\/\r\n   @Inject\r\n   private HBoxLayout hbox;\r\n\r\n   \/* Create stepper to be placed into the prepared hbox container *\/\r\n   private DateStepper stepper = new DateStepper();\r\n\r\n   \/* Overriding init method, which will be called by the framework after creation of all components and before showing the screen *\/\r\n   @Override\r\n   public void init(Map&lt;String, Object&gt; params) {\r\n       super.init(params);\r\n\r\n       \/* Unwrapping hbox to get access to the native Vaadin layout to place stepper *\/\r\n       Layout box = hbox.unwrap(Layout.class);\r\n\r\n       \/* Placing stepper component into the unwrapped hbox container *\/\r\n       box.addComponent(stepper);\r\n\r\n       \/* Defining stepper size to fit 100% of the parent hbox component width *\/\r\n       stepper.setWidth(\"100%\");\r\n\r\n       \/* Adding listener to show notification when stepper value is changed *\/\r\n       stepper.addValueChangeListener(event -&gt; \r\n           showNotification(\"Value has been changed to \" + stepper.getValue(), NotificationType.HUMANIZED)\r\n       );\r\n   }\r\n}\r\n<\/pre>\n<ol start=\"9\">\n<li>To access our screen from the main menu of the application, go to the <strong>Main Menu<\/strong> section of the right panel in the Studio, click Edit, focus on the <strong>application <\/strong>item and press <strong>New<\/strong>. We left our stepper screen id by default, so, find <em>screen<\/em> value in the drop down list and press <strong>Add<\/strong>.<br \/>\n<a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/14.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58508 size-large\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/14-1024x783.png\" alt=\"14\" width=\"620\" height=\"474\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/14-1024x783.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/14-300x229.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/14-768x587.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/14.png 1025w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><\/a><\/li>\n<li>It\u2019s time to launch the application and see how it all works. Press \u2018<strong>Play<\/strong>\u2019 button, which is located right under the <strong>Build<\/strong> item of the Studio\u2019s main menu. The Studio will ask your permission to update DB, agree on it.<\/li>\n<\/ol>\n<p>When the application is up and running you will see the <a href=\"http:\/\/localhost:8080\/app\">localhost:8080\/app<\/a> link in the bottom-left, click on it.<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/15.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58509 size-full\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/15.png\" alt=\"15\" width=\"367\" height=\"711\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/15.png 367w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/15-155x300.png 155w\" sizes=\"(max-width: 367px) 100vw, 367px\" \/><\/a><\/p>\n<p>The CUBA Application will meet you with the login screen, where default user is <em>admin<\/em>, guess what is the password? Just press <strong>Submit<\/strong>. Click on the <strong>Application -&gt; Screen<\/strong> item of the main menu and here we go!<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/16.png\"><img decoding=\"async\" class=\"aligncenter wp-image-58510 size-full\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/16.png\" alt=\"16\" width=\"691\" height=\"213\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/16.png 691w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/07\/16-300x92.png 300w\" sizes=\"(max-width: 691px) 100vw, 691px\" \/><\/a><\/p>\n<p>You can find the source code of the working stepper sample project <a href=\"https:\/\/github.com\/aleksey-stukalov\/vaadin-component\">here<\/a>.<\/p>\n<h1>Conclusion<\/h1>\n<p>Initially, I was going to write a post covering all levels of integration for Vaadin, GWT and JavaScript components, but as you see it would be too much for one article. So, next time I will go through JavaScript components.<\/p>\n<p>Also,\u00a0 I would like to admit that some parts of the process can be hugely simplified and even totally eliminated, but this is the first step that can immediately help users to saturate our generic user interface with rarely used, but sometimes extremely useful widgets. So, if you have suggestions or ideas on how it can be improved, please share them with us on our <a href=\"https:\/\/www.cuba-platform.com\/support\/\">forum<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Attending conferences we always get to meet highly qualified decision makers, who frequently ask the same question: \u2018How extensible is your framework and what if I need more than you offer out-of-the-box?\u2018. The question is very reasonable, as they simply don\u2019t want to be stuck right in the middle of the development curve, then realise\u00a0 &hellip;<\/p>\n","protected":false},"author":925,"featured_media":55008,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[1157],"class_list":["post-58494","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-cuba-platform"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How extensible is your framework? - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Attending conferences we always get to meet highly qualified decision makers, who frequently ask the same question: \u2018How extensible is your framework and\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How extensible is your framework? - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Attending conferences we always get to meet highly qualified decision makers, who frequently ask the same question: \u2018How extensible is your framework and\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/CUBAplatform\" \/>\n<meta property=\"article:published_time\" content=\"2016-07-18T14:41:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-07-25T23:29:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/04\/cuba-platform-os-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"CUBA Platform\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CubaPlatform\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"CUBA Platform\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/how-extensible-is-your-framework.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/how-extensible-is-your-framework.html\"},\"author\":{\"name\":\"CUBA Platform\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/470baf310b973af7e1cdcc621c98c1fc\"},\"headline\":\"How extensible is your framework?\",\"datePublished\":\"2016-07-18T14:41:52+00:00\",\"dateModified\":\"2016-07-25T23:29:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/how-extensible-is-your-framework.html\"},\"wordCount\":1720,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/how-extensible-is-your-framework.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2016\\\/04\\\/cuba-platform-os-logo.jpg\",\"keywords\":[\"CUBA Platform\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/how-extensible-is-your-framework.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/how-extensible-is-your-framework.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/how-extensible-is-your-framework.html\",\"name\":\"How extensible is your framework? - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/how-extensible-is-your-framework.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/how-extensible-is-your-framework.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2016\\\/04\\\/cuba-platform-os-logo.jpg\",\"datePublished\":\"2016-07-18T14:41:52+00:00\",\"dateModified\":\"2016-07-25T23:29:32+00:00\",\"description\":\"Attending conferences we always get to meet highly qualified decision makers, who frequently ask the same question: \u2018How extensible is your framework and\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/how-extensible-is-your-framework.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/how-extensible-is-your-framework.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/how-extensible-is-your-framework.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2016\\\/04\\\/cuba-platform-os-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2016\\\/04\\\/cuba-platform-os-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/how-extensible-is-your-framework.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"How extensible is your framework?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/470baf310b973af7e1cdcc621c98c1fc\",\"name\":\"CUBA Platform\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae4bc5d6ffc84f51ef6c68f164799b97552245e8de25d62557a961e60c6920e9?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae4bc5d6ffc84f51ef6c68f164799b97552245e8de25d62557a961e60c6920e9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae4bc5d6ffc84f51ef6c68f164799b97552245e8de25d62557a961e60c6920e9?s=96&d=mm&r=g\",\"caption\":\"CUBA Platform\"},\"description\":\"CUBA Platform is a full stack Java framework for enterprise applications development. Compared to popular frameworks like Grails it offers a higher level of abstraction, still allowing direct access to the low level API. CUBA Studio takes care of project and build files, database scripts, screens scaffolding, visual design and other routine tasks, enabling developer to focus on the application logic. With a wide range of out of the box components this provides massive development time savings, proven by hundreds of delivered projects. CUBA Platform is developed by Haulmont.\",\"sameAs\":[\"https:\\\/\\\/www.cuba-platform.com\",\"https:\\\/\\\/www.facebook.com\\\/CUBAplatform\",\"https:\\\/\\\/x.com\\\/CubaPlatform\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/cuba-platform\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How extensible is your framework? - Java Code Geeks","description":"Attending conferences we always get to meet highly qualified decision makers, who frequently ask the same question: \u2018How extensible is your framework and","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html","og_locale":"en_US","og_type":"article","og_title":"How extensible is your framework? - Java Code Geeks","og_description":"Attending conferences we always get to meet highly qualified decision makers, who frequently ask the same question: \u2018How extensible is your framework and","og_url":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_author":"https:\/\/www.facebook.com\/CUBAplatform","article_published_time":"2016-07-18T14:41:52+00:00","article_modified_time":"2016-07-25T23:29:32+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/04\/cuba-platform-os-logo.jpg","type":"image\/jpeg"}],"author":"CUBA Platform","twitter_card":"summary_large_image","twitter_creator":"@CubaPlatform","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"CUBA Platform","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html"},"author":{"name":"CUBA Platform","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/470baf310b973af7e1cdcc621c98c1fc"},"headline":"How extensible is your framework?","datePublished":"2016-07-18T14:41:52+00:00","dateModified":"2016-07-25T23:29:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html"},"wordCount":1720,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/04\/cuba-platform-os-logo.jpg","keywords":["CUBA Platform"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html","url":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html","name":"How extensible is your framework? - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/04\/cuba-platform-os-logo.jpg","datePublished":"2016-07-18T14:41:52+00:00","dateModified":"2016-07-25T23:29:32+00:00","description":"Attending conferences we always get to meet highly qualified decision makers, who frequently ask the same question: \u2018How extensible is your framework and","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/04\/cuba-platform-os-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/04\/cuba-platform-os-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/how-extensible-is-your-framework.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"How extensible is your framework?"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/470baf310b973af7e1cdcc621c98c1fc","name":"CUBA Platform","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ae4bc5d6ffc84f51ef6c68f164799b97552245e8de25d62557a961e60c6920e9?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ae4bc5d6ffc84f51ef6c68f164799b97552245e8de25d62557a961e60c6920e9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ae4bc5d6ffc84f51ef6c68f164799b97552245e8de25d62557a961e60c6920e9?s=96&d=mm&r=g","caption":"CUBA Platform"},"description":"CUBA Platform is a full stack Java framework for enterprise applications development. Compared to popular frameworks like Grails it offers a higher level of abstraction, still allowing direct access to the low level API. CUBA Studio takes care of project and build files, database scripts, screens scaffolding, visual design and other routine tasks, enabling developer to focus on the application logic. With a wide range of out of the box components this provides massive development time savings, proven by hundreds of delivered projects. CUBA Platform is developed by Haulmont.","sameAs":["https:\/\/www.cuba-platform.com","https:\/\/www.facebook.com\/CUBAplatform","https:\/\/x.com\/CubaPlatform"],"url":"https:\/\/www.javacodegeeks.com\/author\/cuba-platform"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/58494","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/925"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=58494"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/58494\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/55008"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=58494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=58494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=58494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}