ADF知識點

1. ADF Custom ViewCriteria Compare Operator Problem: operator label disappear after passivation/activation

It’s required to add a “Like” operator to accept wildcard characters in <af:query>. It’s added according to the documentation, it’s working fine except during passivation/activation testing, the operator’s label will disappear in advanced mode. I guess it’s because after passivation/activation, the label’s key string is lost. Workaround is not to add new operator but override the behavior for “=” operator: generate “like” statement instead of “=” in the sql when whildcard character is detected.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//All these code are inside the XXXVOImpl.java class
private static CustomCriteriaAdapter adapter = new CustomCriteriaAdapter();
 
//Override parent method in VOImpl
public CriteriaAdapter getCriteriaAdapter() {
  return adapter;
}
 
public static class CustomCriteriaAdapter extends OracleSQLBuilderImpl {
  protected String convertOpandRHSToWhereFragment(ViewCriteria viewCriteria, ViewCriteriaItem
                                   viewCriteriaItem, String operator, Object paramName, boolean b) {
    logger.finest("CustomCriteriaAdapter.convertOpandRHSToWhereFragment");
    if (operator != null && ("=".equals(operator) || "equals".equalsIgnoreCase(operator))
              && paramName!=null) {
      String attrName = viewCriteriaItem.getAttributeDef()==null?"":viewCriteriaItem.getAttributeDef().getName();
      int vt = viewCriteriaItem.getAttributeDef()==null?Integer.MAX_VALUE:viewCriteriaItem.getAttributeDef().getSQLType();
      if(vt==Types.CHAR || vt==Types.VARCHAR || vt==Types.NVARCHAR || vt==Types.LONGVARCHAR || vt==Types.LONGNVARCHAR){//only for string
      Object v = viewCriteria.getVariableManager().getVariableValue(((String)paramName).replaceAll(":", ""));
      if (v != null && v.toString().contains("%"))
        return " LIKE " + paramName + " ";
    }
   }
   return super.convertOpandRHSToWhereFragment(viewCriteria, viewCriteriaItem, operator, paramName, b);
  }
}

References:
https://community.oracle.com/thread/1053000?start=0&tstart=0
http://tompeez.wordpress.com/2011/08/21/extending-viewcriteria-to-use-sql-contains-4/
http://www.jobinesh.com/2010/12/using-oraclejbodomainarray-with.html
http://adfpractice-fedor.blogspot.sg/2012/12/building-custom-where-clauses-for-view.html

2.  Form auto submission when pressing enter key

This is useful for login page and other forms also:

1
2
3
<af:form ... defaultCommand="submitBtnId">
 
...

Reference: https://blogs.oracle.com/Didier/entry/adf_faces_submit_a_form_with_t_1

3. AM Pool Tuning Tips:

http://technology.amis.nl/2014/07/01/10-tips-for-adf-application-module-pool-tuning/

Most of them are known but some tips are new and very handy:

1
select a.*, dbms_lob.getlength(a.content) passivationSize from PS_TXN a order by passivationSize desc

4. Jdeveloper tool: Tools->ODL Analyzer -> View by ADF Request is handy:

https://blogs.oracle.com/groundside/entry/adventures_in_adf_logging_part4

5. render tree using adf instead of using af:tree:

http://odyniec.net/articles/turning-lists-into-trees/

https://stackoverflow.com/questions/12361858/render-nested-list-like-a-tree

We could achieve the same effect using nested “af:panelGroupLayout” by setting the child component’s margin or padding. We could also build a tree with root node at bottom and children at the top with similar technique. For example, this is a combination of two trees, one of them is upside down, root node in the middle, each node is an af:commandLink:

tree

6. af:setPropertyListener fired too late for af:commandLink/commandButton in facelets

http://prsync.com/oracle/setpropertylistener-and-setactionlistener-might-fire-too-late-when-using-facelets-468522/

7: ADF CSS Image URL optimization:

If put images in “public_html/images” folder and use JDeveloper to edit styles (eg background image) and select the image from this folder, the generated path is:

1
background-image:url("images/img.png");

It’s better to change the path to following:

1
background-image:url("../images/img.png");

For the first one, browser will in fact request image from “app_root/faces/images/img.png”, faces servlet will response http code 302 “moved temporarily” and browser will send another request to “app_root/faces/images/img.png?_adf.ctrl-state=xxx” to download the image again. The second approach (“../images/img.png”) will make sure browser cached image is used which is much faster. Moreover for the first approach in IE8, the image is not displayed occasionally :(

8: convert Oracle DB connected by result into tree:

Oracle DB hierarchical query (either via connect by keywords or recursive query using with keyword) result records are a flattened tree in depth first search order (assuming no order by clause is used). After knowing this, it becomes easy to convert result records into any tree data structure. One way is to scan result records with helping of Dequeue to construct the tree data structure.

Some March 2014 Notes/Tips

1) List of implicit JSF EL objects:

http://balusc.blogspot.sg/2011/09/communication-in-jsf-20.html#ImplicitELObjects

2) Performance issue caused by Oracle DB bind variable peeking

Encountered an strange performance issue, the ADF VO query is very slow, though the same query could finish in other sql tools within seconds. In the end it’s due to oracle bind variable peeking, different execution plan is used by the query optimizer, some references:

http://blog.tanelpoder.com/2010/02/02/bind-variable-peeking-execution-plan-inefficiency/

http://dba.stackexchange.com/questions/51558/query-gets-slow-when-bind-peeking-is-turned-on

http://scn.sap.com/community/oracle/blog/2013/06/13/oracle-db-optimizer-part-vi–effects-of-disabled-bind-variable-peeking-adaptive-cursor-sharing-and-cardinality-feedback-on-the-cbo-in-sap-environments

http://stackoverflow.com/questions/7839907/no-more-data-to-read-from-socket-error/7844985#7844985

3) how to find query block identifier for oracle sql hint

explain plan then run:

1
2
3
</p>
<p>SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, NULL, 'typical alias -rows -bytes -cost'))</p>
<p>

http://jonathanlewis.wordpress.com/2007/06/25/qb_name/

4) Set all VO fetch size to 25, I feel it has more benefits than drawbacks

Default fetch size is 1 which is Ok since when drag drop to page as table, it will set fetch size to 25. But sometimes, we iterate on the table/iterator data without displaying it on UI, this setting will often missed out. If the SQL is slow, performance is even more affected obviously. I felt change this to 25 in all VO has more benefits than drawbacks.

5) ADF Error page

http://biemond.blogspot.sg/2008/04/exception-page-with-adf-taskflow.html

But it seems need some special handling for view expired exception (should redirect to login instead of this page? pending test this)

6) ADF dynamic component, some hacking to show filter and sort properties

http://andrejusb.blogspot.sg/2013/11/creating-adf-bc-view-object-instances.html

Used above as a starting point but forced to add sorting and filtering, fortunately most columns are just String type, otherwise more work needs to be done. Following is in Jdev11.1.2.4, I think higher version will be much easier to do this since it’s more JSF2.x compatible.

Step 1: Add following phase listener to the dynamic table page:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public void phaseListener(PhaseEvent evt) {
    try {
        if (PhaseId.RENDER_RESPONSE.equals(evt.getPhaseId())) {
            evt.getFacesContext().getViewRoot().subscribeToViewEvent(PreRenderComponentEvent.class, new SystemEventListener() {
                    @Override
                    public void processEvent(SystemEvent evt) {
                        if (evt.getSource() != null && evt.getSource() instanceof DynamicTable) {
                            DynamicTable dtt = (DynamicTable)evt.getSource();
                            if (dtt != null && dtt.getChildCount() > 0) {
                                RichTable t = (RichTable)dtt.getChildren().get(0);
                                Iterator<UIComponent> itr = t == null ? null : t.getFacetsAndChildren();
                                while (itr != null && itr.hasNext()) {
                                    UIComponent col = itr.next();
                                    if (col != null && col instanceof RichColumn) {
                                        ((RichColumn)col).setSortable(true);
                                        ((RichColumn)col).setSortProperty(((RichColumn)col).getHeaderText());
                                        UIComponent filter = col.getFacet("filter");
                                        List<UIComponent> children = ((RichColumn)col).getChildren();
                                        boolean filterable = true;
                                        if (children != null && children.size() > 0) {
                                            if (children.get(0) != null && children.get(0) instanceof RichInputDate) {
                                                ((RichColumn)col).setFilterable(false);
                                                filterable = false;
                                            }
                                        }
                                        if (filter == null && filterable) {
                                            UIComponent f = new RichInputText();
                                            ((RichColumn)col).setFilterable(true);
                                            FacesContext context = FacesContext.getCurrentInstance();
                                            f.setValueExpression("value",
                                                                 context.getApplication().getExpressionFactory().createValueExpression(context.getELContext(),
                                                                                                                                       "#{vs.filterCriteria." +
                                                                                                                                       ((RichColumn)col).getHeaderText() +
                                                                                                                                       "}", String.class));
                                            ((RichColumn)col).setFilter(f);
                                        }
                                    }
                                }
                            }
                        }
                    }
 
                    @Override
                    public boolean isListenerForSource(Object o) {
                        return o != null && o instanceof DynamicTable;
                    }
                });
        }
    } catch (Throwable e) {
        logger.severe("before phase", e);
    }
}

Step 2: Add phase listener to page:

1
<f:view beforePhase="#{pageFlowScope.xxxBean.phaseListener}">

In page def file, besides the iterator, also need to add this search criteria binding for filtering:

1
2
3
4
</pre>
<searchRegion Criteria="__ImplicitViewCriteria__" Customizer="oracle.jbo.uicli.binding.JUSearchBindingCustomizer" Binds="MyVO1Iterator"
 id="ImplicitViewCriteriaQuery" InitialQueryOverridden="true" Refresh="always"/>
<pre>

7) For ViewObject, need to run executeQuery before insertRow (if it’s not executed)? otherwise hv activation/passivation problem

8) In IE, tabbing out of autosubmit input fields inside af:table is not working perfect if event policy is ppr

In IE, if event policy is ppr, for a table of input text fields, if it’s autosubmit & other fields have partial trigger on it, when user tab out to the next field (assume there’s existing text inside all input fields), the highlighted text status of the next input text field will be lost, it’s a problem for those head down input users

env: Jdev 11.1.2.4 & IE8; it’s working fine in Chrome.

9) Transient View Object In-memory sorting behavior

If all attributes of the view object are transient attributes (I didn’t have time to test sql/entity based VO), In-memory sorting feature works however after the sorting, all inserted rows will disappear after passivation/activation. One possible workaround is that executeQuery in scan db table mode and insert sorted rows again :(

It seems this was a bug and already fixed but I still encounter it in 11.1.2.4.

Reference: https://community.oracle.com/thread/656745?start=0&tstart=0

10) ADF IE 11 Support:

Workarounds like filter are there but seems official way is to use following patch:

https://blogs.oracle.com/jdeveloperpm/entry/oracle_jdeveloper_and_adf_patches

11) Add own searhc fields to af:query 

http://www.jobinesh.com/2011/03/retrieving-viewcriteria-from-custom.html

I used above reference as a starting point of some af:query hacking (I do this only when I don’t have a choice): Adding some semi-colon delimited search fields.

Step 1: Change the VO sql, add some new column like this ‘$$$_’ || COLUMN1 searchField, mark it as queriable

Step 2: Manipulate search criteria in  VO’s “executeQueryForCollection” method, so it always evaluated to true.

01
02
03
04
05
06
07
08
09
10
11
12
13
...
 
ViewCriteria vc = this.getViewCriteria("__ImplicitViewCriteria__");
 Object v = null;
 if(vc!=null && vc.size()>0){
ViewCriteriaRowImpl r = (ViewCriteriaRowImpl)vc.get(0);
if(r!=null){
r.setOperator("searchField", "<>");
}
 
...
 }
 super.executeQueryForCollection(object, object2, i);

Step 3: in the af:query’s query listener, execute a AM’s method binding to query the VO by converting the semicolon field to its where clause (or maybe using a VC if you like) before processing query event via EL invokation. The submitted af:query search field could be obtained:

1
2
3
4
5
6
7
8
9
public void onSearch(QueryEvent evt) {
   QueryDescriptor desc = evt.getDescriptor();</pre>
for(Criterion c : desc.getConjunctionCriterion().getCriterionList()){
if( "SearchFeild".equalsIgnoreCase(((AttributeCriterion)c).getAttribute().getName())){
 searchField= (String)((AttributeCriterion)c).getValues().get(0);
 }
 
...
<pre>

Lastly, I need to hide the search criteria operator for the newly added fields, following tip is very helpful: http://andrejusb.blogspot.sg/2014/04/hide-all-search-operators-for-adf-view.html However, on jdev11.1.2.4, I notice that the jdeveloper view object attributes will disappear in the VO configuration design View, workaround is to remove the added tag in source view and get the attributes shown and add the tag in source view again.

12) Encounter issue: RowID truncated during table scrolling

Forced to use RowID as PK and display records inside af:table however when scrolling and select the row, the row key in selection event which is the RowID is truncated so the RichTable.getRowDate(key) will fail to return current row.

Some Dec/2013 Notes

1) Some useful JVM params
http://blog.joda.org/2011/08/printcompilation-jvm-flag.html
https://wikis.oracle.com/display/HotSpotInternals/PrintAssembly
http://classparser.blogspot.sg/2010/03/hsdis-i386dll.html

2) UEditor from baidu

http://ueditor.baidu.com

3) How to check if it’s a postback in jsf 1 & 2:

http://stackoverflow.com/a/5266472/382180

4) A nice timeline javascript library:

http://timeline.knightlab.com/

5) Oracle autonomous_transaction (difference with nested transaction; autonomous proecedure/function/trigger etc):

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/autonotransaction_pragma.htm

Useful for logging, shadow table etc.

6) Oracle database never block a read on rows even if the rows is/are locked by another session; the resultset will be a fixed snapshot, the rows are fixed (multi-version):

eg: one session opened a cursor to read selection result on a table, during which all rows are deleted and committed in another session, the first session could continue reading the rows using that cursor.

7) Some developer tools collection, could check this list first whenever one needs a tool:

http://www.hanselman.com/blog/ScottHanselmans2014UltimateDeveloperAndPowerUsersToolListForWindows.aspx

8) Guava v15.0 couldn’t be deployed to Weblogic 12c:

http://stackoverflow.com/a/19627096/382180

9) Java XML Parser error: “Exception in thread “main” java.lang.UnsupportedOperationException: This parser does not support specification “null” version “null”

Solution one, add following jvm setting:

1
-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

Other solutions:

http://www.jroller.com/navanee/entry/unsupportedoperationexception_this_parser_does_not

http://colorcoding.wordpress.com/2010/02/17/unsupportedoperationexception-and-xml-parser-versions/

10) BTrace Project, it could change running jvm’s classes:

https://kenai.com/projects/btrace/pages/Home

11) Workaround for Lov bug: selected invalid Lov value appears not set immediately but validation error message is shown when user moves to the next row.

Workaround is: set ExceptionMode of the data control to “immediate” in DataBinding.cpx file.

http://andrejusb.blogspot.sg/2013/12/workaround-for-infamous-bug-13626875.html

12) Git revert local changes:

http://stackoverflow.com/questions/52704/how-do-you-discard-unstaged-changes-in-git

Quick workaround is:

1
2
3
git stash save --keep-index
 
git stash drop

13) af:tree af:treeTable get node depth:
https://community.oracle.com/thread/2154226

1
<af:outputText value="#{bindings.Employees.treeModel.depth}"/>

14) af:fileDownloadActionListener or af:exportCollectionActionListener not working (the bean method is not called)
https://community.oracle.com/message/10902026
I think I encounter same problem of this post, workaround is disable ppr in adf-config.xml
but one need to revisit existing functions if it’s relying on this feature.

Some Sep/2013 Notes

1) Search Content Server (UCM) documents that the user “USERID1″ has read write rights:

In query builder form:

search2Alternatively, could go to “Expanded Form” and add the user access list search conditions (Including access rights info)

2) Understanding OCS Content Item Lifecycle:

Here’re a few common states an item goes through and corresponding values you’ll see in the Status field:

Review: The item is in the workflow.
Edit: The item is in the contribution stage. It has probably been rejected from the first step of the workflow.
Pending: The item was included in a basic workflow along with the other items. It was approved and is waiting while the rest of the items go through the workflow.
Done: Workflow is complete.
GenWWW: Conversion is in progress. For instance, when you use the PDF converter to generate a PDF version after check in.
Released: All done. The item is available and will appear in searches

3) In OCS, create a token represent a user defined in one of metadata field (eg. approver user token):

tokenThis will create a token represent the user defined in workflow approver metadata field, similar use cases can also be implemented this way. http://docs.oracle.com/cd/E21764_01/webcenter.1111/e12405/wcadm_documents.htm#BABIFAJG

4) WebCenter 11.1.1.8 released, WC Spaces renamed to WC Portal, Info on WC Content 11.1.1.8:

http://andrejusb.blogspot.sg/2013/08/webcenter-portal-new-name-for-webcenter.html

http://jonathanhult.com/blog/2013/08/webcenter-content-11-1-1-8-0/

5) Groovy expression to assign db sequence to a string variable (append “as String” in the of the expression):

http://www.jobinesh.com/2013/08/groovy-expression-for-assigning-db.html

6) JRebel now supports JDeveloper v11.1.2+

http://manuals.zeroturnaround.com/jrebel/ide/jdeveloper.html

7) Use “AdfAgent.AGENT.getElementById” instead of document.findElementById for better performance

8) Adf table filtering not working for MySQL database, solution is:

http://technology.amis.nl/2011/10/24/adf-table-filtering-on-mysql-is-failing/

9) WebCenter 11.1.1.8, identify slow pages technique

http://www.ateam-oracle.com/webcenter-11-1-1-8-performance-analysis-feature/?fb

Reference: http://docs.oracle.com/cd/E29542_01/webcenter.1111/e27738/wcadm_trouble.htm#WCADM12929

10) Change WebCenter session timeout

Use Red Samurai’s MDS Cleaner -> Search “%webcenter-config% -> Edit Source XML -> Change session timeout to larger value

webcenter_session11) Oracle Text Search Info (also could check documentation for indexing of various content types, different index types etc)

http://docs.oracle.com/cd/B19306_01/server.102/b14220/content.htm#i468182

http://docs.oracle.com/cd/B19306_01/text.102/b14218/cdatadic.htm#sthref455

12) UCM couldn’t re-create deleted folder

Error msg is folder with same name already exists, one of possible reasons is that the deleted folder is a system folder (can be viewed in UCM console “Administration -> Folder Configuration -> System Folder Configuration”). When the folder is deleted, it’s not deleted but marked as disabled, so re-create a folder with same name will fail. Quick fix is in UCM database, set column Collections.dcollectionmark as null for the folder or make sure dCollectioMark meta field is null during folder creation.

13) Java Integer / Long  overflow handling and checking

http://stackoverflow.com/a/3001879/382180

Integer.MAX_VALUE+1 will be Integer.MIN_VALUE , similar for Long

14) Java has no built-in AtomicDouble (it has AtomicBoolean, AtomicLong etc), google’s Guava has, it uses AtomicLong to implement it.

http://docs.guava-libraries.googlecode.com/git-history/v11.0.2/javadoc/com/google/common/util/concurrent/AtomicDouble.html

Similar to other JDK AtomicXXX classes, it’s non-blocking, it used Double.doubleToLongBits() technique

15) Java 8 Streams vs LINQ

http://blog.informatech.cr/2013/03/24/java-streams-preview-vs-net-linq/

16) Some useful adf resource/articles:

ADF Taskflow Transaction:

http://www.oracle.com/technetwork/developer-tools/adf/learnmore/adf-task-flow-trans-fund-v1-1-1864319.pdf

Transaction issue created by nested region and tx attributes:

https://blogs.oracle.com/onesizedoesntfitall/entry/adf_prematurely_terminated_task_flows

ADF layout basics:

http://www.oracle.com/technetwork/developer-tools/adf/learnmore/adffaceslayoutbasics-2046652.pdf

17) Nice UI mock tool:

http://balsamiq.com/

18) In ADF 12c, after changing -Djbo.debugoutput=console, it’s still required to change logging.xml to see the log:

https://forums.oracle.com/message/11145783

Some May tips

1) ADF ChangeEventPolicy=PPR

https://forums.oracle.com/forums/thread.jspa?threadID=2266956

https://blogs.oracle.com/jheadstart/entry/jdev_11_1_2_differences

2) What’s new in JSF2.2? Very nice article here:

http://jdevelopment.nl/jsf-22/

3) Call taskflow via url & adf redirect to view id:

1
2
3
4
ControllerContext ctx = ControllerContext.getInstance();
//If first param for ctx.getTaskFlowURL is false, current taskflow finalizer will not be called
String url = ctx.getTaskFlowURL(true, TaskFlowId.parse("/WEB-INF/task-flow2-definition.xml#task-flow2-definition"), null);
FacesContext.getCurrentInstance().getExternalContext().redirect(url);

For ADF redirection to a view id, it’s recommended to use following so that controller state is properly maintained:

1
2
3
ControllerContext.getInstance().getGlobalViewActivityURL("viewId");
//or
ControllerContext.getInstance().getLocalViewActivityURL("viewId");

4) Some interesting HTML5 features
http://daker.me/2013/05/5-html5-features-you-need-to-know.html
Summary: DNS prefetching, Link prefetching, download attribute, regular expression (validation), datalist element (auto complete inputs)

5) WebCenter URL:

1
WCApplicationContext.getCurrentInstance().getNavigableURL(s);

This will append control state params to the original url, so that finalizer of current taskflow will be called properly

6) Some navigation references (especially within bounded task inside region):

https://blogs.oracle.com/jdevotnharvest/entry/how-to_navigate_in_bounded_task_flows

7) Good reading material on “CLIENT_STATE_MAX_TOKENS”:

http://www.jobinesh.com/2013/05/a-good-read-on-clientstatemaxtokens.html

(target url: http://www.ateam-oracle.com/understanding-client_state_max_tokens/)

8) RIDC example:

http://jonathanhult.com/blog/2012/12/ridc-examples/

9) WebCenter Content Custom Component vs Java Filter:

http://www.redstonecontentsolutions.com/5/post/2012/04/ucm-service-handlers-and-javafilters.html

http://jonathanhult.com/blog/2012/09/favorite-webcenter-content-filters/

10) UCM Full Text Search:

https://blogs.oracle.com/interactions/entry/ucm_get_search_results_with_full_text_search

11) UCM Query Size of Contribution Folder – Trash

http://jonathanhult.com/blog/2013/06/contribution-folders-trash/

12) UCM Database Tables:

http://jonathanhult.com/blog/2012/12/webcenter-content-database-tables/

13) A Sample UCM RIDC Client program in Java that import batch files

http://jonathanhult.com/blog/2012/11/ridc-import-batch-file/

14) UCM DataResultSet vs ResultSet 

http://jonathanhult.com/blog/2012/11/resultset-versus-dataresultset/

15) Jdeveloper 12c released (new features etc):

http://tompeez.wordpress.com/2013/07/11/jdeveloper-12c-available/

16) Install EM (Enterprise Manager) in JDeveloper Integrated Server:

http://rohith-oracle.blogspot.sg/2013/06/install-enterprise-manager-em-in.html

17) Some good UCM crash start materials:

Good book/doc to understand basic UCM concepts: <<The Oracle Universal Content Management Handbook>>   <<Content Folios User Guide>>



轉載自:http://codeplay.net/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章