/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.server.controller.impl;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.kie.server.api.KieServerConstants;
import org.kie.server.api.model.KieContainerResource;
import org.kie.server.api.model.KieScannerResource;
import org.kie.server.api.model.KieServerConfig;
import org.kie.server.api.model.KieServerConfigItem;
import org.kie.server.api.model.KieServerInfo;
import org.kie.server.api.model.Message;
import org.kie.server.controller.api.KieServerController;
import org.kie.server.controller.api.ModelFactory;
import org.kie.server.controller.api.model.KieServerSetup;
import org.kie.server.controller.api.model.events.ServerInstanceConnected;
import org.kie.server.controller.api.model.events.ServerInstanceDeleted;
import org.kie.server.controller.api.model.events.ServerInstanceDisconnected;
import org.kie.server.controller.api.model.events.ServerInstanceUpdated;
import org.kie.server.controller.api.model.events.ServerTemplateUpdated;
import org.kie.server.controller.api.model.runtime.Container;
import org.kie.server.controller.api.model.runtime.ServerInstance;
import org.kie.server.controller.api.model.runtime.ServerInstanceKey;
import org.kie.server.controller.api.model.spec.Capability;
import org.kie.server.controller.api.model.spec.ContainerConfig;
import org.kie.server.controller.api.model.spec.ContainerSpec;
import org.kie.server.controller.api.model.spec.ProcessConfig;
import org.kie.server.controller.api.model.spec.RuleConfig;
import org.kie.server.controller.api.model.spec.ServerConfig;
import org.kie.server.controller.api.model.spec.ServerTemplate;
import org.kie.server.controller.api.service.NotificationService;
import org.kie.server.controller.api.storage.KieServerTemplateStorage;
import org.kie.server.controller.impl.service.LoggingNotificationService;
import org.kie.server.controller.impl.storage.InMemoryKieServerTemplateStorage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class KieServerControllerImpl implements KieServerController {
private static final Logger logger = LoggerFactory.getLogger(KieServerControllerImpl.class);
private KieServerTemplateStorage templateStorage = InMemoryKieServerTemplateStorage.getInstance();
private NotificationService notificationService = LoggingNotificationService.getInstance();
@Override
public synchronized KieServerSetup connect(KieServerInfo serverInfo) {
ServerTemplate serverTemplate = templateStorage.load(serverInfo.getServerId());
KieServerSetup serverSetup = new KieServerSetup();
ServerInstanceKey serverInstanceKey = ModelFactory.newServerInstanceKey(serverInfo.getServerId(), serverInfo.getLocation());
List<Container> containerList = new ArrayList<Container>();
if (serverTemplate != null) {
logger.debug("Server id {} know to the controller, checking if given server exists", serverInfo.getServerId());
if (!serverTemplate.hasServerInstance(serverInfo.getLocation())) {
logger.debug("Server instance '{}' not yet registered", serverInfo.getLocation());
serverTemplate.addServerInstance(serverInstanceKey);
}
templateStorage.update(serverTemplate);
logger.debug("KieServerInstance updated after connect from server {}", serverInfo.getLocation());
Set<KieContainerResource> containers = new HashSet<KieContainerResource>();
for (ContainerSpec containerSpec : serverTemplate.getContainersSpec()) {
KieContainerResource containerResource = new KieContainerResource();
containerResource.setContainerId(containerSpec.getId());
containerResource.setContainerAlias(containerSpec.getContainerName());
containerResource.setReleaseId(containerSpec.getReleasedId());
containerResource.setStatus(containerSpec.getStatus());
// cover scanner and rules config
ContainerConfig containerConfig = containerSpec.getConfigs().get(Capability.RULE);
if (containerConfig != null) {
RuleConfig ruleConfig = (RuleConfig) containerConfig;
KieScannerResource scannerResource = new KieScannerResource();
scannerResource.setPollInterval(ruleConfig.getPollInterval());
scannerResource.setStatus(ruleConfig.getScannerStatus());
containerResource.setScanner(scannerResource);
}
// cover process config
containerConfig = containerSpec.getConfigs().get(Capability.PROCESS);
if (containerConfig != null) {
ProcessConfig processConfig = (ProcessConfig) containerConfig;
KieServerConfigItem configItem = new KieServerConfigItem();
configItem.setType(KieServerConstants.CAPABILITY_BPM);
configItem.setName(KieServerConstants.PCFG_KIE_BASE);
configItem.setValue(processConfig.getKBase());
containerResource.addConfigItem(configItem);
configItem = new KieServerConfigItem();
configItem.setType(KieServerConstants.CAPABILITY_BPM);
configItem.setName(KieServerConstants.PCFG_KIE_SESSION);
configItem.setValue(processConfig.getKSession());
containerResource.addConfigItem(configItem);
configItem = new KieServerConfigItem();
configItem.setType(KieServerConstants.CAPABILITY_BPM);
configItem.setName(KieServerConstants.PCFG_MERGE_MODE);
configItem.setValue(processConfig.getMergeMode());
containerResource.addConfigItem(configItem);
configItem = new KieServerConfigItem();
configItem.setType(KieServerConstants.CAPABILITY_BPM);
configItem.setName(KieServerConstants.PCFG_RUNTIME_STRATEGY);
configItem.setValue(processConfig.getRuntimeStrategy());
containerResource.addConfigItem(configItem);
}
containers.add(containerResource);
containerList.add(new Container(containerSpec.getId(),
containerSpec.getContainerName(),
serverInstanceKey,
new ArrayList<Message>(),
containerSpec.getReleasedId(),
serverInstanceKey.getUrl()+"/containers/"+containerSpec.getId()));
}
serverSetup.setContainers(containers);
// server configuration
KieServerConfig serverConfig = new KieServerConfig();
for (Map.Entry<Capability, ServerConfig> entry : serverTemplate.getConfigs().entrySet()) {
KieServerConfigItem configItem = new KieServerConfigItem();
ServerConfig config = entry.getValue();
// currently ServerConfig does not have data...
//configItem.setName();
//configItem.setValue();
// type of the config item is capability
configItem.setType(entry.getKey().toString());
serverConfig.addConfigItem(configItem);
}
serverSetup.setServerConfig(serverConfig);
} else {
logger.debug("Server id {} unknown to this controller, registering...", serverInfo.getServerId());
serverTemplate = new ServerTemplate();
serverTemplate.setId(serverInfo.getServerId());
serverTemplate.setName(serverInfo.getName());
List<String> capabilities = new ArrayList<String>();
if (serverInfo.getCapabilities().contains(KieServerConstants.CAPABILITY_BRM)) {
capabilities.add(Capability.RULE.toString());
}
if (serverInfo.getCapabilities().contains(KieServerConstants.CAPABILITY_BPM)) {
capabilities.add(Capability.PROCESS.toString());
}
if (serverInfo.getCapabilities().contains(KieServerConstants.CAPABILITY_BRP)) {
capabilities.add(Capability.PLANNING.toString());
}
serverTemplate.setCapabilities(capabilities);
// add newly connected server instance
serverTemplate.addServerInstance(serverInstanceKey);
logger.debug("KieServerInstance stored after connect (register) from server {}", serverInfo.getLocation());
templateStorage.store(serverTemplate);
notificationService.notify(new ServerTemplateUpdated(serverTemplate));
}
logger.info("Server {} connected to controller", serverInfo.getLocation());
ServerInstance serverInstance = new ServerInstance();
serverInstance.setServerName(serverInstanceKey.getServerName());
serverInstance.setServerTemplateId(serverInstanceKey.getServerTemplateId());
serverInstance.setServerInstanceId(serverInstanceKey.getServerInstanceId());
serverInstance.setUrl(serverInstanceKey.getUrl());
serverInstance.setContainers(containerList);
notificationService.notify(new ServerInstanceUpdated(serverInstance));
notificationService.notify(new ServerInstanceConnected(serverInstance));
return serverSetup;
}
@Override
public synchronized void disconnect(KieServerInfo serverInfo) {
ServerTemplate serverTemplate = templateStorage.load(serverInfo.getServerId());
if (serverTemplate != null) {
logger.debug("Server id {} known to the controller, checking if given server exists", serverInfo.getServerId());
if (serverTemplate != null) {
logger.info("Server {} disconnected from controller", serverInfo.getLocation());
ServerInstanceKey serverInstanceKey = ModelFactory.newServerInstanceKey(serverInfo.getServerId(), serverInfo.getLocation());
serverTemplate.deleteServerInstance(serverInstanceKey.getServerInstanceId());
templateStorage.update(serverTemplate);
notificationService.notify(new ServerInstanceDeleted(serverInstanceKey.getServerInstanceId()));
notificationService.notify(new ServerTemplateUpdated(serverTemplate));
notificationService.notify(new ServerInstanceDisconnected(serverInstanceKey.getServerInstanceId()));
}
}
}
public KieServerTemplateStorage getTemplateStorage() {
return templateStorage;
}
public void setTemplateStorage(KieServerTemplateStorage templateStorage) {
this.templateStorage = templateStorage;
}
public NotificationService getNotificationService() {
return notificationService;
}
public void setNotificationService(NotificationService notificationService) {
this.notificationService = notificationService;
}
}