/*
* JBoss, Home of Professional Open Source.
* Copyright 2009, 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.server.profileservice.persistence.component;
import java.util.ArrayList;
import org.jboss.managed.api.ManagedComponent;
import org.jboss.managed.api.ManagedObject;
import org.jboss.managed.api.factory.ManagedObjectFactory;
import org.jboss.system.server.profileservice.persistence.ManagedObjectPersistencePlugin;
import org.jboss.system.server.profileservice.persistence.PersistenceFactory;
import org.jboss.system.server.profileservice.persistence.xml.ModificationInfo;
import org.jboss.system.server.profileservice.persistence.xml.PersistedComponent;
import org.jboss.system.server.profileservice.persistence.xml.PersistedManagedObject;
import org.jboss.system.server.profileservice.persistence.xml.PersistedProperty;
/**
* The abstract component mapper.
*
* @author <a href="mailto:emuckenh@redhat.com">Emanuel Muckenhuber</a>
* @version $Revision$
*/
public abstract class AbstractComponentMapper implements ComponentMapper
{
/** The persistence factory. */
private final PersistenceFactory persistenceFactory;
public AbstractComponentMapper(PersistenceFactory persistenceFactory)
{
if(persistenceFactory == null)
throw new IllegalArgumentException("null persistence factory");
this.persistenceFactory = persistenceFactory;
}
public ManagedObjectPersistencePlugin getPersistencePlugin()
{
return persistenceFactory.getPersistencePlugin();
}
public ManagedObjectFactory getMOF()
{
return persistenceFactory.getManagedObjectFactory();
}
public void restoreComponent(Object attachment, PersistedComponent component)
{
if(attachment == null)
throw new IllegalArgumentException("null attachment");
if(component == null)
throw new IllegalArgumentException("null component");
// Check what we need to do
ModificationInfo modification = component.getModificationInfo();
if(modification == null)
modification = ModificationInfo.MODIFIED;
switch(modification)
{
case ADDED:
updateComponent(attachment, component, true);
break;
case MODIFIED:
updateComponent(attachment, component, false);
break;
case REMOVED:
removeComponent(attachment, component);
break;
}
}
public PersistedComponent addComponent(Object attachment, ManagedComponent component)
{
return createPersistedComponent(attachment, component, ModificationInfo.ADDED);
}
public PersistedComponent updateComponent(Object attachment, ManagedComponent component)
{
return createPersistedComponent(attachment, component, ModificationInfo.MODIFIED);
}
public PersistedComponent removeComponent(Object attachment, ManagedComponent component)
{
PersistedComponent persisted = createPersistedComponent(attachment, component, ModificationInfo.REMOVED);
// FIXME cleanup properties, as they are not need for removed components
persisted.setProperties(new ArrayList<PersistedProperty>());
return persisted;
}
/**
* Remove a component from the attachment.
*
* @param attachment the attachment
* @param component the component to remove
*/
protected abstract void removeComponent(Object attachment, PersistedComponent component);
/**
* Get a ManagedObject for a given component, based on the information
* in the attachment descriptor.
*
* @param attachment the attachment
* @param component the component
* @param create whether to create a non existing component or not
* @return the managed object for the component
*/
protected abstract ManagedObject getComponent(Object attachment, PersistedComponent component, boolean create);
/**
* Create the persisted information for a given ManagedComponent.
*
* @param attachment the attachment
* @param component the managed component
* @return the persisted component
*/
protected PersistedComponent createComponent(Object attachment, ManagedComponent component)
{
// ManagedObject mo = component.getDeployment().getManagedObject(component.getName());
ManagedObject mo = (ManagedObject) component.getParent();
PersistedManagedObject persisted = getPersistencePlugin().createPersistedManagedObject(mo);
PersistedComponent persistedComponent = new PersistedComponent(persisted);
setComponentName(persistedComponent, mo);
return persistedComponent;
}
/**
* Set the current name for this component.
*
* @param component the persisted component
* @param mo the managed object
*/
protected abstract void setComponentName(PersistedComponent component, ManagedObject mo);
/**
* Update a attachment descripto based on the persisted
* component information.
*
* @param attachment the attachment
* @param component the persisted component
* @param added whether this component was added or not
*/
protected void updateComponent(Object attachment, PersistedComponent component, boolean added)
{
ManagedObject mo = getComponent(attachment, component, added);
getPersistencePlugin().updateManagedObject(component, mo);
}
/**
* Create a persisted component for a given ManagedComponent.
*
* @param attachment the attachment
* @param component the managed component
* @param modification the modification info
* @return the persisted component
*/
protected PersistedComponent createPersistedComponent(Object attachment, ManagedComponent component, ModificationInfo modification)
{
if(attachment == null)
throw new IllegalArgumentException("null attachment");
if(component == null)
throw new IllegalArgumentException("null component");
if(modification == null)
throw new IllegalArgumentException("null modification info");
// Create the component and set the modification information
PersistedComponent persisted = createComponent(attachment, component);
persisted.setModificationInfo(modification);
return persisted;
}
}