Skip to content

Commit

Permalink
MGR-86 start/stop sites (#21)
Browse files Browse the repository at this point in the history
  • Loading branch information
madness-inc committed Jun 16, 2021
1 parent cfbabf7 commit f77ae4d
Show file tree
Hide file tree
Showing 12 changed files with 346 additions and 40 deletions.
26 changes: 22 additions & 4 deletions application-home/conf/datasources/ds-sites.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<datasources xmlns="http://www.appng.org/schema/platform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<datasources xmlns="http://www.appng.org/schema/platform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.appng.org/schema/platform http://www.appng.org/schema/platform/appng-platform.xsd">

<datasource id="sites">
Expand Down Expand Up @@ -56,6 +57,22 @@
</link>
</linkpanel>
<linkpanel id="actions" location="inline">
<link mode="intern" target="/sites&#63;form_action=start&#38;siteid=${current.id}">
<label>start</label>
<icon>activate</icon>
<condition expression="${current.active and current.state.name() eq 'STOPPED'}" />
<permissions>
<permission ref="site.reload" mode="set" />
</permissions>
</link>
<link mode="intern" target="/sites&#63;form_action=stop&#38;siteid=${current.id}">
<label>stop</label>
<icon>deactivate</icon>
<condition expression="${current.active and current.running}" />
<permissions>
<permission ref="site.reload" mode="set" />
</permissions>
</link>
<link mode="intern" target="/sites/update/${current.id}" default="true">
<label>edit</label>
<icon>edit</icon>
Expand All @@ -71,17 +88,18 @@
<permission ref="site.delete" mode="set" />
</permissions>
</link>
<link mode="intern" target="/sites&#63;form_action=reload&#38;siteid=${current.id}">
<link mode="intern" target="/sites&#63;form_action=reload&#38;siteid=${current.id}" show-disabled="true">
<label>reload</label>
<icon>reload</icon>
<condition expression="${current.active}" />
<permissions>
<permission ref="site.reload" mode="set" />
</permissions>
</link>
</linkpanel>
</config>
<bean id="sites">
<option name="site" siteName="${name}" siteDomain="${domain}"/>
<option name="site" siteName="${name}" siteDomain="${domain}" />
</bean>
</datasource>

Expand All @@ -104,7 +122,7 @@
<field name="description" type="longtext">
<label>description</label>
</field>
<field name="active" type="checkbox">
<field name="active" type="checkbox" readonly="${current.site.running}">
<label>active</label>
</field>
<field name="template" type="list:radio" binding="template">
Expand Down
39 changes: 38 additions & 1 deletion application-home/conf/events/ev-sites.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<event id="siteEvent" xmlns="http://www.appng.org/schema/platform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<event id="siteEvent" xmlns="http://www.appng.org/schema/platform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.appng.org/schema/platform http://www.appng.org/schema/platform/appng-platform.xsd">
<config />
<action id="update">
Expand Down Expand Up @@ -78,6 +79,42 @@
</bean>
</action>

<action id="start">
<config>
<title>site.start</title>
<permissions>
<permission ref="site.reload" mode="set" />
</permissions>
<params>
<param name="form_action" />
<param name="siteid" />
</params>
</config>
<condition expression="${form_action eq 'start'}" />
<bean id="sites">
<option name="site" id="${siteid}" />
<option name="action" id="start" />
</bean>
</action>

<action id="stop">
<config>
<title>site.stop</title>
<permissions>
<permission ref="site.reload" mode="set" />
</permissions>
<params>
<param name="form_action" />
<param name="siteid" />
</params>
</config>
<condition expression="${form_action eq 'stop'}" />
<bean id="sites">
<option name="site" id="${siteid}" />
<option name="action" id="stop" />
</bean>
</action>

<action id="grantSite">
<config>
<title id="site.grant" />
Expand Down
16 changes: 16 additions & 0 deletions application-home/conf/pages/pg-sites.xml
Expand Up @@ -350,6 +350,22 @@
</params>
</action>
</element>
<element>
<action id="start" eventId="siteEvent" onSuccess="/sites" forceForward="true">
<params>
<param name="form_action">${form_action}</param>
<param name="siteid">${siteid}</param>
</params>
</action>
</element>
<element>
<action id="stop" eventId="siteEvent" onSuccess="/sites" forceForward="true">
<params>
<param name="form_action">${form_action}</param>
<param name="siteid">${siteid}</param>
</params>
</action>
</element>
<element>
<action id="reload" eventId="siteEvent" onSuccess="/sites" forceForward="true">
<params>
Expand Down
9 changes: 9 additions & 0 deletions application-home/dictionary/manager-messages.properties
Expand Up @@ -340,6 +340,15 @@ site.reload=Reload site
site.reloaded=Site has been reloaded.
site.reloaded.error=Failed to reload the site.
site.select=Select site
site.start.error=Failed to start the site!
site.start.notActive=Site {0} is not active and can not be started!
site.start.isRunning=Site {0} is already running with state {1}!
site.started=Started site {0}.
site.stop.error=Failed to stop the site!
site.stop.isCurrent=Can not stop the current site {0}!
site.stop.notRunning=Site {0} is not running and can not be stopped!
site.stop.notStarted=Site {0} is in state {1} and can not be stopped!
site.stopped=Stopped site {0}.
site.update.error=Failed to update the site.
site.updated=Site has been updated.
site=Site
Expand Down
34 changes: 29 additions & 5 deletions src/main/java/org/appng/application/manager/business/Sites.java
Expand Up @@ -32,6 +32,8 @@
import org.appng.application.manager.form.SubjectForm;
import org.appng.application.manager.service.Service;
import org.appng.application.manager.service.ServiceAware;
import org.appng.application.manager.service.StartSiteEvent;
import org.appng.application.manager.service.StopSiteEvent;
import org.appng.core.domain.SiteImpl;
import org.appng.core.service.InitializerService;
import org.springframework.stereotype.Component;
Expand All @@ -48,6 +50,8 @@
@Component
public class Sites extends ServiceAware implements DataProvider, ActionProvider<SiteForm> {

protected static final String ACTION_START = "start";
protected static final String ACTION_STOP = "stop";
public static final String SITE = "site";

public void perform(Site site, Application application, Environment environment, Options options, Request request,
Expand Down Expand Up @@ -82,13 +86,33 @@ public void perform(Site site, Application application, Environment environment,
errorMessage = MessageConstants.PLATFORM_RELOAD_ERROR;
reloadPlatform(site, application, request, fp);
okMessage = MessageConstants.PLATFORM_RELOADED;
} else if (ACTION_START.equals(action)) {
errorMessage = MessageConstants.SITE_START_ERROR;
String siteName = service.startSite(request, application, siteId, fp);
if (null != siteName) {
site.sendEvent(new StartSiteEvent(siteName));
}
} else if (ACTION_STOP.equals(action)) {
if (!site.getId().equals(siteId)) {
errorMessage = MessageConstants.SITE_STOP_ERROR;
String siteName = service.stopSite(request, application, siteId, fp);
if (null != siteName) {
site.sendEvent(new StopSiteEvent(siteName));
}
} else {
fp.addErrorMessage(request.getMessage(MessageConstants.SITE_STOP_IS_CURRENT, site.getName()));
}
}
if (null != okMessage) {
String message = request.getMessage(okMessage, siteId);
fp.addOkMessage(message);
}
String message = request.getMessage(okMessage, siteId);
fp.addOkMessage(message);
} catch (BusinessException ex) {
String message = request.getMessage(errorMessage, siteId);
log.error("error during action '" + action + "': " + message, ex);
fp.addErrorMessage(message);
if (null != errorMessage) {
String message = request.getMessage(errorMessage, siteId);
log.error("error during action '" + action + "': " + message, ex);
fp.addErrorMessage(message);
}
}
}

Expand Down
Expand Up @@ -962,11 +962,13 @@ private void checkUniqueRepositoryName(Request request, Repository repository, F
public DataContainer searchSites(Environment environment, FieldProcessor fp, Integer siteId, String name,
String domain) throws BusinessException {
DataContainer data = new DataContainer(fp);
Map<String, Site> siteMap = environment.getAttribute(Scope.PLATFORM, Platform.Environment.SITES);
if (siteId != null) {
SiteImpl site = siteRepository.findOne(siteId);
if (null == site) {
throw new BusinessException("no such site: " + siteId, MessageConstants.SITE_NOT_EXISTS);
}
setSiteState(siteMap, site);
addSelectionsForSite(site, data);
data.setItem(new SiteForm(site));
} else {
Expand All @@ -979,13 +981,8 @@ public DataContainer searchSites(Environment environment, FieldProcessor fp, Int
}
Page<SiteImpl> sites = siteRepository.search(siteQuery, fp.getPageable());

Map<String, Site> siteMap = environment.getAttribute(Scope.PLATFORM, Platform.Environment.SITES);
for (SiteImpl siteImpl : sites) {
Site site = siteMap.get(siteImpl.getName());
if (null != site) {
siteImpl.setRunning(SiteState.STARTED.equals(site.getState()));
siteImpl.setStartupTime(site.getStartupTime());
}
setSiteState(siteMap, siteImpl);
}
Selection nameFilter = new SelectionBuilder<>(FILTER_SITE_NAME).defaultOption(FILTER_SITE_NAME, name)
.title(MessageConstants.NAME).type(SelectionType.TEXT).select(name).build();
Expand All @@ -1001,6 +998,18 @@ public DataContainer searchSites(Environment environment, FieldProcessor fp, Int
return data;
}

private void setSiteState(Map<String, Site> siteMap, SiteImpl siteImpl) {
Site site = siteMap.get(siteImpl.getName());
if (null != site) {
siteImpl.setState(site.getState());
siteImpl.setRunning(SiteState.STARTED.equals(site.getState()));
siteImpl.setStartupTime(site.getStartupTime());
} else {
siteImpl.setState(SiteState.STOPPED);
siteImpl.setRunning(false);
}
}

private void addSelectionsForSite(final SiteImpl site, DataContainer data) {
initSiteProperties(site);
List<String> templateNames = new ArrayList<>();
Expand Down Expand Up @@ -1551,7 +1560,7 @@ public void deleteProperty(Request request, String id, FieldProcessor fp) throws
public void reloadSite(Request request, Application application, Integer siteId, FieldProcessor fp)
throws BusinessException {
try {
InitializerService initializerService = application.getBean(InitializerService.class);
InitializerService initializerService = getInitializerService(application);
SiteImpl site = getSite(siteId);
if (null != site) {
String siteName = site.getName();
Expand All @@ -1571,6 +1580,57 @@ public void reloadSite(Request request, Application application, Integer siteId,
}
}

private InitializerService getInitializerService(Application application) {
return application.getBean(InitializerService.class);
}

public String startSite(Request request, Application application, Integer siteId, FieldProcessor fp)
throws BusinessException {
SiteImpl site = getSite(siteId);
Environment env = request.getEnvironment();
Map<String, Site> siteMap = env.getAttribute(Scope.PLATFORM, Platform.Environment.SITES);
Site activeSite = siteMap.get(site.getName());
if (null == activeSite) {
if (site.isActive()) {
try {
getInitializerService(application).loadSite(env, site, true, fp);
fp.addOkMessage(request.getMessage(MessageConstants.SITE_STARTED, site.getName()));
return site.getName();
} catch (InvalidConfigurationException e) {
throw new BusinessException(e);
}
} else {
fp.addErrorMessage(
request.getMessage(MessageConstants.SITE_START_NOT_ACTIVE, site.getName(), site.getState()));
}
} else {
fp.addErrorMessage(
request.getMessage(MessageConstants.SITE_START_IS_RUNNING, site.getName(), site.getState()));
}
return null;
}

public String stopSite(Request request, Application application, Integer siteId, FieldProcessor fp)
throws BusinessException {
SiteImpl site = getSite(siteId);
Environment env = request.getEnvironment();
Map<String, Site> siteMap = env.getAttribute(Scope.PLATFORM, Platform.Environment.SITES);
Site activeSite = siteMap.get(site.getName());
if (null != activeSite) {
if (SiteState.STARTED.equals(activeSite.getState())) {
getInitializerService(application).shutDownSite(env, site);
fp.addOkMessage(request.getMessage(MessageConstants.SITE_STOPPED, site.getName()));
return site.getName();
} else {
fp.addErrorMessage(
request.getMessage(MessageConstants.SITE_STOP_NOT_STARTED, site.getName(), site.getState()));
}
} else {
fp.addErrorMessage(request.getMessage(MessageConstants.SITE_STOP_NOT_RUNNING, site.getName()));
}
return null;
}

public DataContainer getNewSubject(Request request, FieldProcessor fp, String timezone, List<String> languages) {
DataContainer data = new DataContainer(fp);
SubjectForm subjectsForm = new SubjectForm();
Expand Down
20 changes: 13 additions & 7 deletions src/main/java/org/appng/application/manager/service/Service.java
Expand Up @@ -61,7 +61,6 @@
* Service-interface for the manager application.
*
* @author Matthias Müller
*
*/
public interface Service {

Expand All @@ -83,7 +82,8 @@ void createProperty(Request request, PropertyForm propertyForm, Integer siteId,
void createPermission(Request request, PermissionImpl permission, Integer appId, FieldProcessor fp)
throws BusinessException;

DataContainer searchGroups(FieldProcessor fp, Site site, Integer siteId, Integer groupId, String groupName) throws BusinessException;
DataContainer searchGroups(FieldProcessor fp, Site site, Integer siteId, Integer groupId, String groupName)
throws BusinessException;

DataContainer searchApplications(FieldProcessor fp, Integer siteId, Integer appId, boolean assignedOnly)
throws BusinessException;
Expand All @@ -96,11 +96,11 @@ DataContainer searchInstallablePackages(Request request, FieldProcessor fp, Inte
DataContainer searchPackageVersions(Request request, FieldProcessor fp, Integer repositoryId, String packageName)
throws BusinessException;

Packages searchPackages(Environment env, FieldProcessor fp, String repositoryName, String digest, String packageName)
throws BusinessException;
Packages searchPackages(Environment env, FieldProcessor fp, String repositoryName, String digest,
String packageName) throws BusinessException;

PackageVersions searchPackageVersions(Environment environment, FieldProcessor fp, String repositoryName, String packageName,
String digest) throws BusinessException;
PackageVersions searchPackageVersions(Environment environment, FieldProcessor fp, String repositoryName,
String packageName, String digest) throws BusinessException;

PackageArchive getPackageArchive(Environment environment, String repositoryName, String packageName,
String packageVersion, String packageTimestamp, String diges) throws BusinessException;
Expand All @@ -110,7 +110,8 @@ DataContainer searchResources(Request request, Site site, FieldProcessor fp, Res

DataContainer searchRole(FieldProcessor fp, Integer roleId, Integer appId) throws BusinessException;

DataContainer searchSites(Environment environment, FieldProcessor fp, Integer siteId, String name, String domain) throws BusinessException;
DataContainer searchSites(Environment environment, FieldProcessor fp, Integer siteId, String name, String domain)
throws BusinessException;

DataContainer searchSubjects(Request request, FieldProcessor fp, Integer subjectId, String defaultTimezone,
List<String> languages, Integer groupId) throws BusinessException;
Expand Down Expand Up @@ -172,6 +173,11 @@ void deleteSite(Request request, String host, Integer siteId, FieldProcessor fp,
void reloadSite(Request request, Application application, Integer siteId, FieldProcessor fp)
throws BusinessException;

String startSite(Request request, Application application, Integer siteId, FieldProcessor fp)
throws BusinessException;

String stopSite(Request request, Application application, Integer siteId, FieldProcessor fp) throws BusinessException;

DataContainer getNewSubject(Request request, FieldProcessor fp, String timezone, List<String> languages);

DataContainer getNewPermission(FieldProcessor fp);
Expand Down

0 comments on commit f77ae4d

Please sign in to comment.