Fusion Middleware

Give Back/Help Out

Greg Pavlik - Wed, 2008-08-27 10:19
I (slightly) modified the right hand side of my blog to include some charities that I support. In some cases, I have good friends that have dedicated their professional lives to helping to build these organizations.

These don't even begin to scratch the surface of great organizations that offer great ways to help others. I listed these because I know a bit more about them personally and I'm confident that they do good (efficiently!). Another good friend, Edwin, recently added a blog post on Abilities United, which works with kids experiencing challenges in development and gives them special attention based on their needs. Take a careful look at Abilities United: they deserve support and all the help they can get.

Estimating global delivery - Don't toe the line

Steve Jones - Tue, 2008-08-26 16:22
First off the basic rule on estimating Cut your cloth to the available time and resources What I mean by this is don't create an estimate for the fully gold-plated, uber techy dream system. Make a smart guess based on the business value of the project what you should be spending. As a hint the project should be costing less than its x2 benefits. So if it takes 6 months then you can spend a
Categories: Fusion Middleware

What is OpenID Good For? Lots!

Billy Cripe - Tue, 2008-08-26 16:11
Wondering why OpenID is a GREAT idea? Read this. Still a cynic? Read this. The only reason I join some sites is because I can use my OpenID (http://billy.cripe.myopenid.com). Plaxo is one example. The ability for me to take... billy.cripe http://blogs.oracle.com/fusionecm
Categories: Fusion Middleware

Latest Wordle

Billy Cripe - Tue, 2008-08-26 13:24
Del.icio.us bookmarks wordle... billy.cripe http://blogs.oracle.com/fusionecm
Categories: Fusion Middleware

Quarterly Customer Update Sept 10 - Mark it Down!

Billy Cripe - Tue, 2008-08-26 13:10
Be sure to join us online and on the fon (old technology I know but still cool if you use VOIP) for the next Oracle Quarterly Content Management Customer Update. Here's the info: Americas / EMEA time zones: Customer Update... billy.cripe http://blogs.oracle.com/fusionecm
Categories: Fusion Middleware

Hello Dallas, meet Bangalore

Steve Jones - Tue, 2008-08-26 03:45
One thing to raise up on "Project Gerald" is its global scope. Phase 1 has a dev team mainly in India and two business change teams in the US and UK. This gives us an entertaining timezone shift (West Coast US to India) and also some differing cultural challenges. The most important thing on a global programme in the first month is hit the road later on you can do the conference calls and
Categories: Fusion Middleware

A little more on OpenID adoption

Nishant Kaushik - Mon, 2008-08-25 16:42
In response to my post about the lag in OpenID RP adoption, Mark Workel asked the following questions: 1. What are the strategic advantages of becoming an IdP? 2. As a consumer or RP, how do I know if an... Nishant Kaushik
Categories: Fusion Middleware

Web 2.0 Peer Pressure

Billy Cripe - Mon, 2008-08-25 16:19
I've finally done it, I set up my Facebook account/profile today after a colleague asked "How can you be Mr. Enterprise 2.0 without a Facebook account?" Actually, it's easy. The frustrating part of the proliferation of all the socially... billy.cripe http://blogs.oracle.com/fusionecm
Categories: Fusion Middleware

Oracle Community Call For ECM

Bex Huff - Mon, 2008-08-25 12:59

In case you didn't get the invite, Oracle's quarterly ECM community seminar is in about three weeks...

Americas / EMEA time zones: Customer Update
September 10, 2008
9:00am US PDT / 12:00pm US EDT / 16:00 GMT

You can register early... and just like last time, this is for Oracle customers and select partners only... There's a repeat webcast for Asia-Pacific at 7pm US Pacific time (12:00pm Sydney AEST, 10:00am Singapore).

If you missed the previous ones, they're up on Metalink. The last one covered how to find Stellent resources in Metalink... as well as Universal Online Archive, Captovation, what's going on with Verity, important patches, and general news items.

Put it on your calendar now!

read more

Categories: Fusion Middleware

Flex upload and download with Blazeds

Edwin Biemond - Sun, 2008-08-24 15:59
With Actionscript 3 and Flashplayer 10 you can now use the new FileReference features. For example you download and upload a file with RemoteObjects ( Blazeds / LifeCycle ). In the early days you had to use a upload and download servlets.
To use the new FileReference features please read these two articles flexexamples.com and using flashplayer 10

Here are some screenshots of the flex application.
First we can upload a file. The datagrid show the status of the uploaded files.

Off course we can download some files from a remote server. First we need to get a list of the remote files. For this we need to press the Get remote files button.

We can select a file and press the Retrieve File Button. When the status is ready we can save this file by pressing the Save File Button.

Here you can download the Flex source code

The code of the upload panel

<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical" width="100%" height="100%"
title="Upload Files">


<mx:Script>
<![CDATA[
import mx.rpc.AsyncToken;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;

private var refUploadFile:FileReference;

private var UploadFiles:Array = new Array();


// Called to add file(s) for upload
private function addFiles():void {
refUploadFile = new FileReference();
refUploadFile.browse();
refUploadFile.addEventListener(Event.SELECT,onFileSelect);
refUploadFile.addEventListener(Event.COMPLETE,onFileComplete);
}

// Called when a file is selected
private function onFileSelect(event:Event):void {
UploadFiles.push({ name:refUploadFile.name,
size:formatFileSize(refUploadFile.size),
status:"initial"});
listFiles.dataProvider = UploadFiles;
listFiles.selectedIndex = UploadFiles.length - 1;

refUploadFile.load();
for ( var i:int = 0 ; i < UploadFiles.length ; i++ ) {
if( UploadFiles[i].name == refUploadFile ) {
UploadFiles[i].status = "loaded";
listFiles.dataProvider = UploadFiles;
break;
}
}
}

// Called to format number to file size
private function formatFileSize(numSize:Number):String {
var strReturn:String;
numSize = Number(numSize / 1000);
strReturn = String(numSize.toFixed(1) + " KB");
if (numSize > 1000) {
numSize = numSize / 1000;
strReturn = String(numSize.toFixed(1) + " MB");
if (numSize > 1000) {
numSize = numSize / 1000;
strReturn = String(numSize.toFixed(1) + " GB");
}
}
return strReturn;
}



private function onFileComplete(event:Event):void
{
refUploadFile = event.currentTarget as FileReference;
var data:ByteArray = refUploadFile.data;
var loader:Loader = new Loader();
loader.loadBytes(data);

var token:AsyncToken = AsyncToken(
remoteUpload.doUpload(data, refUploadFile.name)
);

token.kind = refUploadFile.name;

for ( var i:int = 0 ; i < UploadFiles.length ; i++ ) {
if( UploadFiles[i].name == refUploadFile ) {
UploadFiles[i].status = "upload";
listFiles.dataProvider = UploadFiles;
break;
}
}
}

private function uploadResultHandler(event:ResultEvent):void
{
for ( var i:int = 0 ; i < UploadFiles.length ; i++ ) {
if( UploadFiles[i].name == event.token.kind ) {
UploadFiles[i].status = "finished";
listFiles.dataProvider = UploadFiles;
break;
}
}
}

private function faultResultHandler(event:FaultEvent):void
{
for ( var i:int = 0 ; i < UploadFiles.length ; i++ ) {
if( UploadFiles[i].name == event.token.kind ) {
UploadFiles[i].status = "error";
listFiles.dataProvider = UploadFiles;
break;
}
}
}


]]>
</mx:Script>

<mx:RemoteObject id="remoteUpload" destination="FileUtils"
result="uploadResultHandler(event)"
fault="faultResultHandler(event)"/>


<mx:Canvas width="100%" height="100%">
<mx:DataGrid id="listFiles" left="0" top="0" bottom="0" right="0"
allowMultipleSelection="true" verticalScrollPolicy="on"
draggableColumns="false" resizableColumns="false" sortableColumns="false">
<mx:columns>
<mx:DataGridColumn headerText="File" width="150" dataField="name" wordWrap="true"/>
<mx:DataGridColumn headerText="Size" width="50" dataField="size" textAlign="right"/>
<mx:DataGridColumn headerText="Status" width="50" dataField="status" textAlign="right"/>
</mx:columns>
</mx:DataGrid>
</mx:Canvas>
<mx:ControlBar horizontalAlign="center" verticalAlign="middle">
<mx:Button id="btnAdd" toolTip="Add file(s)" click="addFiles()"
label="Upload Files" width="150"/>
</mx:ControlBar>
</mx:Panel>


The code of the download panel

<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
width="100%" height="100%" title="Download Files">

<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.AsyncToken;

private var UploadFiles:Array = new Array();
private var UploadFilesColl:ArrayCollection = new ArrayCollection();
private var fileData:ByteArray = new ByteArray();
private var fileName:String;


private function uploadResultHandler(event:ResultEvent):void
{
if ( event.token.kind == "remoteFileList") {
UploadFilesColl = event.result as ArrayCollection;
for ( var i:int = 0 ; i < UploadFilesColl.length ; i++ ) {
UploadFiles.push({ name:UploadFilesColl[i]
, status:"initial"});
}
listFiles.dataProvider = UploadFiles;
} else {
fileData = event.result as ByteArray;
fileName = event.token.kind;
for ( var b:int = 0 ; b < UploadFiles.length ; b++ ) {
if( UploadFiles[b].name == event.token.kind ) {
UploadFiles[b].status = "Ready";
listFiles.dataProvider = UploadFiles;
break;
}
}

}
}

private function faultResultHandler(event:FaultEvent):void
{
}

private function saveFile(event:Event):void
{
var fileReference:FileReference = new FileReference();
fileReference.save(fileData,fileName);
}

private function getRemoteFiles(event:Event):void
{
var token:AsyncToken = AsyncToken(remoteDownload.getDownloadList());
token.kind = "remoteFileList";
}

private function getDownload(event:Event):void
{
var token:AsyncToken = AsyncToken(
remoteDownload.doDownload(listFiles.selectedItem.name));
token.kind = listFiles.selectedItem.name;
}
]]>
</mx:Script>


<mx:RemoteObject id="remoteDownload" destination="FileUtils"
result="uploadResultHandler(event)"
fault="faultResultHandler(event)"/>


<mx:Canvas width="100%" height="100%">
<mx:DataGrid id="listFiles" left="0" top="0" bottom="0" right="0"
verticalScrollPolicy="on"
draggableColumns="false" resizableColumns="false" sortableColumns="false">
<mx:columns>
<mx:DataGridColumn headerText="File" width="150" dataField="name" wordWrap="true"/>
<mx:DataGridColumn headerText="Status" width="50" dataField="status" textAlign="right"/>
</mx:columns>

</mx:DataGrid>
</mx:Canvas>
<mx:ControlBar horizontalAlign="center" verticalAlign="middle">
<mx:Button id="btnList" toolTip="List remote files"
width="150"
label="Get Remote Files"
click="getRemoteFiles(event)"/>
<mx:Button id="btnRetrieve" toolTip="Retrieve file"
width="150" click="getDownload(event)" label="Retrieve File"/>
<mx:Button id="btnSave" toolTip="Save file"
width="150" click="saveFile(event)" label="Save File"/>
</mx:ControlBar>



</mx:Panel>

The java code

package nl.ordina.flex;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import java.util.ArrayList;
import java.util.List;

public class FileUtils {


public String doUpload(byte[] bytes, String fileName) throws Exception
{
fileName = System.getProperty("java.io.tmpdir") + "/" + fileName;
File f = new File(fileName);
FileOutputStream fos = new FileOutputStream(f);
fos.write(bytes);
fos.close();
return "success";
}

public List getDownloadList()
{
File dir = new File(System.getProperty('java.io.tmpdir'));
String[] children = dir.list();
List dirList = new ArrayList();
if (children == null) {
// Either dir does not exist or is not a directory
} else {
for (int i=0; i<children.length; i++) {
// Get filename of file or directory
dirList.add( children[i]);
}
}
return dirList;
}

public byte[] doDownload(String fileName)
{
FileInputStream fis;
byte[] data =null;
FileChannel fc;

try {
fis = new FileInputStream(System.getProperty("java.io.tmpdir") + "/" + fileName);
fc = fis.getChannel();
data = new byte[(int)(fc.size())];
ByteBuffer bb = ByteBuffer.wrap(data);
fc.read(bb);
} catch (FileNotFoundException e) {
// TODO
} catch (IOException e) {
// TODO
}
return data;
}
}

How to do a "desc emp" from JDBC

Pas Apicella - Sun, 2008-08-24 10:03
If you ever try to do a "desc emp" from a JDBC program , that won't work as that's a SQL*Plus command only, but here is how to write an SQL statement to do that which can easily be converted into a JDBC program and used.

Firstly here is what we get when we describe the EMP table in SQL*Plus.

SCOTT@linux10g> desc emp;
Name Null? Type
----------------------------------- -------- ------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)

Now here is the SQL we can use to get the same output from an SQL query.


select
column_name as "Name",
decode(NULLABLE, 'Y', '', 'N', 'Not Null') as "Null",
data_type||decode(data_type,
'NUMBER', decode(DATA_PRECISION, NULL, '',
'('||DATA_PRECISION||','||data_scale||')'),
'VARCHAR2', '('||data_length||')',
'CHAR', '('||data_length||')') as "Type"
from user_tab_columns
where table_name = 'EMP'


The output of that is as follows from the query above , identical to a "desc emp", or close enough, couple more decodes will sort out a few minors issues , but seems to work for most tables I tested it against.

Name Null Type
------------------------------ -------- ------------------------------
EMPNO Not Null NUMBER(4,0)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4,0)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2,0)

So with a bind variable defined it would simply be as follows


select
column_name as "Name",
decode(NULLABLE, 'Y', '', 'N', 'Not Null') as "Null",
data_type||decode(data_type,
'NUMBER', decode(DATA_PRECISION, NULL, '',
'('||DATA_PRECISION||','||data_scale||')'),
'VARCHAR2', '('||data_length||')',
'CHAR', '('||data_length||')') as "Type"
from user_tab_columns
where table_name = ?


And then easily be integrated into a JDBC program, I did this over the web using a JSP page, which lists all user tables and adds a DESCRIBE button next to the table name to get the output above when clicked.http://feeds.feedburner.com/TheBlasFromPas
Categories: Fusion Middleware

Cisco launches Russia/CIS fund

Greg Pavlik - Sun, 2008-08-24 00:10
Brent Marcus left a note that Cisco recently announced a Russia focused venture fund. I will be in Moscow in a few weeks and will try to get some first hand information to blog about.

We're Number 1! We're Number 1!

Nishant Kaushik - Fri, 2008-08-22 13:40
UPDATE (August 27, 2008): I have updated the blog post to avoid violating certain copyright issues with Gartner Gartner has released their latest Magic Quadrant on User Provisioning. It's good to see that we have built on our previous success... Nishant Kaushik
Categories: Fusion Middleware

We're Number 1! At least according to Gartner

Nishant Kaushik - Fri, 2008-08-22 13:40
Gartner has released their latest Magic Quadrant on User Provisioning. It's good to see that we have built on our previous success to become "the leader in this Magic Quadrant". I can remember the days at Thor when we... Nishant Kaushik
Categories: Fusion Middleware

Check out Insightory

Billy Cripe - Fri, 2008-08-22 10:31
Insightory is a (new) idea incubator site for sharing cool ideas from topical experts. It's like slideshare with added content. There are some neat ideas being posed out there. I like this one, about an underused productivity tool we all... billy.cripe http://blogs.oracle.com/fusionecm
Categories: Fusion Middleware

Setting the high level services.

Steve Jones - Fri, 2008-08-22 05:14
Okay so now the team is getting established, as a hint for the future though remember that August is a really bad time to get a project going in Europe, and we are looking at structure. We have three high level business services EngagementManagementProductionThese are the real names but they describe the basic areas of the project I'm on. Engagement is all about getting information, its about
Categories: Fusion Middleware

Enterprise 2.0 - sometimes its like that

Billy Cripe - Thu, 2008-08-21 13:22
billy.cripe http://blogs.oracle.com/fusionecm
Categories: Fusion Middleware

Forget "Knowledge Management", Focus on "Context Management"

Bex Huff - Thu, 2008-08-21 09:02

I was always bugged with the buzzword "Knowledge Management." Not because it is a buzzword... but because it appears to NOT be a buzzword. A buzzword should either be really concrete, or vague enough to lead to questions -- like "Enterprise 2.0." Instead, "Knowledge Management" is somewhere in the middle, and sounds like annoying advice:

  • The key to getting rich is making more money!
  • The key to winning races is going faster!
  • The key to a smarter enterprise is managing your knowledge!

As such, I feel that the very phrase "Knowledge Management" might have led people to ask the wrong questions, and implement the wrong solutions... I think Chuck Klein down here in Albuquerque said it best:

We don't need "Knowledge Management." We need knowledge capture and context management.

That puts it pretty well... the goal is to capture as much knowledge as you can, and store it safely and securely. At the same time, you need to constantly gather more and more context, so you know what information to get to which people, and when. Information without context is worse than useless: its merely clutter that wastes everyone's time.

Too many projects lose focus on the context management problem... some of the easy questions revolve around things like metadata and keywords, but that is rapidly becoming insufficient. As the amount of information you manage gets larger and larger, you need to ask a lot of hard questions before you can maximize the value of your system:

  • Who is the intended audience for this item?
  • Where does this item fit in my taxonomy?
  • If people like this document, what related items would they like?
  • How would people find this item, if your search engine did not exist?
  • Under what conditions should we archive this item to reduce clutter?
  • Under what conditions should we destroy this item to save storage space, and mitigate risk?
  • Who is the current user?
  • Where is this user, and how are they accessing the system?
  • What is the user's search, download, and feedback history?
  • What is the most effortless way to gather feedback from this user?
  • Based on this user's past behavior, what information are they likely to want next?

Some good Knowledge Management folks already ask these kinds of questions... but I feel that not enough clients understand what kinds of questions to ask. If we used more specific terminology -- like context management -- it gets people thinking about the problem in a very concrete way... and I feel would lead to better implementations.

read more

Categories: Fusion Middleware

E2.0 Strategy Briefing in Ohio Tomorrow

Billy Cripe - Wed, 2008-08-20 10:03
It's not Bangkok but... If you are in the Columbus, OHIO area tomorrow, come out to our E2.0 strategy briefing. I'll be presenting the keynote (it's fun, it's hip) and we'll have some detailed breakout sessions. Thursday, August 21, 2008... billy.cripe http://blogs.oracle.com/fusionecm
Categories: Fusion Middleware

Data grids and the Web

Greg Pavlik - Tue, 2008-08-19 03:27
There's been a lot of talk recently about web 2.0, social networks, and cloud computing. To my way of thinking, these are very much overlapping categories. One useful technology that can be used support all of these models is the concept of a "data grid": high performance, distributed and reliable caching technology. On-Demand Enterprise has a good profile of AbeBooks.com, which uses Oracle Coherence technology to support their web site.