Skip to content

Commit

Permalink
refactor ServerComponents into multiple PlatformLevel classes
Browse files Browse the repository at this point in the history
  • Loading branch information
sns-seb committed May 20, 2015
1 parent 419f034 commit b691c1b
Show file tree
Hide file tree
Showing 10 changed files with 1,374 additions and 1,084 deletions.
Expand Up @@ -19,17 +19,28 @@
*/ */
package org.sonar.server.platform; package org.sonar.server.platform;


import java.util.Collection;
import java.util.List;
import java.util.Properties;

import javax.annotation.CheckForNull;
import javax.servlet.ServletContext;

import org.sonar.api.platform.Server; import org.sonar.api.platform.Server;
import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers; import org.sonar.api.utils.log.Loggers;
import org.sonar.api.utils.log.Profiler;
import org.sonar.core.persistence.DatabaseVersion; import org.sonar.core.persistence.DatabaseVersion;
import org.sonar.core.platform.ComponentContainer; import org.sonar.core.platform.ComponentContainer;
import org.sonar.server.platform.platformlevel.PlatformLevel;
import org.sonar.server.platform.platformlevel.PlatformLevel1;
import org.sonar.server.platform.platformlevel.PlatformLevel2;
import org.sonar.server.platform.platformlevel.PlatformLevel3;
import org.sonar.server.platform.platformlevel.PlatformLevel4;
import org.sonar.server.platform.platformlevel.PlatformLevelSafeMode;
import org.sonar.server.platform.platformlevel.PlatformLevelStartup;


import javax.annotation.CheckForNull; import com.google.common.collect.Lists;
import javax.servlet.ServletContext;

import java.util.Collection;
import java.util.Properties;


/** /**
* @since 2.2 * @since 2.2
Expand All @@ -40,11 +51,14 @@ public class Platform {


private static final Platform INSTANCE = new Platform(); private static final Platform INSTANCE = new Platform();


private ServerComponents serverComponents; private Properties properties;
private ComponentContainer level1Container, level2Container, safeModeContainer, level3Container, level4Container; private ServletContext servletContext;
private ComponentContainer currentContainer; private PlatformLevel level1, level2, levelSafeMode, level3, level4;
private PlatformLevel currentLevel;
private boolean dbConnected = false; private boolean dbConnected = false;
private boolean started = false; private boolean started = false;
private final List<Object> level4AddedComponents = Lists.newArrayList();
private final Profiler profiler = Profiler.createIfTrace(Loggers.get(Platform.class));


public Platform() { public Platform() {
} }
Expand Down Expand Up @@ -72,11 +86,12 @@ public static <T> T component(Class<T> type) {
} }


public void init(Properties properties, ServletContext servletContext) { public void init(Properties properties, ServletContext servletContext) {
serverComponents = new ServerComponents(this, properties, servletContext); this.properties = properties;
this.servletContext = servletContext;
if (!dbConnected) { if (!dbConnected) {
startLevel1Container(); startLevel1Container();
startLevel2Container(); startLevel2Container();
currentContainer = level2Container; currentLevel = level2;
dbConnected = true; dbConnected = true;
} }
} }
Expand All @@ -94,13 +109,13 @@ protected void doStart(Startup startup) {
if (requireSafeMode()) { if (requireSafeMode()) {
LOGGER.info("DB needs migration, entering safe mode"); LOGGER.info("DB needs migration, entering safe mode");
startSafeModeContainer(); startSafeModeContainer();
currentContainer = safeModeContainer; currentLevel = levelSafeMode;
started = true; started = true;
} else { } else {
startLevel34Containers(); startLevel34Containers();
executeStartupTasks(startup); executeStartupTasks(startup);
// switch current container last to avoid giving access to a partially initialized container // switch current container last to avoid giving access to a partially initialized container
currentContainer = level4Container; currentLevel = level4;
started = true; started = true;


// stop safemode container if it existed // stop safemode container if it existed
Expand All @@ -113,8 +128,9 @@ public void restart() {
} }


protected void restart(Startup startup) { protected void restart(Startup startup) {
// switch currentContainer on level1 now to avoid exposing a container in the process of stopping
currentContainer = level1Container; // switch currentLevel on level1 now to avoid exposing a container in the process of stopping
currentLevel = level1;


// stop containers // stop containers
stopSafeModeContainer(); stopSafeModeContainer();
Expand All @@ -124,7 +140,7 @@ protected void restart(Startup startup) {
startLevel2Container(); startLevel2Container();
startLevel34Containers(); startLevel34Containers();
executeStartupTasks(startup); executeStartupTasks(startup);
currentContainer = level4Container; currentLevel = level4;
} }


private boolean requireSafeMode() { private boolean requireSafeMode() {
Expand All @@ -143,10 +159,10 @@ public Status status() {
if (!started) { if (!started) {
return Status.BOOTING; return Status.BOOTING;
} }
if (safeModeContainer != null && currentContainer == safeModeContainer) { if (levelSafeMode != null && currentLevel == levelSafeMode) {
return Status.SAFEMODE; return Status.SAFEMODE;
} }
if (currentContainer == level4Container) { if (currentLevel == level4) {
return Status.UP; return Status.UP;
} }
return Status.BOOTING; return Status.BOOTING;
Expand All @@ -156,30 +172,22 @@ public Status status() {
* Starts level 1 * Starts level 1
*/ */
private void startLevel1Container() { private void startLevel1Container() {
level1Container = new ComponentContainer(); level1 = start(new PlatformLevel1(this, properties, servletContext));
level1Container.addSingletons(serverComponents.level1Components());
level1Container.startComponents();
} }


/** /**
* Starts level 2 * Starts level 2
*/ */
private void startLevel2Container() { private void startLevel2Container() {
level2Container = level1Container.createChild(); level2 = start(new PlatformLevel2(level1));
level2Container.addSingletons(serverComponents.level2Components());
level2Container.startComponents();
} }


/** /**
* Starts level 3 and 4 * Starts level 3 and 4
*/ */
private void startLevel34Containers() { private void startLevel34Containers() {
level3Container = level2Container.createChild(); level3 = start(new PlatformLevel3(level2));
level3Container.addSingletons(serverComponents.level3Components()); level4 = start(new PlatformLevel4(level3, level4AddedComponents));
level3Container.startComponents();

level4Container = level3Container.createChild();
serverComponents.startLevel4Components(level4Container);
} }


public void executeStartupTasks() { public void executeStartupTasks() {
Expand All @@ -188,23 +196,36 @@ public void executeStartupTasks() {


private void executeStartupTasks(Startup startup) { private void executeStartupTasks(Startup startup) {
if (startup.ordinal() >= Startup.ALL.ordinal()) { if (startup.ordinal() >= Startup.ALL.ordinal()) {
serverComponents.executeStartupTasks(level4Container); new PlatformLevelStartup(level4)
.configure()
.start()
.stop()
.destroy();
} }
} }


private void startSafeModeContainer() { private void startSafeModeContainer() {
safeModeContainer = level2Container.createChild(); levelSafeMode = start(new PlatformLevelSafeMode(level2));
safeModeContainer.addSingletons(serverComponents.safeModeComponents()); }
safeModeContainer.startComponents();
private PlatformLevel start(PlatformLevel platformLevel) {
profiler.start();
platformLevel.configure();
profiler.stopTrace(String.format("%s configured", platformLevel.getName()));
profiler.start();
platformLevel.start();
profiler.stopTrace(String.format("%s started", platformLevel.getName()));

return platformLevel;
} }


/** /**
* Stops level 1 * Stops level 1
*/ */
private void stopLevel1Container() { private void stopLevel1Container() {
if (level1Container != null) { if (level1 != null) {
level1Container.stopComponents(); level1.stop();
level1Container = null; level1 = null;
} }
} }


Expand All @@ -215,11 +236,11 @@ private void stopLevel1Container() {
* {@link ComponentContainer#stopComponents()}). * {@link ComponentContainer#stopComponents()}).
*/ */
private void stopLevel234Containers() { private void stopLevel234Containers() {
if (level2Container != null) { if (level2 != null) {
level2Container.stopComponents(); level2.stop();
level2Container = null; level2 = null;
level3Container = null; level3 = null;
level4Container = null; level4 = null;
} }
} }


Expand All @@ -230,9 +251,9 @@ private void stopLevel234Containers() {
* see {@link ComponentContainer#stopComponents()}). * see {@link ComponentContainer#stopComponents()}).
*/ */
private void stopSafeModeContainer() { private void stopSafeModeContainer() {
if (safeModeContainer != null) { if (levelSafeMode != null) {
safeModeContainer.stopComponents(); levelSafeMode.stop();
safeModeContainer = null; levelSafeMode = null;
} }
} }


Expand All @@ -247,28 +268,28 @@ public void doStop() {
stopSafeModeContainer(); stopSafeModeContainer();
stopLevel234Containers(); stopLevel234Containers();
stopLevel1Container(); stopLevel1Container();
currentContainer = null; currentLevel = null;
dbConnected = false; dbConnected = false;
started = false; started = false;
} catch (Exception e) { } catch (Exception e) {
LOGGER.debug("Fail to stop server - ignored", e); LOGGER.debug("Fail to stop server - ignored", e);
} }
} }


public void addComponents(Collection components) { public void addComponents(Collection<?> components) {
serverComponents.addComponents(components); level4AddedComponents.addAll(components);
} }


public ComponentContainer getContainer() { public ComponentContainer getContainer() {
return currentContainer; return currentLevel.getContainer();
} }


public Object getComponent(Object key) { public Object getComponent(Object key) {
return getContainer().getComponentByKey(key); return getContainer().getComponentByKey(key);
} }


public enum Status { public enum Status {
BOOTING, SAFEMODE, UP; BOOTING, SAFEMODE, UP
} }


public enum Startup { public enum Startup {
Expand Down

0 comments on commit b691c1b

Please sign in to comment.