/* (c) 2016 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.backuprestore.writer; import java.io.IOException; import java.util.List; import org.geoserver.backuprestore.Backup; import org.geoserver.backuprestore.BackupRestoreItem; import org.geoserver.catalog.Catalog; import org.geoserver.config.util.XStreamPersister; import org.geoserver.config.util.XStreamPersisterFactory; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.platform.resource.Files; import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemStreamWriter; import org.springframework.batch.item.file.ResourceAwareItemWriterItemStream; import org.springframework.batch.item.util.ExecutionContextUserSupport; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.io.Resource; import org.springframework.util.ClassUtils; /** * Abstract Spring Batch {@link ItemReader}. * * Configures the {@link Catalog} and initizializes the {@link XStreamPersister}. * * @author Alessio Fabiani, GeoSolutions * */ @SuppressWarnings("rawtypes") public abstract class CatalogWriter<T> extends BackupRestoreItem implements ItemStreamWriter<T>, ResourceAwareItemWriterItemStream<T>, InitializingBean { protected Class clazz; public CatalogWriter(Class<T> clazz, Backup backupFacade, XStreamPersisterFactory xStreamPersisterFactory) { super(backupFacade, xStreamPersisterFactory); this.clazz = clazz; this.setExecutionContextName(ClassUtils.getShortName(clazz)); } private final ExecutionContextUserSupport executionContextUserSupport = new ExecutionContextUserSupport(); /** * No-op. * * @see org.springframework.batch.item.ItemStream#close() */ @Override public void close() { } /** * No-op. * * @see org.springframework.batch.item.ItemStream#open(ExecutionContext) */ @Override public void open(ExecutionContext executionContext) { } /** * Return empty {@link ExecutionContext}. * * @see org.springframework.batch.item.ItemStream#update(ExecutionContext) */ @Override public void update(ExecutionContext executionContext) { } /** * The name of the component which will be used as a stem for keys in the {@link ExecutionContext}. Subclasses should provide a default value, * e.g. the short form of the class name. * * @param name the name for the component */ public void setName(String name) { this.setExecutionContextName(name); } protected void setExecutionContextName(String name) { executionContextUserSupport.setName(name); } public String getExecutionContextKey(String key) { return executionContextUserSupport.getKey(key); } protected String getItemName(XStreamPersister xp) { return xp.getClassAliasingMapper().serializedClass(clazz); } @SuppressWarnings("unchecked") protected void firePostWrite(T item, Resource resource) throws IOException { List<CatalogAdditionalResourcesWriter> additionalResourceWriters = GeoServerExtensions .extensions(CatalogAdditionalResourcesWriter.class); for (CatalogAdditionalResourcesWriter wr : additionalResourceWriters) { if (wr.canHandle(item)) { wr.writeAdditionalResources(backupFacade, Files.asResource(resource.getFile()), item); } } } }