package nl.ipo.cds.etl;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.concurrent.Executor;
import javax.inject.Inject;
import javax.sql.DataSource;
import nl.ipo.cds.dao.ManagerDao;
import nl.ipo.cds.domain.Dataset;
import nl.ipo.cds.etl.process.DatasetMetadata;
import nl.ipo.cds.etl.process.HarvesterFactory;
import nl.ipo.cds.etl.process.MetadataHarvester;
import nl.ipo.cds.etl.theme.ThemeConfig;
import nl.ipo.cds.etl.theme.ThemeDiscoverer;
import nl.ipo.cds.etl.util.BlockingExecutor;
import nl.ipo.cds.executor.ConfigDir;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.jdbc.datasource.DataSourceUtils;
public class VerifyDatasetSchemas implements Runnable {
private static final int ADVISORY_LOCK_KEY = 0;
@Configuration
@ComponentScan (basePackageClasses = { nl.ipo.cds.etl.config.Package.class, nl.ipo.cds.etl.theme.Package.class })
@ImportResource ({
"/nl/ipo/cds/dao/dataSource-applicationContext.xml",
"/nl/ipo/cds/dao/dao-applicationContext.xml"
})
public static class Config {
@Bean
public ConfigDir configDir (final @Value("file:${CONFIGDIR}") String configDirPath) {
return new ConfigDir (configDirPath);
}
@Bean
public VerifyDatasetSchemas verifyDatasetSchemas () {
return new VerifyDatasetSchemas ();
}
@Bean
public Executor executor () {
return new BlockingExecutor (1);
}
}
@Inject
private ManagerDao managerDao;
@Inject
private HarvesterFactory harvesterFactory;
@Inject
private DataSource dataSource;
@Inject
private ThemeDiscoverer themeDiscoverer;
public static void main (final String ... args) {
try {
final AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext (Config.class);
applicationContext.getBean (VerifyDatasetSchemas.class).run ();
applicationContext.close ();
} catch(Exception e) {
e.printStackTrace ();
System.exit(1);
}
System.exit(0);
}
@Override
public void run () {
try {
Connection connection = DataSourceUtils.getConnection(dataSource);
PreparedStatement stmt = connection.prepareStatement("select pg_try_advisory_lock(?)");
stmt.setLong(1, ADVISORY_LOCK_KEY);
ResultSet rs = stmt.executeQuery();
boolean result = false;
while(rs.next()) {
result = rs.getBoolean(1);
}
rs.close();
stmt.close();
if(!result) {
System.err.println("Couldn't acquire lock (JobExecutor already running?)");
return;
}
System.out.println ("Listing dataset");
final OutputStream os = new FileOutputStream ("datasets.csv");
final PrintWriter writer = new PrintWriter (new OutputStreamWriter (os, Charset.forName ("UTF-8")));
for (final Dataset ds: managerDao.getAllDatasets ()) {
processDataset (ds, writer);
}
writer.close ();
os.close ();
DataSourceUtils.releaseConnection(connection, dataSource);
} catch (Exception e) {
e.printStackTrace ();
}
}
public void processDataset (final Dataset dataset, final PrintWriter writer) {
String result = "OK";
String describeFeatureTypeURL = "";
try {
final MetadataHarvester metadataHarvester = harvesterFactory.createMetadataHarvester ();
final DatasetMetadata metadata = metadataHarvester.parseMetadata (dataset.getUuid ());
describeFeatureTypeURL = metadata.getSchemaUrl ();
ThemeConfig<?> themeConfig = themeDiscoverer.getThemeConfiguration(dataset.getDatasetType().getThema().getNaam());
themeConfig.getSchemaHarvester().parseApplicationSchema(metadata);
} catch (Exception e) {
result = String.format ("%s: %s", e.getClass ().getCanonicalName (), e.getMessage ());
}
writer.println (String.format (
"%s;%s;%s;%s;%s",
dataset.getBronhouder ().getNaam (),
dataset.getDatasetType ().getNaam (),
dataset.getUuid (),
describeFeatureTypeURL,
result
));
}
}