/*
* RHQ Management Platform
* Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.server.sync.importers;
import java.util.Set;
import javax.xml.stream.XMLStreamException;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.enterprise.server.sync.ExportReader;
import org.rhq.enterprise.server.sync.validators.EntityValidator;
/**
* Implementations of this interface are used to import entities into the database.
* <p>
* The implementations MUST provide a no-arg public constructor.
*
* @author Lukas Krejci
*/
public interface Importer<Entity, ExportedType> {
/**
* A configuration definition describing the configuration of the importer and
* the default values for individual properties.
* <p>
* The returned configuration definition <b>MUST</b> define a default template.
*/
ConfigurationDefinition getImportConfigurationDefinition();
/**
* Configures the importer.
*
* @param importConfiguration the configuration of the import as defined by the {@link #getImportConfigurationDefinition()}
*/
void configure(Configuration importConfiguration);
/**
* Returns an entity matcher that can match the entities from the export file
* with the real entities in the database.
*
* @return
*/
ExportedEntityMatcher<Entity, ExportedType> getExportedEntityMatcher();
/**
* The set of entity validators that should be called on each entity before
* the import actually starts.
*/
Set<EntityValidator<ExportedType>> getEntityValidators();
/**
* Updates the entity with the data from the export.
* <p>
* This method is responsible for persisting the entity in the database
* using the provided entityManager. Note that the actual persist can
* also be delayed until the {@link #finishImport()} method is called
* so that the importer can take advantage of batching.
*
* @param entity the entity to persist (may be null if the {@link #getExportedEntityMatcher()} returned null of if the entity matcher didn't find a match)
* @param exportedEntity the entity found in the export file that should be used to update the entity in the database
*/
void update(Entity entity, ExportedType exportedEntity) throws Exception;
/**
* Unmarshalls an entity from the provided reader.
*
* @param reader
* @return
* @throws XMLStreamException
*/
ExportedType unmarshallExportedEntity(ExportReader reader) throws XMLStreamException;
/**
* Finishes the import. This method is called after all entities from the export file
* have been {@link #update(Object, Object) updated}.
* <p>
* This is useful for importers that need to batch the updates to the database.
*
* @return notes that should be transfered to the user. These should be any warnings and other
* messages that are not errors (which should throw an exception) but are deemed
* important for the (human) caller to be aware of.
*/
String finishImport() throws Exception;
}