/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
/**
*
*/
package org.jboss.as.txn.service;
import org.jboss.as.controller.services.path.PathManager;
import org.jboss.msc.service.Service;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
import com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean;
import com.arjuna.ats.internal.arjuna.objectstore.hornetq.HornetqJournalEnvironmentBean;
import com.arjuna.common.internal.util.propertyservice.BeanPopulator;
/**
* Configures the {@link ObjectStoreEnvironmentBean}s using an injected path.
*
* @author Brian Stansberry (c) 2011 Red Hat Inc.
*/
public class ArjunaObjectStoreEnvironmentService implements Service<Void> {
private final InjectedValue<PathManager> pathManagerInjector = new InjectedValue<PathManager>();
private final boolean useJournalStore;
private final boolean enableAsyncIO;
private final String path;
private final String pathRef;
private final boolean useJdbcStore;
private final String dataSourceJndiName;
private final JdbcStoreConfig jdbcSoreConfig;
private volatile PathManager.Callback.Handle callbackHandle;
public ArjunaObjectStoreEnvironmentService(final boolean useJournalStore, final boolean enableAsyncIO, final String path, final String pathRef, final boolean useJdbcStore, final String dataSourceJndiName, final JdbcStoreConfig jdbcSoreConfig) {
this.useJournalStore = useJournalStore;
this.enableAsyncIO = enableAsyncIO;
this.path = path;
this.pathRef = pathRef;
this.useJdbcStore = useJdbcStore;
this.dataSourceJndiName = dataSourceJndiName;
this.jdbcSoreConfig = jdbcSoreConfig;
}
@Override
public Void getValue() throws IllegalStateException, IllegalArgumentException {
return null;
}
@Override
public void start(StartContext context) throws StartException {
callbackHandle = pathManagerInjector.getValue().registerCallback(pathRef, PathManager.ReloadServerCallback.create(), PathManager.Event.UPDATED, PathManager.Event.REMOVED);
String objectStoreDir = pathManagerInjector.getValue().resolveRelativePathEntry(path, pathRef);
final ObjectStoreEnvironmentBean defaultActionStoreObjectStoreEnvironmentBean =
BeanPopulator.getNamedInstance(ObjectStoreEnvironmentBean.class, null);
if(useJournalStore) {
HornetqJournalEnvironmentBean hornetqJournalEnvironmentBean = BeanPopulator.getDefaultInstance(
com.arjuna.ats.internal.arjuna.objectstore.hornetq.HornetqJournalEnvironmentBean.class
);
hornetqJournalEnvironmentBean.setAsyncIO(enableAsyncIO);
hornetqJournalEnvironmentBean.setStoreDir(objectStoreDir+"/HornetqObjectStore");
defaultActionStoreObjectStoreEnvironmentBean.setObjectStoreType(
"com.arjuna.ats.internal.arjuna.objectstore.hornetq.HornetqObjectStoreAdaptor"
);
} else {
defaultActionStoreObjectStoreEnvironmentBean.setObjectStoreDir(objectStoreDir);
}
final ObjectStoreEnvironmentBean stateStoreObjectStoreEnvironmentBean =
BeanPopulator.getNamedInstance(ObjectStoreEnvironmentBean.class, "stateStore");
stateStoreObjectStoreEnvironmentBean.setObjectStoreDir(objectStoreDir);
final ObjectStoreEnvironmentBean communicationStoreObjectStoreEnvironmentBean =
BeanPopulator.getNamedInstance(ObjectStoreEnvironmentBean.class, "communicationStore");
communicationStoreObjectStoreEnvironmentBean.setObjectStoreDir(objectStoreDir);
if(useJdbcStore) {
defaultActionStoreObjectStoreEnvironmentBean.setObjectStoreType("com.arjuna.ats.internal.arjuna.objectstore.jdbc.JDBCStore");
stateStoreObjectStoreEnvironmentBean.setObjectStoreType("com.arjuna.ats.internal.arjuna.objectstore.jdbc.JDBCStore");
communicationStoreObjectStoreEnvironmentBean.setObjectStoreType("com.arjuna.ats.internal.arjuna.objectstore.jdbc.JDBCStore");
defaultActionStoreObjectStoreEnvironmentBean.setJdbcAccess("com.arjuna.ats.internal.arjuna.objectstore.jdbc.accessors.DataSourceJDBCAccess;datasourceName=" + dataSourceJndiName);
stateStoreObjectStoreEnvironmentBean.setJdbcAccess("com.arjuna.ats.internal.arjuna.objectstore.jdbc.accessors.DataSourceJDBCAccess;datasourceName=" + dataSourceJndiName);
communicationStoreObjectStoreEnvironmentBean.setJdbcAccess("com.arjuna.ats.internal.arjuna.objectstore.jdbc.accessors.DataSourceJDBCAccess;datasourceName=" + dataSourceJndiName);
defaultActionStoreObjectStoreEnvironmentBean.setTablePrefix(jdbcSoreConfig.getActionTablePrefix());
stateStoreObjectStoreEnvironmentBean.setTablePrefix(jdbcSoreConfig.getStateTablePrefix());
communicationStoreObjectStoreEnvironmentBean.setTablePrefix(jdbcSoreConfig.getCommunicationTablePrefix());
defaultActionStoreObjectStoreEnvironmentBean.setDropTable(jdbcSoreConfig.isActionDropTable());
stateStoreObjectStoreEnvironmentBean.setDropTable(jdbcSoreConfig.isStateDropTable());
communicationStoreObjectStoreEnvironmentBean.setDropTable(jdbcSoreConfig.isCommunicationDropTable());
}
}
@Override
public void stop(StopContext context) {
callbackHandle.remove();
}
public InjectedValue<PathManager> getPathManagerInjector() {
return pathManagerInjector;
}
public static final class JdbcStoreConfig {
private final String actionTablePrefix;
private final boolean actionDropTable;
private final String stateTablePrefix;
private final boolean stateDropTable;
private final String communicationTablePrefix;
private final boolean communicationDropTable;
private JdbcStoreConfig(final String actionTablePrefix, final boolean actionDropTable, final String stateTablePrefix, final boolean stateDropTable, final String communicationTablePrefix, final boolean communicationDropTable) {
this.actionTablePrefix = actionTablePrefix;
this.actionDropTable = actionDropTable;
this.stateTablePrefix = stateTablePrefix;
this.stateDropTable = stateDropTable;
this.communicationTablePrefix = communicationTablePrefix;
this.communicationDropTable = communicationDropTable;
}
public String getActionTablePrefix() {
return actionTablePrefix;
}
public boolean isActionDropTable() {
return actionDropTable;
}
public String getStateTablePrefix() {
return stateTablePrefix;
}
public boolean isStateDropTable() {
return stateDropTable;
}
public String getCommunicationTablePrefix() {
return communicationTablePrefix;
}
public boolean isCommunicationDropTable() {
return communicationDropTable;
}
}
public static final class JdbcStoreConfigBulder {
private String actionTablePrefix;
private boolean actionDropTable;
private String stateTablePrefix;
private boolean stateDropTable;
private String communicationTablePrefix;
private boolean communicationDropTable;
public JdbcStoreConfigBulder setActionTablePrefix(String actionTablePrefix) {
this.actionTablePrefix = actionTablePrefix;
return this;
}
public JdbcStoreConfigBulder setActionDropTable(boolean actionDropTable) {
this.actionDropTable = actionDropTable;
return this;
}
public JdbcStoreConfigBulder setStateTablePrefix(String stateTablePrefix) {
this.stateTablePrefix = stateTablePrefix;
return this;
}
public JdbcStoreConfigBulder setStateDropTable(boolean stateDropTable) {
this.stateDropTable = stateDropTable;
return this;
}
public JdbcStoreConfigBulder setCommunicationTablePrefix(String communicationTablePrefix) {
this.communicationTablePrefix = communicationTablePrefix;
return this;
}
public JdbcStoreConfigBulder setCommunicationDropTable(boolean communicationDropTable) {
this.communicationDropTable = communicationDropTable;
return this;
}
public JdbcStoreConfig build() {
return new JdbcStoreConfig(actionTablePrefix, actionDropTable, stateTablePrefix, stateDropTable, communicationTablePrefix, communicationDropTable);
}
}
}