/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.ui.io.instance;
import java.io.File;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.ui.PlatformUI;
import de.fhg.igd.slf4jplus.ALogger;
import de.fhg.igd.slf4jplus.ALoggerFactory;
import eu.esdihumboldt.hale.common.core.io.IOAdvisor;
import eu.esdihumboldt.hale.common.core.io.IOProviderConfigurationException;
import eu.esdihumboldt.hale.common.core.io.extension.IOProviderDescriptor;
import eu.esdihumboldt.hale.common.core.io.report.IOReport;
import eu.esdihumboldt.hale.common.core.io.report.IOReporter;
import eu.esdihumboldt.hale.common.core.io.supplier.FileIOSupplier;
import eu.esdihumboldt.hale.common.core.io.supplier.Locatable;
import eu.esdihumboldt.hale.common.core.io.supplier.LocatableInputSupplier;
import eu.esdihumboldt.hale.common.instance.io.InstanceValidator;
import eu.esdihumboldt.hale.common.instance.io.InstanceWriter;
import eu.esdihumboldt.hale.ui.HaleUI;
import eu.esdihumboldt.hale.ui.io.ExportTarget;
import eu.esdihumboldt.hale.ui.io.ExportWizard;
import eu.esdihumboldt.hale.ui.io.IOWizard;
import eu.esdihumboldt.hale.ui.io.target.FileTarget;
import eu.esdihumboldt.hale.ui.service.report.ReportService;
/**
* Wizard for exporting instances
*
* @author Simon Templer
* @partner 01 / Fraunhofer Institute for Computer Graphics Research
* @since 2.5
*/
public class InstanceExportWizard extends ExportWizard<InstanceWriter> {
private static final ALogger log = ALoggerFactory.getLogger(InstanceExportWizard.class);
private final List<InstanceValidator> validators = new ArrayList<>();
private List<IOProviderDescriptor> cachedFactories;
/**
* Default constructor
*/
public InstanceExportWizard() {
super(InstanceWriter.class);
setWindowTitle("Export instances");
}
/**
* @see IOWizard#getFactories()
*/
@Override
public List<IOProviderDescriptor> getFactories() {
if (cachedFactories != null) {
return cachedFactories;
}
List<IOProviderDescriptor> providers = super.getFactories();
IOAdvisor<InstanceWriter> advisor = getAdvisor();
if (advisor == null) {
return providers;
}
List<IOProviderDescriptor> result = new ArrayList<IOProviderDescriptor>();
for (IOProviderDescriptor providerFactory : providers) {
// create a dummy provider
InstanceWriter provider;
try {
provider = (InstanceWriter) providerFactory.createExtensionObject();
} catch (Exception e) {
log.error("Error creating an instance writer: " + providerFactory.getIdentifier(),
e);
continue; // ignore this provider as it cannot be created
}
// assign the basic configuration
advisor.prepareProvider(provider);
advisor.updateConfiguration(provider);
// and check the compatibility
try {
provider.checkCompatibility();
result.add(providerFactory);
} catch (IOProviderConfigurationException e) {
// ignore this export provider, it is not compatible
}
}
cachedFactories = result;
return cachedFactories;
}
/**
* Run the configured validators on the exported instance. May be overriden
* to customize validation process.
*
* @return true if all validations were successful
*/
protected boolean performValidation() {
boolean success = true;
for (InstanceValidator validator : validators) {
// set schemas
List<? extends Locatable> schemas = getProvider().getValidationSchemas();
validator.setSchemas(schemas.toArray(new Locatable[schemas.size()]));
// set service provider
validator.setServiceProvider(HaleUI.getServiceProvider());
ExportTarget<?> exportTarget = getSelectTargetPage().getExportTarget();
if (exportTarget instanceof FileTarget) {
String fileName = ((FileTarget<?>) exportTarget).getTargetFileName();
LocatableInputSupplier<? extends InputStream> source = new FileIOSupplier(
new File(fileName));
validator.setSource(source);
validator.setContentType(getContentType());
IOReporter defReport = validator.createReporter();
// validate and execute provider
try {
// validate configuration
validator.validate();
IOReport report = execute(validator, defReport);
if (report != null) {
// add report to report server
ReportService repService = PlatformUI.getWorkbench()
.getService(ReportService.class);
repService.addReport(report);
if (report.isSuccess()) {
log.info(report.getSummary());
}
else {
log.error(report.getSummary());
success = false;
}
}
} catch (IOProviderConfigurationException e) {
log.error(MessageFormat.format("The validator '{0}' could not be executed",
validator.getClass().getCanonicalName()), e);
success = false;
}
}
else {
log.error("No input can be provided for validation (no file target)");
success = false;
}
}
if (success) {
log.userInfo("All validations completed successfully.");
}
else {
log.userError(
"There were validation failures. Please check the report for more details.");
}
return success;
}
/**
* @see IOWizard#performFinish()
*/
@Override
public boolean performFinish() {
boolean success = super.performFinish();
if (success && !validators.isEmpty()) {
// validate the written output
success = performValidation();
}
return success;
}
/**
* @return the list of {@link InstanceValidator}s
*/
public List<InstanceValidator> getValidators() {
return validators;
}
/**
* @param validator the {@link InstanceValidator} to add
*/
public void addValidator(InstanceValidator validator) {
this.validators.add(validator);
}
/**
* Removes a validator
*
* @param validator {@link InstanceValidator} to remove
*/
public void removeValidator(InstanceValidator validator) {
this.validators.remove(validator);
}
// /**
// * Get all export configuration saved in the current project
// *
// * @return the exportConfigs
// */
// public List<IOConfiguration> getExportConfigurations() {
// ProjectService ps = (ProjectService) PlatformUI.getWorkbench().getService(
// ProjectService.class);
// Project p = (Project) ps.getProjectInfo();
// return p.getExportConfigurations();
// }
}