package org.pentaho.platform.engine.core.system.objfac;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.platform.api.engine.IObjectCreator;
import org.pentaho.platform.api.engine.IPentahoObjectReference;
import org.pentaho.platform.api.engine.IPentahoObjectRegistration;
import org.pentaho.platform.api.engine.IPentahoRegistrableObjectFactory;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.engine.core.system.PentahoSessionHolder;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.engine.core.system.StandaloneSession;
import org.pentaho.platform.engine.core.system.objfac.references.PrototypePentahoObjectReference;
import org.pentaho.platform.engine.core.system.objfac.references.SingletonPentahoObjectReference;
import java.util.Collections;
import java.util.List;
import static org.junit.Assert.*;
/**
* Created by nbaker on 2/28/14.
*/
public class RuntimeObjectFactoryTest {
@Before
public void setUp() throws Exception {
PentahoSystem.clearObjectFactory();
}
@Test
public void testRegisterObject() throws Exception {
{
RuntimeObjectFactory factory = new RuntimeObjectFactory();
factory.registerObject( "hello", RuntimeObjectFactory.Types.CLASSES );
String out = factory.get( String.class, PentahoSessionHolder.getSession() );
assertEquals( "hello", out );
CharSequence out2 = factory.get( CharSequence.class, PentahoSessionHolder.getSession() );
assertNull( out2 );
} {
RuntimeObjectFactory factory = new RuntimeObjectFactory();
factory
.registerReference( new SingletonPentahoObjectReference<String>( String.class, "world" ),
RuntimeObjectFactory.Types.INTERFACES );
CharSequence out = factory.get( CharSequence.class, PentahoSessionHolder.getSession() );
assertEquals( "world", out );
} {
RuntimeObjectFactory factory = new RuntimeObjectFactory();
factory.registerObject( "world" );
String out = factory.get( String.class, PentahoSessionHolder.getSession() );
assertEquals( "world", out );
CharSequence out2 = factory.get( CharSequence.class, PentahoSessionHolder.getSession() );
assertEquals( "world", out2 );
}
}
@Test
public void testRegistrationWithSpecificClasses() throws Exception {
{
RuntimeObjectFactory factory = new RuntimeObjectFactory();
factory.registerObject( "hello", String.class );
String out = factory.get( String.class, PentahoSessionHolder.getSession() );
assertEquals( "hello", out );
CharSequence out2 = factory.get( CharSequence.class, PentahoSessionHolder.getSession() );
assertNull( out2 );
} {
RuntimeObjectFactory factory = new RuntimeObjectFactory();
factory
.registerReference( new SingletonPentahoObjectReference<String>( String.class, "world" ),
CharSequence.class );
CharSequence out = factory.get( CharSequence.class, PentahoSessionHolder.getSession() );
assertEquals( "world", out );
} {
RuntimeObjectFactory factory = new RuntimeObjectFactory();
factory.registerObject( "world" );
String out = factory.get( String.class, PentahoSessionHolder.getSession() );
assertEquals( "world", out );
CharSequence out2 = factory.get( CharSequence.class, PentahoSessionHolder.getSession() );
assertEquals( "world", out2 );
} {
RuntimeObjectFactory factory = new RuntimeObjectFactory();
factory
.registerReference( new SingletonPentahoObjectReference<String>( String.class, "world" ),
CharSequence.class, String.class );
CharSequence out = factory.get( CharSequence.class, PentahoSessionHolder.getSession() );
assertEquals( "world", out );
String out2 = factory.get( String.class, PentahoSessionHolder.getSession() );
assertSame( out, out2 );
}
}
@Test
public void testWithQuery() throws Exception {
{
RuntimeObjectFactory factory = new RuntimeObjectFactory();
factory
.registerReference(
new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "world" ).attributes(
Collections.<String, Object>singletonMap( "foo", "bar" ) ).build(), RuntimeObjectFactory.Types.CLASSES );
String out =
factory.get( String.class, PentahoSessionHolder.getSession(), Collections.singletonMap( "foo", "bar" ) );
assertEquals( "world", out );
out = factory.get( String.class, PentahoSessionHolder.getSession(), Collections.singletonMap( "foo", "baz" ) );
assertNull( out );
} {
// check the old fallback
RuntimeObjectFactory factory = new RuntimeObjectFactory();
factory.registerReference(
new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "world" ).attributes(
Collections.<String, Object>singletonMap( "id", "abcd" ) ).build(), RuntimeObjectFactory.Types.CLASSES );
factory
.registerReference(
new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "beater" ).attributes(
Collections.<String, Object>singletonMap( "id", "abcdef" ) ).build(), RuntimeObjectFactory.Types.CLASSES );
String out = factory.get( String.class, "abcd", PentahoSessionHolder.getSession() );
assertEquals( "world", out );
out = factory.get( String.class, "abcdef", PentahoSessionHolder.getSession() );
assertEquals( "beater", out );
// be sure that it falls-back to class if key not found
out = factory.get( String.class, "NOT THERE", PentahoSessionHolder.getSession() );
assertNotNull( out );
// and it should respond with null if nothing is there
assertNull( factory.get( Integer.class, "NOT THERE", PentahoSessionHolder.getSession() ) );
}
}
@Test
public void testNotImplementedMethods() throws Exception {
RuntimeObjectFactory factory = new RuntimeObjectFactory();
factory.init( "", null );
assertNull( factory.getImplementingClass( "aKey" ) );
assertFalse( factory.objectDefined( "aKey" ) );
}
@Test
public void testGetName() throws Exception {
RuntimeObjectFactory factory = new RuntimeObjectFactory();
assertEquals( "Runtime Object Factory", factory.getName() );
}
@Test
public void testPriority() throws Exception {
RuntimeObjectFactory factory = new RuntimeObjectFactory();
factory
.registerReference(
new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "higher" ).priority( 2 ).build(),
RuntimeObjectFactory.Types.CLASSES );
factory
.registerReference(
new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "lower" ).priority( 1 ).build(),
RuntimeObjectFactory.Types.CLASSES );
String out = factory.get( String.class, PentahoSessionHolder.getSession() );
assertEquals( "higher", out );
factory
.registerReference(
new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "highest" ).priority( 5 ).build(),
RuntimeObjectFactory.Types.CLASSES );
out = factory.get( String.class, PentahoSessionHolder.getSession() );
assertEquals( "highest", out );
}
@Test
public void testObjectDefined() throws Exception {
RuntimeObjectFactory factory = new RuntimeObjectFactory();
factory.registerObject( "hello", RuntimeObjectFactory.Types.CLASSES );
assertTrue( factory.objectDefined( String.class ) );
assertFalse( factory.objectDefined( Integer.class ) );
}
@Test
public void testGetAll() throws Exception {
RuntimeObjectFactory factory = new RuntimeObjectFactory();
factory
.registerReference(
new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "higher" ).priority( 2 ).build(),
RuntimeObjectFactory.Types.CLASSES );
factory
.registerReference(
new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "lower" ).priority( 1 ).build(),
RuntimeObjectFactory.Types.CLASSES );
List<String> out = factory.getAll( String.class, PentahoSessionHolder.getSession() );
assertEquals( 2, out.size() );
assertEquals( "higher", out.get( 0 ) );
assertEquals( "lower", out.get( 1 ) );
factory
.registerReference(
new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "highest" ).priority( 5 ).build(),
RuntimeObjectFactory.Types.CLASSES );
out = factory.getAll( String.class, PentahoSessionHolder.getSession() );
assertEquals( 3, out.size() );
assertEquals( "highest", out.get( 0 ) );
assertEquals( "higher", out.get( 1 ) );
assertEquals( "lower", out.get( 2 ) );
}
@Test
public void testGetAllWithQuery() throws Exception {
RuntimeObjectFactory factory = new RuntimeObjectFactory();
SingletonPentahoObjectReference.Builder<String> builder =
new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "world" )
.attributes( Collections.<String, Object>singletonMap( "foo", "bar" ) );
SingletonPentahoObjectReference<String> ref = builder.build();
SingletonPentahoObjectReference<String> ref2 = builder.build();
builder.attributes( Collections.<String, Object>singletonMap( "foo", "baz" ) );
SingletonPentahoObjectReference<String> ref3 = builder.build();
factory.registerReference( ref );
factory.registerReference( ref2 );
factory.registerReference( ref3 );
List<String> out = factory.getAll( String.class, PentahoSessionHolder.getSession() );
assertEquals( 3, out.size() );
out = factory.getAll( String.class, PentahoSessionHolder.getSession(), Collections.singletonMap( "foo", "bar" ) );
assertEquals( 2, out.size() );
}
@Test
public void testGetObjectReference() throws Exception {
IPentahoSession session = new StandaloneSession( "joe" );
RuntimeObjectFactory factory = new RuntimeObjectFactory();
final SingletonPentahoObjectReference<String>
something = new SingletonPentahoObjectReference<String>( String.class, "Something" );
factory.registerReference( something );
assertSame( something, factory.getObjectReference( String.class, session ) );
}
@Test
public void testGetObjectReferences() throws Exception {
IPentahoSession session = new StandaloneSession( "joe" );
RuntimeObjectFactory factory = new RuntimeObjectFactory();
final SingletonPentahoObjectReference<String> something1 =
new SingletonPentahoObjectReference<String>( String.class, "Something1", Collections.<String, Object>emptyMap(),
0 );
final SingletonPentahoObjectReference<String> something2 =
new SingletonPentahoObjectReference<String>( String.class, "Something2", Collections.<String, Object>emptyMap(),
1 );
factory.registerReference( something1 );
factory.registerReference( something2 );
List<String> out = factory.getAll( String.class, PentahoSessionHolder.getSession() );
assertEquals( 2, out.size() );
List<IPentahoObjectReference<String>> refs = factory.getObjectReferences( String.class, session );
assertSame( something1, refs.get( 1 ) );
assertSame( something2, refs.get( 0 ) );
}
@Test
public void testBadFactory() throws Exception {
PrototypePentahoObjectReference.Builder<String> builder =
new PrototypePentahoObjectReference.Builder<String>( String.class );
builder.creator( new IObjectCreator<String>() {
@Override public String create( IPentahoSession session ) {
throw new RuntimeException( "I am bad" );
}
} );
PrototypePentahoObjectReference<String> factoryReference = builder.build();
assertNull( factoryReference.getObject() );
}
@Test
public void testFactoriedReferencePriorities() throws Exception {
SingletonPentahoObjectReference.Builder<String> builder =
new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "something" );
SingletonPentahoObjectReference<String> r1 = builder.priority( 1 ).build();
SingletonPentahoObjectReference<String> r2 = builder.priority( 2 ).build();
SingletonPentahoObjectReference<String> r3 = builder.priority( 2 ).build();
assertTrue( r1.compareTo( r2 ) == -1 );
assertTrue( r2.compareTo( r1 ) == 1 );
assertTrue( r2.compareTo( r3 ) == 0 );
assertTrue( r1.compareTo( null ) == 1 );
assertTrue( r1.compareTo( r1 ) == 0 );
SingletonPentahoObjectReference.Builder<String> stringBuilder =
new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "Something" );
SingletonPentahoObjectReference<String> s1 = stringBuilder.priority( 1 ).build();
SingletonPentahoObjectReference<String> s2 = stringBuilder.priority( 2 ).build();
SingletonPentahoObjectReference<String> s3 = stringBuilder.priority( 2 ).build();
assertTrue( s1.compareTo( s2 ) == -1 );
assertTrue( s2.compareTo( s1 ) == 1 );
assertTrue( s2.compareTo( s3 ) == 0 );
assertTrue( s1.compareTo( null ) == 1 );
assertTrue( s1.compareTo( s1 ) == 0 );
}
@Test
public void testPentahoSystem() throws Exception {
PentahoSystem.registerObject( "Testing" );
assertEquals( "Testing", PentahoSystem.get( String.class ) );
PentahoSystem.clearObjectFactory();
PentahoSystem.registerObject( "Testing", IPentahoRegistrableObjectFactory.Types.INTERFACES );
assertNull( PentahoSystem.get( String.class ) );
assertEquals( "Testing", PentahoSystem.get( CharSequence.class ) );
PentahoSystem.clearObjectFactory();
PentahoSystem
.registerReference( new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "foo" ).build() );
assertEquals( "foo", PentahoSystem.get( String.class ) );
PentahoSystem.clearObjectFactory();
PentahoSystem
.registerReference( new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "foo" ).build(),
IPentahoRegistrableObjectFactory.Types.INTERFACES );
assertNull( PentahoSystem.get( String.class ) );
assertEquals( "foo", PentahoSystem.get( CharSequence.class ) );
PentahoSystem.clearObjectFactory();
PentahoSystem
.registerReference( new SingletonPentahoObjectReference.Builder<String>( String.class ).object( "foo" ).build(),
CharSequence.class );
assertNull( PentahoSystem.get( String.class ) );
assertEquals( "foo", PentahoSystem.get( CharSequence.class ) );
PentahoSystem.clearObjectFactory();
PentahoSystem.registerObject( "Testing", String.class );
assertEquals( "Testing", PentahoSystem.get( String.class ) );
}
@Test
public void testDeregistration() throws Exception {
PentahoSystem.clearObjectFactory();
final IPentahoObjectRegistration handle = PentahoSystem.registerObject( "Testing" );
assertEquals( "Testing", PentahoSystem.get( String.class ) );
handle.remove();
assertNull( PentahoSystem.get( String.class ) );
}
}