Wednesday, January 14, 2015

Alternative to SitesExplorer on Mac OS X

Use HSQL Database Manager. For example: Oracle Webcenter Sites Jump Start Kit is installed in user’s home Library directory (~/Library/Oracle/JSK/11.1.1.8.0.app). The HSQL Database manager is available from hsqldb.jar available in:
 ~/Library/Oracle/JSK/11.1.1.8.0.app/App_Server/apache-tomcat-7.0.42/Sites/lib.

From Sites directory launch Database Manager using the command:
$java –cp ./hsqldb.jar org.hsqldb.util.DatabaseManagerSwing


In the Database Manager use the following connection parameters:
  • Type: HSQL Database Engine In-Memory
  • Driver: org.hsqldb.jdbcDriver
  • URL: jdbc:hsqldb:file:./default/data/hypersonic/csDB
  • User: SA

SQL instructions can be used in order to view and manipulate data from JSK HSQL database.

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.