All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.dawnsci.nexus.builder.impl.DefaultNexusFileBuilder Maven / Gradle / Ivy

/*-
 *******************************************************************************
 * Copyright (c) 2015 Diamond Light Source Ltd.
 * 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:
 *    Matthew Dickie - initial API and implementation and/or initial documentation
 *******************************************************************************/

package org.eclipse.dawnsci.nexus.builder.impl;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.dawnsci.analysis.api.tree.TreeFile;
import org.eclipse.dawnsci.nexus.INexusFileFactory;
import org.eclipse.dawnsci.nexus.NXentry;
import org.eclipse.dawnsci.nexus.NXroot;
import org.eclipse.dawnsci.nexus.NexusException;
import org.eclipse.dawnsci.nexus.NexusFile;
import org.eclipse.dawnsci.nexus.NexusNodeFactory;
import org.eclipse.dawnsci.nexus.ServiceHolder;
import org.eclipse.dawnsci.nexus.builder.NexusEntryBuilder;
import org.eclipse.dawnsci.nexus.builder.NexusFileBuilder;
import org.eclipse.dawnsci.nexus.builder.NexusScanFile;
import org.eclipse.dawnsci.nexus.validation.NexusValidationException;

/**
 * Default implementation of {@link NexusFileBuilder}.
 */
public class DefaultNexusFileBuilder implements NexusFileBuilder {

	private final TreeFile treeFile;

	private final NXroot nxRoot;
	
	private Map entries = new HashMap<>();
	
	private boolean fileCreated = false;

	/**
	 * Creates a new {@link DefaultNexusFileBuilder}.
	 * @param filePath
	 */
	public DefaultNexusFileBuilder(final String filePath) {
		treeFile = NexusNodeFactory.createTreeFile(filePath);
		nxRoot = NexusNodeFactory.createNXroot();
		
		// TODO: do we need to set any attributes on root?
		nxRoot.setAttributeFile_name(filePath);
		treeFile.setGroupNode(nxRoot);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.dawnsci.nexus.builder.NexusFileBuilder#getNexusTree()
	 */
	@Override
	public TreeFile getNexusTree() {
		return treeFile;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.dawnsci.nexus.builder.NexusFileBuilder#getNxRoot()
	 */
	@Override
	public NXroot getNXroot() {
		return nxRoot;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.dawnsci.nexus.builder.NexusFileBuilder#newEntry()
	 */
	@Override
	public DefaultNexusEntryBuilder newEntry() throws NexusException {
		return newEntry("entry");
	}

	/* (non-Javadoc)
	 * @see org.eclipse.dawnsci.nexus.builder.NexusFileBuilder#newEntry(java.lang.String)
	 */
	@Override
	public DefaultNexusEntryBuilder newEntry(String entryName) throws NexusException {
		if (entries.containsKey(entryName)) {
			throw new NexusException("An entry with the name " + entryName + " already exists");
		}
		
		final NXentry entry = NexusNodeFactory.createNXentry();
		nxRoot.setEntry(entryName, entry);

		DefaultNexusEntryBuilder entryModel = new DefaultNexusEntryBuilder(entryName, entry);
		entries.put(entryName, entryModel);
		
		return entryModel;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.dawnsci.nexus.builder.NexusFileBuilder#validate()
	 */
	@Override
	public void validate() throws NexusValidationException {
		for (NexusEntryBuilder entry : entries.values()) {
			entry.validate();
		}
	}

	/* (non-Javadoc)
	 * @see org.eclipse.dawnsci.nexus.builder.NexusFileBuilder#createFile(boolean)
	 */
	@Override
	public NexusScanFile createFile(boolean async) throws NexusException {
		if (fileCreated) {
			throw new IllegalStateException("The Nexus file has already been created");
		}
		
		final String filename = treeFile.getFilename();
		
		// create the parent dir if it doesn't exist
		File parentDir = new File(filename).getParentFile();
		if (!parentDir.exists()) {
			parentDir.mkdirs();
		}
		
		// create and open the nexus file
		final INexusFileFactory nexusFileFactory = ServiceHolder.getNexusFileFactory();
		try (NexusFile nexusFile = nexusFileFactory.newNexusFile(filename, true)) {
			nexusFile.createAndOpenToWrite();
			nexusFile.setWritesAsync(async);
			// save the content of the TreeFile into the nexus file
			nexusFile.addNode("/", treeFile.getGroupNode());
			nexusFile.flush();
			fileCreated = true;
			return new DefaultNexusScanFile(filename);
		} // NexusFile is auto-closed
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy