Tuesday, December 20, 2011

Custom ADF Skin: Consume as Library

Tested with JDeveloper: 11.1.2.1.0
Main purpose of this post is for me to have a reference project and proof of concept using an ADF Skin as Library.
Part 1: Skin Application
So first the ADF Skin project should be created. Since JDevR2 this process has been simplified by new ADF Skin wizard.
0000@2728_2728-41266a37beff9ee9
In the next screen just give your skin a name and extend from the fusionFx-simple-v2.desktop Oracle Skin. It is specially designed with extensibility in mind for cusom skins. Fortunataly the recommended skin is selected. (It is not with every ADF/Jdeveloper feature ;). So well done Oracle!
0001@2728_2728-41266a37bfbbbbbc
The following bunch of things is created on the fly
0002@2728_2728-41266a37c0ee2cc1
Now lets create a "green" skin with smallest amount of modifications. This is achieved by opening the CSS file and
go to the "Images" View. Just change some of the colors.
0003@2728_2728-41266a37c2b9d648
And afterwards click "Apply to Skin"
=> This will generate a lot of images according to your color schema.
0004@2728_2728-41266a37c3487043
In order to support versioning of skin I am adding the following to the trinidad-skins.xml
   <version>
     <name>v1</name>
     <default>true</default>
   </version>
=>
0005@2728_2728-41266a37c41b4e82
Now we are ready to bundle the custom skin as ADF library. There is nothing special here. Create the Deployment profile, keep defaults and deploy.
Next step is to test the provisioning of the ADF Skin through ADF Library through File System connection. To do that we create a filesystem connection in the resource pallete
0006@2728_2728-41266a37c59fab0c
The Skin shows up as expected
0007@2728_2728-41266a37c5c8a0ce
Part 2: Consume ADF Skin
a) Create an pure empty Fusion ADF Application by wizard.
b) Select the ViewController project
c) Select adflib-myskin.jarm Right Click and Click add to Project
0008@2728_2728-41266a37c70bc1cd
The Message Pane should output something like
These ADF Library jar items are now in ViewController.jpr
{
  file:/C:/ak/JDeveloper/mywork/TestADFSkin/MySkin/deploy/adflib-myskin.jar
  These are in the project as a result of your ADF jar imports:
  Resource Bundle Variable Resolver from .../TestADFSkin/MySkin/MySkin.jpr
}
d) Apply custom ADF Skin as default in Project Properties>ADF View
0009@2728_2728-41266a37c7b425ed
e) Create a simple JSF Page based on the threeColumnTemplate and  take a look
0010@2728_2728-41266a37c94320ff
At Design-Time there seem to be some problems.
At Runtime it looks as expected
0011@2728_2728-41266a37cb518a6e
Is it a Bug at Design Time?
Using just a QuickLayout everything is as expected also in design time
0012@2728_2728-41266a37cd2f684c
Download Sample Workspaces: http://www.box.com/s/h8mggth460ntujhg7o3r

Tuesday, December 13, 2011

RESTful Management Services in Oracle WebLogic Server 12c

Version: 12.1.1 (developer edition, ZIP, no installer)

Installation

unzip wls1211_dev as follows

0000@2713_0-41266a23103b2a19

In order to be able to work with this edition we have to call configure.cmd. This basically unpacks all jars, create the registry.xml and wlserver\.product.properties

To have some reusable snippets I have created additional scripts in the new MW_HOME

env_wls12c_dev.cmd

@echo off
@rem ***************************************************************************
@rem This script is used to set the environment for
@rem Oracle WebLogic Server 12.1.1 dev ZIP edition
@rem ***************************************************************************

set MW_HOME=C:\oracle\product\12.1.1\middleware
set JAVA_HOME=C:\oracle\product\11.1.2.1\middleware\jdk160_24
set JAVA_VENDOR=Sun


install_wls12c_dev.cmd



@echo off
@rem ***************************************************************************
@rem This script is used to install Oracle WebLogic Server 12.1.1 dev ZIP edition
@rem ***************************************************************************

call env_wls1211_dev.cmd

title Installing WLS 12.1.1.0...

call %MW_HOME%\configure.cmd

pause


Now execute install_wls12c_dev.cmd



In order to create a domain by configuration wizard



a) call env_wls12c_dev.cmd



b) %MW_HOME%\wlserver\common\bin\config.cmd



RESTful Management Service API



Sounds cool...lets try



Activate by Domain > Configuration > Advanced Configuation > Enable RESTful Management Services



=> (restart required)



After restart you will notice the following in the output



INFO: Scanning for root resource and provider classes in the packages:
weblogic.management.rest.resources
weblogic.management.rest.provider
13.12.2011 00:03:13 com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
class weblogic.management.rest.resources.ApplicationResource
class weblogic.management.rest.resources.TestResource
class weblogic.management.rest.resources.ClusterResource
class weblogic.management.rest.resources.DataSourceResource
class weblogic.management.rest.resources.ServerResource
13.12.2011 00:03:13 com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Provider classes found:
class weblogic.management.rest.provider.CollectionResponseXmlProvider
class weblogic.management.rest.provider.ItemResponseJsonProvider
class weblogic.management.rest.provider.CollectionResponseJsonProvider
class weblogic.management.rest.provider.CollectionResponseHtmlProvider
class weblogic.management.rest.provider.ItemResponseHtmlProvider
class weblogic.management.rest.provider.ItemResponseXmlProvider
13.12.2011 00:03:14 com.sun.jersey.server.impl.application.WebApplicationImpl _i
nitiate
INFO: Initiating Jersey application, version 'Jersey: 1.9 09/02/2011 11:17 AM'


(=> This is good news! It states that some RESTful service will be available.)



After Restart open http://localhost:7001/management/tenant-monitoring/servers



(the authorized users must be in the group Administrators or Monitors)



0001@2713_2713-41266a27ed555555



Login in as weblogic user and see the default HTML output



0002@2713_2713-41266a27efb11d34



If you e.g. need better proccessable formats, JSON and XML are of course also supported. Let's see how it is done and what it looks.



Add Accept Header with application/json



0004@2713_2713-41266a27f2c474d0



Add Accept Header with application/xml



0005@2713_2713-41266a27f36b5493



Currently there is REST support for Servers (all in a domain or specific one), Clusters ( all in a domain or specific incl server members), applications (all in a domain or specific app), data sources (all in a domain or specific).



With these capabilities it' possible to implement a custom monitoring solution. A slim mobile wls monitoring app (and more)! => Hands on;)



See doc for details of all available RESTful-Services in WLS12.1.1 http://docs.oracle.com/cd/E24329_01/web.1211/e26722/toc.htm



Collected Documentation links



Overview OTN: http://www.oracle.com/technetwork/middleware/weblogic/documentation/index.html



WLS 12c  Data sheet: http://www.oracle.com/us/products/middleware/application-server/oracle-weblogic-server-ds-1391360.pdf



WLS 12c online Documentation Library: http://docs.oracle.com/cd/E24329_01/index.htm



Usind RESTful Services  With WLS 12c: http://docs.oracle.com/cd/E24329_01/web.1211/e26722/toc.htm



Dislikes



- Still many BEA* stuff in diffrent scripts. It would be nice to have a clean and straight product without any historical garbage.



- configure.xml : ProgramGroupName=BEA WebLogic Platform 10.3 (Integrated Build)....


Why there is still the need to have a programm group called "BEA WebLogic Platform 10.3"?


My suggestions: Oracle WebLogic Platform 12.1.1 or Oracle Fusion Middleware Platform 12.1.1, everythin else, but not 10.3!



Like



- Java EE 6 Support. (It took a long time..)


- Better Maven Support


- RESTful Management Service


- ZIP distribution. Although the file is called wls1211_dev.zip it is possible to create a domain in production mode by the configuration wizard. At least in a simple testdrive it worked for me.


-Startup time feels better than wls11g


- more to test...(-Dservertype=wlx  to avoid loading EJB, JMS, JCA )

Friday, December 9, 2011

ADF News Session (german) - Integration of BI Publisher into ADF Applications

The folowing session was presented today on the german ADF News Session that is driven by the german ADF community.

Although the slides are in german I think the ADF concepts should be well decoupled from the language itself ;)



Similiar Stuff / Links

Saturday, November 26, 2011

ADF: Panel Tabbed Inter-Region Communication through shared bean datacontrol

Tested with JDeveloper 11.1.1.2

Use Case

  • JSF Page with two tabs (Departments, Employees)
    image The DepartmentName is rendered as a command link. If the user clicks on a DepartmentName the view changes on to the Employees Tab and filters the data
    image
  • In each tab there is an static adf region (bound to fragment based BTF)
    image
In summary we need the following to do:
  • DepartmentName as command link
  • View switches to the Employees Tab
  • Tab text should change to “Employees (<DepartmentName>)
  • On the employees tab - of course – only the corresponding entries should be displayed
  • The employees tab contains a button to remove the “global” filter.

How to do it?

Create DataExchange Bean as follows
public class DeptEmpExchange {
    private Number deptId;
    private String deptName;
    public DeptEmpExchange() {
        super();
        System.out.println("DeptEmpExchange created " + this);
    }
    public void setDeptId(Number deptId) {
        this.deptId = deptId;
    }
    public Number getDeptId() {
        return deptId;
    }
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }
    public String getDeptName() {
        return deptName;
    }
    /**
     * Exposed as DC Operation.
     * Called from the dept btf
     * @param deptId
     * @param deptName
     */
    public void onDepartmentChange(final Number deptId,
                                   final String deptName) {
        System.out.println("onDepartmentExchange called: " + deptId + "/" + deptName);
        setDeptId(deptId);
        setDeptName(deptName);
        View1Bean view1 = (View1Bean)JSFUtils.resolveExpression("#{View1Bean}");
        view1.getEmpTab().setDisclosed(true);
        view1.getDeptTab().setDisclosed(false);
        view1.setEmpTabText("Employees ("+deptName+")");
        AdfFacesContext.getCurrentInstance().addPartialTarget(view1.getPanelTabbed());
    }
And expose as JavaBean DataControl.
Now, on depts page fragment: drop the exposed operation onto the command link and provide the parameters from the current row.
image
The refresh of the panel tabbed is done programmatically in the onDepartmentChange(..) method. In order to refresh the emp btf with the new dept id configure the following bindings / properties on the main page
image
- create an attribute binding on the deptId from the DeptEmpExchange Bean.
- bind the tf input parameter to the attribute binding
- do not forget to set refresh=ifNeeded => this causes the btf to refresh in case the input params will change.
Implementing the “remove global filter” functionality is pretty simple. Just drag the onDepartmentChange-Operation from the data control palette on to the toolbar and adjust the text.
image

image
I hope I have not forgotten any important steps.

Download JDev11112Workspace

Update on Dec 19th 2011: Added Sample Application

Thursday, November 24, 2011

ADF Faces: Navigate on Checkbox selection

Used in Version: 11.1.1.2

As you may have noticed there is no action attribute on af:selectBooleanCheckbox. So how could you trigger a navigation case if user changed selection state of the checkbox.

In a customers scenario I need to trigger a navigation in a BTF from a checkbox insige a jsff

<af:selectBooleanCheckbox label="Klick me" id="sbc1"
                                       selected="#{MyBean.selected}"
                                       autoSubmit="true"/>

image

MyBean.java looks like

 public void setSelected(String value) {
final FacesContext context = FacesContext.getCurrentInstance();

if ("true".equalsIgnoreCase(value)) {
// checkbox is selected
context.getApplication()
.getNavigationHandler()
.handleNavigation(context,null,"selected");
return;
}

// checkbox is not selected
context.getApplication()
.getNavigationHandler()
.handleNavigation(context,null,"notSelected");
}

Tuesday, November 22, 2011

ADF Talk on Youtube started

Today Ulrich and me started a series of sessions on ADF Topics.

In ADF Talk Session 1 we are introducing a way to integrate PL/SQL Code into ADF fusion applications. The video shows the usage of custom jdeveloper extension: TEAM Application Module from Database Package. See it in action.

Monday, November 21, 2011

My DOAG 2011 Slides – Upgrade Guide for Oracle ADF on WebLogic Server

Just translated my german slides from DOAG 2011 and uploaded those to slideshare.
Hopefully someone will find it useful. At the conference there were just too few attendees…
http://www.slideshare.net/multikoop/doag-2011-upgrade-guide-for-oracle-adf-on-weblogic-server

Friday, November 11, 2011

ADF 11.1.2.1 - clicktoedit table, createinsert, rollback bug?

ADF version: 11.1.2.1
Firefox: 5.0

Prerequistes

-Using ADF BC
-Create the most simple jsf page declarativly (no custom java code)
--table features: single selection, sorting, filtering
--change table attributes: editingMode=clickToEdit

Steps to reproduce

1. start http://127.0.0.1:7101/TestInsertIntoClickToEditTable2-ViewController-context-root/faces/view1

0000@2660_2660-412669e935ee8dd8

[notice the yellow marked rows.]

2. Now Click on CreateInsert

0001@2660_2660-412669e9366af37c

OK, new row is inserted and can be edited now.

3. Click on Rollback-Button (or Execute-Button)

0002@2660_2660-412669e937240796

What happened to the last two rows?

Further issue: clicktoedit not working on some rows

0003@2660_2660-412669e9385e0e69

You may click as often you want. The row won't change into edit mode. In the log window you will see

<FacesCtrlHierBinding$FacesModel> <makeCurrent> ADFv: Keine Zeile gefunden für rowKey: [oracle.jbo.Key[191 ]].

Known workaround so far

1. Click the Execute-Button after Rollback.

2. Bind Rollback action to a backing bean method and do the following (Rollback + setActiveRowKey)

/**
* Rollsback and Re-Executes the table iterator
* @param actionEvent
*/
public void onRollback(ActionEvent actionEvent) {
    final DCBindingContainer bc = (DCBindingContainer)getBindings();
    bc.getOperationBinding("Rollback").execute();

    setActiveRowKey(bc);
}

/**
*
* @param bc
*/
private void setActiveRowKey(final DCBindingContainer bc) {
    final DCIteratorBinding empIter = bc.findIteratorBinding("EmployeesView1Iterator");
    final Row newRow = empIter.getCurrentRow();
    final ArrayList activeRowKeyList = new ArrayList();
    activeRowKeyList.add(newRow.getKey());
    getEmpTable().setActiveRowKey(activeRowKeyList);
}

public BindingContainer getBindings(){
    return BindingContext.getCurrent().getCurrentBindingsEntry();
}

Download

Sample Application: http://www.box.net/s/od2t8en8ojo3hho704uz

Similiar issues

http://adfbugs.blogspot.com/2010/03/rollback-does-not-refresh-current-row.html

JDev 11.1.2.1 – Clear WLS Log tab Bug?

Applies to JDeveloper: 11.1.2.1

Problem Description

After starting the integrated WLS from JDev the wls log is displayed in the log tab. Open mouse context menu and “clear” item is not activated

image

I have no chance to clear the log tab!! Arghh.

Is there any good reason for this behaviour? ( not beeing able to clear the log). The memory consumption is already enormous. Dear Oracle, please let me clear the log tab again…

Never seen this issue in 11gR1 versions.

Is there any workaround?

Saturday, October 8, 2011

[solved] Download offline bc4j-junit_bundle 11.1.2.1 version/download link mismatch

Applies to: JDeveloper 11.1.2.1

Download from: http://www.oracle.com/ocom/groups/public/@otn/documents/webcontent/131167.xml#oracle.BC4J.junit

Problem description

Trying to install the downloaded bc4j-junit_bundle offline version as extension I get the following error

0001@2612_2612-412669a31839a5bc

Analysis

Open the corresponding bundle ZIP an lets see if it is really wrong version

0000@2612_0-412669a316db363c

But as you can see I have downloaded the correct version. So there is a mismatch.

Solution

After further investigating the download link I realized that it just references the old version

http://download-llnw.oracle.com/otn-pub/jdeveloper/11.1.2.0.0/extensions/bc4j-junit_bundle.zip

So let's try to adjust manually the URL und download

http://download-llnw.oracle.com/otn-pub/jdeveloper/11.1.2.1.0/extensions/bc4j-junit_bundle.zip

é voilà now the installation works fine as well

0002@2612_2612-412669a3198bf259

[solved] JDeveloper - Install Extensions offline / licences check issue

Applies to: JDeveloper 11.1.2.1

Issue

0000@2607_2607-412669a3102f0735

Results in

0001@2607_2607-412669a31054f43e

The impact is that you are unable to install JUnit-Extension in a Workshop Lab e.g. where

you can't assume that the attendees have an internet connection

Workaround

Because we are quite smart let's workaround....

Open Bundle with your favourite archiver tool

and remove or comment out the following line

<u:requires-agreement url="http://junit.sourceforge.net/cpl-v10.html" />

0002@2607_2607-412669a312de3ef5

Save change and Update Archive.

Import extension again.

0003@2607_2607-412669a3138e38e4

=> No license check requirement shows up. Yeeeees we can!

Monday, October 3, 2011

Upgrade Oracle Team Productivity Center to 11.1.2.1 / Hudson Plugin

From Version: 11.1.1.5 
To Version: 11.1.2.1

Prepare

Check the content of the current otpc schema

SQL> select * from otpc_version t;

                 ID       DB_UPGRADE_NUM DB_VERSION                                                                    VERSION

-------------------- -------------------- ---------------------------------------------------------------- --------------------

                  1                    2 11.1.1.5.37.60.13                                                                   1

Download tpcinstaller.jar from OTN

Installation

Start new installer

jar -jar tpcinstaller.jar

0000@2570_2570-41266996bfbd4018

Click Next

0001@2570_2570-41266996c019ca25

Great: The installer recognized everything, so you really can expect the installation process will do the right thing

Choose: NExt

0003@2570_2570-41266996c1f19691

Point to the autodeploy directory of the privious installation. If you just point to the DOMAIN_HOME Location you will get an exception:

0004@2570_2570-41266996c22e4506

TPC-90026: The otpc.war of current installation for upgrade is missing in the server deployment directory

(Enhencement request: The installer should be smart enough to be able to check for otpc.war in the given domain!)

0005@2570_2570-41266996c4153d10

Choose: Next

0006@2570_2570-41266996c433944a

Choose: Next

0007@2570_2570-41266996c44a55b6

...

0008@2570_2570-41266996c45e0e69

...

0009@2570_2570-41266996c4765432

Upgrade completed. Plus Hudson Plugin installed.

Verify installation/ Upgrade

Verify  otpc_version in database schema:

SQL> select * from otpc_version t;

                 ID       DB_UPGRADE_NUM DB_VERSION                                                                    VERSION

-------------------- -------------------- ---------------------------------------------------------------- --------------------

                  1                    2 11.1.2.1.38.60.81                                                                   2

SQL>

Everything worked as expected. Nice.

Lets start weblogic and check if otpc server is running

0010@2570_2570-41266996c6ebe636

Seems to run, but (as stated in one of my privious posts) nobody can be sure which version actually is running. Especially from an ALM tool which now integrates with hudson I REALLY CAN EXPECT to see a BUILD-Number here! Dear Oracle, if you are reading this, please log an enhencement request to integrate a build number in the otpc server homepage! Further it would be nice if that homepage lists all installed otpc plugins (plus which version of course). Thanks.

BTW:

After starting the new otpc server a new folder has been created in DOMAIN_HOME

activemq-data

=> Oracle uses ActiveMQ now. I think in order to be able multi app server compatible. And ActiveMQ is obviously tinier than the WLS one.

OTPC Hudson Plugin

Now I am really interessted in how the hudson plugin looks like. So lets start my local hudson sanbox.

java -jar hudson-2.1.1.war -httpPort=8081 (8080 is used by the XE DB)

Observing the Hudson > Plugin Manager > Installed

=> No hints to a newly installed plugin

Looking into Hudson > Plugin Manager > Available

=> Bingo.

0011@2570_2570-41266996ce3bec47

(Additional info. The plugin has been put to

$HUDSON_HOME/HudsonTpcPlugin.hpi

by the OTPC installer and not into the $HUDSON_HOME/plugins/ as I would expect.)

Ok, move on

0012@2570_2570-41266996ceed6a92

Restart hudson.

The otpc plugin shows up in the installed section of the plugin manager.

0013@2570_2570-41266996cff6e5d5

So now we can use the plugin in our hudson jobs. Choose your job and configure..

0014@2570_2570-41266996d1950c84

Save changes and run your job.

Check the jobs console output

"The test result(s) Testergebnis will be sent to the Oracle Team Productivity Team Server at http://localhost:7001.

Successfully loggedin."


Thats all so far. Nothing else shows up in your hudson ui ;-(



What's next



Check OTPC in new JDev 11.1.2.1



0015@2570_2570-4126699b4bcdf012



0016@2570_2570-4126699b4bec474d



0017@2570_2570-4126699b4c0795cf



Let's open an old task repository



0019@2570_2570-4126699b51493271



Hhhm. let's create a new task repository



0018@2570_2570-4126699b4e450673



Same problem here.



Conclusion



OTPC is still not enterprise ready. OTPC should improve in the following




  1. Task repository connection does not work in new version! Wow. Where is the mistake? the server logs



WARNUNG: RepositoryServerServiceImpl.getAll() 10/03/2011 17:43:29 MESZ - reposit



ory server 'New Repository Server11121'  does not have any parameters by parentN



ame 'REPOSITORY_SERVER.New Repository Server11121.OTCP Task Repository11121'.



03.10.2011 17:43:29 oracle.alminternal.server.core.RepositoryServerServiceImpl g



etAll




  1. Integration BUILD-Number into otpc server homepage


  2. List installed connectors on otpc server homepage


  3. Integrate LDAP vor OTPC Users/Groups. Provide a mapping from those users/groups to OTPC Roles


  4. Integrate some nice charts in the hudson jobs webpages ;)



Like (in general about OTPC)




  1. Saving the IDE context for a specific task.!! This really rocks!