package org.openflexo.emf.model.city.tooling;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import com.thalesgroup.openflexo.emf.model.city1.City1Factory;
import com.thalesgroup.openflexo.emf.model.city1.House;
import com.thalesgroup.openflexo.emf.model.city1.HouseType;
import com.thalesgroup.openflexo.emf.model.city1.Resident;
import com.thalesgroup.openflexo.emf.model.city2.Appartment;
import com.thalesgroup.openflexo.emf.model.city2.Mansion;
import com.thalesgroup.openflexo.emf.model.city2.City2Factory;
import com.thalesgroup.openflexo.emf.model.city2.Mayor;
public class GenerateCitiesModel {
// EMF Factories
private static XMIResourceFactoryImpl factory = new XMIResourceFactoryImpl();
private static City1Factory city1Factory = City1Factory.eINSTANCE;
private static City2Factory city2Factory = City2Factory.eINSTANCE;
// Random numbers
private static Random r = new Random();
// Output Models
private static String city1FilePrefix = "models/generated";
private static String city2FilePrefix = "models/generated";
// Input Data
private static String cityDataFile = "data/villes_france.csv";
private static String prenomsDataFile = "data/prenoms.csv";
static List<String> listPrenoms = null;
private static Integer MAX_PRENOMS = 500;
private static String nomsDataFile = "data/noms_famille.csv";
private static Integer MAX_NOMS = 250;
static List<String> listNoms = null;
// Number of random files to generate
static int MAX_TRIES_NUMBER = 10;
static int MAX_HOUSES = 50;
/**
* @param args
*/
public static void main(String[] args) {
try {
// read lists of nom and Prenom
listPrenoms = readInputData(prenomsDataFile);
listNoms = readInputData(nomsDataFile);
File citiesFile = new File (cityDataFile);
generateIdenticFilesForCitiesMoreThanXinhab(citiesFile,0);
generateIdenticFilesForCitiesMoreThanXinhab(citiesFile,10);
generateIdenticFilesForCitiesMoreThanXinhab(citiesFile,110);
generateIdenticFilesForCitiesMoreThanXinhab(citiesFile,120);
generateIdenticFilesForCitiesMoreThanXinhab(citiesFile,150);
generateIdenticFilesForCitiesMoreThanXinhab(citiesFile,1000);
int i = MAX_TRIES_NUMBER;
while (i>0){
generateDifferentFilesForCitiesMoreThanXinhab(citiesFile,0,"Try"+i);
generateDifferentFilesForCitiesMoreThanXinhab(citiesFile,10,"Try"+i);
generateDifferentFilesForCitiesMoreThanXinhab(citiesFile,110,"Try"+i);
generateDifferentFilesForCitiesMoreThanXinhab(citiesFile,120,"Try"+i);
generateDifferentFilesForCitiesMoreThanXinhab(citiesFile,150,"Try"+i);
generateDifferentFilesForCitiesMoreThanXinhab(citiesFile,1000,"Try"+i);
i--;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*
* Generates CityFiles with some random differences, for cities that have more than (maxNbInhab * 1000) inhabitants
*
* @param citiesFile
* @param maxNbInhab
* @throws NumberFormatException
* @throws IOException
*/
public static void generateDifferentFilesForCitiesMoreThanXinhab(File citiesFile, int maxNbInhab, String suffix) throws NumberFormatException, IOException{
// Create EMF Resource
Resource r1 = makeResource(city1FilePrefix + "_" + maxNbInhab +"kh" + suffix+".city1");
Resource r2 = makeResource(city2FilePrefix +"_" + maxNbInhab+"kh" + suffix+".city2");
com.thalesgroup.openflexo.emf.model.city1.City cit1 = null;
com.thalesgroup.openflexo.emf.model.city2.City cit2 = null;
Mayor mayor = null;
// ReadFile
if(citiesFile.canRead()){
FileInputStream fstream;
fstream = new FileInputStream(citiesFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String line;
boolean genInCity1, genInCity2;
while ((line = br.readLine()) != null){
String[] data = line.split(",");
Integer size = new Integer(data[2]);
genInCity1 = r.nextBoolean();
genInCity2 = r.nextBoolean();
if (size > maxNbInhab*1000) {
String mayorName = listNoms.get(r.nextInt(MAX_NOMS)) + " " + listPrenoms.get(r.nextInt(MAX_PRENOMS));
if (genInCity1){
cit1 = genInCity1(data[0],new Integer(data[1]),mayorName);
r1.getContents().add(cit1);
}
if (genInCity2){
cit2 = genInCity2(data[0],new Integer(data[1]),mayorName);
r2.getContents().add(cit2);
}
int nbhouses = r.nextInt(MAX_HOUSES);
while (nbhouses>0){
generateHouse(cit1,cit2,true);
nbhouses--;
}
}
}
}
// Save Resources
r1.save(null);
r2.save(null);
}
/**
*
* Generates identic CityFiles with cities that have more than (maxNbInhab * 1000) inhabitants
*
* @param citiesFile
* @param maxNbInhab
* @throws NumberFormatException
* @throws IOException
*/
public static void generateIdenticFilesForCitiesMoreThanXinhab(File citiesFile, int maxNbInhab) throws NumberFormatException, IOException{
// Create EMF Resource
Resource r1 = makeResource(city1FilePrefix + "_" + maxNbInhab +"kh.city1");
Resource r2 = makeResource(city2FilePrefix +"_" + maxNbInhab+"kh.city2");
com.thalesgroup.openflexo.emf.model.city1.City cit1 = null;
com.thalesgroup.openflexo.emf.model.city2.City cit2 = null;
Mayor mayor = null;
Resident resident = null;
// ReadFile
if(citiesFile.canRead()){
FileInputStream fstream;
fstream = new FileInputStream(citiesFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String line;
while ((line = br.readLine()) != null){
String[] data = line.split(",");
Integer size = new Integer(data[2]);
if (size > maxNbInhab*1000) {
String mayorName = generateRandomCitizenName();
cit1 = genInCity1(data[0],new Integer(data[1]),mayorName);
cit2= genInCity2(data[0],new Integer(data[1]),mayorName);
int nbhouses = r.nextInt(MAX_HOUSES);
while (nbhouses>0){
generateHouse(cit1,cit2,false);
nbhouses--;
}
r1.getContents().add(cit1);
r2.getContents().add(cit2);
}
}
}
// Save Resources
r1.save(null);
r2.save(null);
}
/** Makes new EMF Resources
*
* @param filename
* @return
*/
public static Resource makeResource (String filename){
URI uri = (org.eclipse.emf.common.util.URI.createFileURI(filename));
Resource emfResource = factory.createResource(uri);
return emfResource;
}
/** Generate a random citizen name
*
*/
public static String generateRandomCitizenName(){
return listNoms.get(r.nextInt(MAX_NOMS)) + " " + listPrenoms.get(r.nextInt(MAX_PRENOMS));
}
/**
* Generate a new House (with some difference if diff = true) in each city
*/
public static void generateHouse (com.thalesgroup.openflexo.emf.model.city1.City cit1 , com.thalesgroup.openflexo.emf.model.city2.City cit2, boolean diff){
boolean genInCity1 = r.nextBoolean();
boolean genInCity2 = r.nextBoolean();
boolean appartment = r.nextBoolean();
String ownerSurname = listNoms.get(r.nextInt(MAX_NOMS));
String houseName = "House Of "+ ownerSurname;
String ownerName = ownerSurname + " " + listPrenoms.get(r.nextInt(MAX_PRENOMS));
int apptNumber = r.nextInt();
if (!diff || genInCity1 && cit1 != null ){
House house = city1Factory.createHouse();
Resident resident = city1Factory.createResident();
resident.setName(ownerName);
if (appartment){
house.setType(HouseType.APPARTMENT);
house.setInfo("Apparment N°" + apptNumber);
}
else {
house.setType(HouseType.MANSION);
house.setInfo(houseName);
}
house.setOwner(resident);
cit1.getResidents().add(resident);
cit1.getHouses().add(house);
}
if (!diff || genInCity2 && cit2 != null){
com.thalesgroup.openflexo.emf.model.city2.House house=null;
if (appartment){
house = city2Factory.createAppartment();
((Appartment) house).setLabel(houseName);
}
else {
house = city2Factory.createMansion();
((Mansion) house).setNumber(apptNumber);
}
house.setOwner(ownerName);
cit2.getHouses().add(house);
}
}
/** Generate a City for city1 MM
*
* @return
*/
public static com.thalesgroup.openflexo.emf.model.city1.City genInCity1(String cityName, Integer zipcode, String mayorName){
com.thalesgroup.openflexo.emf.model.city1.City cit1 = city1Factory.createCity();
Resident resident = city1Factory.createResident();
resident.setName(mayorName);
city1Factory.createCity();
cit1.setName(cityName);
cit1.setZipcode(zipcode);
cit1.getResidents().add(resident);
// adding max 5 residents per city
int i =r.nextInt(5);
while (i>0){
resident = city1Factory.createResident();
resident.setName(generateRandomCitizenName());
cit1.getResidents().add(resident);
i--;
}
return cit1;
}
/** Generate a City for city2 MM
*
* @return
*/
public static com.thalesgroup.openflexo.emf.model.city2.City genInCity2(String cityName, Integer zipcode, String mayorName){
com.thalesgroup.openflexo.emf.model.city2.City cit2 = city2Factory.createCity();
cit2 = city2Factory.createCity();
cit2.setName(cityName);
Mayor mayor = city2Factory.createMayor();
mayor.setName(mayorName);
cit2.setMayor(mayor);
return cit2;
}
/**
* Reads data from a file into a list
*
* @param filename
* @return
* @throws IOException
*/
public static List<String> readInputData(String filename) throws IOException{
ArrayList<String> list = new ArrayList<String>();
// ReadFile
File file = new File (filename);
FileInputStream fstream = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String line;
while ((line = br.readLine()) != null){
list.add(line);
}
br.close();
fstream.close();
return list;
}
}