Hi all,

Just thought I should share this snippet for creating DataSource resources either before or after an embedded OpenEJB has started.
Thanks go out to David Blevins for pointing me in the right direction.

The method can be fed a non-null environment (env) properties which will be seeded before use in the InitialContext call. If the 'env' parameter is null then it is assumed that an InitialContext has been created for OpenEJB, in which case a live Resource is created.

Obviously this is quite specific to my requirements, but can be easily modified.


private static final Log log = LogFactory.getLog(Session.class);
private static final Set<String> _dataSources = new HashSet<String>();

    /**
     * Creates a DataSource resource for OpenEJB.
* @param env If not null the properties are seeds with parameters to create the DataSource .
     * @param managed Is this a JTA managed or unmanaged DataSource.
* @param f File location for the database - Is specific for file based databases such as Derby, etc. * @param name DataSource name - Will prepend to either [name]Managed or [name]Unmanaged.
     * @throws Exception If anything goes wrong.
     */
private static void addDataSourceConfig(Properties env, final boolean managed, final File f, final String name) throws Exception {

        final String m = (managed ? "Managed" : "Unmanaged");

        if (_dataSources.contains(String.format("%1$s%2$s", name, m))) {
            //Already configured for OpenEJB
            return;
        }

final Resource resource = (null == env ? new Resource(String.format("%1$s%2$s", name, m), "DataSource") : null);
        final String dsname;

        if (null != resource) {
            env = resource.getProperties();
            dsname = "";
        } else {
env.put(String.format("%1$s%2$s", name, m), "new://Resource?type=DataSource");
            dsname = String.format("%1$s%2$s.", name, m);
        }

env.put(String.format("%1$sJtaManaged", dsname), (managed ? "true" : "false"));
        env.put(String.format("%1$sUserName", dsname), "SA");
env.put(String.format("%1$sJdbcDriver", dsname), "org.apache.derby.jdbc.EmbeddedDriver"); env.put(String.format("%1$sJdbcUrl", dsname), String.format("jdbc:derby:%1$s/%2$s;create=true", f.getPath().replace("\\", "/"), m.toLowerCase()));

        if (null != resource) {

            try {
SystemInstance.get().getComponent(Assembler.class).createResource(new ConfigurationFactory().configureService(resource, ResourceInfo.class));
            } catch (OpenEJBException e) {
                log.error("error:", e);
throw new Exception(String.format("Failed to add DataSource %1$s%2$s", name, m), e);
            }
        }

        _dataSources.add(String.format("%1$s%2$s", name, m));
    }

Best regards,

Andy.

PS. Something I also do which might be useful to someone is to create and load an application dynamically after OpenEJB has started.

//Dynamically load application
 SystemInstance.get().getComponent(Assembler.class).createApplication(new 
ConfigurationFactory().configureApplication(
    new File("my.ejb.jar")
  ));

Reply via email to