blob: dfdea63d7bc1be110d973067c6ac081cdc6d0f6b [file] [log] [blame]
package org.eclipse.stem.internal.data;
/*******************************************************************************
* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018
* IBM Corporation, BfR, and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* IBM Corporation - initial API and implementation and new features
* Bundesinstitut für Risikobewertung - Pajek Graph interface, new Veterinary Models
*******************************************************************************/
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.stem.internal.data.specifications.IdentfiableSpecificationFactory;
import org.eclipse.stem.internal.data.specifications.IdentifiablePropertyFileSpecification;
/**
* This class is the Main entry point to the generation of
* {@link org.eclipse.stem.core.graph.Graph}s from internal data sets.
*/
abstract public class DataGenerator {
/**
* This is the path to the root directory of the property files that define
* the graphs.
*/
public static final String ROOT_PROPERTY_FILES = "resources"
+ File.separator + "data";
/**
* This is the path to the root directory of the serialized files
*/
public static final String ROOT_SERIALIZED_FILES = "temp" + File.separator
+ "data";
protected List<IdentifiablePropertyFileSpecification> processFiles(
String[] args) {
List<IdentifiablePropertyFileSpecification> retValue = new ArrayList<IdentifiablePropertyFileSpecification>();
// Is the root directory specified?
if (args.length == 0) {
// Yes
System.err
.println("Missing specification of source directory as an argument");
} // if
else {
final String sourceDir = args[0];
final String propertyRootDir = sourceDir + File.separator
+ ROOT_PROPERTY_FILES;
final String serializationRootDir = sourceDir + File.separator
+ ROOT_SERIALIZED_FILES;
try {
retValue = createIdentifiablePropertyFileSpecifications(propertyRootDir);
// Now serialize the Identifiables
for (IdentifiablePropertyFileSpecification identifiablePropertyFileSpecification : retValue) {
identifiablePropertyFileSpecification
.serialize(serializationRootDir);
}
} // try
catch (IOException e) {
e.printStackTrace();
} // catch IOException
} // else
return retValue;
} // processFiles
/**
* Process all of the property files and create all of the
* {@link IdentifiablePropertyFileSpecification}s they define.
*
* @param propertyFileRootDirectory
* this is the path relative to the workspace that specifies the
* directory that is the root of all of the property files that
* contain data that specifies the contents of the
* {@link IdentifiablePropertyFileSpecification}s.
*
* @return a {@link List} of {@link IdentifiablePropertyFileSpecification}s
* created from the property files
*/
protected List<IdentifiablePropertyFileSpecification> createIdentifiablePropertyFileSpecifications(
final String propertyFileRootDirectory) {
final List<IdentifiablePropertyFileSpecification> retValue = new ArrayList<IdentifiablePropertyFileSpecification>();
// Recursively descend the directory structure rooted at
// propertyFileRootDirectory and retrieve all of the property files we
// find.
final List<File> propertyFiles = getPropertyFiles(new File(
propertyFileRootDirectory));
// Each property file contains a property that names a class that can
// parse/process its contents to create an instance of DataSetRecord.
// The factory IdentfiableSpecificationFactory extracts that name and
// creates an instance of the specified class. That instance then
// processes the rest of the property file to create an instance of
// DataSetData which it retains internally.
// Process each property file to create the DataSetRecord it specifies.
int skippedFiles = 0;
for (final File propertyFile : propertyFiles) {
final IdentifiablePropertyFileSpecification identifiableSpecification = IdentfiableSpecificationFactory.INSTANCE
.createIdentifiablePropertyFileSpecification(propertyFile);
// Did we create one?
if (identifiableSpecification != null) {
// Yes
retValue.add(identifiableSpecification);
} else {
// No
skippedFiles++;
}
} // for each property file
if (skippedFiles > 0) {
System.out.println("Skipped " + skippedFiles
+ " incorrect property file"
+ (skippedFiles == 1 ? "" : "s"));
}
System.out.println("Created " + retValue.size() + " GraphRecord"
+ (retValue.size() == 1 ? "" : "s"));
// System.out.println("Created " + retValue.getNumModelRecords()
// + " ModelRecord"
// + (retValue.getNumModelRecords() == 1 ? "" : "s"));
return retValue;
} // createIdentifiablePropertyFileSpecifications
/**
* @param directory
* the top-level directory containing property files and other
* sub-directories that contain property files. The directory
* will be recursively processed to find property files.
* @return a list of the property files that contain property definitions
*/
private List<File> getPropertyFiles(final File directory) {
final List<File> retValue = new ArrayList<File>();
// Does it exist and is it a directory?
if (directory.exists() && directory.isDirectory()) {
// Yes
// Get all of the property files from the directory...
final File[] propertyFiles = directory.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
final String name = pathname.getName();
boolean valid = pathname.isFile()
&& name.endsWith(".properties")
&& !name.endsWith("names.properties")
&& !name.endsWith("centers.properties");
return valid;
}
});
// ...and add them the list we're returning
Collections.addAll(retValue, propertyFiles);
// Now get the sub-directories...
final File[] subDirectories = directory.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory()
&& !pathname.getName().equals(".svn")
&& !pathname.getName().equals("CVS");
}
});
// ...and process them recursively to get their properties files too
for (final File subDirectory : subDirectories) {
retValue.addAll(getPropertyFiles(subDirectory));
}
} // if directory
else {
System.err.println("The directory \"" + directory.getAbsolutePath()
+ "\" doesn't exist or is not a directory");
}
return retValue;
} // getGraphPropertyFiles
} // DataGenerator