/* * Copyright 2007 - 2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.sf.jailer.ui; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import net.sf.jailer.datamodel.DataModel; import net.sf.jailer.util.CsvFile; import net.sf.jailer.util.Pair; /** * Methods for managing data model files and folders. * * @author Ralf Wisser */ public class DataModelManager { /** * Gets names of all model folders. Including <code>null</code> for the * default model. */ public static List<String> getModelFolderNames() { File dmFolder = new File(getBaseFolder()); List<String> folders = new ArrayList<String>(); if (new File(dmFolder, DataModel.TABLE_CSV_FILE).exists()) { folders.add(null); } File[] files = dmFolder.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { if (new File(f, DataModel.TABLE_CSV_FILE).exists()) { folders.add(f.getName()); } } } } return folders; } private static String getBaseFolder() { return CommandLineInstance.getExecutionContext().getQualifiedDatamodelFolder(); } /** * Deletes a Data Model. * * @param modelFolder * folder name, <code>null</code> for the default model */ public static boolean deleteModel(String modelFolder) { String dir = getBaseFolder() + File.separator + (modelFolder != null ? modelFolder + File.separator : ""); File nameFile = new File(dir + DataModel.TABLE_CSV_FILE); try { copyFile(nameFile, new File(dir + DataModel.TABLE_CSV_FILE + ".bak")); } catch (Exception e) { // ignore } if (!nameFile.delete()) { return false; } if (modelFolder != null) { nameFile.getParentFile().renameTo(new File(getBaseFolder() + File.separator + modelFolder + ".bak")); } return true; } /** * Gets display name and last-modified timestamp of a given model folders as * a pair. * * @param modelFolder * folder name, <code>null</code> for the default model */ public static Pair<String, Long> getModelDetails(String modelFolder) { File nameFile = new File( getBaseFolder() + File.separator + (modelFolder != null ? modelFolder + File.separator : "") + DataModel.MODELNAME_CSV_FILE); String name = null; Long lastModified = null; try { if (nameFile.exists()) { List<CsvFile.Line> nameList = new ArrayList<CsvFile.Line>(new CsvFile(nameFile).getLines()); if (nameList.size() > 0) { CsvFile.Line line = nameList.get(0); name = line.cells.get(0); lastModified = Long.parseLong(line.cells.get(1)); } } } catch (Throwable t) { // keep defaults } if (name == null) { if (modelFolder == null) { name = "Default"; } else { name = modelFolder; } } return new Pair<String, Long>(name, lastModified); } public static void main(String[] args) throws Exception { CommandLineInstance.init(args); for (String s : getModelFolderNames()) { System.out.println(s + " -> " + getModelDetails(s)); } } /** * Sets folder of current data model. * * @param modelFolder * the folder, <code>null</code> for default model */ public static void setCurrentModelSubfolder(String modelFolder) { CommandLineInstance.getExecutionContext().setCurrentModelSubfolder(modelFolder); } /** * Gets folder of current data model. * * @return modelFolder the folder, <code>null</code> for default model */ public static String getCurrentModelSubfolder() { return CommandLineInstance.getExecutionContext().getCurrentModelSubfolder(); } /** * Creates a new model * * @param newName * model name * @param folderName * folder name * @throws IOException */ public static void createNewModel(String newName, String folderName) throws IOException { setCurrentModelSubfolder(null); File modelFolder = new File(getBaseFolder() + File.separator + folderName); if (modelFolder.exists()) { throw new IOException("Folder \"" + modelFolder.getAbsolutePath() + "\" already exists"); } if (!modelFolder.mkdir()) { throw new IOException("Unable to create folder \"" + modelFolder.getAbsolutePath() + "\""); } setCurrentModelSubfolder(folderName); for (String file : new String[] { DataModel.getTablesFile(CommandLineInstance.getExecutionContext()), DataModel.getAssociationsFile(CommandLineInstance.getExecutionContext()), DataModel.getColumnsFile(CommandLineInstance.getExecutionContext()) }) { File toCreate = new File(file); BufferedWriter out = new BufferedWriter(new FileWriter(toCreate)); out.write(" "); out.close(); } DataModelEditor.createNameFile(newName); } private static void copyFile(File in, File out) throws Exception { FileInputStream fis = new FileInputStream(in); FileOutputStream fos = new FileOutputStream(out); byte[] buf = new byte[16 * 1024]; int i = 0; while ((i = fis.read(buf)) != -1) { fos.write(buf, 0, i); } fis.close(); fos.close(); } }