Thursday, November 20, 2014

Spring-Boot - Jump-Start Spring Application Development

The Spring-Boot project (more information available here) provides a quick and elegant way to start with Spring application development.

Tuesday, November 4, 2014

Oracle MAF – WebCenter Sites Integration


Inspired by Yannik article from here I tried to achieve the same kind of integration but between WebCenter Sites and Oracle MAF using custom MAF components.

Using a simple set of flex assets and three templates (main layout template, template for article and image template) the content is generated and displayed in the MAF application using a custom JavaScript component.

Layout template is calling the article (Demo_C asset) Detail template which is also calling the detail template for image (Demo_M asset):

<%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld"
%><%@ taglib prefix="asset" uri="futuretense_cs/asset.tld"
%><%@ taglib prefix="assetset" uri="futuretense_cs/assetset.tld"
%><%@ taglib prefix="commercecontext" uri="futuretense_cs/commercecontext.tld"
%><%@ taglib prefix="ics" uri="futuretense_cs/ics.tld"
%><%@ taglib prefix="listobject" uri="futuretense_cs/listobject.tld"
%><%@ taglib prefix="render" uri="futuretense_cs/render.tld"
%><%@ taglib prefix="siteplan" uri="futuretense_cs/siteplan.tld"
%><%@ taglib prefix="searchstate" uri="futuretense_cs/searchstate.tld"
%><%@ page import="COM.FutureTense.Interfaces.*,
                   COM.FutureTense.Util.ftMessage,
                   com.fatwire.assetapi.data.*,
                   com.fatwire.assetapi.*,
                   COM.FutureTense.Util.ftErrors"
%><cs:ftcs>
<%-- Record dependencies for the Template --%>
<ics:if condition='<%=ics.GetVar("tid")!=null%>'><ics:then><render:logdep cid='<%=ics.GetVar("tid")%>' c="Template"/></ics:then></ics:if>
<!DOCTYPE html>
<html lang="en">
      <head>
            <meta charset="utf-8"/>
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <meta name="description" content="">
            <meta name="author" content="">
            <link rel="shortcut icon" href="ico/favicon.png">
             
            <title>WebCenter Sites Demo</title>
           
            <!-- Bootstrap core css -->
            <link href="/cs/demo/css/bootstrap.min.css" rel="stylesheet">
           
            <!-- Custom styles -->
            <link href="/cs/demo/css/custom.css" rel="stylesheet">
      </head>
      <body>
            <!-- Start Fixed Navbar -->
            <%-- <render:callelement elementname="/Common/Navigation/TopNav"/>--%>
            <!-- End Fixed Navbar -->
           
            <!-- Detail Section -->
            <render:calltemplate tname="Detail" c='<%=ics.GetVar("c") %>'
                                                cid='<%=ics.GetVar("cid") %>'
                                                tid='<%=ics.GetVar("tid") %>'>
            </render:calltemplate>
            <!-- End Detail Section -->

          <!-- Start Footer -->    
            <%--<render:callelement elementname="/Common/Navigation/Footer"/> --%>
            <!-- End Footer -->
           
            <script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
            <script src="/cs/demo/js/bootstrap.min.js"></script>
            <script>
                  $(function(){
                        $('.collapse').collapse();
                  });
            </script>
      </body>
</html>
</cs:ftcs>


The custom component is named wcsEmbed and is stored in the file demo1.js:

(function(){
    try {
        var wcsEmbed = adf.mf.api.amx.TypeHandler.register("http://xmlns.example.com/wcs", "wcsEmbed");
        
        wcsEmbed.prototype.render = function(amxNode, id) {
            var rootElement = document.createElement("div");
            var c = amxNode.getAttribute("c");
            var cid = amxNode.getAttribute("cid");
            var pagename = amxNode.getAttribute("pagename");
            var pageUrl = "http://localhost:9080/cs/Satellite?c=" + c + "&pagename=" + pagename + "&cid=" + cid;
           
            rootElement.innerHTML = "<iframe id='f1' scrolling='auto' width='100%' height='100%' src='" + pageUrl +"'/>";
            //rootElement.innerHTML ="<h1>Hello world!</h1>";
            return rootElement;
        }
    }
    catch (problem) {
        alert("Error displaying the URL:" + pageUrl);
    }
})();


In the AMX view we are calling the custom components with the parameters that are identifiying the asset: c, cid and pagename:

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"           xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
          xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt"
          xmlns:wcs="http://xmlns.example.com/wcs">
  <amx:panelPage id="pp1">
    <amx:facet name="header">
      <amx:outputText value="Sites Demo" id="ot1"/>
    </amx:facet>
    <amx:facet name="primary">
      <amx:commandButton id="cb1" text="Back" action="__back"/>
    </amx:facet>
   
    <wcs:wcsEmbed id="em1" c="#{bindings.c.inputValue}"
                cid="#{bindings.cid.inputValue}"
                pagename="#{bindings.pagename.inputValue}" />
  </amx:panelPage>
</amx:view>

A couple of things to mention:
   - The js and css files for custom components must be associated with the feature.
   


   - Because we are calling a remote URL, in the maf-application.xml, in the security section, the URLs must be whitelisted. For convenience and for this demo only, I whitelisted everything that is coming over http.





The end-result of this application in iOS simulator:


Wednesday, July 9, 2014

Using Flex Assets in Templates and CSElements

Let’s assume that we want to use a FlexAsset in a template and we don’t have access to the id of the asset but only to the value of an attribute of the asset.  

We will use the Demo_M (DemoImage) asset type with the definition “DemoImageDefinition”






The attributes used in this definition are file and thumbnail of type BLOB and title, altText and description of type string, string and text.

We have a number of assets of this type and that are using the same definition:


The goal of this tutorial is to access the DemoImage assets using as the identifier for the asset the value of an attribute, let’s say title.

First we need to create a searchstate object:

<%-- Create a searchstate --%>
<searchstate:create name="img_title" />

To narrow the result set we have to provide a constraint for searchstate. We do this by adding a constraint:

<searchstate:addsimplestandardconstraint name="img_title" attribute="title" value="Earth" typename="Demo_A"/>

Next step is to create and assetset using searchstate:

<assetset:setsearchedassets name="imgByTitle" assettypes="Demo_M" constraint="img_title" fixedlist="true"/>


Retrive the wanted attribute (altText for this example):

<assetset:getattributevalues name="imgByTitle" listvarname="altTextList" attribute="altText" typename="Demo_A"/>

Display the attribute value:

<p>Alt text for Earth image is: <ics:listget fieldname="value" listname="altTextList"/></p>


If the attribute has multiple values (like the description attribute):

<assetset:getattributevalues name="imgByTitle" listvarname="descList" attribute="description" typename="Demo_A"/>
<p>
     Description:<br/>
     <ics:listloop listname="descList">
          <ics:listget fieldname="value" listname="descList"/><br/>
     </ics:listloop>
</p>
        

To get the values from asset type primary table (like id, name, etc…) we can use asset:search tag:

<ics:setvar name="prefix:name_op" value="="/>
<ics:setvar name="prefix:name" value="earth"/>
<asset:search prefix="prefix" list="earthAttributes" type="Demo_M"/>
<ics:listloop listname="earthAttributes">
     <ics:listget listname="earthAttributes" fieldname="id"/>----
     <ics:listget listname="earthAttributes" fieldname="name"/>
</ics:listloop>
</cs:ftcs>


The result of the execution of the template:


Friday, June 27, 2014

Digging Tunnels

So, let’s say that we want to access the machine Y going through an intermediate server, machine X. Also we need to execute application with a graphic user interface and access a couple of servers on different ports (let’s say 7001 and 7003) on the target machine (server Y).  

In the first step we will create a connection to the management server (machineX) and will setup a tunnel with local port 10001 for the remote port 22. The command that is creating the connection and tunnel is:

ssh –f  userx@machineX –L 10001:machineY:22

We use –f option to put the SSH connection in the background and –L 10001:machineY:22 to create the tunnel. We use 10001 for the local port number and not 22 because only root can forward ports under 1024.

Once we have this connection we can create the other tunnels (for 7001 and 7003) and forward X11 display.

ssh –X –p 10001 usery@localhost –L7001:machineY:7001 –L7003:machineY:7003 

The command above creates multiple tunnels in one go and also forwards X11 display and you can access the target machine services using localhost:7001 and localhost:7003.

Wednesday, March 5, 2014

Java Mission Control and Flight Recorder Tutorial from Oracle

A very interesting tutorial created by Michael Williams on Java Mission Control and Flight Recorder is available here. It covers monitoring and analysis tools now available as part of the standard JDK starting with Java 7 u40.

Tuesday, February 25, 2014

Creating a WebCenter Sites Custom Attribute Editor


Sometimes we want to simplify the process of uploading of images associated with assets in WebCenter Sites and the best way to do that is to use specialized editors. We can add brand new editors or we can customize existing out-of-the box editors. Let’s assume that we have an asset that represents a newspaper article in our asset we have a media attribute (an associated image). We want to provide a simpler way for an author to select and add a image for our article.

For that we will create a custom asset editor based on provided IMAGEPICKER.

An attribute editor asset is made up of an XML field that describe the widget it represents. We have a choice for the XML: we can upload an XML file or paste the content of attribute editor XML description into a text field.

In our XML we are specifying values for attributes of PRESENTATIONOBJECT  and IMAGEPICKER element. For the PRESENTATIONOBJECT NAME attribute we are using the name of our editor ”DemoCustomImagePicker” and for
IMAGEPICKER we have:

ASSETTYPENAME with value "Demo_M " is the name of asset type representing the image.
ATTRIBUTETYPENAME with value "Demo_A" is the name of the attribute type used in asset
ATTRIBUTENAME with the value "file" is the name of the attribute type instance representing the binary content.



Second, we have to provide the attribute type for which this editor is provided. We want to allow user to choose an asset (an image asset) so "asset" is selected in the Attribute Type list. 



We are using out-of-the-box IMAGEPICKER, so we don’t have to modify presentationobject.dtd file.

Next we associate the editor with an attribute, in our case with “associatedImage” attribute. We select from the drop-down list “Attribute Editor” our “DemoCustomImagePicker” and save the updated object.



We can test now the editor by editing an asset of type DemoArticle. If we click on the “Browse” button a list of images is displayed and we can drag and drop an image in our Associated Image field. A thumbnail version of the image in media asset “file” attribute is also displayed.