[opencms-dev] Using OpenCms objects in external Java application?

Andreas Haumer andreas at xss.co.at
Sat Oct 7 20:27:53 CEST 2006


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi!

Today I have implemented a solution which might not be
perfect but seems to be a good compromise in the given
situation.

My reasoning for this implementation was:

a) The CmsShell class contains all necessary functionality
   and is public so I can subclass it and implement a
   method which gives me access to the CmsObject I need.
   Alas, it's constructor does a lot more than I want.
   It's a working, but still ugly solution.

b) The most important classes are OpenCmsCore and OpenCms
   in package org.opencms.main. These classes contain all
   the methods needed to get access to the OpenCms VFS.
   But all the important methods are protected and the
   classes are declared final, so there is no way for my
   application to use the classes or methods directly.


Looking at a and b I came to the conclusion the best way
was to implement a new class inside package org.opencms.main
and use the protected methods I need there. Luckily, Java
let's me implement a class for a package in a different
filesystem namespace and still have the class considered
part of the package. That way I don't have to touch the
OpenCms sources and can implement my class in our own
project source directory structure.

So I have implemented class org.opencms.main.CmsObjectFactory
to give me access to an correctly initialized CmsObject
object. I have the sources for this class attached to this
mail, just in case someone else might find it useful.

With this new class, I can implement a resource upload function
in my application as follows:

    private static void upload (String webappName,
                                String servletMapping,
                                String webInfPath,
                                String username,
                                String password,
                                String siteRoot,
                                String filename,
                                byte[] data, List properties)
    throws Exception
    {
        CmsObjectFactory factory = new CmsObjectFactory();

        try {
            LOG.info("get OpenCMS instance");
            CmsObject cms = factory.getCmsObject(webInfPath, servletMapping, webappName);

            LOG.info("login to OpenCMS at \"" + webInfPath + "\" with username \"" + username + "\"");
            cms.loginUser(username, password);

            // switch to the offline project
            LOG.info("switch to offline project");
            cms.getRequestContext().setCurrentProject(cms.readProject(OFFLINE_PROJECT_STR));

            // set site root if requested
            if (siteRoot != null) {
                LOG.info("set site root to\"" + siteRoot + "\"");
                cms.getRequestContext().setSiteRoot(siteRoot);
            }

            String foldername = cms.getRequestContext().getFolderUri();
            if (!foldername.endsWith(DIRECTORY_DELIMITER_STR))
                foldername += DIRECTORY_DELIMITER_STR;

            if (filename.startsWith(DIRECTORY_DELIMITER_STR)) {
                filename = filename.substring(DIRECTORY_DELIMITER_STR.length());
            }

            String resourcename = foldername + filename;

            LOG.info("upload resource \"" + resourcename + "\" into site \"" + cms.getRequestContext().getSiteRoot() + "\"");

            // delete old resource if it already exists
            if (cms.existsResource(resourcename)) {
                LOG.info("resource \"" + resourcename + "\" exists, deleting it");
                cms.lockResource(resourcename);
                cms.deleteResource(resourcename, CmsResource.DELETE_PRESERVE_SIBLINGS);
            }

            LOG.info("creating resource \"" + resourcename + "\"");
            cms.createResource(resourcename, DEFAULT_RESOURCE_TYPE, data, properties);
            LOG.info("unlocking resource \"" + resourcename + "\"");
            cms.unlockResource(resourcename);
            LOG.info("publishing resource \"" + resourcename + "\"");
            cms.publishResource(resourcename);

            // go back to online project
            LOG.info("switch back to online project");
            cms.getRequestContext().setCurrentProject(cms.readProject(ONLINE_PROJECT_STR));
        }
        catch (Exception ex) {
            LOG.error("resource upload failed: " + ex.getLocalizedMessage());
            throw(ex);
        }
        finally {
            // finally, release all OpenCms resources
            LOG.info("shutdown OpenCMS instance");
            factory.destroyCmsObject();
        }
    }



I have tested this in my application and it works quite fine.
There is still room for improvement, but at least for now I'm
happy.

I would be interested in any comments, especially from the
OpenCms core developers. I think the functionality implemented
in the CmsObjectFactory class is missing from the OpenCms API.
Would you consider adding this class (or at least the functionality)
to the OpenCms core sources?

Regards,

- - andreas

- --
Andreas Haumer                     | mailto:andreas at xss.co.at
*x Software + Systeme              | http://www.xss.co.at/
Karmarschgasse 51/2/20             | Tel: +43-1-6060114-0
A-1100 Vienna, Austria             | Fax: +43-1-6060114-71
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFFJ/GnxJmyeGcXPhERAoFlAKCbWekQbxYyc/wZ3bB2wQKHIXahNACfcgU5
MYObT84qXqHW+k3O7A/SuPg=
=fyF1
-----END PGP SIGNATURE-----
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CmsObjectFactory.java
Type: text/x-java
Size: 5872 bytes
Desc: not available
URL: <https://webmail.opencms.org/pipermail/opencms-dev/attachments/20061007/19bdcf56/attachment.java>


More information about the opencms-dev mailing list