/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, 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.system.pm; import org.jboss.mx.persistence.AttributePersistenceManager; import org.jboss.system.ServiceMBean; import org.jboss.system.ServiceMBeanSupport; import org.w3c.dom.Element; /** * AttributePersistenceService * * Works in conjuction with * org.jboss.mx.persistence.DelegatingPersistenceManager * that upon creation, consults this service for an * implementations of the interface * org.jboss.mx.persistence.AttributePersistenceManager * * The service will instantiate and initialize the actual * persistence manager and return it whenever asked. * * It also introduces the notion of a 'version', when * creating the persistent manager, so that persisted * data from different versions are kept separately. * * The service can be stopped, the version can be changed * and the service re-started, resulting in a new * persistent manager being instantiated and all * XMBeans created thereafter using this instead. * * So the goal is really to have a way to plug-in * external and manageable persistent managers that * that support versioning, too. * * @jmx:mbean * extends="org.jboss.system.ServiceMBean" * * @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a> * @version $Revision: 81033 $ **/ public class AttributePersistenceService extends ServiceMBeanSupport implements AttributePersistenceServiceMBean { // Constants ----------------------------------------------------- /** The default AttributePersistenceManager implementation */ public static final String DEFAULT_APM = "org.jboss.system.pm.XMLAttributePersistenceManager"; /** The default behaviour for destroying the APM when stopping */ public static final boolean DEFAULT_DESTROY_APM_ON_STOP = false; // Private Data -------------------------------------------------- /** the actual AttributePersistenceManager (APM) implementation */ private AttributePersistenceManager apm = null; /** the APM XML configuration */ private Element apmConfig = null; /** the name of the APM implementation class */ private String apmClass = DEFAULT_APM; /** whether to destroy() the APM upon stop, or leave it servicing XMBeans that use it */ private boolean apmDestroyOnStop = DEFAULT_DESTROY_APM_ON_STOP; /** indicate the active version configured to the APM */ private String versionTag = null; // Constructors ------------------------------------------------- /** * Constructs a <tt>AttributePersistenceService</tt>. */ public AttributePersistenceService() { // setup logger super(AttributePersistenceService.class); } // Attributes ---------------------------------------------------- /** * @jmx:managed-attribute * @return Returns the versionTag. */ public String getVersionTag() { return versionTag; } /** * @jmx:managed-attribute * @param versionTag The versionTag to set. */ public void setVersionTag(String versionTag) { checkNotStarted(); this.versionTag = versionTag; } /** * @jmx:managed-attribute * @return Returns the apmClass. */ public String getAttributePersistenceManagerClass() { return apmClass; } /** * @jmx:managed-attribute * @param apmClass The apmClass to set. */ public void setAttributePersistenceManagerClass(String apmClass) { checkNotStarted(); this.apmClass = apmClass; } /** * @jmx:managed-attribute * @return Returns the apmConfig. */ public Element getAttributePersistenceManagerConfig() { return apmConfig; } /** * @jmx:managed-attribute * @param apmConfig The apmConfig to set. */ public void setAttributePersistenceManagerConfig(Element apmConfig) { checkNotStarted(); this.apmConfig = apmConfig; } /** * @jmx:managed-attribute * @return Returns the apmDestroyOnStop. */ public boolean getApmDestroyOnServiceStop() { return apmDestroyOnStop; } /** * @jmx:managed-attribute * @param apmDestroyOnStop The apmDestroyOnStop to set. */ public void setApmDestroyOnServiceStop(boolean apmDestroyOnStop) { checkNotStarted(); this.apmDestroyOnStop = apmDestroyOnStop; } // ServiceMBeanSupport overrides --------------------------------- public void startService() throws Exception { // Instantiate the APM trough the MBeanServer this.apm = (AttributePersistenceManager)this.getServer().instantiate(this.apmClass); // Initialize it this.apm.create(this.versionTag, this.apmConfig); } public void stopService() { // if we destroy it non can be used it if (this.apmDestroyOnStop) { this.apm.destroy(); } // forget about this apm this.apm = null; } // Operations ---------------------------------------------------- /** * @jmx:managed-operation */ public AttributePersistenceManager apmCreate() { checkStarted(); return this.apm; } /** * @jmx:managed-operation */ public boolean apmExists(String id) throws Exception { checkStarted(); return this.apm.exists(id); } /** * @jmx:managed-operation */ public void apmRemove(String id) throws Exception { checkStarted(); this.apm.remove(id); } /** * @jmx:managed-operation */ public void apmRemoveAll() throws Exception { checkStarted(); this.apm.removeAll(); } /** * @jmx:managed-operation */ public String[] apmListAll() throws Exception { checkStarted(); return this.apm.listAll(); } /** * @jmx:managed-operation */ public String apmListAllAsString() throws Exception { checkStarted(); StringBuffer sbuf = new StringBuffer(1024); String[] list = this.apm.listAll(); for (int i = 0; i < list.length; i++) { sbuf.append(list[i]).append("\n"); } return sbuf.toString(); } // Private ------------------------------------------------------- private void checkStarted() { int state = this.getState(); if (state != ServiceMBean.STARTED) { throw new IllegalStateException("Cannot perform operations unless service is started"); } } private void checkNotStarted() { int state = this.getState(); if (state == ServiceMBean.STARTING || state == ServiceMBean.STARTED) { throw new IllegalStateException("Cannot modify attributes while service is started"); } } }