User:Trifonnt
|
Contents
- 1 About Me
- 2 Trifon's Paid Services
- 3 Adempiere trackers
- 4 Adempiere contributions
- 5 Interesting bugs/patches
- 6 My favourite readings
- 6.1 Interesting
- 6.2 Social networks
- 6.3 ERP articles
- 6.4 Adempiere
- 6.4.1 Adempiere commit schema
- 6.4.2 VERY IMPORTANT
- 6.4.3 Incoming evenets
- 6.4.4 Adempiere Application dictionary vs. Axapta Data dictionary
- 6.4.5 Postal Code Web Service
- 6.4.6 Developer hints
- 6.4.6.1 Subversion Access
- 6.4.6.2 MFG
- 6.4.6.3 Template Process
- 6.4.6.4 Migration with SQL statements - AD_Element
- 6.4.6.5 Migration with SQL statements - AD_Column
- 6.4.6.6 Migration with SQL statements - AD_Field
- 6.4.6.7 Migration with SQL statements - AD_Message
- 6.4.6.8 Migration with SQL statements - AD_Process_Para
- 6.4.7 License to use for new classes
- 6.4.8 Adempiere Export/Import Tools
- 6.5 CRM systems
- 6.6 Tina POS
- 6.7 Compiere
- 6.8 HTML/CSS
- 6.9 Java related
- 6.9.1 Java and IM
- 6.9.2 Autocompletion
- 6.9.3 Portal, JCR, ECM, Groupware
- 6.9.4 Eclipse IDE and Application build on Eclipse
- 6.9.5 Script Languages
- 6.9.6 Java FTP Libraries and Articles
- 6.9.7 OpenXava Q & A
- 6.9.7.1 Q1. How do I set this up?
- 6.9.7.2 Q2. How can I get the view of the entity refreshed after the method is executed.
- 6.9.7.3 Q3. How can i reload other modules to reflect the changes made by an action that was performed in one module?
- 6.9.7.4 Q4. How to avoid warnings that messages are not translated
- 6.9.7.5 Q5. Example TestCase
- 6.9.7.6 Q.6 How to provide a web API for accessing the OpenXava application?
- 6.9.7.7 Q7. Magic numbers
- 6.9.7.8 Q8. How to access EJB from OpenXava
- 6.9.7.9 Q9. Access rights depending on the user profile
About Me
I started my own comapny last year providing Adempiere and Compiere consultancy and development. I like developing business systems. This makes me headache from tme to time, but also makes me very happy when i see system wokring.
As a member of ADempiere Council i like to review patches and SVN commits in order to be sure that code remains stable and system functional. I hope that you have found that i like to help in forums and provide guidance to ADempiere developers how to solve problems they find in their day by day work.
Trifon's Paid Services
Paid Adempiere support
- Need urgent advice for your Adempiere implementation or need to talk with experienced Adempiere developer - call now to get friendly help. Ask for Trifon.
- Price is 0.80 euro per minute
Use Skype Prime service to call now. More info about Skype Prime
Paid on site Adempiere training and development
- 1500 EURO / week + ticket + hotel
Paid EDI @ Adempiere support and training
- If you need training or support for EDI in Adempiere, please do not hesitate to contact me.
- Prices start from 30 Euro per hour.
Paid Liferay setup and extensions development
- Leading Open Source Enterprise Portal
- JSR-168 compliant
- Business Friendly Open Source License: MIT License
Paid OpenXava Development
- Development of custom applications based on OpenXava framework.
- Suitable for:
- Small applications which need to be developed from scratch
- Development of applications which must be part of a Web Portal.
- Applications based on OpenXava can run on any DB which is supported by Hibernate.
- Licensed under LGPL. You can develop comercial application using OpenXava.
- Features:
- Applications based on OpenXava have Multitier architecture or Client-server architecture.
- Applications based on OpenXava can run on any application server (Tomcat, JBoss, WebSphere, etc).
- Applications based on Openxava have easy integration of reports made with JasperReports.
- My contributions to OpenXava:
- Please contact me for quotation.
Paid Java Development
- Development of java applications.
- Please contact me for quotation.
Adempiere trackers
Submited by Trifon and Assigned to Trifon
Assigned to Trifon
Adempiere contributions
Functionality Contributions
EDI @ Adempiere - Sponsored Development: EDI Import/Export
Replication @ Adempiere - Sponsored Development: Replication
- Links:
Resources: http://www.afceurope.com/JMS.html http://www.manageability.org/blog/stuff/open-source-jms-java
Example the Replication with JMS http://www-128.ibm.com/developerworks/library/i-jms/
Use the JMS Synchrony and Asynchrony http://openjms.sourceforge.net/usersguide/using.html
http://www.javalobby.org/articles/distributed-jms/
JMS @ Salesforce.com:
Planned Contributions and Tasks
- Restrict form "Generate Invoices (manual)" to show only public records (hide locked records) BUG - 1713337
- Restrict form "Generate Shipments (manual)" to show only public records (hide locked records) BUG - 1713317
Interesting bugs/patches
- 1721710 Changing BPartner in a completed document should be denied
- 1711594 Workflow is not taking account of "Access All Orgs"
- 1704785 VFile is not firing Vetoable Change
My favourite readings
Interesting
- Variable Costing/Direct Costing/Marginal Costing
- Martin Fowler; Language Workbenches: The Killer-App for Domain Specific Languages?
- Continuous Integration, Source Control, a Wiki and a Bug-Tracker; by ThoughtWorks
Firefox Extensions
- FoxMark - The Bookmark Synchronizer
- InFormEnter adds a small, clickable icon next to every input field in a web form, from where you can select the item to be inserted
- Web Developer - Adds a menu and a toolbar with various web developer tools.
Open Source articles
- Will Open Source Developers be Well Paid?
- The Economic Motivation of Open Source Software: Stakeholder Perspectives
OSS Etiquette & Culture
- Mozilla Forum Etiquette
- ArchLinux Forum Etiquette
- WikiMatrix Forum Etiquette
- Forum Etiquette & Rules
Books
Articles and posts from Martin Fowler
Financial based
Read and respond to this message at: https://sourceforge.net/forum/message.php?msg_id=4366156 By: drhayderaziz
I think that Adempiere would get a lot of kudos if Adempiere went the XBRL route www.xbrl.org for financial reporting. For listed companies (and even for unlisted) XBRL will be the way to go especially for any international company that has to consolidate accounts from multiple legal entities in multiple countries in a standardised manner. This would be an essential component of an ERP system in the 2008-2009 time frame. If Adempiere would have its COA structured the XBRL way and have XBRL compliant financial statements at company/consolidated level it would be an AMAZING value proposition to so many organisations.
Comparison of Open Source ERP Systems
Non IT Technology
Social networks
- www.xing.com; Formerly know as openBC; Very strong in Europe
- www.linkedin.com; Emerging at the moment
ERP articles
Interesting
Adempiere
- Adempiere Foundation
- Adempiere on ZK Demo
- Radio station to help people learn Adempiere libero by Tim
- ADempiere Motto Contest
- Qualification Round ADempiere Motto Contest
- WEB interface from Robert
- Accounting initiative
- Pictures from Adempiere Conference - Berlin 2007
- ADempiere Institute & Center of Excellence
- Making Workflows more predictable
- Revision: 2725; Grid Collapse & Horizontal Tab Improve
- Feature Request
Adempiere Brazil Localisation effort Peope that are cooperating with Adempiere LBR (LBR = Localization Brazil). Those are their names, followed by their sourceforge username.
Eduardo Montenegro (emontenegro) Alvaro Montenegro (amontenegro) Mario Grigioni (mgrigioni)
Adempiere commit schema
- Mentor/Commiter approach approved with 11/11 votes, according to this thread.
VERY IMPORTANT
Incoming evenets
Time: 15:00 GMT Day: Tuesday June 26 Venue: IRC channel #adempiere-team (on irc.freenode.net)
1 - Centralized Application Dictionary Management
2 - The second issue is that developer community is growing and commit committee can't cope with the review of all commits.
Adempiere Application dictionary vs. Axapta Data dictionary
Postal Code Web Service
- 1741222 Webservice connector for address lookups
- 1-Postcode lookup propsal by Michael Judd
- 2-Postcode lookup propsal by Michael Judd
- Proposal from Teo
Developer hints
- class dbPort/org.compiere.process.DocActionTemplate shows a template for DocAction, i think that it must be updated.
Subversion Access
Adempiere project's SourceForge.net Subversion repository can be checked out through SVN with the following instruction set: svn co https://adempiere.svn.sourceforge.net/svnroot/adempiere adempiere
MFG
Important Steps:
1. Apply the following patches: buildbase.patch.tim buildclient.patch.tim buildutils_dev.patch.tim X_AD_WF_Node.patch X_C_DocType.patch X_S_Resource.patch X_AD_Workflow.patch X_M_Cost.patch X_M_Transaction.patch X_M_Product.patch 2. I copied adempiere/libero/build.xml.tim to adempiere/libero/build.xml Build your Adempiere and run it. 3. Create a new client and import accounting etc... (If you don't do this you won't see all the menus, you can't just login under GardenAdmin/GardenAdmin that is not enough) It looks that 2pack file do not contains proper access records. Must research!!! 4. Login with your new client Admin login you created in step3 and Libero away!!!
Template Process
package org.adempiere.process; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.logging.Level; import org.compiere.model.MClient; import org.compiere.model.MDocType; import org.compiere.model.X_C_BPartner_EDI; import org.compiere.model.X_C_EDIFormat; import org.compiere.model.X_C_EDIProcessor; import org.compiere.process.ProcessInfoParameter; import org.compiere.process.SvrProcess; import org.compiere.util.DB; import org.compiere.util.Env; import org.compiere.util.Msg; /** * @author Trifon Trifonov * @version $Id:$ */ public class ModelImporter extends SvrProcess { /** Client Parameter */ protected int p_AD_Client_ID = 0; /** Business Partner Parameter */ protected int p_C_BPartner_ID = 0; /** Document Type Parameter */ protected int p_C_DocType_ID = 0; /** Record ID */ protected int p_Record_ID = 0; /** Table ID */ int AD_Table_ID = 0; /** * Get Parameters */ protected void prepare () { p_Record_ID = getRecord_ID(); if (p_AD_Client_ID == 0) p_AD_Client_ID = Env.getAD_Client_ID(getCtx()); AD_Table_ID = getTable_ID(); StringBuffer sb = new StringBuffer ("AD_Table_ID=").append(AD_Table_ID); sb.append("; Record_ID=").append(getRecord_ID()); // Parameter ProcessInfoParameter[] para = getParameter(); for (int i = 0; i < para.length; i++) { String name = para[i].getParameterName(); if (para[i].getParameter() == null) ; else if (name.equals("C_BPartner_ID")) p_C_BPartner_ID = para[i].getParameterAsInt(); else log.log(Level.SEVERE, "Unknown Parameter: " + name); } log.info(sb.toString()); } /** * Process * @return info */ protected String doIt () throws Exception { StringBuffer result = new StringBuffer(""); MClient client = MClient.get (getCtx(), p_AD_Client_ID); log.info(client.toString()); // get proper EDI Format from Document Type MDocType docType = MDocType.get(getCtx(), p_C_DocType_ID); int C_EDIFormat_ID = 0; int C_EDIProcessor_ID = 0; String sql1 = "SELECT C_EDIFormat_ID, C_EDIProcessor_ID " + "FROM " + X_C_BPartner_EDI.Table_Name + " " + "WHERE AD_Client_ID = ? " + " AND C_BPartner_ID = ? " + " AND C_DocType_ID = ? " + " AND Inbound = 'N' " ; ResultSet rs1 = null; PreparedStatement pstmt1 = null; try { pstmt1 = DB.prepareStatement(sql1, get_TrxName()); pstmt1.setInt(1, p_AD_Client_ID); pstmt1.setInt(2, p_C_BPartner_ID); pstmt1.setInt(3, p_C_DocType_ID); rs1 = pstmt1.executeQuery(); if (rs1.next()) { // Found specific C_EDIFormat for given BPartner and C_DocType_ID C_EDIFormat_ID = rs1.getInt(X_C_EDIFormat.COLUMNNAME_C_EDIFormat_ID); C_EDIProcessor_ID = rs1.getInt(X_C_EDIProcessor.COLUMNNAME_C_EDIProcessor_ID); } else { // Get C_EDIFormat_ID from Document Type C_EDIFormat_ID = docType.getC_EDIFormat_ID(); } } finally { try { if (rs1 != null) rs1.close(); if (pstmt1 != null) pstmt1.close(); } catch (SQLException ex) {/*ignored*/} rs1 = null; pstmt1 = null; } if (C_EDIFormat_ID == 0) { throw new Exception("EDI Format is not set for C_DocType_ID = [" + p_C_DocType_ID + "]"); } if (C_EDIProcessor_ID == 0) { throw new Exception("EDI Processor is not set for C_DocType_ID = [" + p_C_DocType_ID + "]"); } addLog(0, null, null, Msg.getMsg (getCtx(), "EDISubmitProcessResult") + "\n" + result.toString()); return result.toString(); } }
Migration with SQL statements - AD_Element
INSERT INTO AD_Element (AD_Element_ID, AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Cpdated, UpdatedBy, ColumnName, EntityType, Name, PrintName ) VALUES (500XX, 0, 0, 'Y', TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100, TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100, '[ColumnNameHere]', 'D', '[NameHere]', '[PrintNameHere]' ); COMMIT; UPDATE AD_Sequence SET CurrentNextSys = (SELECT MAX (AD_Element_ID) + 1 FROM AD_Element WHERE AD_Element_ID < 1000000) WHERE NAME = 'AD_Element';
Migration with SQL statements - AD_Column
INSERT INTO AD_Column (AD_Column_ID, AD_Client_ID, AD_Org_ID, IsActive, Created, Updated, CreatedBy, UpdatedBy, Name, Description, VERSION, EntityType, ColumnName, AD_Table_ID, AD_Reference_ID, FieldLength, IsKey, IsParent, IsMandatory, IsUpdateable, IsIdentifier, SeqNo, IsTranslated, IsEncrypted, isselectioncolumn, ad_element_id, callout, issyncdatabase, isalwaysupdateable ) VALUES (502XX, 0, 0, 'Y', TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100, 100, '[NameHere]', '[DescriptionHere]', 1, 'D', '[ColumnNameHere]', AD_Table_IDHERE, AD_Reference_IDHere, 1, 'N', 'N', 'Y', 'Y', 'N', 0, 'N', 'N', 'N', 50071, '[CalloutHere]', 'N', 'N' ); COMMIT; UPDATE AD_Sequence SET CurrentNextSys = (SELECT MAX (ad_column_id) + 1 FROM AD_Column WHERE AD_Column_ID < 1000000) WHERE NAME = 'AD_Column';
Migration with SQL statements - AD_Field
INSERT INTO AD_Field (ad_field_ID, AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy, Name, Description, IsCentrallyMaintained, SeqNo, AD_Tab_ID, AD_Column_ID, IsDisplayed, DisplayLength, IsReadonly, IsSameLine, IsHeading, IsFieldOnly, IsEncrypted, EntityType ) VALUES (50184, 0, 0, 'Y', TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100, TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100, 'Store Archive On File System', 'Store Archive On File System', 'Y', 250, 145, 50214, 'Y', 1, 'N', 'N', 'N', 'N', 'N', 'D' ); COMMIT; UPDATE AD_Sequence SET currentnextsys = (SELECT MAX (ad_field_id) + 1 FROM AD_Field WHERE AD_Field_ID < 1000000) WHERE Name = 'AD_Field';
Migration with SQL statements - AD_Message
INSERT INTO AD_Message (AD_Message_ID, AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy, Value, MsgText, MsgType ) VALUES (500XX, 0, 0, 'Y', TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100, TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100, '[VaueHere]','[MSG Text Here]','I' ); COMMIT; UPDATE AD_Sequence SET CurrentNextSys = (SELECT MAX (AD_Message_ID) + 1 FROM AD_Message WHERE AD_message_ID < 1000000) WHERE NAME = 'AD_Message';
Migration with SQL statements - AD_Process_Para
INSERT INTO AD_Process_Para (AD_Process_Para_ID, AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy, Name, Description, Help, AD_Process_ID, SeqNo, AD_Reference_ID, AD_Reference_Value_ID, AD_Val_Rule_ID, ColumnName, IsCentrallyMaintained, FieldLength, IsMandatory, IsRange, AD_Element_ID, EntityType ) VALUES (50019, 0, 0, 'Y', TO_DATE ('2007-03-03', 'YYYY-MM-DD'), 100, TO_DATE ('2007-03-03', 'YYYY-MM-DD'), 100, 'Shipment Date', 'Date printed on shipment', 'The Shipment Date indicates the date printed on the shipment.', 118, 15, 15, NULL, NULL, 'MovementDate', 'N', 0, 'Y', 'N', 1037, 'D' ); COMMIT; UPDATE AD_SEQUENCE SET currentnextsys = (SELECT MAX (ad_process_para_id) + 1 FROM AD_Process_Para WHERE AD_Process_Para_ID < 1000000) WHERE NAME = 'AD_Process_Para';
License to use for new classes
/********************************************************************** * This file is part of Adempiere ERP Bazaar * * http://www.adempiere.org * * * * Copyright (C) Trifon Trifonov. * * Copyright (C) Contributors * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * * as published by the Free Software Foundation; either version 2 * * of the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA. * * * * Contributors: * * - Trifon Trifonov (trifonnt@users.sourceforge.net) * * * * Sponsors: * * - Company (http://www.site.com) * ***********************************************************************/ ... ... /** * @author Trifon Trifonov * @version $Id$ */
Adempiere Export/Import Tools
- ADCK can be used in two modes.
- As Development tool. To model DB design and create/modify tables.
As Development tool ADCK uses Druid which allows developer to generate CREATE TABLE and ALTER table SQL statement for various DBs: Oracle, Postgres, MySQL, ... As Development tool ADCK can generate xml files for various tools and frameworks like: hibernate, torque.
- As transfer tool for only migrating AD changes from Adempiere instance to instance or from version to version.
As transfer tool ADCK require initial just setting of proper settings in properties files.
2Pack vs. ADCK comparison table.
This table is made with the sole purpose to help me to organize information regarding import/export tools in Adempiere. I do not have any idea to push any of the tools mentiod here. It is user's choice to use or not to use any of them and also users choice to have headache after thier usage.
WARNING: !!!MAKE A BACKUP BEFORE ANY USAGE OF ANY OF THE TOOLS!!!
2Pack | ADCK |
menu | menu |
window | window |
tab | tab |
field | field |
process | process |
processpara | processpara |
table | table |
column | column |
impformat | AD_ImpFormat |
impformatrow | AD_ImpFormat_Row |
printformat | AD_PrintFormat |
printformatitem | AD_PrintFormatItem |
reference | [[ADCK |]] |
referencelist | [[ADCK |]] |
referencetable | [[ADCK |]] |
reportview | [[ADCK |]] |
reportviewcol | [[ADCK |]] |
task | [[ADCK |]] |
form | [[ADCK |]] |
workbench | [[ADCK |]] |
preference | [[ADCK |]] |
role | AD_Role |
??? | AD_User |
userrole | AD_User_Roles |
orgrole | AD_Role_OrgAccess |
windowaccess | AD_Window_Access |
processaccess | AD_Process_Access |
formaccess | AD_Form_Access |
workflowaccess | AD_Workflow_Access |
taskaccess | [[ADCK |]] |
??? | AD_Column_Access |
??? | AD_Language |
??? | AD_Message |
??? | AD_PrintTableFormat |
??? | AD_Scheduler |
??? | C_BP_Group |
??? | M_Product_Category |
??? | PA_ReportColumnSet |
??? | PA_ReportColumn |
??? | PA_Report |
??? | PA_ReportLineSet |
??? | PA_ReportLine |
??? | PA_ReportSource |
??? | AD_Client |
2Pack Any Table | ADCK Any Table |
??? | TEMPLATE |
Weak sides of 2pack according me
- Require integration at source code level with Adempiere, which means that if i need to customize any import functionality i must rebuild whole application or patch it.
- Carlos pointed that 2Pack can import records into any table, even customized.
- My comment is regarding main xml elements like: menu, window, tab, field, process, ... First time when i understood that i need to modify main xml elements was for JasperReports integration when i had to add new column into AD_Process table.
- I think that GenericPO which is responsible to import records into Any Table had one issue (I have to remember the exact reason. It was regarding Sequences or something related. ).
- Format of general imports is complicated.
- Main class(org.adempiere.pipo.PackInHandler) which handle import is very big(3800 lines) and complex, which require lot of time for developer to study it and makes modifications hard task.
- Since version 3.3.0 Low Heng Sin refactored org.adempiere.pipo.PackInHandler and now it is split into multiple classes.
- 2Pack uses SAX Parser which makes developer job harder as developer can't look forward or backward in XML tree.
Weak sides of ADCK according me
- It is external program, so user do not have such detailed control over security.
- It is harder for developer to work with it as do not have automatic changes extraction like 2Pack.
CRM systems
Comparison of CRM systems
Localized in Bulgarian
Interesting news/Forum post regarding CRM systems
- SOAP Performance Issue Loading Accounts Strange advice "database to database conversion"! But for CRM system probably it is OK!
- SugarCRM for blind man's (disabled people) Very interesting requirements!
Tina POS
Compiere
My opinion is that this is very outdated information, but who knows...
HTML/CSS
- Dynamic Proxy
- Example Adempiere JPA persistance
- Configuring Inheritance for a JPA Entity; Explanation why Teo likes DiscriminatorColumn
- Hello world with standalone java persistance
- Java Performance Tuning
- Amazon S3Browse site
- Uploading to Amazon S3 using a custom ANT task
- Database Refactoring With LiquiBase; DBMS-independent library for tracking, managing and applying database changes; Similar to DDLUtils.
Java and IM
Autocompletion
Portal, JCR, ECM, Groupware
Eclipse IDE and Application build on Eclipse
Script Languages
- Neanshell, example how to invoke scriped ActionListener Interface
- Dynamic BeanShell binding and ANT tasks
- Discover new dimensions of scripted Java
Java FTP Libraries and Articles
Commercial which support FTPS (FTP Over SSL)
OpenXava Q & A
Created an entity ticketClass with a method GenerateTickets. Implemented the calculator using an IModelCalculator class.
Want to create a button/link when ticketClass is displayed so that user click on it the method gets executed.
Q1. How do I set this up?
- A1. Have to create an action and include it in the controller of your module.
In this action, you can obtain the object and call to you method, something like this:
public void execute() throws Exception { ... TicketClass ticketClass = (TicketClass) MapFacade.findEntity(getModelName(), getView().getKeyValues()); ticketClass.generateTickets(); getView().findObject(); // This refresh the view (Q2) ... }
Q2. How can I get the view of the entity refreshed after the method is executed.
- A2. See the above code
Q3. How can i reload other modules to reflect the changes made by an action that was performed in one module?
An action in one module (module A) that changes the value of the data contained in another module (module B), when i execute an action button (in module A), it executes successfully and updates the data in the other entity (entity B) in the database, but when i view module B, the module list view (of module B) is still showing the old data!
- A3. In a Liferay 2.1.3 with OX2.2 it works fine, that is, I modify data in a portlet, I move to another and the data
is refreshed without touch filter nor any other action. Look at your web/WEB-INF/portlet.xml, have you <expiration-cache>0</expiration-cache> for your portlets? Since OX2.1 expiration-cache is 0 in the portlet.xml generated by OpenXava. Hence, if you are using OX2.1 or better you only need to execute the ant target 'redeployPortlets' in order to fix your portlet.xml file.
Q4. How to avoid warnings that messages are not translated
- A4.
This messages warn you about the labels that you need to put in your i18n/YourProyectName-labels_en.properties. Developer can avoid this messages putting the next line:
i18nWarnings=false
in the file properties/xava.properties of your project.
Q5. Example TestCase
public class ExampleTest extends ModuleTestBase { public DepartmentsTest(String testName) { super(testName,"ExampleManager", "ExampleModlue"); } public void testCreateReadUpdateDelete() throws Exception { //Test Create execute("CRUD.new"); setValue("id", "ENG"); setValue("name", "Example Name"); setValue("description", "Example description"); assertNoErrors(); } }
Q.6 How to provide a web API for accessing the OpenXava application?
Just use Web Services. The OpenXava applications are standard Java Web applications, therefore you can use any Java API from your OpenXava application.
In this case you can create a simple Java class, with the services of you application that you want to expose. And use from it MapFacade or the model objects generated by OpenXava, or whatever code of your application you want. Something like this:
public class MyService { public Address getCustomerAddress(String customerId) throws Exception { // Here you use the POJOs generated by OpenXava Customer customer = (Customer) Customer.findById(customerId); return customer.getAddress(); } }
Now you can create a Web Service from MyService class using AXIS, or the wizard included in Eclipse WTP. But, remember, all this is a Java issue, not an OpenXava one.
Q7. Magic numbers
It is possible to define some magic numbers in OX? The Environment Variables are not enough. I want to use the magic numbers in components.
- A7. Use standard techniques for Java and XML.
In Java you can use "public final static" variables:
public class MyMagicNumbers { public final static int MY_MAGIC = 24324; }
In XML you can use XML ENTITIES:
<!ENTITY mymagic "24324">
and then use &mymagic; instead of 34324.
These techniques are not from OpenXava but from Java and XML.
In XML you can use @mymagic@, and the filter of OpenXava ant build changes it from a value of your properties file. This allows you to have a different value of @mymagic@ for each customer or configuration. This is a technique from OpenXava.
Q8. How to access EJB from OpenXava
- Reference Guide section 3.14.
- There is a example of using a EJB inside validator.
- Developer can access EJB code in any part of OpenXava applications, for example:
Delivery delivery = DeliveryUtil.getHome().findByNumber(33); delivery.generateInvoice();
Q9. Access rights depending on the user profile
- sf.net thread
- User should only see fields or to execute actions depending on his user profile (or role).
- Certain users to be able to update certain fields while others may only read them.
1. Option - provided by the container portal
- Create two groups of users:
- First with create-delete-edit rights.
- Second only with read rights.
- Define two modules:
- First with standard CRUD controller.
- Second with Print controller.
The admin may asign First or Second module (portlet) for each group of users with the portal administrative tools.
2. Option
Not completly implemented in OpenXava, but there are some useful tools in OX that can help:
- Users.getCurrent() return the current user if application is started in portal. This value may be used in any point of the code.
- Filters: filters the data displayed in the mode list according to the current user.
A full management of users in OX project implies creation of several modules for storing the info about users, interfaces for change rights and create new users, roles and rights, overwrite standard controllers, to write new actions (tipically "save" action, frequently "new" action too), to write specific validators, to write filters for tabs in list mode, and more...
Javier's opinion: I think that part of this stuff can be moved to a new project, instead of be included in OX core. This new project would manage access rights and user profiles, and will be reusable for other projects.