/*
* 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.server.services.optaplanner;
import java.util.ArrayList;
import java.util.List;
import org.kie.server.api.commands.CommandScript;
import org.kie.server.api.commands.optaplanner.CreateSolverCommand;
import org.kie.server.api.commands.optaplanner.DisposeSolverCommand;
import org.kie.server.api.commands.optaplanner.GetSolverCommand;
import org.kie.server.api.commands.optaplanner.GetSolverWithBestSolutionCommand;
import org.kie.server.api.commands.optaplanner.GetSolversCommand;
import org.kie.server.api.commands.optaplanner.SolvePlanningProblemCommand;
import org.kie.server.api.commands.optaplanner.TerminateSolverEarlyCommand;
import org.kie.server.api.marshalling.Marshaller;
import org.kie.server.api.marshalling.MarshallingFormat;
import org.kie.server.api.model.KieServerCommand;
import org.kie.server.api.model.ServiceResponse;
import org.kie.server.api.model.ServiceResponsesList;
import org.kie.server.api.model.instance.SolverInstance;
import org.kie.server.services.api.KieContainerCommandService;
import org.kie.server.services.api.KieServerRegistry;
import org.kie.server.services.impl.KieContainerInstanceImpl;
import org.kie.server.services.impl.locator.ContainerLocatorProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class OptaplannerCommandServiceImpl
implements KieContainerCommandService {
private static final Logger logger = LoggerFactory.getLogger(OptaplannerCommandServiceImpl.class);
private KieServerRegistry context;
private SolverServiceBase solverService;
public OptaplannerCommandServiceImpl(
KieServerRegistry context,
SolverServiceBase solverService) {
this.context = context;
this.solverService = solverService;
}
@Override
public ServiceResponse<String> callContainer(String containerId,
String payload,
MarshallingFormat marshallingFormat,
String classType) {
return null;
}
@Override
public ServiceResponsesList executeScript(CommandScript commands,
MarshallingFormat marshallingFormat,
String classType) {
List<ServiceResponse<? extends Object>> responses = new ArrayList<ServiceResponse<? extends Object>>();
for (KieServerCommand command : commands.getCommands()) {
try {
ServiceResponse<?> response = null;
logger.debug("About to execute command: {}",
command);
if (command instanceof CreateSolverCommand) {
CreateSolverCommand csc = (CreateSolverCommand) command;
String containerId = context.getContainerId(csc.getContainerId(),
ContainerLocatorProvider.get().getLocator());
SolverInstance instance = new SolverInstance();
instance.setContainerId(containerId);
instance.setSolverId(csc.getSolverId());
instance.setSolverConfigFile(csc.getSolverConfigFile());
response = solverService.createSolver(containerId,
csc.getSolverId(),
instance);
} else if (command instanceof GetSolversCommand) {
GetSolversCommand gss = (GetSolversCommand) command;
String containerId = context.getContainerId(gss.getContainerId(),
ContainerLocatorProvider.get().getLocator());
response = solverService.getSolvers(containerId);
} else if (command instanceof GetSolverCommand) {
GetSolverCommand gss = (GetSolverCommand) command;
String containerId = context.getContainerId(gss.getContainerId(),
ContainerLocatorProvider.get().getLocator());
response = solverService.getSolver(containerId,
gss.getSolverId());
} else if (command instanceof GetSolverWithBestSolutionCommand) {
GetSolverWithBestSolutionCommand gss = (GetSolverWithBestSolutionCommand) command;
String containerId = context.getContainerId(gss.getContainerId(),
ContainerLocatorProvider.get().getLocator());
response = solverService.getSolverWithBestSolution(containerId,
gss.getSolverId());
} else if (command instanceof SolvePlanningProblemCommand) {
SolvePlanningProblemCommand uss = (SolvePlanningProblemCommand) command;
String containerId = context.getContainerId(uss.getContainerId(),
ContainerLocatorProvider.get().getLocator());
KieContainerInstanceImpl kc = context.getContainer(containerId);
Marshaller marshaller = kc.getMarshaller(marshallingFormat);
Object planningProblem = marshaller.unmarshall(uss.getPlanningProblem(),
Object.class);
response = solverService.solvePlanningProblem(containerId,
uss.getSolverId(),
planningProblem);
} else if (command instanceof TerminateSolverEarlyCommand) {
TerminateSolverEarlyCommand uss = (TerminateSolverEarlyCommand) command;
String containerId = context.getContainerId(uss.getContainerId(),
ContainerLocatorProvider.get().getLocator());
response = solverService.terminateSolverEarly(containerId,
uss.getSolverId());
} else if (command instanceof DisposeSolverCommand) {
DisposeSolverCommand ds = (DisposeSolverCommand) command;
String containerId = context.getContainerId(ds.getContainerId(),
ContainerLocatorProvider.get().getLocator());
response = solverService.disposeSolver(containerId,
ds.getSolverId());
} else {
throw new IllegalStateException("Unsupported command: " + command);
}
logger.debug("Service returned response {}",
response);
// return successful result
responses.add(response);
} catch (Throwable e) {
logger.error("Error while processing {} command",
command,
e);
// return failure result
responses.add(new ServiceResponse(ServiceResponse.ResponseType.FAILURE,
e.getMessage()));
}
}
logger.debug("About to return responses '{}'",
responses);
return new ServiceResponsesList(responses);
}
}