/*- ******************************************************************************* * Copyright (c) 2011, 2016 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 Gerring - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.dawnsci.nexus.builder.impl; import static org.eclipse.dawnsci.nexus.NXentry.NX_ENTRY_IDENTIFIER; import static org.eclipse.dawnsci.nexus.NXentry.NX_EXPERIMENT_IDENTIFIER; import static org.eclipse.dawnsci.nexus.NXentry.NX_PROGRAM_NAME; import static org.eclipse.dawnsci.nexus.NexusBaseClass.NX_SAMPLE; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.Matchers.sameInstance; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import java.util.Arrays; import org.eclipse.dawnsci.nexus.NXcollection; import org.eclipse.dawnsci.nexus.NXdetector; import org.eclipse.dawnsci.nexus.NXentry; import org.eclipse.dawnsci.nexus.NXinstrument; import org.eclipse.dawnsci.nexus.NXpositioner; import org.eclipse.dawnsci.nexus.NXsample; import org.eclipse.dawnsci.nexus.NXsource; import org.eclipse.dawnsci.nexus.NexusApplicationDefinition; import org.eclipse.dawnsci.nexus.NexusBaseClass; import org.eclipse.dawnsci.nexus.NexusException; import org.eclipse.dawnsci.nexus.NexusNodeFactory; import org.eclipse.dawnsci.nexus.builder.AbstractNexusObjectProvider; import org.eclipse.dawnsci.nexus.builder.CustomNexusEntryModification; import org.eclipse.dawnsci.nexus.builder.NexusEntryBuilder; import org.eclipse.dawnsci.nexus.builder.NexusEntryModification; import org.eclipse.dawnsci.nexus.builder.NexusObjectProvider; import org.eclipse.dawnsci.nexus.builder.appdef.NexusApplicationBuilder; import org.eclipse.dawnsci.nexus.builder.data.NexusDataBuilder; import org.eclipse.dawnsci.nexus.validation.NexusValidationException; import org.junit.Before; import org.junit.Test; public class DefaultNexusEntryBuilderTest { public static class TestPositioner extends AbstractNexusObjectProvider<NXpositioner> { public TestPositioner() { super("positioner", NexusBaseClass.NX_POSITIONER, NXpositioner.NX_VALUE); } public TestPositioner(String name) { super(name, NexusBaseClass.NX_POSITIONER); } @Override protected NXpositioner createNexusObject() { return NexusNodeFactory.createNXpositioner(); } } public static class TestDetector extends AbstractNexusObjectProvider<NXdetector> { public TestDetector() { super("detector", NexusBaseClass.NX_DETECTOR); } @Override protected NXdetector createNexusObject() { return NexusNodeFactory.createNXdetector(); } } public static class TestSource extends AbstractNexusObjectProvider<NXsource> { public TestSource() { super("source", NexusBaseClass.NX_SOURCE); } @Override protected NXsource createNexusObject() { return NexusNodeFactory.createNXsource(); } } private CustomNexusEntryModification customModification = new CustomNexusEntryModification() { @Override public void modifyEntry(NXentry entry) { entry.setField("foo", "bar"); } }; private NexusEntryBuilder entryBuilder; private NXentry nxEntry; @Before public void setUp() throws Exception { entryBuilder = new DefaultNexusFileBuilder("test").newEntry(); nxEntry = entryBuilder.getNXentry(); } @Test public void testGetNXentry() { assertThat(entryBuilder.getNXentry(), notNullValue(NXentry.class)); } @Test public void testAddDefaultGroups() { assertThat(nxEntry.getNumberOfGroupNodes(), is(0)); entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(nxEntry.getInstrument(), notNullValue(NXinstrument.class)); assertThat(nxEntry.getSample(), notNullValue(NXsample.class)); } @Test public void testAdd() throws NexusException { entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); NXinstrument instrument = nxEntry.getInstrument(); assertThat(instrument.getNumberOfGroupNodes(), is(0)); TestPositioner positionerProvider = new TestPositioner(); entryBuilder.add(positionerProvider); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(instrument.getNumberOfGroupNodes(), is(1)); assertThat(instrument.getPositioner(), is(sameInstance(positionerProvider.getNexusObject()))); } @Test public void testAdd_namedGroup() throws NexusException { entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); NXinstrument instrument = nxEntry.getInstrument(); assertThat(instrument.getNumberOfGroupNodes(), is(0)); TestPositioner positionerProvider = new TestPositioner("x"); entryBuilder.add(positionerProvider); assertThat(instrument.getNumberOfGroupNodes(), is(1)); assertThat(instrument.getPositioner(), is(nullValue())); assertThat(instrument.getPositioner("x"), is(sameInstance(positionerProvider.getNexusObject()))); } @Test public void testAdd_positionerWithCollectionName() throws NexusException { entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); NXinstrument instrument = nxEntry.getInstrument(); assertThat(instrument.getNumberOfGroupNodes(), is(0)); AbstractNexusObjectProvider<NXpositioner> positioner = new TestPositioner("xPos"); positioner.setCollectionName("scannables"); entryBuilder.add(positioner); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(instrument.getNumberOfGroupNodes(), is(1)); NXcollection collection = instrument.getCollection("scannables"); assertNotNull(collection); NXpositioner xPositioner = (NXpositioner) collection.getGroupNode("xPos"); assertNotNull(xPositioner); assertThat(xPositioner, is(sameInstance(positioner.getNexusObject()))); } @Test public void testAdd_samplePositioner() throws NexusException { entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); NXinstrument instrument = nxEntry.getInstrument(); assertThat(instrument.getNumberOfGroupNodes(), is(0)); NXsample sample = nxEntry.getSample(); assertThat(sample.getNumberOfGroupNodes(), is(0)); TestPositioner positionerProvider = new TestPositioner(); positionerProvider.setCategory(NX_SAMPLE); entryBuilder.add(positionerProvider); assertThat(instrument.getNumberOfGroupNodes(), is(0)); assertThat(sample.getNumberOfGroupNodes(), is(1)); assertThat(sample.getPositioner(), is(sameInstance(positionerProvider.getNexusObject()))); } @Test public void testAdd_sample() throws NexusException { NexusObjectProvider<NXsample> sampleProvider = new AbstractNexusObjectProvider<NXsample>("sample", NexusBaseClass.NX_SAMPLE) { @Override protected NXsample createNexusObject() { return NexusNodeFactory.createNXsample(); } }; entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); NXsample oldSample = nxEntry.getSample(); assertThat(oldSample, is(notNullValue())); entryBuilder.add(sampleProvider); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(nxEntry.getSample(), is(sameInstance(sampleProvider.getNexusObject()))); assertThat(nxEntry.getSample(), is(not(sameInstance(oldSample)))); } @Test public void testAddAll() throws NexusException { TestPositioner xPositioner = new TestPositioner("x"); TestPositioner yPositioner = new TestPositioner("y"); TestPositioner zPositioner = new TestPositioner("z"); TestDetector detector = new TestDetector(); TestPositioner samplePositioner = new TestPositioner(); samplePositioner.setCategory(NX_SAMPLE); entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); NXinstrument instrument = nxEntry.getInstrument(); assertThat(instrument.getNumberOfGroupNodes(), is(0)); NXsample sample = nxEntry.getSample(); assertThat(sample.getNumberOfGroupNodes(), is(0)); entryBuilder.addAll(Arrays.asList(xPositioner, yPositioner, zPositioner, samplePositioner, detector)); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(instrument.getNumberOfGroupNodes(), is(4)); assertThat(instrument.getPositioner("x"), is(sameInstance(xPositioner.getNexusObject()))); assertThat(instrument.getPositioner("y"), is(sameInstance(yPositioner.getNexusObject()))); assertThat(instrument.getPositioner("z"), is(sameInstance(zPositioner.getNexusObject()))); assertThat(instrument.getDetector(), is(sameInstance(detector.getNexusObject()))); assertThat(sample.getPositioner(), is(sameInstance(samplePositioner.getNexusObject()))); } @Test public void testAddMetadata() throws NexusException { entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(nxEntry.getNumberOfDataNodes(), is(0)); MapBasedMetadataProvider metadata = new MapBasedMetadataProvider(); metadata.addMetadataEntry(NX_ENTRY_IDENTIFIER, "12345"); metadata.addMetadataEntry(NX_EXPERIMENT_IDENTIFIER, "myexperiment"); metadata.addMetadataEntry(NX_PROGRAM_NAME, "GDA 8.36.0"); metadata.addMetadataEntry("scan_command", "scan foo bar etc"); metadata.addMetadataEntry("scan_identifier", "a3d668c0-e3c4-4ed9-b127-4a202b2b6bac"); metadata.addMetadataEntry(NXentry.NX_TITLE, "Test Scan"); entryBuilder.addMetadata(metadata); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(nxEntry.getNumberOfDataNodes(), is(6)); assertThat(nxEntry.getEntry_identifierScalar(), is(equalTo("12345"))); assertThat(nxEntry.getExperiment_identifierScalar(), is(equalTo("myexperiment"))); assertThat(nxEntry.getProgram_nameScalar(), is(equalTo("GDA 8.36.0"))); assertThat(nxEntry.getString("scan_command"), is(equalTo("scan foo bar etc"))); assertThat(nxEntry.getString("scan_identifier"), is(equalTo("a3d668c0-e3c4-4ed9-b127-4a202b2b6bac"))); assertThat(nxEntry.getTitleScalar(), is(equalTo("Test Scan"))); } @Test public void testModifyEntry() throws Exception { assertThat(nxEntry.getDataNode("foo"), is(nullValue())); entryBuilder.modifyEntry(customModification); assertThat(nxEntry.getDataNode("foo").getString(), is(equalTo("bar"))); } @Test public void testModifyEntry_nexusObjectProvider() throws Exception { entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); NXinstrument instrument = nxEntry.getInstrument(); assertThat(instrument.getNumberOfGroupNodes(), is(0)); TestPositioner positionerProvider = new TestPositioner(); entryBuilder.modifyEntry(positionerProvider); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(instrument.getNumberOfGroupNodes(), is(1)); assertThat(instrument.getPositioner(), is(sameInstance(positionerProvider.getNexusObject()))); } @Test public void testModifyEntry_metadataProvider() throws Exception { entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(nxEntry.getNumberOfDataNodes(), is(0)); MapBasedMetadataProvider metadata = new MapBasedMetadataProvider(); metadata.addMetadataEntry(NX_ENTRY_IDENTIFIER, "12345"); metadata.addMetadataEntry(NXentry.NX_TITLE, "Test Scan"); entryBuilder.addMetadata(metadata); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(nxEntry.getNumberOfDataNodes(), is(2)); assertThat(nxEntry.getEntry_identifierScalar(), is(equalTo("12345"))); assertThat(nxEntry.getTitleScalar(), is(equalTo("Test Scan"))); } @Test public void testModifyEntry_customModification() throws Exception { assertThat(nxEntry.getDataNode("foo"), is(nullValue())); entryBuilder.modifyEntry((NexusEntryModification) customModification); assertThat(nxEntry.getDataNode("foo").getString(), is(equalTo("bar"))); } @Test public void testModifyEntry_collection() throws Exception { entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); NXinstrument instrument = nxEntry.getInstrument(); assertThat(instrument.getNumberOfGroupNodes(), is(0)); assertThat(nxEntry.getDataNode("foo"), is(nullValue())); TestPositioner positionerProvider = new TestPositioner(); MapBasedMetadataProvider metadata = new MapBasedMetadataProvider(); metadata.addMetadataEntry(NX_ENTRY_IDENTIFIER, "12345"); metadata.addMetadataEntry(NXentry.NX_TITLE, "Test Scan"); entryBuilder.modifyEntry(Arrays.asList(positionerProvider, metadata, customModification)); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(instrument.getNumberOfGroupNodes(), is(1)); assertThat(instrument.getPositioner(), is(sameInstance(positionerProvider.getNexusObject()))); assertThat(nxEntry.getEntry_identifierScalar(), is(equalTo("12345"))); assertThat(nxEntry.getTitleScalar(), is(equalTo("Test Scan"))); } @Test public void testCreateDefaultData() throws Exception { entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(nxEntry.getData(), is(nullValue())); NexusDataBuilder dataBuilder = entryBuilder.createDefaultData(); assertThat(dataBuilder, is(notNullValue())); assertThat(nxEntry.getNumberOfGroupNodes(), is(4)); assertThat(nxEntry.getData(), is(notNullValue())); assertThat(dataBuilder.getNxData(), is(sameInstance(nxEntry.getData()))); } @Test public void testNewData() throws Exception { entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(nxEntry.getData(), is(nullValue())); NexusDataBuilder dataBuilder = entryBuilder.newData("testdata"); assertThat(dataBuilder, is(notNullValue())); assertThat(nxEntry.getNumberOfGroupNodes(), is(4)); assertThat(nxEntry.getData(), is(nullValue())); assertThat(nxEntry.getData("testdata"), is(notNullValue())); assertThat(dataBuilder.getNxData(), is(sameInstance(nxEntry.getData("testdata")))); } @Test public void testSetInstrumentName() throws Exception { entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(nxEntry.getData(), is(nullValue())); NXinstrument instrument = nxEntry.getInstrument(); assertThat(instrument.getNumberOfGroupNodes(), is(0)); assertThat(instrument.getNumberOfDataNodes(), is(0)); assertThat(instrument.getName(), is(nullValue())); entryBuilder.setInstrumentName("i13"); assertThat(instrument.getNumberOfDataNodes(), is(1)); assertThat(instrument.getName().getString(), is(equalTo("i13"))); assertThat(instrument.getNameScalar(), is(equalTo("i13"))); } @Test public void testNewApplication() throws Exception { entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(nxEntry.getData(), is(nullValue())); NexusApplicationBuilder app = entryBuilder.newApplication(NexusApplicationDefinition.NX_TOMO); assertThat(app, is(notNullValue())); assertThat(nxEntry.getNumberOfGroupNodes(), is(4)); assertThat(app.getNXsubentry(), is(sameInstance(nxEntry.getSubentry("tomo_entry")))); } @Test public void testNewApplication_subentryName() throws Exception { entryBuilder.addDefaultGroups(); assertThat(nxEntry.getNumberOfGroupNodes(), is(3)); assertThat(nxEntry.getData(), is(nullValue())); NexusApplicationBuilder app = entryBuilder.newApplication("appdef", NexusApplicationDefinition.NX_TOMO); assertThat(app, is(notNullValue())); assertThat(nxEntry.getNumberOfGroupNodes(), is(4)); assertThat(app.getNXsubentry(), is(sameInstance(nxEntry.getSubentry("appdef")))); } @Test public void testGetDataNode() throws Exception { entryBuilder.addDefaultGroups(); nxEntry.setTitleScalar("My Entry"); nxEntry.getInstrument().setNameScalar("My instrument"); assertThat(entryBuilder.getDataNode("title").getString(), is(equalTo("My Entry"))); assertThat(entryBuilder.getDataNode("instrument/name").getString(), is(equalTo("My instrument"))); } @Test(expected = NexusException.class) public void testGetDataNode_NotExist() throws Exception { entryBuilder.getDataNode("doesnotexist"); } @Test(expected = NexusException.class) public void testGetDataNode_groupNode() throws Exception { entryBuilder.getDataNode("groupnode"); } @Test(expected = NexusValidationException.class) public void testValidate() throws Exception { // Note: this method used to use Mockito to validate that each subentry was validated, // however the plugin dependency on mockito appears to prevent plugin tests from running entryBuilder.newApplication("subentry1", NexusApplicationDefinition.NX_TOMO); entryBuilder.newApplication("subentry2", NexusApplicationDefinition.NX_TOMO); entryBuilder.validate(); // verify(subentry1).validate(); // verify(subentry2).validate(); // verifyNoMoreInteractions(subentry1, subentry2); } }