/*
* Copyright 2016 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.
* You may obtain a copy of the License at
*
* 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.workbench.common.screens.server.management.backend.service;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.jboss.errai.bus.server.annotations.Service;
import org.kie.server.controller.api.model.events.ServerInstanceDeleted;
import org.kie.server.controller.api.model.runtime.ServerInstanceKey;
import org.kie.server.controller.api.model.spec.ServerTemplate;
import org.kie.server.controller.impl.KieServerInstanceManager;
import org.kie.server.controller.rest.RestSpecManagementServiceImpl;
import org.kie.workbench.common.screens.server.management.service.SpecManagementService;
import static org.uberfire.commons.validation.PortablePreconditions.checkNotNull;
@Service
@ApplicationScoped
public class SpecManagementServiceCDI extends RestSpecManagementServiceImpl implements SpecManagementService {
@Inject
@Override
public void setKieServerInstanceManager(KieServerInstanceManager kieServerInstanceManager) {
super.setKieServerInstanceManager(kieServerInstanceManager);
}
@Inject
@Override
public void setNotificationService(org.kie.server.controller.api.service.NotificationService notificationService) {
super.setNotificationService(notificationService);
}
@Inject
@Override
public void setTemplateStorage(org.kie.server.controller.api.storage.KieServerTemplateStorage templateStorage) {
super.setTemplateStorage(templateStorage);
}
@Override
public void deleteServerInstance(final ServerInstanceKey serverInstanceKey) {
checkNotNull("serverInstanceKey",
serverInstanceKey);
if (getKieServerInstanceManager().isAlive(serverInstanceKey)) {
throw new RuntimeException("Can't delete live instance.");
} else {
final String serverInstanceId = serverInstanceKey.getServerInstanceId();
final ServerTemplate serverTemplate = getServerTemplate(serverInstanceKey.getServerTemplateId());
if (serverTemplate != null) {
serverTemplate.deleteServerInstance(serverInstanceId);
getTemplateStorage().update(serverTemplate);
getNotificationService().notify(new ServerInstanceDeleted(serverInstanceId));
}
}
}
@Override
public boolean isContainerIdValid(String serverTemplateId,
String containerId) {
if (!isValidIdentifier(containerId)) {
return false;
}
final ServerTemplate template = getServerTemplate(serverTemplateId);
if (template == null) {
throw new RuntimeException("Server template doesn't exists");
}
return template.getContainerSpec(containerId) == null;
}
@Override
public String validContainerId(final String serverTemplateId,
final String containerId) {
if (isContainerIdValid(serverTemplateId,
containerId)) {
return containerId;
}
return validContainerIdWithSuffix(serverTemplateId,
containerId);
}
@Override
public boolean isNewServerTemplateIdValid(String serverTemplateId) {
return !getTemplateStorage().exists(serverTemplateId);
}
private String validContainerIdWithSuffix(final String serverTemplateId,
final String containerId) {
int attemptNumber = 2;
while (!isContainerIdValid(serverTemplateId,
containerId + "-" + attemptNumber)) {
attemptNumber++;
}
return containerId + "-" + attemptNumber;
}
private boolean isValidIdentifier(final String identifier) {
return identifier != null && identifier.matches("[A-Za-z0-9_\\-.:]+");
}
}