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;

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.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.api.utils.log.Profiler;
import org.sonar.core.persistence.DatabaseVersion;
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 javax.servlet.ServletContext;

import java.util.Collection;
import java.util.Properties;
import com.google.common.collect.Lists;

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

private static final Platform INSTANCE = new Platform();

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

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

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

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
stopSafeModeContainer();
Expand All @@ -124,7 +140,7 @@ protected void restart(Startup startup) {
startLevel2Container();
startLevel34Containers();
executeStartupTasks(startup);
currentContainer = level4Container;
currentLevel = level4;
}

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

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

/**
* Starts level 3 and 4
*/
private void startLevel34Containers() {
level3Container = level2Container.createChild();
level3Container.addSingletons(serverComponents.level3Components());
level3Container.startComponents();

level4Container = level3Container.createChild();
serverComponents.startLevel4Components(level4Container);
level3 = start(new PlatformLevel3(level2));
level4 = start(new PlatformLevel4(level3, level4AddedComponents));
}

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

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

private void startSafeModeContainer() {
safeModeContainer = level2Container.createChild();
safeModeContainer.addSingletons(serverComponents.safeModeComponents());
safeModeContainer.startComponents();
levelSafeMode = start(new PlatformLevelSafeMode(level2));
}

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
*/
private void stopLevel1Container() {
if (level1Container != null) {
level1Container.stopComponents();
level1Container = null;
if (level1 != null) {
level1.stop();
level1 = null;
}
}

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

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

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

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

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

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

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

public enum Startup {
Expand Down

0 comments on commit b691c1b

Please sign in to comment.