Skip to content

Commit

Permalink
Application config is not available in main.js (#6608)
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Rodriguez committed Oct 24, 2018
1 parent 4dd1118 commit 06edb16
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,22 @@

import java.io.File;
import java.net.URL;
import java.util.Dictionary;
import java.util.List;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.ConfigurationAdmin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.Lists;

import com.enonic.xp.app.Application;
import com.enonic.xp.app.ApplicationKey;
import com.enonic.xp.config.ConfigBuilder;
import com.enonic.xp.config.Configuration;
import com.enonic.xp.core.impl.app.config.ApplicationConfigMap;
import com.enonic.xp.core.impl.app.resolver.ApplicationUrlResolver;
import com.enonic.xp.core.impl.app.resolver.BundleApplicationUrlResolver;
Expand All @@ -19,6 +27,10 @@

final class ApplicationFactory
{
private final static Logger LOG = LoggerFactory.getLogger( ApplicationFactory.class );

private final static Configuration EMPTY_CONFIG = ConfigBuilder.create().build();

private final RunMode runMode;

ApplicationFactory( final RunMode runMode )
Expand All @@ -36,9 +48,7 @@ public Application create( final Bundle bundle )
final ApplicationBuilder builder = new ApplicationBuilder();
builder.bundle( bundle );
builder.urlResolver( createUrlResolver( bundle ) );

final ApplicationKey key = ApplicationKey.from( bundle.getSymbolicName() );
builder.config( ApplicationConfigMap.INSTANCE.get( key ) );
builder.config( getConfig( bundle ) );
return builder.build();
}

Expand Down Expand Up @@ -94,4 +104,60 @@ private URL getSearchPathUrl( final String path )
return null;
}
}

private Configuration getConfig( final Bundle bundle )
{
final ApplicationKey key = ApplicationKey.from( bundle );
Configuration config = ApplicationConfigMap.INSTANCE.get( key );

if ( config != null )
{
return config;
}

config = loadConfig( bundle );
if ( config == null )
{
config = EMPTY_CONFIG;
}
else
{
ApplicationConfigMap.INSTANCE.put( key, config );
}

return config;
}

private Configuration loadConfig( final Bundle bundle )
{
BundleContext ctx = null;
ServiceReference<ConfigurationAdmin> serviceRef = null;

try
{
ctx = bundle.getBundleContext();
if ( ctx == null )
{
return null;
}
serviceRef = ctx.getServiceReference( ConfigurationAdmin.class );
ConfigurationAdmin configAdmin = ctx.getService( serviceRef );

org.osgi.service.cm.Configuration conf = configAdmin.getConfiguration( bundle.getSymbolicName() );
final Dictionary<String, Object> properties = conf.getProperties();
return properties == null ? null : ConfigBuilder.create().addAll( properties ).build();
}
catch ( Exception e )
{
LOG.warn( "Unable to load app configuration for " + bundle.getSymbolicName(), e );
return null;
}
finally
{
if ( ctx != null && serviceRef != null )
{
ctx.ungetService( serviceRef );
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,12 @@
import com.google.common.collect.Maps;

import com.enonic.xp.app.ApplicationKey;
import com.enonic.xp.config.ConfigBuilder;
import com.enonic.xp.config.Configuration;

public final class ApplicationConfigMap
{
public final static ApplicationConfigMap INSTANCE = new ApplicationConfigMap();

private final static Configuration EMPTY_CONFIG = ConfigBuilder.create().build();

private final Map<ApplicationKey, Configuration> map;

private ApplicationConfigMap()
Expand All @@ -23,7 +20,7 @@ private ApplicationConfigMap()

public Configuration get( final ApplicationKey key )
{
return this.map.getOrDefault( key, EMPTY_CONFIG );
return this.map.get( key );
}

public void put( final ApplicationKey key, final Configuration config )
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
package com.enonic.xp.core.impl.app;

import java.util.Dictionary;
import java.util.Hashtable;

import org.junit.Test;
import org.mockito.Mockito;
import org.ops4j.pax.tinybundles.core.TinyBundle;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.ConfigurationAdmin;

import com.enonic.xp.app.Application;
import com.enonic.xp.core.impl.app.resolver.ApplicationUrlResolver;
import com.enonic.xp.core.impl.app.resolver.BundleApplicationUrlResolver;
import com.enonic.xp.core.impl.app.resolver.MultiApplicationUrlResolver;
import com.enonic.xp.server.RunMode;

import static com.enonic.xp.core.impl.app.ApplicationHelper.X_BUNDLE_TYPE;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;

public class ApplicationFactoryTest
extends BundleBasedTest
Expand Down Expand Up @@ -69,6 +79,38 @@ public void createUrlResolver_dev_no_source()
assertTrue( resolver instanceof BundleApplicationUrlResolver );
}

@Test
public void create_app_config_not_loaded()
throws Exception
{
final Bundle bundle = Mockito.mock( Bundle.class );
Mockito.when( bundle.getSymbolicName() ).thenReturn( "app1" );

final Dictionary<String, String> headers = new Hashtable<>();
headers.put( X_BUNDLE_TYPE, "application" );
Mockito.when( bundle.getHeaders() ).thenReturn( headers );

final BundleContext ctx = Mockito.mock( BundleContext.class );
Mockito.when( bundle.getBundleContext() ).thenReturn( ctx );

final ServiceReference<ConfigurationAdmin> servRef = Mockito.mock( ServiceReference.class );
Mockito.when( ctx.getServiceReference( any( Class.class ) ) ).thenReturn( servRef );

final ConfigurationAdmin configAdmin = Mockito.mock( ConfigurationAdmin.class );
Mockito.when( ctx.getService( any() ) ).thenReturn( configAdmin );

final org.osgi.service.cm.Configuration cfg = Mockito.mock( org.osgi.service.cm.Configuration.class );
Mockito.when( configAdmin.getConfiguration( anyString() ) ).thenReturn( cfg );

final Dictionary<String, Object> props = new Hashtable<>();
props.put( "key", "value" );
Mockito.when( cfg.getProperties() ).thenReturn( props );

final Application app = new ApplicationFactory( RunMode.PROD ).create( bundle );
assertNotNull( app );
assertNotNull( app.getConfig() );
assertEquals( "value", app.getConfig().get( "key" ) );
}

private Bundle deploy( final String name, final boolean isApp, final boolean hasSourcePath )
throws Exception
Expand All @@ -88,7 +130,7 @@ private TinyBundle createBundleWithSourcePath( final String name, final boolean

if ( isApp )
{
tinyBundle.set( ApplicationHelper.X_BUNDLE_TYPE, "application" );
tinyBundle.set( X_BUNDLE_TYPE, "application" );
}

return tinyBundle;
Expand Down

0 comments on commit 06edb16

Please sign in to comment.