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:
- 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.
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.
Subscribe to:
Posts (Atom)