/*******************************************************************************
* Copyright (c) 2011 Subgraph.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Subgraph - initial API and implementation
******************************************************************************/
package com.subgraph.vega.internal.model;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import com.subgraph.vega.api.model.IWorkspaceEntry;
import com.subgraph.vega.api.paths.IPathFinder;
public class WorkspaceEntries {
private final static int MAX_WORKSPACE_INDEX = 1000;
private final static int DEFAULT_WORKSPACE_INDEX = 0;
private final Logger logger = Logger.getLogger("model");
private final File workspaceDirectory;
private final IWorkspaceEntry[] entryArray = new IWorkspaceEntry[MAX_WORKSPACE_INDEX + 1];
WorkspaceEntries(IPathFinder pathFinder) {
this.workspaceDirectory = pathFinder.getWorkspaceDirectory();
loadWorkspaceEntries();
}
private void loadWorkspaceEntries() {
if(!workspaceDirectory.exists()) {
if(!workspaceDirectory.mkdirs()) {
logger.warning("Failed to create workspace directory: "+ workspaceDirectory);
return;
}
}
if(!workspaceDirectory.isDirectory()) {
logger.warning("Workspace directory name exists but is not a directory: "+ workspaceDirectory);
return;
}
for(File ws: workspaceDirectory.listFiles()) {
final WorkspaceEntry entry = WorkspaceEntry.createFromPath(ws);
if(entry != null) {
entryArray[entry.getIndex()] = entry;
}
}
if(entryArray[DEFAULT_WORKSPACE_INDEX] == null)
entryArray[DEFAULT_WORKSPACE_INDEX] = createDefaultWorkspace();
}
private WorkspaceEntry createDefaultWorkspace() {
return createWorkspace(DEFAULT_WORKSPACE_INDEX, "default");
}
private WorkspaceEntry createWorkspace(int index, String name) {
final File path = indexToWorkspacePath(index);
final File nameFile = new File(path, ".name");
if(path.exists())
throw new IllegalStateException("Workspace directory already exists "+ path);
if(!path.mkdirs()) {
logger.warning("Failed to make directory while creating workspace: "+ path);
return null;
}
final Writer writer = openNameFileWriter(nameFile);
if(writer == null)
return null;
try {
writer.write(name +"\n");
return new WorkspaceEntry(name, index, false, path);
} catch (IOException e) {
logger.warning("I/O error writing to name file while creating workspace "+ nameFile);
return null;
} finally {
try {
writer.close();
} catch (IOException e) {}
}
}
private Writer openNameFileWriter(File nameFile) {
try {
final FileOutputStream out = new FileOutputStream(nameFile);
return new OutputStreamWriter(out);
} catch (FileNotFoundException e) {
logger.warning("Failed to open name file for writing :"+ nameFile);
return null;
}
}
private File indexToWorkspacePath(int index) {
if(index < 0 || index > MAX_WORKSPACE_INDEX)
throw new IllegalArgumentException("Workspace index out of range (0 - "+ MAX_WORKSPACE_INDEX +") : "+ index);
final String indexStr = String.format("%02d", index);
return new File(workspaceDirectory, indexStr);
}
List<IWorkspaceEntry> getWorkspaceEntries() {
final List<IWorkspaceEntry> entryList = new ArrayList<IWorkspaceEntry>();
for(int i = 0; i <= MAX_WORKSPACE_INDEX; i++)
if(entryArray[i] != null)
entryList.add(entryArray[i]);
return entryList;
}
IWorkspaceEntry getDefaultWorkspaceEntry() {
IWorkspaceEntry firstEntry = null;
for(int i = 0; i <= MAX_WORKSPACE_INDEX; i++) {
IWorkspaceEntry entry = entryArray[i];
if(entry != null) {
if(entry.isAutostart())
return entry;
else if(firstEntry == null)
firstEntry = entry;
}
}
if(firstEntry == null)
throw new IllegalStateException("No default workspace entry found");
return firstEntry;
}
}