Shay Shmeltzer
CI, DevOps and ALM for Oracle SOA Suite with Oracle Developer Cloud Service
We have a lot of developers who are using JDeveloper to develop applications with Oracle SOA Suite, and in this blog I wanted to show them how the combination of JDeveloper along with Oracle Developer Cloud Service can help automate their whole development and delivery lifecycle.
One unique aspect of Developer Cloud Service is that it has an instance of JDeveloper available in the build environment. This allows customers who are building Oracle SOA artifacts to leverage the OJDeploy mechanism to package their applications as part of a continuous integration cycle just like they do during development time.
With the improved DevCS integration that we added in JDeveloper 12.2.1, developers can go beyond integration with the Git server offered by DevCS and can now interact with the DevCS task tracking system directly as well as associate code changes to specific tasks they are working on.
In this 10 minutes video I show:
- Creating Ant based builds for Oracle SOA artifacts
- Automating Continuous Integration build and packaging for Oracle SOA from Developer Cloud Service
- Managing SOA project code with Git and Developer Cloud Service
- Tracking tasks from JDeveloper and monitor agile development in Developer Cloud Service
By the way, for those who rather use Maven to automate their builds - this is totally possible and supported in DevCS as well. There is a set of videos that show you how to do that here.
(If you haven't seen how quick and easy it is to create a DevCS project, create a git repo, track tasks and create agile team boards - see this video and this one too).
Note that developers get access to Developer Cloud Service with every subscription to the Oracle SOA Cloud Service.
Here are the two ant files used in the video:
Note that in the build.properties you'll want to change the application and project names to match the ones you are working on.
As you see in the video the build.xml is generated for you automatically and you just need to add the line:
<property environment="env" />
build.properties
oracle.commons=../../../../oracle_common/oracle.commons=../../../../oracle_common/install.dir=../../../..oracle.home=${env.ORACLE_HOME_SOA_12_2_1}oracle.jdeveloper.workspace.path=${env.WORKSPACE}/e2e-1201-composites.jwsmiddleware.home=${env.MIDDLEWARE_HOME_SOA_12_2_1}workspace=${env.WORKSPACE}oracle.jdeveloper.ant.library=${env.ORACLE_HOME_SOA_12_2_1}/jdev/lib/ant-jdeveloper.jaroracle.jdeveloper.deploy.dir=${env.WORKSPACE}/ProcessOrder/deployoracle.jdeveloper.ojdeploy.path=${oracle.home}/jdev/bin/ojdeployjavac.nowarn=offoracle.jdeveloper.project.name=ProcessOrderoracle.jdeveloper.deploy.outputfile=${env.WORKSPACE}/e2e-1201-composites/ProcessOrder/deploy/${profile.name}output.dir=classesjavac.deprecation=offoracle.jdeveloper.deploy.profile.name=*javac.debug=on
build.xml
<?xml version="1.0" encoding="UTF-8" ?><!--Ant buildfile generated by Oracle JDeveloper--><!--Generated Jul 25, 2016 5:11:09 PM--><project xmlns="antlib:org.apache.tools.ant" name="ProcessOrder" default="all" basedir="."><property environment="env" /><property file="build.properties"/><path id="library.SOA.Designtime"><pathelement location="${install.dir}/soa/plugins/jdeveloper/extensions/oracle.sca.modeler.jar"/></path><path id="library.SOA.Runtime"><pathelement location="${install.dir}/soa/soa/modules/oracle.soa.fabric_11.1.1/fabric-runtime.jar"/><pathelement location="${install.dir}/soa/soa/modules/oracle.soa.fabric_11.1.1/tracking-api.jar"/><pathelement location="${install.dir}/soa/soa/modules/oracle.soa.fabric_11.1.1/tracking-core.jar"/><pathelement location="${install.dir}/soa/soa/modules/oracle.soa.fabric_11.1.1/edn.jar"/><pathelement location="${install.dir}/soa/soa/modules/oracle.soa.mgmt_11.1.1/soa-infra-mgmt.jar"/><pathelement location="${oracle.commons}/modules/com.oracle.webservices.fabric-common-api.jar"/></path><path id="library.BPEL.Runtime"><pathelement location="${install.dir}/soa/soa/modules/oracle.soa.bpel_11.1.1/orabpel.jar"/></path><path id="library.Mediator.Runtime"><pathelement location="${install.dir}/soa/soa/modules/oracle.soa.mediator_11.1.1/mediator_client.jar"/></path><path id="library.MDS.Runtime"><pathelement location="${oracle.commons}/modules/oracle.mds/mdsrt.jar"/></path><path id="library.BC4J.Service.Runtime"><pathelement location="${oracle.commons}/modules/oracle.adf.model/adfbcsvc.jar"/><pathelement location="${oracle.commons}/modules/oracle.adf.model/adfbcsvc-share.jar"/><pathelement location="${oracle.commons}/modules/commonj.sdo.backward.jar"/><pathelement location="${oracle.commons}/modules/commonj.sdo.jar"/><pathelement location="${oracle.commons}/modules/oracle.toplink/eclipselink.jar"/><pathelement location="${oracle.commons}/modules/com.oracle.webservices.fmw.wsclient-impl.jar"/><pathelement location="${oracle.commons}/modules/com.oracle.webservices.fmw.jrf-ws-api.jar"/><pathelement location="${oracle.commons}/modules/com.oracle.webservices.fmw.web-common-schemas-impl.jar"/></path><path id="classpath"><path refid="library.SOA.Designtime"/><path refid="library.SOA.Runtime"/><path refid="library.BPEL.Runtime"/><path refid="library.Mediator.Runtime"/><path refid="library.MDS.Runtime"/><path refid="library.BC4J.Service.Runtime"/></path><target name="init"><tstamp/><mkdir dir="${output.dir}"/></target><target name="all" description="Build the project" depends="deploy,compile,copy"/><target name="clean" description="Clean the project"><delete includeemptydirs="true" quiet="true"><fileset dir="${output.dir}" includes="**/*"/></delete></target><target name="deploy" description="Deploy JDeveloper profiles" depends="init"><taskdef name="ojdeploy" classname="oracle.jdeveloper.deploy.ant.OJDeployAntTask" uri="oraclelib:OJDeployAntTask"classpath="${oracle.jdeveloper.ant.library}"/><ora:ojdeploy xmlns:ora="oraclelib:OJDeployAntTask" executable="${oracle.jdeveloper.ojdeploy.path}"ora:buildscript="${oracle.jdeveloper.deploy.dir}/ojdeploy-build.xml"ora:statuslog="${oracle.jdeveloper.deploy.dir}/ojdeploy-statuslog.xml"><ora:deploy><ora:parameter name="workspace" value="${oracle.jdeveloper.workspace.path}"/><ora:parameter name="project" value="${oracle.jdeveloper.project.name}"/><ora:parameter name="profile" value="${oracle.jdeveloper.deploy.profile.name}"/><ora:parameter name="nocompile" value="false"/><ora:parameter name="outputfile" value="${oracle.jdeveloper.deploy.outputfile}"/></ora:deploy></ora:ojdeploy></target><target name="compile" description="Compile Java source files" depends="init"><javac destdir="${output.dir}" classpathref="classpath" debug="${javac.debug}" nowarn="${javac.nowarn}"deprecation="${javac.deprecation}" encoding="UTF8" source="1.8" target="1.8"><src path="SOA/SCA-INF/src"/></javac></target><target name="copy" description="Copy files to output directory" depends="init"><patternset id="copy.patterns"><include name="**/*.GIF"/><include name="**/*.JPEG"/><include name="**/*.JPG"/><include name="**/*.PNG"/><include name="**/*.cpx"/><include name="**/*.dcx"/><include name="**/*.ejx"/><include name="**/*.gif"/><include name="**/*.ini"/><include name="**/*.jpeg"/><include name="**/*.jpg"/><include name="**/*.png"/><include name="**/*.properties"/><include name="**/*.sva"/><include name="**/*.tag"/><include name="**/*.tld"/><include name="**/*.wsdl"/><include name="**/*.xcfg"/><include name="**/*.xlf"/><include name="**/*.xml"/><include name="**/*.xsd"/><include name="**/*.xsl"/><include name="**/*.exm"/><include name="**/*.xml"/><exclude name="build.xml"/></patternset><copy todir="${output.dir}"><fileset dir="SOA/SCA-INF/src"><patternset refid="copy.patterns"/></fileset><fileset dir="."><patternset refid="copy.patterns"/></fileset></copy></target></project>
Extending Oracle SaaS with Oracle Application Builder Cloud Service - Simplified PaaS for SaaS
One of the focus area for us when developing the new Oracle Application Builder Cloud Service (ABCS) was to create a tool that would make it very simple to enrich Oracle SaaS applications.
This integration is a key part of Oracle's PaaS for SaaS offering - where we have unique capabilities in our Platform as a Service offering for our Software as a Service customers.
With ABCS it is very easy to pick up objects from Oracle SaaS (through the built in service catalog) and then design new web and mobile interfaces that show data from those.
In addition you can then add your own custom fields and related objects with additional data you want to track.
Once your application is complete - you can then either run it as a stand-alone app, or embed it into an Oracle SaaS interface.
I wrote two blogs and recorded two videos that show you the basics.
Creating Oracle ABCS application connected to Oracle SaaS
Embedding Oracle Application Builder Cloud Service Apps in Oracle Sales Cloud
<span id="XinhaEditingPostion"></span>
These videos are part of the new Oracle Application Builder Cloud Service YouTube Channel
And the blogs are published on the Oracle Application Builder Cloud Service OTN Community
We have more tutorials there to help you go even further - so check them out!
Continuous Integration for Database Developers - Updated
About a year ago I posted a demo showing how to manage the full development lifecycle of your database code with the help of Developer Cloud Service. Since then we released new versions of both Developer Cloud Service and JDeveloper that make the experience even smoother and add more features - so I figured I'll record a small updated demo.
In this demo I'm starting from an existing project that has a list of tasks being tracked in a development sprint in the new Agile tab in Developer Cloud Service - which gives you a great view of your development effort and progress.
(If you want to see how you create the initial project and add issues to it check out the previous demo).
A few new things you'll see in this demo:
- The new Agile/Sprint management dashboard in Developer Cloud Service
- Task tracking integration in JDeveloper
- Updating definition of database objects in JDeveloper and generating SQL scripts
- Branching Git repositories
- Code review for SQL files
- Build automation for DB changes with Ant - including deployment to a cloud database
Note that in this video I'm using a cloud instance of an Oracle database where port 1521 is open for SQLNet communication. The instructions for opening this port for communication on an Oracle Cloud Database are here.
Another approach that you can take is to use scripts that execute commands using SSH on the Database Cloud Service - you can see this approach in action in this video showing Developer Cloud Service managing an Oracle APEX Lifecycle.
The Ant script used in the sample is:
<?xml version="1.0" encoding="UTF-8" ?> <project xmlns="antlib:org.apache.tools.ant" default="init"> <target name="init"> <tstamp/> </target> <path id="antclasspath"> <fileset dir="."> <include name="ojdbc7.jar"/> </fileset> </path> <target name="deploy"> <sql driver="oracle.jdbc.OracleDriver" userid="C##xxxx" password="xxxx" url="jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:ORCL" src="./database/DATABASE1/dbcreate.sql" classpathref="antclasspath" onerror="continue"/> </target> </project>
Note that you need the Oracle JDBC jar file to be accessible from the Ant script - I just included it in my git repository.
If you like to try this out with your own database development project - get a trial of Oracle Developer Cloud Service here.
Getting Started with Oracle JET
Last week I did an "Introduction to Oracle JET" session at the KScope16 conference, and I wanted to share the demo I used there with more people.
Specifically the demo shows how you can adopt the code from the Oracle JET cookbook samples to work in the quick start template project.
In this demo you'll learn how to create your first JET application and build a basic JET page.
Specifically it shows the following steps:
- Leveraging NetBeans - HTML5/JavaScript edition
- Starting with the QuickStart Project
- Creating your own main page
- Connecting the page to Alta UI and Require.js
- Creating a JET reusable module and hooking it into your main page
- Adding a JET component to your module
- Working with the cookbook sources and adopting the code to the quick start project structure
Hopefully this video can help you build your first Oracle JET page.
Now that you watched this video that shows how to use the pre-configured project provided as a quick start, you might want to follow up and watch the video that shows you how to work with the base distribution and hook up the JET libraries.
Need more help with Oracle JET? Join the JET community on OTN.
Calling REST Services from Application Builder Cloud Service
One of the frequent requests we get when we demo ABCS is - can I invoke some external functionality that is exposed as a REST service and pass parameters to it.
Well, with a minimal amount of JavaScript coding you can do it in the current version.
I recorded the demo below that shows you how to do that.
I'm leveraging a public REST API that github exposes to get a list of repositories for a user. The service is available at https://api.github.com/users/oracle/repos
I then design an ABCS page that has a parameter field, a button that invokes the REST/JSON call, and a placeholder for results. It looks like this:
In addition the video also shows some other techniques that are useful, including:
- How to create a new blank data entry page
- How to add custom component that renders HTML content
- How to add a button that calls a REST service
- How to pass a parameter to the JavaScript custom code
- How to set a page to be the default page of the app
- How to stage your application for external testing
&amp;amp;amp;lt;span id=&amp;amp;amp;quot;XinhaEditingPostion&amp;amp;amp;quot;&amp;amp;amp;gt;&amp;amp;amp;lt;/span&amp;amp;amp;gt;
It seems that right now you are restricted to accessing REST services that are secured over HTTPS protocol (which is a good thing).
Note that you of course don't have to stage the app to see it run, you can just go into live mode, or run it to see it working. I just wanted to make sure I have a demo out there that shows how staging works.
The JavaScript snippet I'm using in the video is:
$.getJSON("https://api.github.com/users/"+ +"/repos", function(result){
$.each(result, function(i, field){
$('[name="myOutput"]').append(field.name + " ");
});
});
resolve();
If you'll actually add a
$('[name="results"]').empty();
as the first link, it will clear the field for you each time you re-press the button.
OTN Interview about Application Development with Oracle
A few weeks ago, I set down with Bob from OTN for an interview that covered some of the key products our group works on.
I covered the various frameworks (ADF, JET, MAF), what we are doing with cloud based development (DevCS) and our tools for citizen developers (ABCS).
In case you are interested in any of these acronyms here is the video:
Note that things move really fast at Oracle, and since this interview we already released a new version of Oracle JET and also made it open source, we released an update to Developer Cloud Service, and Application Builder Cloud Service has gone production.
Application Builder Cloud Service - Menus, Buttons and Validation
Continuing with the exploration of Oracle Application Builder Cloud Service, I've picked up the application I created in the previous blog entry and added a few more things to demo how to:
- Configure the logo and title
- Modify and add menu items
- Define field level validation
- Add buttons and define their actions
Check out this short demo:
First Steps with Oracle Application Builder Cloud Service
Last week we released a new cloud service - the Oracle Application Builder Cloud Service.
(I'll refer to is as ABCS here to keep it short).
ABCS is built for the non-professional developer, what some call the citizen developer, giving them a solution to very quickly build and publish applications that can address immediate business needs. As you'll see in the demo below, a UI first approach makes development very simple.
I recorded a quick demo to show you just the basics of app development and wet your appetite.
As you'll see ABCS makes it dead simple to create Web apps, define business objects that you want to track (implemented as tables in an Oracle cloud database instance), and fine tune the UI creating multiple forms. The underlying UI technology of both ABCS and the apps that it creates is Oracle JET.
Note that in this video I didn't cover the steps to actually stage and then publish your application so other users can access it - another thing that ABCS makes simple. On these and other capabilities in future blogs...
Agile Development with Oracle Developer Cloud Service and JDeveloper 12.2.1
I blogged in the past about using Oracle Developer Cloud Service (DevCS) together with JDeveloper/ADF to manage your code and automate your builds.
Since I wrote those blog entries, we released a new version of JDeveloper (12.2.1) that added deeper integration with the Developer Cloud Service functionality for tracking tasks/issues. In parallel Developer Cloud Service also added various features with one of the new areas being covered is managing sprints and an agile development processes.
I thought it might be interesting to show some of the new features of both products working togethers.
In the video below you'll see how to:
- Connect to DevCS and its projects from inside JDeveloper
- Leverage the Team view in JDeveloper (tasks, builds, and code repositories)
- Interact with Tasks/Issues in JDeveloper
- Handle Git transactions
- Associate code commits with specific tasks
- Monitor team activity in the Team Dashboard
- Create Agile boards and manage sprints in Developer Cloud Service
One other interesting feature I'm not showing above is the ability to do code reviews on your code by team members - before those are merged into your main code line.
If you want to try Developer Cloud Service out, just get a trial account of the Oracle Java Cloud Service - and you'll get an instance of the Developer Cloud Service that you can use to test this new way of working.
Developing with Oracle MAF and Oracle ADF Business Components - The REST Edition
When Oracle ADF Mobile was released over 3 years ago, one of the first blogs I created on this topic showed how to leverage Oracle ADF Business Components to access a server database and create a mobile front end on top of it.
Since then both frameworks have matured, and we learned some best practices doing implementations internally and for customers. Today I'm going to show you a better way to build this type of applications, specifically leveraging REST as the communication protocol between the ADF backend and the Oracle MAF front end. REST based integration performs much better than SOAP for this mobile scenario, and as you'll see development is as simple.
Specifically I'm leveraging the Oracle A-Team Mobile Persistence Accelerator (AMPA) JDeveloper Extension- this extension simplifies MAF's interacting with REST backends, and has some cool extra features if your REST services are based on ADF BC.
I used JDeveloper 12.2.1 to expose REST services from my ADF Business Components. If you are not familiar with how to do that, see this blog on exposing ADF BC as REST services, and then this blog about enabling CORS for ADF Business Components.
The video below picks up the same application (Application14) and continues from where the previous two ended.
Now let's see the MAF development part:
As you can see, it is quite easy to create your MAF UI. The AMPA extension does a lot of work for you making the access to the REST backend as easy as possible. (thanks goes out to Steven Davelaar).
The AMPA extension can also generate a complete UI for you - so you can give that wizard a try to if you are looking for even more productivity.
Doughnut Chart - a Yummy Addition to Oracle ADF Faces
Another new feature in Oracle ADF 12.2.1 is the new Doughnut Chart capability.
It looks like this:
When I first tried to create this one, I couldn't find the option for doughnut chart in the JDeveloper wizard.
Then I was told that a doughnut is just a pie with a hole in the center - so you actually just need to create a pie chart, and then specify some properties.
And indeed, if you'll look at the property inspector for pie charts you'll see a few new properties you can leverage.
For example there is the InnerRadius property - that expects a value between 1 and 0 - this controls how big is the hole in your doughnut.
Another nice capability is the you can put some filling in your doughnut - basically put some text that will go in the middle empty area. You do this by using centerLabel property. In the example above I used the center of the doughnut to report the total salary of a department - using a groovy sum expression in the Departments ViewObject - learn how here.
(Don't forget to use the centerLabelStyle property to assign it a bigger font - a best practice from the Oracle Alta UI book).
Here is the code from the JSF page:
<dvt:pieChart selectionListener="#{bindings.EmployeesView4.collectionModel.makeCurrent}" dataSelection="single" id="pieChart1" var="row" value="#{bindings.EmployeesView4.collectionModel}" centerLabel="Total Salary: #{bindings.SumSalary.inputValue}" innerRadius="0.7" centerLabelStyle="font-size:large;" title="Salary BreakDown" sliceLabelPosition="inside"> <dvt:chartLegend id="cl1" position="bottom"/> <dvt:pieDataItem id="di1" label="#{row.LastName}" value="#{row.Salary}"/> </dvt:pieChart>
Try it out - it's a yummy new addition to Oracle's set of bakery based charts.
Enabling CORS for ADF Business Component REST Services
CORS (which stands for Cross-Origin Resource Sharing) is a setting that will enable your REST services running on one server to be invoked from applications running on another server.
I first encountered this when I was trying to run an Oracle JET project in my NetBeans IDE that will access a set of REST services I exposed using Oracle ADF Business Component in my JDeveloper environment. Since NetBeans runs the HTML on a GlassFish instance, while JDeveloper ran the ADF BC layer on a WebLogic instance I got the dreaded No 'Access-Control-Allow-Origin' header is present error:
XMLHttpRequest cannot load http://127.0.0.1:7101/Application14-RESTWebService-context-root/rest/1/dept/20. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8383' is therefore not allowed access.
There is no built-in functionality to enable CORS for ADF BC in JDeveloper, but I found it very easy to leverage the CORS Filter libraries to do this. All you need to do is add the two JAR files it provides to your project and configure the web.xml to support the filter and the specific REST operations you want to enable CORS for.
Here is a quick video showing you the complete setup (using the REST ADF BC project created here).
The web.xml addition is:
<filter> <filter-name>CORS</filter-name> <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class> <init-param> <param-name>cors.supportedMethods</param-name> <param-value>GET, POST, HEAD, PUT, PATCH, DELETE</param-value> </init-param> </filter> <filter-mapping> <filter-name>CORS</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
If you follow my approach in the video and add the JARs as a new user library to JDeveloper and don't forget to check the "Deploy by Default" check box for the library.
Remote TaskFlows/Remote Region - For Advanced Reusability in Oracle ADF
A new feature in Oracle ADF 12.2.1 is Remote TaskFlows (or Remote Regions) - this allows one application to have regions inside it that are populated from taskflows that are running as part of another application.
Initially some of you might be a bit confused - "wasn't this something that we were able to do with ADF libraries already? We could just package a taskflow from one app as an ADF library and use that library in the other application".
The slight distinction here is that the library approach had the taskflow running as part of your consuming application. Remote task flows on the other hand have the taskflow running as part of the other application and don't require the creation of a library. As a result they also don't require an ADF library update when the taskflow changes- the minute the changes are deployed on the remote server, your application will get the new version.
One way of thinking about remote taskflows is as adding a "portal" like functionality to your ADF app - allowing one app to display parts of another app leveraging the other app resources for executing any logic.
Here is a quick video demoing how to configure and run this.
The URLs you'll need for creating the remote region resource connection are:
http://yourserver:port/your-context-root/rtfquery
and
http://yourserver:port/your-context-root/rr
Note that there are some limitation on the type and functionality of taskflows that can be exposed as remote taskflows. And there are other things to consider such as security and session timeout settings. So have a read through the remote region documentation before you start leveraging this feature.
A couple of notes.
1. In the currently available 12.2.1 version of JDeveloper from OTN, there is a slight bug that will prevent you from creating the connection to the remote task flow - there is a patch available for this from Oracle Support - request the patch for bug 22132843 or 22093099.
2. At my OOW session about new features I mentioned that remote task flows are loaded in parallel, that is actually still not the case, while we started work on this capability - it didn't made it into 12.2.1. So remote task flows behave like other task flows and load in sequential way right now.
REST based CRUD with Oracle ADF Business Components
A key new feature in Oracle ADF 12.2.1 is the ability to expose ADF Business Components through REST/JSON interfaces.
REST/JSON is the preferred interface for many client side UI technologies to access remote backend services - as examples both Oracle JET and Oracle MAF leverage REST as the way to access data from remote servers.
Oracle ADF makes it very simple to expose your existing business components as REST services - all through a declarative set of dialogs.
Once you published the service interface for a view object, you should be able to do the full set of CRUD operation on that object through different REST action:
GET - will do a Read
POST - will do a Create
PATCH - will do an Update
DELETE - will do a Delete
One thing that you'll want to verify is that when you are passing JSON data back into the REST interface you specify in the header that:
Content-Type is application/vnd.oracle.adf.resourceitem+json
otherwise you'll get an error along the lines of:
oracle.adf.internal.model.rest.core.exception.CannotParseContentException: The content type is not a ADFm REST entity. Content-Type: text/plain
In the video below I show very quickly how to expose a REST interface and then how to invoke all the CRUD operations directly from the chrome app "Postman".
These new feature can make your Oracle ADF business services part of any new application that prefers to use REST/JavaScript/HTML5 type of architecture.
Read more about exposing Oracle ADF BC as REST in the documentation.
Responsive UI in Oracle ADF 12.2.1 with the MatchMediaBehavior Tag
Another very powerful addition to the responsive capabilities of ADF Faces in version 12.2.1 is the new af:matchMediaBehavior tag. It allows you to control almost every bit of your UI and change properties in response to changes in the viewport size.
Check out what it can do in this video:
Note that in the mediaQuery you can use other type of CSS media queries.
The code for the page in the demo is
<af:panelSplitter id="ps1" orientation="horizontal" splitterPosition="201"> <f:facet name="first"> <af:panelFormLayout id="pfl1" labelAlignment="start"> <af:matchMediaBehavior matchedPropertyValue="top" propertyName="labelAlignment" mediaQuery="screen and (max-width: 768px)"/> <af:inputText label="Label 1" id="it1"/> <af:inputText label="Label 2" id="it2"/> <f:facet name="footer"/> </af:panelFormLayout> </f:facet> <f:facet name="second"> <af:panelFormLayout id="pfl2" labelAlignment="start" rows="2"> <af:matchMediaBehavior matchedPropertyValue="top" propertyName="labelAlignment" mediaQuery="screen and (max-width: 900px)"/> <af:matchMediaBehavior matchedPropertyValue="4" propertyName="rows" mediaQuery="screen and (max-width: 800px)"/> <af:inputText label="Label 1" id="it3"/> <af:inputText label="Label 2" id="it4"/> <f:facet name="footer"/> <af:inputListOfValues label="Label 1" popupTitle="Search and Result Dialog" id="ilov1"/> <af:inputFile label="Label 1" id="if1"/> </af:panelFormLayout> </f:facet> <af:matchMediaBehavior matchedPropertyValue="vertical" propertyName="orientation" mediaQuery="screen and (max-width: 768px)"/> <af:matchMediaBehavior matchedPropertyValue="100" propertyName="splitterPosition" mediaQuery="screen and (max-width: 768px)"/> </af:panelSplitter>
Introducing the Masonry Layout in Oracle ADF 12.2.1
One of the focus areas for Oracle ADF 12.2.1 was simplifying the creation of responsive UIs, and one of the new components that supports this is the af:masonryLayout component. It allows you to define areas on your page that act as tiles and automatically re-arrange themselves to match the browser's window size.
This layout is very useful for dashboard type of pages where you are showing all sorts of information.
In the video below I show you the very basic way to use this out of the box.
As mentioned in the video there are built in styleClasses in ADF for the size of masonry tiles.
They are in the format of AFMasonryTileSize1x1 with support for 1x2,1x3,2x1,2x2,3x1,3x2
The Masonry Layout can contain any component you want (not just group layout as shown in the page), as long as you give that component the right AFMasonryTileSize style.
You can further control the sizing and coloring of the tiles using styleClasses that you define in a skin file.
For example in the video I used the following style to make sure you can actually see the panelGroupLayout tiles on the page.
.tileStyle{ background-color:gray; border: black; border-width: 2px; }The actual code in the JSF page is:
<af:masonryLayout id="ml1"> <af:panelGroupLayout id="pgl1" styleClass="AFMasonryTileSize2x1 tileStyle"/> <af:panelGroupLayout id="pgl2" styleClass="AFMasonryTileSize2x1 tileStyle"/> <af:panelGroupLayout id="pgl3" styleClass="AFMasonryTileSize1x1 tileStyle"/> <af:panelGroupLayout id="pgl4" styleClass="AFMasonryTileSize3x1 tileStyle"/> </af:masonryLayout>
OOW and JavaOne 2015 - Where I'll Be
It's that time of the year again, and next week is going to be crazy busy for us at Oracle OpenWorld and at JavaOne.
In case you want to catch me, here is a list of the locations where I'll be:
Building iOS Apps with Java 8 [CON1588]
Monday, Oct 26, 12:30 p.m. | Hilton—Continental Ballroom 4
Build Responsive Web Applications with Oracle ADF [HOL10380]
Monday, Oct 26, 5:00 p.m. | Hotel Nikko—Nikko Ballroom III (3rd Floor)
General Session: Revolutionizing Application Development with Oracle Cloud [GEN9500]
Tuesday, Oct 27, 11:00 a.m. | Moscone South—103
Meet the Experts: Oracle’s Development Tools and Frameworks [MTE10022]
Tuesday, Oct 27, 6:15 p.m. | Moscone South—300
Oracle Application Development Framework and Oracle JDeveloper—What’s New and How to Use It [CON8333]
Wednesday, Oct 28, 1:45 p.m. | Moscone South—304
Building iOS Apps with Java 8 [CON1588]
Thursday, Oct 29, 9:00 a.m. | Hilton—Continental Ballroom 1/2/3
Moving Oracle ADF to the Cloud—Development and Deployment in the New Age [CON8332]
Thursday, Oct 29, 1:15 p.m. | Moscone South—270
In between you could also catch me at the Oracle demo ground in Moscone south (mostly in the Oracle Application Builder Cloud Service), and at the JavaOne GeekBar on Monday.
At the rest of the time, I'll try and catch some of the sessions on this list.
See you there...
Hot Deployment in JDeveloper 12c - Don't Stop/Start Your App
Old habits are hard to get rid off, and I still see long time users of JDeveloper (and also many new users) who are stopping/starting their application on the embedded WebLogic each time that they make a change or addition to their code.
Well you should stop it! (I mean stop stopping the application).
For a while now, JDeveloper has support for hot deployment that means that when you do most of the changes to your code you just need to do save-all followed by a rebuild of your viewController project - and that's it.
You can then go to your browser and reload your page - and the changes will be reflected there. This will not only save you the time it takes to undeploy and redeploy your app, it will also reduce the amount of memory you use since frequent redeployment of the app on the embedded WebLogic leads to bigger memory consumption.
In the demo below I use JDeveloper 12.1.3 to show you that I can just do the save->rebuild and pick up:
- Changes in the JSF file
- Changes to the JSF configuration file adfc-config.xml
- New classes that are added to both the model and viewController projects
- Changed to the ADF configuration files (pagedefs, data binding, data controls)
So for most cases, you should be covered with this hot-deployment capability.
There are some cases that will require a redeploy of the application (for example if you add a new skin css file, or if you change some runtime configuration of your app in web.xml) but for most cases you don't need to continue with the stop/start habit.
Leveraging Oracle Developer Cloud Service in SQL and PL/SQL Projects - lifecycle and team collaboration
Usually my demos are targeted at Java developers, but I realize that a lot of developers out there are not using Java, for example in the Oracle install base there is a huge section of PLSQL developers. This however doesn't change their requirements from a development platform. They can still benefit from version management and code review functionality. They still need to track bugs/issues and requirements from their users, and they still need to collaborate in a team environment.
So I decided to try out and see what would be the development lifecycle experience for a PL/SQL developer if they'll leverage the services provided by the Oracle Developer Cloud Service - here is a demo that shows a potential experience.
What you'll see in the demo:
- Using JDeveloper to create DB Diagrams, Tables and PL/SQL code
- Version manage PL/SQL and SQL with Git
- Defining a cloud project and adding users
- Check code in, and branch PL/SQL functions
- Tracking tasks for developers
- Code review by team members
- Build automation (with Ant) - and almost a deploy to the DB
As you can see it is quite a nice complete solution that is very quick to setup and use.
It seems that the concepts of continuous integration in the world of PL/SQL development are not yet a common thing. In the demo I use the Ant SQL command to show how you could run a SQL script you created to create the objects directly in the database - which is probably the equivalent of doing a deployment in the world of Java. However if you prefer you can use Ant for example to copy files, zip them, or do many other tasks such as run automated testing frameworks.
The Ant task I used is this:
<path id="antclasspath"> <fileset dir="."> <include name="ojdbc7.jar"/> </fileset> </path> <target name="deploy"> <sql driver="oracle.jdbc.OracleDriver" userid="hr2" password="hr" url="jdbc:oracle:thin:@//server:1521/sid" src="./script1.sql" classpathref="antclasspath"/> </target>I had both the ojdbc7.jar file and the script file at the root of the project for convenience.
While my demo uses JDeveloper - you should be able to achieve similar functionality with any tool that supports Git. In fact if you rather not use a tool you can simply use command lines to check your files directly into the cloud.
Leveraging Icon Fonts (Font Awesome) in Oracle ADF - 500 New Icons for your app
Icon fonts are a growing trend among web developers, they make it quite simple to add icons to your web site and resize them for better responsive design.
Font Awesome is a popular open source icon font - providing over 500 icons that you can add to your application. I got several questions over the past couple of weeks about using these icons in ADF applications, so here is a short video showing you how to set this up with ADF 12.1.3 and using skins. (Quick note - before 12.1.3 you couldn't include these type of font in the skin css file - and you would have needed to directly refer to the CSS file from each page in your app - one more reason to upgrade your application to 12.1.3).
The basic steps:
- Create a new skin for your ADF application (if you don't know how to do this, see this blog entry).
- Download font awesome and copy the font-awesome-4.3.0 directory into your new skin directory
- Copy the @font-face entry from the font-awesome.min.css file into your new skin.css file
- Update the path in the various URI entries so it reflects the new relative location of the font files
- Create class entries in your skin CSS for the icons you want to use - remember to add a font-family: FontAwesome; to make sure they use the new font.
- Assign the classes to the styleclass property of your ADF Faces components.
Here is a demo showing how it is set up and how it works:
The skin1.css in the video is this:
@charset "UTF-8";
/**ADFFaces_Skin_File / DO NOT REMOVE**/
@namespace af "http://xmlns.oracle.com/adf/faces/rich";
@namespace dvt "http://xmlns.oracle.com/dss/adf/faces";
@font-face {
font-family: 'FontAwesome';
src: url('font-awesome-4.3.0/fonts/fontawesome-webfont.eot?v=4.3.0');
src: url('font-awesome-4.3.0/fonts/fontawesome-webfont.eot?#iefix&v=4.3.0')format('embedded-opentype'), url('font-awesome-4.3.0/fonts/fontawesome-webfont.woff2?v=4.3.0')format('woff2'), url('font-awesome-4.3.0/fonts/fontawesome-webfont.woff?v=4.3.0')format('woff'), url('font-awesome-4.3.0/fonts/fontawesome-webfont.ttf?v=4.3.0')format('truetype'), url('font-awesome-4.3.0/fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular')format('svg');
font-weight: normal;
font-style: normal;
}
.heart:before {
content: "\f004";
font-family: FontAwesome;
}
.mail:before {
content: "\f003";
font-family: FontAwesome;
}
If you want to see how this could help with responsive design try this in your CSS as an example. Then resize the width of the browser window to see how the icons will change their size dynamically:
.heart:before {
content: "\f004";
font-family: FontAwesome;
font-size: x-large;
}
.mail:before {
content: "\f003";
font-family: FontAwesome;
font-size: x-large;
}
@media screen and (max-width:950px) {
.heart:before {
content: "\f004";
font-family: FontAwesome;
font-size: small;
}
.mail:before {
content: "\f003";
font-family: FontAwesome;
font-size: small;
}