See also RELEASE-NOTES for additional information on new/changed features.
See also RELEASE-NOTES for additional information on new/changed features.
See also RELEASE-NOTES for additional information on new/changed features.
See also RELEASE-NOTES for additional information on new/changed features.
See also RELEASE-NOTES for additional information on new/changed features.
See also RELEASE-NOTES for additional information on new/changed features.
See also RELEASE-NOTES for additional information on new/changed features.
See also RELEASE-NOTES for additional information on new/changed features.
See also RELEASE-NOTES for additional information on new/changed features.
See also RELEASE-NOTES for additional information on new/changed features.
See also RELEASE-NOTES for additional information on new/changed features.
See also RELEASE-NOTES for additional information on new/changed features.
Many bug fixed and performance improvements. For more information see the release notes.
^Support for TomEE 1.7.4 and TomEE plus 7.0.5. Newer versions (7.1.x, 8.x) are currently not recommended because of JSF issues.
^
document1: DocumentSchema. Document::documentSchema is a reference to a
DocumentSchema containing the schema definition of the document.
It describes the data stored in Document::cmsMeta:
Examples:
* Document::cmsMeta contains the document's meta-data in JSON notation. Then
the schema definition is a JSON schema (http://json-schema.org)
* Document::cmsMeta contains the document's meta-data in XML notation. Then
the schema-definition is an XML schema.
In order to support efficient storage and fast queries the column type
OOCKE1_DOCUMENT.cms_meta can be set (manually) to a native database type.
E.g. when using PostgreSQL, the column type of cms_meta can be changed to
jsonb. As a consequence only JSON-compliant data can then be stored in
Document::cmsMeta. JSON queries are then supported and have then the form:
thereExistsCmsMeta().like("(?j){\"x\":2}").
BPI: RunExportAction. The RunExportAction allows to invoke ExporterTask::runExport() with a GET request. The parameters param0..param9 are supplied as URL parameters. The request pattern is xri://@openmdx*org.opencrx.application.bpi1/provider/:*/segment/:*/exporter/:*/file/:* The last component is ignored by RunExportAction. However, it should denote a file name where the extension matches the mime type of the returned file, e.g. test.csv if the exporter returns as CSV formatted file.
The RunExportAction simplifies client programming. E.g. an R program can download and parse the file as follows:
> download.file("http://guest:guest@localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/exporter/Test/file/test.csv", destfile="/tmp/test.csv") > read.csv("/tmp/test.csv")
OR
> read.csv(textConnection(getURL("http://guest:guest@localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/exporter/Test/file/test.csv")))
workflow1: ImporterTask / ExporterTask. The new classes allow to configure script-based importer and exporter tasks. ImporterTask:runImport() invokes the method runImport() of the configured script. runImport() has the following signature:
import org.opencrx.kernel.workflow1.jmi1.RunExportResult; import org.opencrx.kernel.workflow1.jmi1.ExporterTask; import org.openmdx.base.exception.ServiceException; import org.w3c.spi2.Structures; import org.w3c.spi2.Datatypes; public static RunExportResult runExport( ExporterTask exporterTask, String[] params ) throws ServiceException { try { String file = "top100_repository_name,month,monthly_increase,monthly_begin_at,monthly_end_with\n" + "Bukkit,2012-03,9,431,440\n" + "Bukkit,2012-04,19,438,457\n" + "Bukkit,2012-05,19,455,474\n" + "Bukkit,2012-06,18,475,493\n" + "Bukkit,2012-07,15,492,507\n" + "Bukkit,2012-08,50,506,556\n" + "Bukkit,2012-09,19,555,574\n" + "Bukkit,2012-10,26,573,599\n" + "Bukkit,2012-11,21,600,621\n" + "Bukkit,2012-12,21,621,642\n" + "CodeIgniter,2012-03,55,708,763\n" + "CodeIgniter,2012-04,75,763,838\n" + "CodeIgniter,2012-05,92,837,929"; return (RunExportResult)Structures.create( RunExportResult.class, Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.file, file.getBytes("UTF-8")), Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.fileMimeType, "text/csv"), Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.fileName, "test.csv"), Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.status, (short)0), Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.statusMessage, "") ); } catch(Exception e) { throw new ServiceException(e); } }
The operation Import:importItem(importerTask, item, itemName, itemMimeType) delegates importerTask.runImport(params) with params[0] = 'xri of invoked object', params[1]=item, param[2]=itemName, param[3]=itemMimeType.
ExporterTask:runExport() invokes the method runImport() of the configured script. The methods runExport() has the following signature:
import org.opencrx.kernel.workflow1.jmi1.RunExportResult; import org.opencrx.kernel.workflow1.jmi1.ExporterTask; import org.openmdx.base.exception.ServiceException; import org.w3c.spi2.Structures; import org.w3c.spi2.Datatypes; public static RunExportResult runExport( ExporterTask exporterTask, String[] params ) throws ServiceException { return (RunExportResult)Structures.create( RunExportResult.class, Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.file, null), Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.fileMimeType, null), Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.fileName, null), Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.status, (short)1), Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.statusMessage, "no file") ); }
The operation Export:exportItem(exporterTask) delegates exporterTask.runExport(params) with params[0] = 'xri of invoked object'.
^Indexer: configurable object set. Indexed_2 now delegates to org.opencrx.kernel.backend.Base. This allows custom-implementations for updateIndexEntry(), allowUpdateExistingIndexEntries(), getKeywords(), getIndexableTypes().
^
disabled → CANCELLED percentComplete = 0 → NEEDS-ACTION percentComplete >= 100 → CANCELLED, COMPLETED (depending on activity.getActivityState()) percentComplete > 0 && perentComplete < 100 → IN-PROCESSthe reverse mapping is implemented in the method importItem
// STATUS s = ICalField.getFieldValue("STATUS", ical); if((s != null) && !s.isEmpty()) { if(!JDOHelper.isNew(activity)) { Short percentComplete = activity.getPercentComplete(); if(percentComplete == null) { percentComplete = (short)0; } if(activity.getProcessState() != null) { ActivityProcessState processState = activity.getProcessState(); ActivityProcess activityProcess = (ActivityProcess)pm.getObjectById(processState.refGetPath().getParent().getParent()); ActivityProcessTransitionQuery processTransitionQuery = (ActivityProcessTransitionQuery)pm.newQuery(ActivityProcessTransition.class); if("CANCELLED".equalsIgnoreCase(s)) { if(!Boolean.TRUE.equals(activity.isDisabled())) { activity.setDisabled(true); } if(percentComplete < 100) { processTransitionQuery.orderByNewActivityState().ascending(); processTransitionQuery.thereExistsNewPercentComplete().equalTo((short)100); } else { processTransitionQuery = null; } } else if("NEEDS-ACTION".equalsIgnoreCase(s) || "TENTATIVE".equalsIgnoreCase(s)) { if(Boolean.TRUE.equals(activity.isDisabled())) { activity.setDisabled(false); } if(percentComplete != 0) { processTransitionQuery.orderByNewActivityState().descending(); processTransitionQuery.thereExistsNewPercentComplete().equalTo((short)0); } else { processTransitionQuery = null; } } else if("COMPLETED".equalsIgnoreCase(s)) { if(Boolean.TRUE.equals(activity.isDisabled())) { activity.setDisabled(false); } if(percentComplete < 100) { processTransitionQuery.orderByNewActivityState().ascending(); processTransitionQuery.thereExistsNewPercentComplete().equalTo((short)100); } else { processTransitionQuery = null; } } else if("IN-PROCESS".equalsIgnoreCase(s) || "CONFIRMED".equalsIgnoreCase(s)) { if(Boolean.TRUE.equals(activity.isDisabled())) { activity.setDisabled(false); } if(percentComplete <= 0) { processTransitionQuery.orderByNewActivityState().ascending(); processTransitionQuery.thereExistsNewPercentComplete().greaterThan((short)0); } else if(percentComplete >= 100) { processTransitionQuery.orderByNewActivityState().descending(); processTransitionQuery.thereExistsNewPercentComplete().lessThan((short)100); } else { processTransitionQuery = null; } } if(processTransitionQuery != null) { // If possible perform a transition. Also allow transitions not // supported by the activity process ActivityProcessTransition processTransition = null; ListprocessTransitions = activityProcess.getTransition(processTransitionQuery); for(ActivityProcessTransition candidate: processTransitions) { if(candidate.getPrevState().equals(activity.getProcessState())) { processTransition = candidate; break; } } if(processTransition == null && !processTransitions.isEmpty()) { processTransition = processTransitions.iterator().next(); } if(processTransition != null) { Activities.getInstance().doFollowUp( activity, s + " @ " + new Date(), "Set STATUS:" + s, processTransition, null, // assignTo null, // parentProcessInstance false // validateStates ); } } } } }
The module depot1 comes with a set of new features which support use-cases for enterprise accounting and depot management:
The standard GUI can easily extended wizards. Now, wizards can be implemented using the latest web technologies. The new directory layout allows a wizard to be implemented with a web framework of your choice. E.g. the typical layout of a Polymer wizard looks like:
{wizard-name} META-INF wizard.properties Api.jsp index.jsp {wizard-name}.html {wizard-name}.css
The CreateActivity and BulkActivityManager wizard is one of the first wizards using this feature.
^DbSchemaUtils now support custom extensions of the database schema. All schema scripts META-INF/dbschema-add.sql are loaded and applied to the core schema. This allows to use the standard DbSchema wizard to manage and upgrade the database schema without additional administrative tasks.
^A new (Polymer-based) wizard which simplifies the bulk-management of activities. The wizard is launched on any activity group.
Many bug fixed and performance improvements. For more information see the release notes.
^CardDavMATE is an open source CardDAV web client implementation. openCRX users who have configured a CardDAV sync profile can view/manage their contacts with any browser.
^openCRX improves the cloud support by supporting the Jelastic hosting platform:
^
CardDavMATE is an open source CardDAV web client implementation. openCRX users who have configured a CardDAV sync profile can view/manage their contacts with any browser.
^New grid actions in all grids allow quick enabling / disabling of objects:
New grid actions on price levels simplify the following use-cases:
Self-service password reset. The API is extended by the operation UserHome::requestPasswordReset() which
This way:
The three wizards PasswordResetCancel.jsp, PasswordResetConfirm.jsp and RequestPasswordReset.jsp implement the logic on the GUI side:
The portal extension can now prepared for scripted extension. Janino-compliant scripts
located in /WEB-INF/config/scripts/{name}.script
can be loaded with
getQueryMethod = this.getMethod( "getQuery", new Class[]{ org.opencrx.kernel.portal.PortalExtension.class, String.class, // qualifiedFeatureName String.class, // filterValue int.class, // queryFilterStringParamCount ApplicationContext.class } );
For more information see the openCRX sample project
^openCRX v3.0 finally runs on Java 7.
^The openCRX REST adapter supports JSON and Swagger:
These improvements allow easy integration with state-of-the-art Javascript frameworks.
JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages, including C, C++, C#, Java, JavaScript, Perl, Python, and many others. These properties make JSON an ideal data-interchange language. Read on at http://www.json.org/.
Swagger is a simple yet powerful representation of your RESTful API. With the largest ecosystem of API tooling on the planet, thousands of developers are supporting Swagger in almost every modern programming language and deployment environment. With a Swagger-enabled API, you get interactive documentation, client SDK generation and discoverability. Read on at http://swagger.io/.
Cross-Origin Resource Sharing (CORS) is a specification that enables truly open access across domain-boundaries. If you serve public content, please consider using CORS to open it up for universal JavaScript/browser access. Read on at http://enable-cors.org/ or have a look at the specification at http://www.w3.org/TR/cors/.
^openCRX is now ready for the cloud. openCRX v3.0 comes with a dockerfile which allows you to install and deploy openCRX in a few minutes on docker-compliant cloud services.
Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications. Consisting of Docker Engine, a portable, lightweight runtime and packaging tool, and Docker Hub, a cloud service for sharing applications and automating workflows, Docker enables apps to be quickly assembled from components and eliminates the friction between development, QA, and production environments. As a result, IT can ship faster and run the same app, unchanged, on laptops, data center VMs, and any cloud.. Read on at https://www.docker.com/.
^openCRX now offers an easy-to-use UI for web-based document management. The UI (based on elFinder 2.0) is launched from the user's home page featuring:
Many bug fixes and performance improvements. As a consequence, the interfaces of some backend plug-in classes have been changed. The upgrade to version v3.0 requires some adaption of your code in case you have implemented custom-specific backend logic.
^A new generic and extremely powerful and feature-rich HTML5/Ajax-GUI (built with the Bootstrap framework) that works on any device. This AJAX-enabled HTML5-GUI supports a wide range of modern browsers, including Chrome, Firefox, Opera, Safari, IE, etc. and it supports any device including mobile devices (iPhone, iPad, Android-based devices, etc.).
Screen shots from a Nexus 5:
Connect to our openCRX demo server and see the new GUI in action or get the updated openCRX GUI Guide.
^Any user can change the ordering of grid columns by simply opening a grid's View menu and then selecting the entry of the grid column to be moved to the right:
Connect to our openCRX demo server and see the new GUI in action or get the updated openCRX GUI Guide.
^The enhanced search form supports both searching withing the result set of a previous search and searching across all objects of a grid:
Connect to our openCRX demo server and see the new GUI in action or get the updated openCRX GUI Guide.
^A new feature that allows you to define a workflow's execute() method as Janino script. This way segment-specific business-logic can be added without building and deploying a new EAR.
Here is an example:
public static void execute( org.opencrx.kernel.base.jmi1.WorkflowTarget wfTarget, org.openmdx.base.jmi1.ContextCapable targetObject, org.opencrx.kernel.home1.jmi1.WfProcessInstance wfProcessInstance ) throws org.openmdx.base.exception.ServiceException { java.util.logging.Logger logger = java.util.logging.Logger.getLogger("PrintConsole"); logger.log(java.util.logging.Level.INFO, "executing workflow " + wfProcessInstance.getProcess().getName()); logger.log(java.util.logging.Level.INFO, "target=" + targetObject); logger.log(java.util.logging.Level.INFO, "wfProcessInstance=" + wfProcessInstance); java.util.Map params = org.opencrx.kernel.utils.WorkflowHelper.getWorkflowParameters(wfProcessInstance); logger.log(java.util.logging.Level.INFO, "params=" + params); }^
In addition to the already supported JavaMail openCRX newly supports external sendmail commands. sendmail has several advantages over JavaMail in high-end environments. sendmail is used by the MailWorkflow if the system property -Dorg.opencrx.usesendmail.{provider.name} is set to true, e.g.
-Dorg.opencrx.usesendmail.CRX=true
In this case JavaMail resources must not be configured anymore in web.xml and the application.server. mail.jar must still be deployed as it is required to construct RFC822-compliant MimeMessages.
^The DocumentExporter workflow allows to export document folders to the file system. A document folder is exported if a DocumentFolderShare exists for this folder. DocumentFolderShares can be managed manually with the standard GUI.
It is now possible to store the content of objects of type org:opencrx:kernel:document1:Media on the file system. The option is activated with the system property
-Dorg.opencrx.mediadir.{provider.name}={mediadir.name}
The DbSchemaWizard supports the following new functions to manage and migrate existing media objects in case the option -Dorg.opencrx.mediadir is turned on:
This new feature can reduce the load on your DBMS in a major way (e.g. easy backup of media/blobs with rsync that does not generated any DB-load).
^If authority is set, postal and e-mail addresses are updated automtically in case the matching authority's addresses changes. With this new feature it is easy to keep addresses of employees of an organization in sync with the organization's address, etc.
The operation checkForAutoUpdate() allows to check whether a given address qualifies for auto-update.
^It is now possible to capture relationships between activities similar to how you capture relationships between accounts:
New Next/Prev buttons allow to iterate the content of a grid at inspector-level:
CalDavZAP is an open source CalDAV web client implementationan. openCRX users who have configured a CalDAV sync profile can view/manage their calendards with any browser.
^Unifie edit and new object. The "New..." object form allows to lookup (with auto-completer) existing objects. If an object is selected, the form is pre-filled with the selected object values. After editing the form, the user can then choose either to "Create" (a new) or "Save" (the existing) object. If no existing object is selected, the user can only choose "Create".
The same "filter pattern" already available for accounts, activities and products is now also available for documents: it is now possible to create filters for documents (Saved Searches). Furthermore, such document filters can be used in SyncFeeds and exported to WebDAV clients.
^Code fields are rendered as cascaded drop-downs for {main category} and {sub category} in case their long texts have the format {main category}|{sub category}
^The search form displays an additional search field in case PortalExtension.getQuery() returns a non-null query for the feature 'grid.getReferencedTypeName() + ":" + identity'. openCRX/core contains an implementation for activities:
1. Get contacts * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/contact?query=...&position=...&size=... * Method: GET * Sample queries: ?query=thereExistsFullName().like(".*Doe.*");orderByFullName().ascending(); ?query=thereExistsPostalAddress().postalCountry().equalTo(756); ?query=thereExistsEMailAddress().thereExistsEmailAddress().equalTo("joe@opencrx.org"); ?query=thereExistsPhoneNumber().thereExistsPhoneNumberFull().like(".*44.*"); 2. Get organizations * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/organization?query=...&position=...&size=... * Method: GET * Sample queries: ?query=thereExistsFullName().like(".*Suisse.*");orderByFullName().ascending(); ?query=thereExistsPostalAddress().postalCountry().equalTo(756); ?query=thereExistsEMailAddress().thereExistsEmailAddress().equalTo("joe@opencrx.org"); ?query=thereExistsPhoneNumber().thereExistsPhoneNumberFull().like(".*44.*"); 3. Get address groups * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/addressGroup?query=...&position=...&size=... * Method: GET * Sample queries: ?query=name().equalTo("test"); 4. Get address group * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/addressGroup/^* Method: GET 5. Get address group members * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/addressGroup/member?query=...&position=...&size=... * Method: GET * Sample queries: ?queryType=org:opencrx:kernel:account1:PostalAddress&query=postalCountry().equalTo(:short:756); ?queryType=org:opencrx:kernel:account1:EMailAddress&query=thereExistsEmailAddress().like(".*sales.*"); 6. Get assigned activities (with optional query) * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/contact/ /assignedActivity?query=...&position=...&size=... * Method: GET * Sample queries: ?query=thereExistsAssignedGroup().thereExistsActivityGroup().name().like(".*Bugs.*"); 7. Get account filter * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/accountFilter/ * Method: GET 8. Get filtered contacts (with optional query) * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/accountFilter/ /contact?query=...&position=...&size=... * Method: GET 9. Get filtered organizations (with optional query) * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/accountFilter/ /organization?query=...&position=...&size=... * Method: GET
Workflow which exports contacts as LDIF:
Configuration ------------- * For each segment create Saved Search for Accounts named "LDAPSynchronizer" * The LDAPSynchronizer has the following configuration options (component configuration with name 'LDAPSynchronizer'). Option names are of the form 'provider name'.'segment name'.'option name'. * syncDir. default is ldapdir. The LDIF entries are created in the following sub dirs: * people/Add: contacts changed since syncKey in Add format * people/Modify: contacts changed since syncKey in Modify format * people/Delete: contacts disabled since syncKey in Delete format * people/Error: people error entries * groups/Add: group entries in Add format * groups/Modify: group entries in Modify format * groups/Error: group error entries For each entry a separate LDIF file is created. The file name is of the form 'syncKey'-'count'.ldif * runAs: run as user * baseDNPeople: base DN for people entries. Default is ou=people,dc=example,dc=com * baseDNGroups: base DN for group entries. Default is ou=groups,dc=example,dc=com LDAP Server ----------- Any LDAP server supporting the standard LDIF format can be used. E.g. on Linux use slapd. Installation notes see http://wiki.debian.org/LDAP/OpenLDAPSetup: > apt-get install slapd > dpkg-reconfigure -plow slapd Domain name: examle.com Organization: Test Running LDAPSynchronizer ------------------------ The LDAPSynchronizer workflow is started with the Workflow Controller wizard as admin-Root. The exported LDIF files can then be processed using the LDIF importer tool provided by your LDAP server. E.g. ldapadd for OpenLDAP. Setup a cron job to process the exported LDIF files: Update people ------------- In directory ldapdir/CRX/Standard/people run the following script: #!/bin/sh export ts=$(date +"%Y%m%d%H%M") mv Modify ${ts}-Modify mv Add ${ts}-Add mv Delete ${ts}-Delete cd ${ts}-Add cat *.ldif | ldapadd -c -x -D cn=admin,dc=example,dc=com -w 'pwd' cd .. cd ${ts}-Modify cat *.ldif | ldapadd -c -x -D cn=admin,dc=example,dc=com -w 'pwd' cd .. cd ${ts}-Delete cat *.ldif | ldapadd -c -x -D cn=admin,dc=example,dc=com -w 'pwd' cd .. IMPORTANT: * Add operations must be done before Modify Update groups ------------- In directory ldapdir/CRX/Standard/groups run the following script: #!/bin/sh export ts=$(date +"%Y%m%d%H%M") mv Modify ${ts}-Modify mv Add ${ts}-Add cd ${ts}-Add cat *.ldif | ldapadd -c -x -D cn=admin,dc=example,dc=com -w 'pwd' cd .. cd ${ts}-Modify cat *.ldif | ldapadd -c -x -D cn=admin,dc=example,dc=com -w 'pwd' cd ..^
See Campaign Guide for information and examples.
^Browse the new UML Models generated with GraphViz:
Additional information about UML modeling is available from https://sourceforge.net/p/opencrx/wiki/Sdk212.Modeling/ ^
We upgraded openCRX to the latest version of the Prototype library and reworked all the operational dialogs. We also enhanced the look and feel of inline wizards.
If you still have issues with IE, try a browser for a change (Firefox, Chrome, Opera, Safari, ...)
^Workflows feature a new grid [Pending / Completed Workflows] showing their processes. The list of processes can be filtered and/or sorted by various attributes like execution stage, started at, last execution, etc.:
The workflow handler creates near real-time progress reports. Furthermore, if a process has child processes, these child processes can be monitored as well:
The throughput of the workflow handler has been increased dramatically with the introduction of concurrent execution of atomic workflows.
^New wizards and workflows support the creation of large numbers of activities and follow-ups. The creation is performed in the background without blocking the GUI. The monitoring of running processes is supported with new wizards and the new workflow structuring and monitoring feature.
For example, an e-mail campaign can be created with the following steps:
Sample screen shot of the bulk create activity wizard:
Sample screen shot of the bulk follow-up wizard:
Simple, extensible adapter for business process integration. The default implementation supports the actions listed below. Additional actions can be added in custom projects by extending org.opencrx.application.bpi.adapter.BpiAdapterServlet.
1. Get code table * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Root/codeTable/country * Method: GET 2. Get contact * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/contact/10000 * Method: GET 3. Get organization * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/organization/0 * Method: GET 4: Get organization members * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/organization/0/member * Method: GET 5. Get activity creator * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/activityCreator/($t*ces*Bugs%20and%20Features) * Method: GET 6. Create activity * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/activityCreator/($t*ces*Bugs%20and%20Features)/createActivity * Method: POST * Body: { "name" : "name of activity", "description" : "description of activity", "detailedDescription" : "detailed description of activity", "priority" : "3", "reportingContact": "id of reporting contact", "scheduledStart": "Jan 01, 2013 4:47:13 PM", "scheduledEnd": "Jan 01, 2013 5:47:13 PM" } 7. Get activity * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/activity/1000000 * Method: GET^
more information to follow
^Wizards were cleaned up by extracting the business-logic and moving it to Java classes. In addition to cleaning up the code lots of optimizations and also bug fixes were done. The openCRX backend was also cleaned up and various optimizations were applied to the code.
^The openCRX installer is not based on IzPack 5 (fixes for example freeze issues during the installation process on Windows 7 64bit). Also, openCRX v2.11.0 runs in the latest snapshot of servlet container Apache TomEE 1.6.
^openCRX features a new CardDAV servlet. Once a user has created a Card Profile he/she can connect to openCRX with any CardDAV client to manage contacts.
We have tested the following clients:
More information about CardDAV is available from http://en.wikipedia.org/wiki/CardDAV - the RFC is at http://tools.ietf.org/html/rfc6352
^Similar to the already existing e-mail and Twitter notifiers, the XMPP (Jabber) notifier can send your openCRX alerts to your personal Jabber account. Supported are all major servers like Google Talk, Jabber.org, etc.
More Information about XMPP is available from http://xmpp.org/
^openCRX supports the localization of any attribute of any CrxObject. With this new feature it is also very easy to implement recipient-driven and/or sender-driven salutations and closings:
Here is the relevant excerpt from the UML model:
^The openCRX File Browser comes in handy if you need to fetch log files from your server, e.g. in a hosted environment without easy access by other means. For security reasons the file browser is available to the admin-Root only.
^
openMDX/Portal offers the following tags:
The tags can be used in wizards and allow easy rendering of objects and grids.
Example:
... <%@ taglib uri="http://www.openmdx.org/tags/openmdx-portal" prefix="portal" %> ... <div id="content-wrap"> <div id="content" style="padding:10px 0.5em 0px 0.5em;"> <portal:showobject id="AAA" object="<%= userHome %>" showAttributes="true" grids="alert,assignedActivity" navigationTarget="_none"> <portal:query name="assignedActivity" query="<%= activityQuery %>" /> </portal:showobject> <portal:showobject id="BBB" object="<%= userHome.getContact() %>" showAttributes="true" grids="address" navigationTarget="_none" /> </div> <!-- content --> </div> ... |
Starting with openCRX v2.10.0 you can set timers on any openCRX object. The simplest timer works like an alarm that goes off at a certain time and (depending on your subscriptions) creates an alert, sends an e-mail message, posts a twitter message or takes any other action that is available. It is possible to define repeating timers with arbitrary intervals:
With Actions > Set Timer you can start a wizard that helps you create simple alarm-type timers:
The Wizard Upload E-Mail now supports the Microsoft-specific MSG-format (including X.500 addresses). It is now possible to import e-mail messages that were saved as files from most e-mail clients (including Thunderbird and Outlook). Of course, it is still possible to import e-mails with IMAP.
openCRX v2.10 comes with many new or enhanced wizards:
This wizard can be started from any account group, address group, saved search for accounts or addresses. It facilitates the creation of bulk activities like sending out a newsletter to lots of recipients, setting up phone calls to a target group, etc.
The wizard support the creation of test activities.
The wizard performs bulk follow ups on a set of activities. The wizard is launched on an existing activity which serves as template for selecting the activities to process by assigned activity groups and process state.
The enhanced wizard "Business Process Manager" assists users in managing instances of complex/nested activity processes. The wizard can be started from any activity and it will collect all other activities that belong to the same process instance and display them in a visualization of the activity process. It is possible to create new sub activities with a single click and adding follow-ups to existing activities can also be done right within the wizard:
This wizard makes it easy to create new contacts and link them to other accounts, etc.
This wizard makes it easy to create new legal entity and link them to other accounts, etc.
Wizard to assist in uploading documents to the openCRX document provider:
Similarly, these wizards make it easy to upload e-mails, files, images, etc.
With this wizard you can connect to a mailbox (POP3, POP3S, IMAP, IMAPS) and
retrieve messages that are then imported into openCRX...
This wizard calculates various access URLs for CalDAV, CardDAV, iCal, ActiveSync, WebDAV, ...
More information available at Thunderbird_Contacts_Add-on.
^A new wizard that supports the most important use cases for customer care:
Permissions must be granted by the segment admin for the users to show activities and activity creators:
The wizard can be launched on:
GUI element-level security allows to set show and edit permissions for the following GUI elements:
Permissions are defined per Role. One or more role can be assigned to a user's principal. Roles are created by the segment administrator in Security policies > Roles. Segment administrators (e.g. admin-Standard) can then easily view and manage permissions with the new wizard Manage GUI Permissions:
The openCRX business process engine has received a major boost with openCRX v2.9.0. The most important enhancements are the following ones:
Activity Process |
![]() |
The new wizard "Business Process Manager" assists users in managing instances of complex/nested activity processes. The wizard can be started from any activity and it will collect all other activities that belong to the same process instance and display them in a visualization of the activity process. It is possible to create new sub activities with a single click and adding follow-ups to existing activities can also be done right within the wizard:
These two new wizards enable users to create activities with a bulk operation (e.g. to create a campaign) and perform bulk follow ups:
The openCRX Model was enhanced in a major way to support generic types of contracts, sales volume contracts, etc. Also, similar to Actiivty Creators and Activity Groups, there are now Contract Creators (to create contracts) and Contract Groups (to group/classify contracts) available.
Here are the most important UML models (click on the thumbnails to see larger versions of the class diagrams):
Contract Creator | ![]() |
Contract Group | ![]() |
Generic Contract | ![]() |
Sales Volume Contract | ![]() |
Sales Contract | ![]() |
Sales Order | ![]() |
Use the existing method exportItem() to export/render data. Overriding Exporter.exportItem() allows the implementation of custom-specific rendering. As an example you can look at the openCRX Sample project, where the method exportItem() is implemented in the class org.opencrx.sample.backend.Exporter.
^It is now possible to add custom-specific actions to the grid menu 'Actions'. The following default actions are added for openCRX:
The above actions either export the current grid page or the selected object(s).
^The new operation move address allows users to move an existing address to a new target account and update the following address references:
The operation performs the following steps:
Similarly, the new operation merge address allows users to udpate references pointing to a source address (to be disabled) and let them reference a new target address.
^This new attribute enables you to assign addresses to "authority" accounts. Think of the authority of an address as an account that "manages" or "owns" the respective address, e.g. the employer assigning e-mail addresses out of a particular domain to individual employees, etc. Even though such an e-mail address "is assigned to" to the respective employee, the employee doesn't really own this e-mail address (e.g. if an employee moves on to a different employer the previous employer (the "authority") will disable the employee's e-mail address.
Similarly, there are plenty of use cases for telephone numbers, postal addresses, etc.
The new grid [Assigned Addresses] available on all accounts lists all addresses that reference the current account as authority. Hence, it is very easy for an authority to manage such addresses:
Starting with openCRX v2.9.0 you can set reminders on any openCRX object. The simplest reminder works like an alarm that goes off at a certain time and (depending on your subscriptions) creates an alert, sends e-mail message, posts a twitter message or takes any other action that is available. It is possible to define repeating reminders with arbitrary intervals:
With Actions > Set Reminder you can start a wizard that helps you create simple alarm-type reminders.
^It is now possible (without defining SQL queries) to create account and/or address filters that select accounts/addresses based on an existing account membership, e.g. in oder to select all employees of a company or all e-mail addresses of members of a particular account group, etc.:
The openCRX Indexer now supports MS Office Open XML File Formats, e.g.
... in addition to the many already supported file formats:
This new wizard can be invoked as root administrator (admin-Root). It allows to copy data from a source database instance to a target database instance. It provides the same functionality as the command-line version.
With this wizard you can - for example - copy all your data from a MySQL database to a PostgreSQL database directly from the openCRX GUI:
The wizard can be invoked as root administrator (admin-Root). It allows to create, validate, upgrade and migrate an openCRX database. The database can either be specified by its JNDI name or by a JDBC connection URL.
...
Validation performs the following checks:
Fix allows to fix the reported issues:
Fix never never drops or removes any database objects or rows. So you never loose data. However, because fix may modify your schema it is recommended to backup before upgrading / fixing a database. It is possible to run fix on an empty database schema. In this case all tables, views, indexes and sequences are created.
Known issues:
Apache TomEE, pronounced "Tommy", is an all-Apache stack aimed at Java EE 6 Web Profile certification where Tomcat is top dog (more information about Apache TomEE is available from http://openejb.apache.org/apache-tomee.html).
The new openCRX Server installer includes Apache TomEE so that the whole installation process can be completed in one go and there is no more need to deal with a installer.
^The AccessControl plug-in supports runAs permissions. runAs permissions allow to run object access operations (read, update, delete) under a different principal than the requesting principal. This feature allows users to define deputies for certain use cases, e.g. a user can allow an assistant to manage his/her calendar.
Two different formats are supported:
Permissions are created as follows:
The AccessControl plug-in handles runAs permissions as follows:
Many more objects than in previous openCRX versions are now full-blown openCRX objects:
The advantages are manifold, including user-specified attributes (i.e. no need to extend the UML model and the database to beef up standard objects with your own attributes; "adding" a new attribute to an OpenCRX Object is a matter of customizing only).
^Unknown e-mail recipients were mapped to the generic e-mail address "UNKNOWN" in previous versions of openCRX. Starting with openCRX v2.9, an e-mail address object is created for such recipients and then assigned to the segment administrator. The address can be moved with Move Address to the proper account at a later time.
Additionally, there is also an enhanced ICAL mapping of attendees. The new attribute emailHint was added to AbstractActivity party. The hint allows to have multiple activity parties pointing to the same account. The hint serves as e-mail address selector in case the account has multiple e-mail addresses. The ICAL import sets the hint field for each imported ATTENDEE, whereas the ICAL exporter/mapper uses the hint to generate the ATTENDEEs.
When importing an ICAL and the e-mail address of an ATTENDEE is unknown, an e-mail address object is created for such attendees and then assigned to the segment administrator.
^We newly map the status code NON-PARTICIPANT, which is used by Lightning (Mozilla Calendar Project) to indicate that a meeting participant was removed, to the openCRX status code "N/A". This ensures, that it is possible to "remove" attendees from an event directly in Lightning without actually "deleting" such attendees in openCRX..
^The openCRX VCARD importer was enhanced so that it accepts mime types and file extensions. It is also possible to import minimalistic VCARDs. Some of these enhancements were propagated to other importers as well.
^The openCRX persistence configuration was moved to
The table prefs_preferences is not required anymore.
^New codes can be reloaded on-the-fly, i.e. it is not required to restart openCRX anymore.
^The new grid actions allow you to change the position of values for multi-valued, ordered reference features (e.g. you can now change the ordering of contracts referenced by an activity):
It is now possible to run openCRX with OpenJDK (required is at least v1.6.0_23).
OpenJDK is an open-source implementation of the Java Platform, Standard Edition.
^openCRX is already available in many languages and more of them are in the pipeline. At this time we do not know yet which additional languages will be ready for inclusion in this openCRX release, but any news will be posted without delay. If you want to contribute and are ready to translate a bunch of strings into a new language, .
^openCRX features a new WebDAV servlet. Once a user has created a Document Profile he/she can connect to openCRX with any WebDAV client to manage documents (including revisions, etc.).
Most Linux distributions support WebDAV out of the box (e.g. Dolphin is a great WebDAV client on Kubuntu, Nautilus works just fine with the Gnome desktop - you might have to install the davfs2 package...), on Windows you might want to use a third-party tool like BitKinex to avoid the quirky implementation of Microsoft's web folders. On the iPhone you might want to look at the Notebooks App.
^openCRX features a new CardDAV servlet. Once a user has created a Card Profile he/she can connect to openCRX with any CardDAV client to manage contacts.
^We taught the openCRX E-Mail importer a few new tricks to facilitate the use of openCRX for E-Mail support. Details of how this new feature works will be available in the openCRX Admin guide once it is available.
^openCRXS newly supports a Party Status of ActivityParties. The Party Status has the same semantics as ICalendar PARTSTAT:
* PARTY_STATUS_NEEDS_ACTION
* PARTY_STATUS_ACCEPTED
* PARTY_STATUS_DECLINED
* PARTY_STATUS_TENTATIVE
* PARTY_STATUS_DELEGATED
* PARTY_STATUS_COMPLETED
CalDAV and ICS servlets support this new feature as well so that calendar clients like Mozilla Calendar can be used to manage attendees and the status of attendees.
^SalesVolumeBudget is a subclass of Budget which allows to define sales volume budgets and targets and to collect sales volume contributions.
SalesVolumeBudget allows to define a sales volume target for a set of accounts in different roles. Supported roles are: customer, sales rep and broker. The operation assignBudgets() on contracts and contract positions allows to automatically identify and assign the matching budgets to contract positions. The operation SalesVolumeBudget.recalcBudget() iterates all contract positions with an assignment to the invoked budget. The contract positions are then matched to budget positions (product and currency / uom must match). In case of a match the contract position acts as contribution to the budget position which results in the creation of a simple booking on the assigned depot position. The contribution type allows to define how the contribution is calculated: either based on the contract position's quantity or one of the base amount, amount, discount amount or price per unit values.
^Configure twitter accounts and timelines on various openCRX objects such as user homes, accounts, activities, and products. The openCRX Admin Guide contains information about the implementation and configuration of the openCRX Twitter adapter.
More information about Twitter is available from www.twitter.com
^The openCRX IMAP servlet now also supports IMAP IDLE, an IMAP feature described in RFC 2177 that allows a client to indicate to the server that it is ready to accept real-time notifications. This comes in quite handy if you have an Android phone and want to receive real-time notifications of new openCRX alerts.
k9mail for Android, for example, supports IMAP IDLE:
^The utility CopyDB now supports changes in provider name when copying a database with the new options
* -Dprovider.name.source
* -Dprovider.name.target
Workspaces enable you to organize your work any way you like, e.g. based on workflows or thematically. It is easy to create workspaces for contact management, bug tracking and support, etc. Workspaces are managed by the segment admin.
A new left-pane holds the workspace-level dashboard. The
global workspace-level dashboard works like the (horizontal) object-level dashboard:
* dashlets can be added removed by admin or user
* dashlets can be shared by admin by prefixing the label with a *
^
Activity replication is supported as follows:
Activities linked with the link type 'is replica of' or 'is replica of
(obfuscated)' are updated whenever the original activity is modified.
The method Activities.replicateActivity() allows to control the
replication at attribute-level. By default, attributes are
replicated as follows:
Upon creation of new activities the creation of replica can be controlled with the method Activities.getActivityReplicationDescrs(). E.g. a custom-specific extension of getActivityReplicationDescrs() can replicate activities created with the creator 'guest~Home~Meetings' with the creator 'guest~Private~Meetings' and obfuscate the replica.
^One candidate for a cool shop front end to openCRX is PrestaShop:
We implemented an adapter that can connect to PrestaShop instances and imports all the relevant data (customers, products, prices, orders, etc.) into openCRX - click on the following image below and give it a try (if you register and enter orders, you will be able to find the respective data on the openCRX demo server):
Username: | guest@opencrx.org |
Password: | guest |
Information on how to setup/configure everything is available in the openCRX v2.8.5 release notes.
^Apache TomEE, pronounced "Tommy", is an all-Apache stack aimed at Java EE 6 Web Profile certification where Tomcat is top dog (more information about Apache TomEE is available from http://openejb.apache.org/3.0/apache-tomee.html).
The new openCRX Server installer includes Apache TomEE so that the whole installation process can be completed in one go and there is no more need to deal with a Tomcat installer.
^You should consider the openCRX AirSync Server if you don't have an MS Exchange Server or if you intend to get rid of it. With the openCRX AirSync Server Mobile phones and PDAs featuring ActiveSync (i.e. all Windows Mobile devices, all Android devices, Apple's iPhone, RIM's BlackBerry, and most phones by Nokia, SonyEricsson, LG, Samsung, Motorola, etc.) can connect directly to openCRX (acting as an ActiveSync server) to synchronize E-Mails, Contacts and Calendars. If required, you can still synchronize MS Outlook with your mobile phone / PDA. On the other hand, you should probably have a look at the combo Mozilla Thunderbird / Lightning (runs on both Windows and Linux!) which is an excellent Open Source alternative to MS Outlook.
Read more about openCRX AirSync in the openCRX Admin Guide.
There is no need for an MS Exchange Server!
In addition to full support for the iPhone (iOS3, iOS4) we also support Android 2.2 devices like the HTC Desire:
More information is available in the openCRX Admin Guide.
^You should consider the openCRX AirSync Client if you already have an MS Exchange Server and all your mobile phones / PDAs / MS Outlook clients connect to that MS Exchange Server. The openCRX AirSync Client enables fully automated backend-synchronization of E-Mails, Contacts and Calendars between openCRX and MS Exchange. Thus, MS Outlook, Mobile Phones and PDAs connecting to MS Exchange (i.e. all Windows Mobile devices, all Android devices, Apple's iPhone, RIM's BlackBerry, and most phones by Nokia, SonyEricsson, LG, Samsung, Motorola, etc.) get easy access to E-mails, Contacts, and Calendars managed in openCRX. No need to reconfigure MS Outlook or any of your mobile phones / PDAs.
If you don't have an MS Exchange Server or intend to get rid of it, see what openCRX AirSync Server can do for you - various clients (MS Outlook, Thunderbird, Mozilla Calendar, ...) and devices (iPhone, Android-based devices, Windows Mobile devices, ...) can connect directly to openCRX.
^openCRX is basically OpenSocial-ready, i.e. it's a matter of programming a few useful gadgets:
More information about OpenSocial is available here:
You should consider the openCRX AirSync Server if you don't have an MS Exchange Server or if you intend to get rid of it. With the openCRX AirSync Server Mobile phones and PDAs featuring ActiveSync (i.e. all Windows Mobile devices, all Android devices, Apple's iPhone, RIM's BlackBerry, and most phones by Nokia, SonyEricsson, LG, Samsung, Motorola, etc.) can connect directly to openCRX (acting as an ActiveSync server) to synchronize E-Mails, Contacts and Calendars. If required, you can still synchronize MS Outlook with your mobile phone / PDA. On the other hand, you should probably have a look at the combo Mozilla Thunderbird / Lightning (runs on both Windows and Linux!) which is an excellent Open Source alternative to MS Outlook.
Read more about openCRX AirSync in the openCRX Admin Guide.
There is no need for an MS Exchange Server!
We have thoroughly tested the openCRX AirSync Adapter with the iPhone:
![]() |
![]() |
![]() |
![]() ![]() |
We have added native LDAP Server functionality to openCRX (get more information about LDAP or read what Wikipedia is saying about LDAP ). In a nutshell this means that you can use any LDAP client to connect to openCRX and view openCRX Contacts. Mozilla's Thunderbird and MS Outlook both support LDAP and they work flawlessly with openCRX.
A simple sample query with ldapsearch:
ldapsearch -D "guest@Standard" -w guest -h localhost -p 1389 -b "ou=filter/All Accounts,ou=Persons" -l 100 -z 100 -P 3 ""
^In addition to the already existing ICS support openCRX now also offers full CalDAV support for Mozilla Calendar, i.e. Thunderbird 3 with the Lightning 1 Add-on and Sunbird 1.
^The project page is at https://www.mozdev.org/projects/overview/opencrx/ - additional info and screen shots are available from here.
^The openCRX Shop Adapter allows you to build shops (web stores, etc.) based on openCRX. The shop adapter provides service-oriented access to the relevant openCRX objects (customer, order, etc.).
We migrated all the openMDX and openCRX UML Models from IBM Rational Software Modeler (a commercial tool) to the Eclipse Modeling Framework EMF.
The EMF project is a modeling framework and code generation facility for building tools and other applications based on a structured data model. From a model specification described in XMI, EMF provides tools and runtime support to produce a set of Java classes for the model, along with a set of adapter classes that enable viewing and command-based editing of the model, and a basic editor (see http://www.eclipse.org/modeling/emf/ for more informationen).
XMI migration was trivial, but we also redrew all the class diagrams:
^openCRX v2.6 runs on Java 6 (see http://java.sun.com/ for more information).
^openCRX v2.6 supports HSQLDB v2.0 (see http://hsqldb.org/ for more information):
As far as openCRX is concerned, the performance of HSQLDB 2 is roughly on par with PostgreSQL for smaller data sets, i.e. more than sufficient for lots of use cases. Bitrock installers for openCRX v2.6 include HSQLDB v2.0 as the default database engine.
^This is a technical upgrade "under the hood". OpenEJB 3.1.2 was released on 14 October 2009 and openCRX v2.6.0 will use this latest stable version.
Information about Apache OpenEJB is available from http://openejb.apache.org/.
^