Skip navigation.

Fusion Middleware

REST, SSE or WebSockets on WebLogic 10.3.6

Edwin Biemond - Wed, 2014-01-15 14:10
WebLogic 10.3.6 comes with Jersey1.9 and has no support for Server Side Events or WebSockets. But for one of our projects we are making a HTML5 / AngularJS application, which need to invoke some RESTful services and we also want to use of SSE or WebSockets. Off course we can use WebLogic 12.1.2 but we already have an OSB / SOA Suite WebLogic 10.3.6 environment. So when you want to pimp your

Why in Business driven information its the consumers view that matters

Steve Jones - Wed, 2014-01-15 12:47
When doing the Business Data Lake pieces it took me back to a view that I had around SOA in that you should take the consumers view when designing a service.  This I think is more critical when looking at analytics and reporting where it really is all about the consumption. What does this mean though to think about data from the consumers perspective?  We've all had the '3 V's' shoved at us and
Categories: Fusion Middleware

Enhancing the WebCenter Portal ADF Template – 3 easy steps for front-end developers.

Here are a few tips for creating new ADF Templates for WebCenter Portal.
These tips are for front end developers applying a branded template or who are integrating their own custom Javascript enhancements.

There are 2 approaches widely used – the first option is to use pure ADF for everything – the second and one which I follow is the hybrid approach to use HTML and JSTL tags only for templating; as I feel its easier for web designers to skin and maintain a light weight frontend without the need to learn ADF techniques.

Read on for tips on templating -

Lets Start off with a clean ADF Page Template first -

<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" 
	xmlns:f="http://java.sun.com/jsf/core" 
	xmlns:h="http://java.sun.com/jsf/html" 
	xmlns:af="http://xmlns.oracle.com/adf/faces/rich" 
	xmlns:pe="http://xmlns.oracle.com/adf/pageeditor" 
	xmlns:wcdc="http://xmlns.oracle.com/webcenter/spaces/taglib" 
	xmlns:trh="http://myfaces.apache.org/trinidad/html" 
	xmlns:c="http://java.sun.com/jsp/jstl/core" 
	xmlns:fn="http://java.sun.com/jsp/jstl/functions" 
	xmlns:fmt="http://java.sun.com/jsp/jstl/fmt">
<af:pageTemplateDef var="attrs">
<af:xmlContent>
	<component xmlns="http://xmlns.oracle.com/adf/faces/rich/component">
		<display-name>
			Clean Portal Template
		</display-name>
		<facet>
			<facet-name>
				content
			</facet-name>
			<description>
				Facet for content Composer
			</description>
		</facet>
	</component>
</af:xmlContent>

<!-- Content Composer Container -->
<af:group>
	<af:facetRef facetName="content"/>
</af:group>
<!-- xContent Composer Container -->

</af:pageTemplateDef>
</jsp:root>

The first thing to do is add the files to be included in the generated template <head></head>.

So first lets add  a generic CSS file ie global.css this is not the ADF Skin and should not contain any ADF skinning syntax ie af|panelGroupLayout {} or hacks like .af_panelGroupLayout {} or compressed CSS adf classes ie – .xyz {}.

<af:resource type="css" source="//css/global.css"/>

This af:resource tag will put either JavaScript or CSS files based on the attribute type into the DOM <head></head> of the generated template.

If your like me – I like to modularise my CSS files into multiple maintainable files like this -

/*Require JS will compress and pull these files into one*/
@import url("import/normalize.css");
@import url("import/main.css");
@import url("import/bootstrap.css");
@import url("import/psa_components.css");
@import url("import/skin.css");
@import url("import/iscroll.css");
@import url("import/responsive.css");
@import url("import/font-awesome.css");
@import url("import/ie8.css");
@import url("import/cache.css");

So you can see global.css acts as a CSS Module container importing the rest of the files. This allows me to maintain and update the CSS files individually ie Normalise, bootstrap, iscroll etc.

What’s also really useful is that with the requireJS library – when I move the files from DEV to SIT OR Live requireJS will compress and pull all those modules into a single global.css removing the imports improving load times.

Next lets add some base scripts to load first  in the head before the rest of the page loads.

<af:resource type="javascript" source="//js/libs/plugins.js"/>
<af:resource type="javascript" source="//js/libs/modernizr-2.0.6.min.js"/>

So first lets discuss plugins.js

/**********************
 * Avoid `console` errors in browsers that lack a console.
 */
(function() {
    var method;
    var noop = function () {};
    var methods = [
        'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
        'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
        'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
        'timeStamp', 'trace', 'warn'
    ];
    var length = methods.length;
    var console = (window.console = window.console || {});

    while (length--) {
        method = methods[length];

        // Only stub undefined methods.
        if (!console[method]) {
            console[method] = noop;
        }
    }
}());
/************************/

This defines an empty method if the object console is not defined.
For more info on JS console and debugging javascript (Chrome Dev Tools) || (FireFox FireBug)

I often leave console.info, log, error methods in my javascript which makes it easier to debug when doing early development – these echo methods will be stripped out when compressed and moved to SIT/Live with the use of requireJS or will be ignore if console is not defined.
(more to come on requirejs in next post) 

- this is common for browser like IE and FireFox without firebug enabled – any console objects found would create a JS error if it the above script was not included.

 JS Method Chaining and initialisation.. ..

/**********************
 * Define FB Base Chain if not defined
 */
var FB = window.FB || {};
//create Base object 
FB.Base = FB.Base || (function() {
	return {
		//create multi-cast delegate.
		onPortalInit: function(function1, function2) {
			return function() {
				if (function1) {
					function1();
				}
				if (function2) {
					function2();
				}
			}
		},
		//used for chaining methods
		chainPSA: function() {}
	}
})();
/************************/

This is important as I use requireJS library as a module loader at the footer of the template. RequireJS asynchronously loads in my dependency libraries ie Jquery, mustache templates and my own custom JS Libs as-well as providing a great tool for optimising and merging of the  libraries into 1 file like the CSS above.

After loading the dependencies the chain method is initialised.

(Why load JS files at the footer and not in the <head></head> with af:resource?
Read this - why it is best practise for scripts to load here by yahoo) ( btw – Modernizr needs to load in the <head></head>)

The chain method above allows me to have multiple portlets that can chain their methods to only initialise once all the dependencies have been loaded on the page. ie. If you imagine an onReady event that only initialises when page has loaded and all scripts in the footer of the page have asynchronously loaded – then and only then initialise all methods from the page or portlets or containers that are wrapped in the chain method that require Jquery for example… Without this if I  were to use the Jquery method in the portlet body but initialised the jquery script in the footer the page would send a JS error as the portlet jquery method would be unaware of the Jquery API – as it has not yet loaded.

How to setup inline methods -
in the template or portlet body that can access a library method after it async loads in the footer - 

FB.Base.chainPSA = FB.Base.onPortalInit(FB.Base.chainPSA, function() {
	//JS to initialises after Async load of required libs
	//ie lets alert the jquery version
	alert('You are running jQuery Version ' + $.fn.jquery);
});

This way you could write out FB.Base.chainPSA multiple times throughout your template to store all the required methods that need to be initiated after the page has loaded..

How to Initialise chainPSA
after all libs have loaded.

//load PSA javascript files 
if (FB.Base.chainPSA) {
	FB.Base.chainPSA();
}

So first check that chainPSA exist then execute all methods; that’s all there is too it.

An alternative solution which I often use is to setting a global JS variable flag – this enables me to contain and compress the forum portlet scripts in a single file that reads the configuration and data attributes from the portlet after all the JS dependencies have loaded if my main script in the footer – Once loaded it will then search to see if the variable flag exist and then asynchronously load all the required portlet files and dependencies ie

Portlet contains inline JS or JS script
which will be injected into the head - 

<af:resource type=”javascript”>

var WCP = WCP || {};
WCP.Portlet  = WCP.Portlet || {};
WCP.Portlet.enableForums = true;

</af:resource>

Footer Script
initiases the following after page load

if (WCP.Portlet.enableForums) {
//Async call required forum files.
}

 

Setting up Global reusable variables using JSTL

//Create FB Obj;
	var FB = FB || {};

	//Global Namespace get properties.
	//http://docs.oracle.com/cd/E25054_01/webcenter.1111/e10149/wcsugappb.htm#
	FB.Global = {
		wcApp: {
			defaultSkin:			'${fn:escapeXml(WCAppContext.application.applicationConfig.skin)}',
			logo:					'${fn:escapeXml(WCAppContext.application.applicationConfig.logo)}',
			resourcePath:			'${fn:escapeXml(WCAppContext.spacesResourcesPath)}',
			requestedSkin:			'${fn:escapeXml(requestContext.skinFamily)}',
			title:					'${fn:escapeXml(WCAppContext.application.applicationConfig.title)}',
			URL:					'${fn:escapeXml(WCAppContext.applicationURL)}',
			webCenterURI:			'${fn:escapeXml(WCAppContext.currentWebCenterURI)}'
		},
		spaceInfo: {
			description:			'${fn:escapeXml(spaceContext.currentSpace.GSMetadata.description)}',
			displayName:			'${fn:escapeXml(spaceContext.currentSpace.GSMetadata.displayName)}',
			keywords:				'${fn:escapeXml(spaceContext.currentSpace.metadata.keywords)}',
			name:					'${fn:escapeXml(spaceContext.currentSpaceName)}'
		},
		//custom Fishbowl lib
		restInfo: {
			trustServiceToken:		'${fb_rtc_bean.trustServiceToken}'
		},
		pageInfo: {
			createDateString:		'${fn:escapeXml(pageDocBean.createDateString)}',
			createdBy:				'${fn:escapeXml(pageDocBean.createdBy)}',
			lastUpdateDateString:	'${fn:escapeXml(pageDocBean.lastUpdateDateString)}',
			lastUpdatedBy:			'${fn:escapeXml(pageDocBean.lastUpdatedBy)}',
			pageName:				'${fn:escapeXml(pageDocBean.name)}',
			pagePath:				'${fn:escapeXml(pageDocBean.pagePath)}',
			pageTitle:				'${fn:escapeXml(pageDocBean.title)}',
			pageUICSSStyle:			'${fn:escapeXml(pageDocBean.UICSSStyle)}'
		},
		userInfo: {
			businessEmail:			'${fn:escapeXml(webCenterProfile[securityContext.userName].businessEmail)}',
			department:				'${fn:escapeXml(webCenterProfile[securityContext.userName].department)}',
			displayName:			'${fn:escapeXml(webCenterProfile[securityContext.userName].displayName)}',
			employeeNumber:			'${fn:escapeXml(webCenterProfile[securityContext.userName].employeeNumber)}',
			employeeType:			'${fn:escapeXml(webCenterProfile[securityContext.userName].employeeType)}',
			expertise:				'${fn:escapeXml(webCenterProfile[securityContext.userName].expertise)}',
			managerDisplayName:		'${fn:escapeXml(webCenterProfile[securityContext.userName].managerDisplayName)}',
			moderator:				'${fn:escapeXml(security.pageContextCommunityModerator)}',
			organization:			'${fn:escapeXml(webCenterProfile[securityContext.userName].organization)}',
			organizationalUnit:		'${fn:escapeXml(webCenterProfile[securityContext.userName].organizationalUnit)}',
			timeZone:				'${fn:escapeXml(webCenterProfile[securityContext.userName].timeZone)}',
			title:					'${fn:escapeXml(webCenterProfile[securityContext.userName].title)}'
		}
	};

Sometimes there are values from WebCenter that you wish to use ie Space Name or User Name – the easiest way is to escape these values with JSTL into a javascript Object within the page template. I’ve put a quick example above you can strip it out if you don’t need any values but it makes it easier to pull in values to other JS libs calling the key value pair from the object like this for user display name -

var userDisplayName = FB.Global.userInfo.displayName;

Setting RequireJS to load my dependencies via base bootstrap script
(Read this - For more info on module loading and using requirejs)  

<script src="/js/core/config.js"><jsp:text/></script>
<script src="/js/libs/requirejs/require.min.js" data-main="bootstrap"><jsp:text/></script>

Now as you can use html in JSF templates and I don’t want my scripts in the head – which af:resource enables I write out the <script> tag. A word or warning and you may have spotted <jsp:text/> this prevents the script tags from being self closed and breaking. This will happen if you are editing the page templates direct at runtime from the browser. This is the same for any empty container ie <div></div> would become <div/> self closing; this is fine with xml but not fine with browser interpreting html mark-up in the DOM..

Also you may want to consider putting this into the login template to pre-load and cache the initial scripts before the portal page loads all of the ADF JS lib dependencies.

The final template
<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" 
	xmlns:f="http://java.sun.com/jsf/core" 
	xmlns:h="http://java.sun.com/jsf/html" 
	xmlns:af="http://xmlns.oracle.com/adf/faces/rich" 
	xmlns:pe="http://xmlns.oracle.com/adf/pageeditor" 
	xmlns:wcdc="http://xmlns.oracle.com/webcenter/spaces/taglib" 
	xmlns:trh="http://myfaces.apache.org/trinidad/html" 
	xmlns:c="http://java.sun.com/jsp/jstl/core" 
	xmlns:fn="http://java.sun.com/jsp/jstl/functions" 
	xmlns:fmt="http://java.sun.com/jsp/jstl/fmt">
<af:pageTemplateDef var="attrs">
<af:xmlContent>
	<component xmlns="http://xmlns.oracle.com/adf/faces/rich/component">
		<display-name>
			Clean Portal Template
		</display-name>
		<facet>
			<facet-name>
				content
			</facet-name>
			<description>
				Facet for content Composer
			</description>
		</facet>
	</component>
</af:xmlContent>

<!-- Put resources into head -->
<af:resource type="css" source="//css/global.css"/>
<af:resource type="javascript" source="//js/plugins.js"/>
<af:resource type="javascript" source="//js/libs/modernizr-2.0.6.min.js"/>
<!-- xPut resources into head -->

<!-- Define static global FB namespace and vars -->
<script>
	//Create FB Obj;
	var FB = FB || {};

	//Global Namespace get properties.
	//http://docs.oracle.com/cd/E25054_01/webcenter.1111/e10149/wcsugappb.htm#
	FB.Global = {
		wcApp: {
			defaultSkin:			'${fn:escapeXml(WCAppContext.application.applicationConfig.skin)}',
			logo:					'${fn:escapeXml(WCAppContext.application.applicationConfig.logo)}',
			resourcePath:			'${fn:escapeXml(WCAppContext.spacesResourcesPath)}',
			requestedSkin:			'${fn:escapeXml(requestContext.skinFamily)}',
			title:					'${fn:escapeXml(WCAppContext.application.applicationConfig.title)}',
			URL:					'${fn:escapeXml(WCAppContext.applicationURL)}',
			webCenterURI:			'${fn:escapeXml(WCAppContext.currentWebCenterURI)}'
		},
		spaceInfo: {
			description:			'${fn:escapeXml(spaceContext.currentSpace.GSMetadata.description)}',
			displayName:			'${fn:escapeXml(spaceContext.currentSpace.GSMetadata.displayName)}',
			keywords:				'${fn:escapeXml(spaceContext.currentSpace.metadata.keywords)}',
			name:					'${fn:escapeXml(spaceContext.currentSpaceName)}'
		},
		//custom Fishbowl lib
		restInfo: {
			trustServiceToken:		'${fb_rtc_bean.trustServiceToken}'
		},
		pageInfo: {
			createDateString:		'${fn:escapeXml(pageDocBean.createDateString)}',
			createdBy:				'${fn:escapeXml(pageDocBean.createdBy)}',
			lastUpdateDateString:	'${fn:escapeXml(pageDocBean.lastUpdateDateString)}',
			lastUpdatedBy:			'${fn:escapeXml(pageDocBean.lastUpdatedBy)}',
			pageName:				'${fn:escapeXml(pageDocBean.name)}',
			pagePath:				'${fn:escapeXml(pageDocBean.pagePath)}',
			pageTitle:				'${fn:escapeXml(pageDocBean.title)}',
			pageUICSSStyle:			'${fn:escapeXml(pageDocBean.UICSSStyle)}'
		},
		userInfo: {
			businessEmail:			'${fn:escapeXml(webCenterProfile[securityContext.userName].businessEmail)}',
			department:				'${fn:escapeXml(webCenterProfile[securityContext.userName].department)}',
			displayName:			'${fn:escapeXml(webCenterProfile[securityContext.userName].displayName)}',
			employeeNumber:			'${fn:escapeXml(webCenterProfile[securityContext.userName].employeeNumber)}',
			employeeType:			'${fn:escapeXml(webCenterProfile[securityContext.userName].employeeType)}',
			expertise:				'${fn:escapeXml(webCenterProfile[securityContext.userName].expertise)}',
			managerDisplayName:		'${fn:escapeXml(webCenterProfile[securityContext.userName].managerDisplayName)}',
			moderator:				'${fn:escapeXml(security.pageContextCommunityModerator)}',
			organization:			'${fn:escapeXml(webCenterProfile[securityContext.userName].organization)}',
			organizationalUnit:		'${fn:escapeXml(webCenterProfile[securityContext.userName].organizationalUnit)}',
			timeZone:				'${fn:escapeXml(webCenterProfile[securityContext.userName].timeZone)}',
			title:					'${fn:escapeXml(webCenterProfile[securityContext.userName].title)}'
		}
	};
</script>
<!-- xDefine static global namespace and vars -->

<!-- Content Composer Container -->
<af:group>
	<!-- Add any custom HTML HERE -->
	<div id="FB-wrapper" class="wrapper">
		<af:facetRef facetName="content"/>
	</div>
	<!-- xAdd any custom HTML HERE -->
</af:group>
<!-- Content Container -->

<!-- Init RequireJS -->
<script src="/js/core/config.js"><jsp:text/></script>
<script src="/js/libs/requirejs/require.min.js" data-main="bootstrap"><jsp:text/></script>
<!-- xInit RequireJS -->

</af:pageTemplateDef>
</jsp:root>

** I haven’t added a navigation structure to this template only the Content Composer facet.

Designing for mobile with Responsive Design.

When learning about responsive design the first thing to do is add the following meta viewport tag into the head defining the required content params for mobile ie -

<meta name="viewport" content="width=device-width, initial-scale=1">

Now unfortunately there is no ADF tag to add meta tags into the header and although you could add this html to the <body></body> its not really ideal.

What you should do is add this meta viewport into the Page Style not the Page Template.
This will allow you to add the following trinidad tag to generate the meta tag into the  <head></head> of the generated template as the facet metaContainer specifies this region to generate into.

<f:facet name="metaContainer">
	<af:group>
		<trh:meta name="viewport" content="width=device-width, initial-scale=1"/> 
	</af:group>
</f:facet>

The metaContainer facet should be held within the <af:document></af:document> tags

You could also add other meta tags ie keywords and add a dynamic value like this -

<trh:meta name="keywords" content="#{bindings.SEO_KEYWORDS}"/>

A word of warning you must make sure you add this to the page style before you create a page. Existing pages will ignore any updates to Page Styles that were used to create a page unlike Page Templates which allow you to tweak and update on the fly.

In the next post I’ll be writing up how to use requireJS properly with WebCenter to Asynchronously load in your libraries, templates and request additional libraries or templates when required by the page.

The post Enhancing the WebCenter Portal ADF Template – 3 easy steps for front-end developers. appeared first on C4 Blog by Fishbowl Solutions.

Categories: Fusion Middleware, Other

WebCenter Portal, ADF, REST API & JS templating – another approach to faster portlets.

So there are a few ways to create portlets, widgets and gadgets for WebCenter -

I’m going to show a few tips and tricks and one of the methods I use – to create faster interactive portlets using the WebCenter REST API and Javascript to leverage the services available.

As an example I will show you the basics to recreating the “OOTB WebCenter Portal forum taskflow” that hooks into JIVE as a light weight Async JS template driven portlet that you can drag and drop from the resource catalogue and supply configurable values.

This will enable marketing or IT teams who have no knowledge of ADF to manage, customise and enhance the look and feel of the portlet with just HTML and CSS skills. Also they will not need to redeploy the portlet via weblogic to apply enhancements – if they have access to the files on the server ie with FTP or SCP – you could also include these files on the content server – if it’s externally facing to handle revisioning version control much like sitestudio.

Click here to see the viewlet

Here’s a quick video that shows the OOTB Spaces Forum on the bottom against a simple one on the top that I created using this approach. You’ll also noticed I added an upload capability that allows the user to upload docs into WebCenter Content associated to the JIVE forum that is not part of the OOTB taskflow capability.

Read on to view the guides on how to recreate this approach and learn some useful tips on the way -

Over next month I will posting articles on how to achieve this (Keep an eye out)

Step 1) ENHANCE WEBCENTER LOGIN TEMPLATE
How to pre-authenticate with the REST API and WebCenter Content if you don’t have SSO enabled.

Step 2) ENHANCE ADF PAGE TEMPLATE
Taking the ADF Page to the next level – improve load times, caching via asynchronous calls to additional assets and JavaScript libs. (With RequireJS)

Step 3) REQUIREJS LOADING DEPENDENCIES
How to use RequireJS with WebCenter Portal effectively

Step 4) MOUSTACHE JS TEMPLATING
Moustache Template driven portlets

Step 5) EVENT DRIVEN PORTLET INTERACTION WITH “HTML5 DATA ATTRIBUTES”
How to navigate and interact between templates/screens with event listening

Step 6) SETTING UP THE FORUM PARAMETRISED PORTLET
How to create your first parametrised portlet for WebCenter Portal and deploy it to the resource catalogue 

Step 7) REQUIREJS COMPRESSING/MERGINING JS AND CSS ASSETS INTO A SINGLE FILE WITH NODEJS
Compress all libraries to Single script and CSS file that loads and caches all dependencies

Step 8) WebCenter Caching and Compression 
How to get the best performance from your portal!

Step 9) TIPS AND TRICKS 
Additional tips for integrating template driven portlets for WebCenter

The post WebCenter Portal, ADF, REST API & JS templating – another approach to faster portlets. appeared first on C4 Blog by Fishbowl Solutions.

Categories: Fusion Middleware, Other

SpringXD : Pre-Packaged Batch Jobs Import CSV Files to GemFireXD

Pas Apicella - Thu, 2014-01-09 21:44
Spring XD comes with several batch import and export modules. You can run them out of the box and show using the "Import CSV Files to JDBC (filejdbc)" as shown below.

This example show's inserting data into GemFireXD, you can use any RDBMS which supports a JDBC driver.

Note: XD_BASE = /Users/papicella/vmware/software/spring/spring-xd-1.0.0.M4

1. Configure connection to RDBMS in "$XD_BASE/xd/config/batch-jdbc-import.properties".

# Setting for the JDBC batch import job module
driverClass=com.vmware.sqlfire.jdbc.ClientDriver
url=jdbc:sqlfire://10.32.240.113:1527
username=APP
password=APP

2. Add jdbc jar file to $XD_BASE/xd/lib directory, in this case GemFireXD which uses "sqlfireclient.jar"

3. Start SpringXD single node using "./$XD_BASE/xd/bin/xd-singlenode"

4. Create a file called people.csv with contents as follows

[Fri Jan 10 14:35:00 papicella@:~/vmware/software/spring/spring-xd-1.0.0.M4/files ] $ cat people.csv
1,pas
2,lucia
3,lucas
4,siena

5. Log into SpringXD shell as shown below using "$XD_BASE/shell/bin/xd-shell"
6. Create table in GemFireXD as shown below.
  
sqlf> create table people (id int, name varchar(20));
0 rows inserted/updated/deleted

7. Create a JOB as shown below

xd:>job create myjob --definition "filejdbc --resources=file:/Users/papicella/vmware/software/spring/spring-xd-1.0.0.M4/files/*.csv --names=id,name --tableName=people"Successfully created and deployed job 'myjob'
8. Start the JOB

xd:>job launch myjob
Successfully launched the job 'myjob'

9. Verify that the CSV data has been inserted into the table PEOPLE in GemFireXD
  
sqlf> select * from people;
ID |NAME
--------------------------------
2 |lucia
1 |pas
4 |siena
3 |lucas

4 rows selected

More Information

For more information on SpringXD or GemFireXD see the links below.

http://projects.spring.io/spring-xd/ - SpringXD

http://gopivotal.com/products/pivotal-hd - GemFireXD Betahttp://feeds.feedburner.com/TheBlasFromPas
Categories: Fusion Middleware

SpringXD FILE/TAIL input ingestion / JDBC Sink output to GemFireXD

Pas Apicella - Thu, 2014-01-09 19:20
The following examples shows what we can do out of the box with SpringXD TAIL input source and JDBC sink as the output source. This can all be done without writing and code.

Assumes you have SpringXD installed and GemFireXD installed. See the getting stared guide which explains how to setup SpringXD. As for a database output for JDBC you can use any RDBMS here so you could use MYSQL , ORACLE etc if you don't have GemFireXD installed.

Note: XD_BASE = /Users/papicella/vmware/software/spring/spring-xd-1.0.0.M4

1. Configure connection to RDBMS in "$XD_BASE/xd/config/jdbc.properties".

driverClass=com.vmware.sqlfire.jdbc.ClientDriver
url=jdbc:sqlfire://10.32.240.113:1527
username=APP
password=APP

2. Add jdbc jar file to $XD_BASE/xd/lib directory, in this case GemFireXD which uses "sqlfireclient.jar"

3. Start SpringXD single node using "./$XD_BASE/xd/bin/xd-singlenode"

./$XD_BASE/xd/bin/xd-singlenode
.....

11:29:00,417  INFO main container.XDContainer:175 - started container: 0
11:29:00,424  INFO main launcher.LocalContainerLauncher:95 - 
 _____                           __   _______
/  ___|          (-)             \ \ / /  _  \
\ `--. _ __  _ __ _ _ __   __ _   \ V /| | | |
 `--. \ '_ \| '__| | '_ \ / _` |  / ^ \| | | |
/\__/ / |_) | |  | | | | | (_| | / / \ \ |/ /
\____/| .__/|_|  |_|_| |_|\__, | \/   \/___/
      | |                  __/ |
      |_|                 |___/
1.0.0.M4                         eXtreme Data

Using local mode JMX is disabled for XD components
XD Configuration:
XD_HOME=/Users/papicella/vmware/software/spring/spring-xd-1.0.0.M4/xd
XD_TRANSPORT=local
XD_STORE=memory
XD_ANALYTICS=memory
XD_HADOOP_DISTRO=hadoop12

started container : 85631@localhost
Documentation: https://github.com/SpringSource/spring-xd/wiki

4. Create a empty file that the stream will read from using TAIL as the input

> touch filetest

eg:

[Fri Jan 10 11:29:06 papicella@:/tmp/xd/input ] $ ls -la /tmp/xd/input/filetest 
-rw-r--r--  1 papicella  wheel  0 10 Jan 11:29 /tmp/xd/input/filetest

5. Log into SpringXD shell as shown below using "$XD_BASE/shell/bin/xd-shell"
[Fri Jan 10 10:46:39 papicella@:~/vmware/software/spring/spring-xd-1.0.0.M4/shell/bin ] $ ./xd-shell _____                           __   _______/  ___|          (-)             \ \ / /  _  \\ `--. _ __  _ __ _ _ __   __ _   \ V /| | | | `--. \ '_ \| '__| | '_ \ / _` |  / ^ \| | | |/\__/ / |_) | |  | | | | | (_| | / / \ \ |/ /\____/| .__/|_|  |_|_| |_|\__, | \/   \/___/      | |                  __/ |      |_|                 |___/eXtreme Data1.0.0.M4 | Admin Server Target: http://localhost:9393Welcome to the Spring XD shell. For assistance hit TAB or type "help".
6. Create a STREAM as shown below.

xd:> stream create --name filetest --definition "tail --name=/tmp/xd/input/filetest |  jdbc --columns=id,name"Created new stream 'filetest'
7. Create table in database as follows.
  
sqlf> create table filetest (id int, name varchar(20));

8. Create file as follows called "testfile" we will copy this to stream file soon.
[Fri Jan 10 11:38:44 papicella@:~/vmware/software/spring/spring-xd-1.0.0.M4 ] $ cat filetest{"id":"1","name":"pas"}{"id":"2","name":"lucia"}{"id":"3","name":"lucas"}{"id":"4","name":"siena"}
7. Copy file "filetest" above to /tmp/xd/input/filetest
9. Check base table in RDBMS for data inserts.
  
sqlf> select * from filetest;
ID |NAME
--------------------------------
4 |siena
1 |pas
3 |lucas
2 |lucia

4 rows selected

More Information

For more information on SpringXD or GemFireXD see the links below.

http://projects.spring.io/spring-xd/ - SpringXD

http://gopivotal.com/products/pivotal-hd - GemFireXD Beta



http://feeds.feedburner.com/TheBlasFromPas
Categories: Fusion Middleware

11g AJAX Authentication for WebCenter Portals Rest API and Content

WebCenters Portals REST API and WebCenter Content provide a great set of  web services enabling you to create rich interactive JavaScript components. You can see an example of this here - http://www.fishbowlsolutions.com/mobile via jQuery and UCM – Client Side Ajax UCM Interaction blog post.

An issue you may have come across if you don’t have SSO enabled is the ability to interact against these services. This can be a problem if you are writing Javascript Widgets or hybrid mobile applications for WebCenter Portal that require authentication to access them.

You could present a popup requesting the user to re authenticate; however this isn’t ideal if the user has already authenticated with the portal to access your new JS Components.

Read on to see the options available to you -

There are two options available if you don’t use SSO:

1) Enabling AJAX pre-authentication on the WebCenter portal login page; which will store the authenticated session.
2) Setting up a trust service token and passing the authentication request with the token when you need to access the services once the user has authenticated.

 

1. Pre-authenticating against the REST API. 

1.1 Updating the login template for pre-auth.

On the login page disable the submit event on the form to authenticate against WebCenter Portal.
Instead when the user selects the login button -

1. Pass a base64 authentication request to the REST API via AJAX.
2. On a success response (store the REST API security token if needed)
3. Trigger the submit request to enable the form post to authenticate on WebCenter.

Here are some code samples for authenticating with either WebCenter Portal or Content via AJAX using JQuery -

WebCenter Portal AJAX REST API Authentication
(with OIT or Username & Password)

jquery.ajax({
	url: endpoint,
	dataType: 'json',
	beforeSend: function(xhr) {
		//if trust token not defined send base64 user/pass authentication
		if (FB.restInfo.trustServiceToken === undefined) {
			//pass user/password credentials
			if (username.length &gt; 0) {
				//IE has no support for BTOA use crypto lib
				if (window.btoa === undefined) {
					xhr.setRequestHeader('Authorization', 'Basic ' + Crypto.util.bytesToBase64(Crypto.charenc.Binary.stringToBytes(username + ':' + password)));
				//all other browsers support BTOA
				} else {
					xhr.setRequestHeader('Authorization', 'Basic ' + window.btoa(username+':'+password));
				}
				return;
			}
		//else pass security token
		} else {
			//token auth
			xhr.setRequestHeader('Authorization', 'OIT ' + FB.restInfo.trustServiceToken); ///Obj path to Trust token value
		}

		//pass secure token
		xhr.withCredentials = true;
	},
	//Authentication Successful
	success: function(data) {
		//Process Resource Index Object in callback method
		//Store REST API Token
		callback(context);
	},
	//Authentication Failed
	error: function(request, status, error) {
		error_handler(callback)(request, status, error, endpoint);
	}
});

 

 WebCenter Content AJAX Authentication
(with OIT or Username & Password)

var params = {
	IdcService: 'PING_SERVER',
	IsJson: 1
};
//Authenticate with WebCenter Content 
jquery.ajax({ url: endpoint+ '/idcplg', data: params, dataType: 'json',
	//user already authenticated
	success: function(data) {
		callback(this);
	},
	//Error connection or authorisation to WebCenter Content failed
	error: function(request, status, error) {
		//if trust token defined send OIT Auth Request
		if (FB.restInfo.trustServiceToken !== undefined) {
			//Authenticate Via OIT
			jquery.ajax({
				type: "GET", 
				url: '/adfAuthentication', //http://domain.com/adfAuthentication will auth OIT on WebCenter
				//setup request headers first
				beforeSend: function(xhr) {
					xhr.setRequestHeader('Authorization', 'OIT ' + FB.restInfo.trustServiceToken); //Obj path to Trust token value
					xhr.withCredentials = true;
				},
				//request successfull
				success: function(data) {
					callback(this);
				},
				//issue with request
				error: function(request, status, error) {
					error_handler(callback)(request, status, error, endpoint+ '/idcplg');
				}
			});
		//else user/pass sent 
		} else {
			//Authenticate with user/pass
			jquery.ajax({
				type: "POST", 
				url: endpoint+'/login/j_security_check', 
				data: {
					j_username: 		username, 
					j_password: 		password, 
					j_character_encoding: 	'UTF-8'
				},
				//request successfull
				success: function(data) {
					callback(this);
				},
				//issue with request
				error: function(request, status, error) {
					error_handler(callback)(request, status, error, endpoint+ '/idcplg');
				}
			});
		}
	}
});

The WebCenter Content Secure Token Auth requires authentication on http://domain.com/adfAuthentication.

You can also use this to authenticate against the Inbound Refinery (Conversion Server)

http://domain.com/ibr/adfAuthentication

And Universal Records Management

http://domain.com/urm/adfAuthentication

Where as User/Pass Auth on the content server is requested via http://domain.com/cs/login/j_security_check.

Here is a simple example of a webcenter login page that makes an Authentication request first to the REST API before posting the form and logging into WebCenter Portal.

 

<!DOCTYPE html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

    <title>Login Auth Example</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width">

</head>
<body>

<div id="FB-loginWrapper">
	<h2>Sign-in to your account</h2>

	<form name="PortalLoginForm" method="post" action="/webcenter/wcAuthentication">
		<input type="hidden" name="success_url" value="/webcenter/intranet_loginhandlerservlet"/>
		<input type="hidden" name="j_character_encoding" value="UTF-8">

		<div class="formField">
			<label>Username:</label>
			<input type="text" name="j_username" />
		</div>

		<div class="formField">
			<label>Password:</label>
			<input type="password" name="j_password" />
		</div>

		<input disabled="disabled" type="submit" />
	</form>
</div>

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>
<script src="js/vendor/cryptojs.js"></script>

<script>
//Setup JS namespace
var FB = FB || {};
FB.Login = (function() {
	return {
		//on script init
		init: function() {
			//Setup page events
			this.events();

			//remove disabled attr on submit button.
			$('[name="PortalLoginForm"] [type="submit"]').prop('disabled',false); 
		},
		//setup page events
		events: function() {
			//on submit click initialise auth request
			$('[name="PortalLoginForm"]').submit(function() {
				//if data attribute true on form allow submit
				if ($(this).data('valid')) {
					return true;
				}

				//call REST API authentication method
				FB.Login.AuthRestAPI(
					'/rest/api/resourceIndex', 			//endpoint
					$('[name="j_username"]').val(), 	//User
					$('[name="j_password"]').val(), 	//Pass
					function() { //callback method
						$('[name="PortalLoginForm"]').data('valid', true).submit(); //enable form to submit
						$('[name="PortalLoginForm"] [type="submit"]').submit(); //submit form on AuthRestAPI success AJAX.
					}
				);

				//else stop form from submitting
				return false;
			});
		},
		//REST Auth AJAX method
		AuthRestAPI:function(endpoint, username, password, callback) {
			//make ajax req
			$.ajax({
				url: endpoint,
				dataType: 'json',
				beforeSend: function(xhr) {
					//IE has no support for BTOA use cryptoJS lib
					if (window.btoa === undefined) {
						xhr.setRequestHeader('Authorization', 'Basic ' + Crypto.util.bytesToBase64(Crypto.charenc.Binary.stringToBytes(username + ':' + password)));
					//all other browsers support BTOA
					} else {
						xhr.setRequestHeader('Authorization', 'Basic ' + window.btoa(username+':'+password));
					}

					//pass secure token
					xhr.withCredentials = true;
				},
				//Authentication Successful
				success: function(data) {
					//submit form via callback
					callback();
				},
				//Authentication Failed
				error: function(request, status, error) {
					alert('Authentication failed');
				}
			});
		}
	}
})();

//on DOM Loaded setup page
$(document).ready(function() {
	FB.Login.init();
});
</script>

</body>
</html>

 

2. Setting up the the trust service security token
(Info to setup OIT).

I would recommend setting up the trust token; however the base64 authentication pre login above is easier and quicker to setup.

The trust token will be generated once the user has logged in.

2.1. Create keystore

a) cd /opt/oracle/jrmc-4.0.1-1.6.0/bin/
b) keytool -genkeypair -keyalg RSA -dname “cn=spaces,dc=domain,dc=com” -alias orakey -keypass myKeyPassword -keystore /opt/oracle/keystore/default-keystore.jks -storepass myKeyPassword -validity 1064
c) keytool -exportcert -v -alias orakey -keystore /opt/oracle/keystore/default-keystore.jks -storepass myKeyPassword -rfc -file /opt/oracle/keystore/orakey.cer
d) keytool -importcert -alias webcenter_spaces_ws -file /opt/oracle/keystore/orakey.cer -keystore /opt/oracle/keystore/default-keystore.jks -storepass myKeyPassword

2.2. Update jps-config.xml

a)

<serviceInstance name="keystore" provider="keystore.provider" location="/opt/oracle/keystore/default-keystore.jks">
<description>Default JPS Keystore Service</description>

b)

<propertySets>
	<propertySet name="trust.provider.embedded">
		... existing entries
		<property value="orakey" name="trust.aliasName"/>
		<property value="orakey" name="trust.issuerName"/>
	</propertySet>
</propertySets>

 

2.3. Update credential store

a) in WLST: /opt/oracle/middleware/Oracle_WC1/common/bin/wlst.sh
b) connect()
c) updateCred(map=”oracle.wsm.security”, key=”keystore-csf-key”, user=”owsm”, password=”myKeyPassword ”, desc=”Keystore key”)
d) updateCred(map=”oracle.wsm.security”, key=”enc-csf-key”, user=”orakey”, password=”myKeyPassword ”, desc=”Encryption key”)
e) updateCred(map=”oracle.wsm.security”, key=”sign-csf-key”, user=”orakey”, password=”myKeyPassword ”, desc=”Signing key”)

2.4. Add TrustServiceIdentityAsserter.

a) Console -> Security Realms -> myrealm -> Providers -> New
b) Restart all

2.5. Configure Credential Store

a) in WLST: /opt/oracle/middleware/Oracle_WC1/common/bin/wlst.sh
b) connect()
c) createCred(map=”o.webcenter.jf.csf.map”, key=”keygen.algorithm”,user=”keygen.algorithm”, password=”AES”)
d) createCred(map=”o.webcenter.jf.csf.map”, key=”cipher.transformation”,user=”cipher.transformation”, password=”AES/CBC/PKCS5Padding”)

2.6. Test it against the rest api

a) http://www.domain.com/rest/api/resourceIndex

Once setup create a bean to output the token into the page template  ie ${fb_rtc_bean.trustServiceToken} JS object so that your JS AJAX request can reuse it.

var FB = FB || {};
FB.restInfo = {
	username: 				'${securityContext.userName}',
	trustServiceToken:			'${fb_rtc_bean.trustServiceToken}',
	spaceName: 				'${spaceContext.currentSpaceName}',
	spaceGUID: 				'${spaceContext.currentSpace.metadata.guid}'
};

You can then use one of the AJAX authentication methods above with ${fb_rtc_bean.trustServiceToken} reading the JS Obj FB.restInfo.trustServiceToken;

 

The post 11g AJAX Authentication for WebCenter Portals Rest API and Content appeared first on C4 Blog by Fishbowl Solutions.

Categories: Fusion Middleware, Other

How integration guys created a data security nightmare

Steve Jones - Tue, 2014-01-07 13:23
There has been a policy in integration that has stored up a really great challenge of data security, and by great I don't mean 'fantastic' I mean 'aw crap'.  Its a policy that was done for the best of reasons and one that really will in future represent a growing challenge to Big Data and federated information. The policy can be described as this: Users authenticate with Apps, Apps
Categories: Fusion Middleware

Six reasons your Big Data Hadoop project will fail in 2014

Steve Jones - Mon, 2014-01-06 09:23
Ok so Hadoop is the bomb, Hadoop is the schizzle, Hadoop is here to solve world hunger and all problems.  Now I've talked before about some of the challenges around Hadoop for enterprises but here are six reasons that Information Week is right when it says that Hadoop projects are going to fail more often than not. 1. Hadoop is a Java thing not a BI thing The first is the most important
Categories: Fusion Middleware

The How and Why of Integrating SharePoint with Oracle WebCenter in 13 Minutes

Integrating Microsoft SharePoint with Oracle WebCenter Content is more of a question of why than how. Integrations between the systems have existed for 6+ years now, and each of those have had their own set of integration points and technologies to make the integration work. However, companies need to first understand and agree why they want to integrate the two systems. This starts with identifying the need or business problem that continues to persist without an integration.

Fishbowl Solutions has had an integration for the systems for three years. In that time, we have talked to hundreds of customers regarding their needs and business problems and the disconnect between SharePoint content and getting that content into Oracle WebCenter. Here are the most common needs/business problems we have heard:

  • Lack of Governance over SharePoint use and what happens to orphaned sites and content
  • Difficulty surfacing high-value content created in SharePoint to Oracle-based websites, portals and business applications
  • Inability to selectively determine the SharePoint content items to store in WebCenter – based on version, site location, or business unit requirements

If your company has identified any of the problems above, then it has effectively answered the why question. However, companies should also take a look at their overall information governance strategy and how SharePoint and Oracle WebCenter are a part of that strategy. For organizations that have answered the why, but also have determined that Oracle WebCenter Content is THE repository for enterprise, mission-critical information,  then the how questions can be asked and answered as well.

This 13 minute overview presentation and demo addresses both questions and may be a good place to start in helping you and your organization define its information governance strategy:

For your convenience, here are the time slots for the use case demos of Fishbowl’s connector:

  • Content Publishing – 3:16 to 5:45
  • Project Lifecycle Governance – 5:46 to 7:58
  • Business Specific Storage Requirements – 7:59 to 10:45

Happy Holidays!

Jason Lamon is a product strategist and technology evangelist who writes about a range of topics regarding content management and enterprise portals. He writes to keep the communication going about such topics, uncover new opinions, and to get responses from people who are smarter than him. If you are one of those people, feel free to respond to his tweets and posts.

The post The How and Why of Integrating SharePoint with Oracle WebCenter in 13 Minutes appeared first on C4 Blog by Fishbowl Solutions.

Categories: Fusion Middleware, Other

Speaking at UKOUG Tech13 – UK Oracle User Group

I was fortunate to be accepted to present at this years UK Oracle User Group – “Developing and integrating with Oracle Social Network”.
Showing how easy it was to integrate with OSN using it’s REST API and my previous experience at OSNs Developer Challenge at Oracle Open World 2012.

You can see more info and my original OOW12 entry – Mobile Integration with OSN here

I had a bit of fun with this years presentations creating it for my ipad; this allowed me to move around whilst still having control of the presentation and making it more dynamic.
Above you can see me and my co-presenter David Rowe as I take a picture of the audience which jumps across and into my presentation being projected.

For those interested I created the IOS application using Cordova to build a hybrid app with the reveal.js library for creating my slides in html5; to speed things up I used www.slid.es and exported the html package which I imported into my cordova project.

I then used an app called reflector that enabled me to use airplay and mirror to my laptop from the ipad onto the projector.
And then finally I used Connectify to quickly create a network from my laptop my ipad could connect too, to enable airplay to work – this could of worked with the available wireless network but I wasn’t taking any chances of things being blocked.

It worked out pretty well and had a few smiles.. Although there were a few glitches and I’m blaming IOS 7 as I had recently upgraded and hadn’t fully tested on the new OS.

 

So Tech13 as you can see below in the infogram – the event had just over a thousand attendees from over 28 countries during 4 days 159 speakers and 200 exciting sessions.
It was a great event and good fun networking and connecting with colleagues, other Aces and the Oracle Team – there were lots of interesting topics/sessions from Fujitsu and their case studies with Webcenter to the Red Samurai team who gave 2 great presentations on ADF - ADF Development Survival Kit – Essentials for ADF Developer &  ADF Anti-Patterns: Dangerous Tutorials – Real Experience in ADF

I also got to play with Oracle’s Google Glass kit; and also get a glimpse at what has been happening behind the scenes; where they are taking new technology and products to enhance user experience and interaction.
With that said Fishbowl Solutions also got a pair of Fishbowl blue Google Glass kits recently for the innovation team to start looking into the future and experimenting as we did with our mobile product line back 5-6 years ago.

So be on the lookout for the first Oracle Partner Glass app ;)

 

 

 

 

The post Speaking at UKOUG Tech13 – UK Oracle User Group appeared first on C4 Blog by Fishbowl Solutions.

Categories: Fusion Middleware, Other

WebCenter Content: How to persist parameters across links ie &coreContentOnly=1

This is something new I came across thanks to a colleague; that I thought would be good to share.

Recently I had an issue where I needed to hide the standard UCM header and footer, but allow the users to navigate through the links available on the body.
(This  process will also allow you to persist other params)

If you add the parameter coreContentOnly=1 like this -

http://contentServer/cs/idcplg?IdcService=GET_DOC_PAGE&Action=GetTemplatePage

&Page=HOME_PAGE&coreContentOnly=1 

The header/footer are removed leaving the body content available however on navigating selecting a link or interacting with a form field the coreContentOnly param is removed therefore displaying the header & footer on the next page.

In the past I’ve written components to handle this or done some magic on the web-server; however no more is this needed!
There is a workaround to persist parameters -

By placing /_p/ after the ISAPI/CGI file Name (usually idcplg) – you can apply and persist variables.

http://contentServer/cs/idcplg/_p/?IdcService=…

This variable mapping can be found by opening the PersistentUrlKeys table.

Here are some of the mappings - 

min =coreContentOnly
cc = ClientControl

So to enable coreContentOnly=1 throughout you can use either approach -

http://contentServer/cs/idcplg/_p/min?IdcService=…

or

http://contentServer/cs/idcplg/_p/min-1?IdcService=…

On the first one I did not set -1 as 1 is the default assumed value the dash is used as a seperator for key/value.
If I wanted to add ClientControl or another variable I  can add the mapping in like this -

http://contentServer/cs/idcplg/_p/min/cc-queryselect?IdcService=…

Important - this mapping must exist in Content Server the SCRIPT_NAME environment variable or it will not be persisted.

 

The post WebCenter Content: How to persist parameters across links ie &coreContentOnly=1 appeared first on C4 Blog by Fishbowl Solutions.

Categories: Fusion Middleware, Other

This blog is now closed.

Billy Cripe - Mon, 2013-10-14 12:14

Thank you for visiting.  This blog has been closed down and merged with the WebCenter Blog, which contains blog posts and other information about ECM, WebCenter Content, the content-enabling of business applications and other relevant topics.  Please be sure to visit and bookmark https://blogs.oracle.com/webcenter/ and subscribe to stay informed about these topics and many more.   From there, use the #ECM hashtag to narrow your focus to topics that are strictly related to ECM.

See you there! 

Categories: Fusion Middleware

New Continuous Integration tutorial published

Lynn Munsinger - Mon, 2012-07-02 09:44
Hot off the press – a new continuous integration tutorial. It’s really not just about continuous integration, though! You’ll find it useful even if you aren’t using a continuous integration server like Hudson. It’s useful if you are doing any part of the scenario it documents: Setting up Team Productivity Center for your team and [...]

Advanced ADF eCourse, Part Deux

Lynn Munsinger - Tue, 2012-06-19 15:11
In February, we published the first in a series of FREE(!) online advanced ADF training: http://tinyurl.com/advadf-part1 The response to that course has been overwhelmingly positive as more and more people are moving past the evaluation/prototype stages with ADF and looking for more advanced topics. I’m pleased to relay the good news that the 2nd part [...]

Fun with Hudson, Part 1.1

Lynn Munsinger - Tue, 2012-06-05 09:19
Earlier I posted that I had used the following zip command in the ‘execute shell’ action for my Hudson build job: zip -r $WORKSPACE/builds/$JOB_NAME-$BUILD_NUMBER * -x ‘*/.svn/*’ -x ‘*builds/*’ This zips up the content of the exported source, so that I can send it on to team members who need the source of each build [...]

Hiring a Curriculum Developer

Lynn Munsinger - Tue, 2012-05-15 09:34
If you are an instructional designer with an eye for technologies like ADF, or if you are an ADF enthusiast and excel at creatively producing technical content, then ADF Product Management would like to hear from you. We’re looking for a curriculum developer to join our ADF Curriculum team, which is tasked with ensuring that [...]

Hiring a Curriculum Developer

Lynn Munsinger - Tue, 2012-05-15 09:34
If you are an instructional designer with an eye for technologies like ADF, or if you are an ADF enthusiast and excel at creatively producing technical content, then ADF Product Management would like to hear from you. We’re looking for a curriculum developer to join our ADF Curriculum team, which is tasked with ensuring that [...]

New ADF Insider on Layouts

Lynn Munsinger - Mon, 2012-03-26 13:22
I’ve published an ADF Insider session that helps de-mystify the ADF Faces components and how to work with them (and not against them), when building ADF applications. There’s also some great information on building ADF prototypes. Take a look here: http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/layouts/layouts.html

New ADF Insider on Layouts

Lynn Munsinger - Mon, 2012-03-26 13:22
I’ve published an ADF Insider session that helps de-mystify the ADF Faces components and how to work with them (and not against them), when building ADF applications. There’s also some great information on building ADF prototypes. Take a look here: http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/layouts/layouts.html