/*
* 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.services.impl.storage.file;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider;
import org.kie.server.api.KieServerConstants;
import org.kie.server.api.model.KieContainerResource;
import org.kie.server.api.model.KieServerConfig;
import org.kie.server.api.model.KieServerConfigItem;
import org.kie.server.services.impl.storage.KieServerState;
import org.kie.server.services.impl.storage.KieServerStateRepository;
public class KieServerStateFileRepository implements KieServerStateRepository {
private final File repositoryDir;
private XStream xs = new XStream(new PureJavaReflectionProvider());
private Map<String, KieServerState> knownStates = new ConcurrentHashMap<String, KieServerState>();
public KieServerStateFileRepository(File repositoryDir) {
this.repositoryDir = repositoryDir;
xs.alias("kie-server-state", KieServerState.class);
xs.alias("container", KieContainerResource.class);
xs.alias("config-item", KieServerConfigItem.class);
}
public KieServerStateFileRepository() {
this(new File(System.getProperty(KieServerConstants.KIE_SERVER_STATE_REPO, ".")));
}
public synchronized void store(String serverId, KieServerState kieServerState) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File(repositoryDir, serverId + ".xml"));
xs.toXML(kieServerState, fos);
} catch (IOException ex) {
// logger.warn("Error when persisting known session id", ex);
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
}
}
}
knownStates.put(serverId, kieServerState);
}
public KieServerState load(String serverId) {
if (knownStates.containsKey(serverId)) {
return knownStates.get(serverId);
}
synchronized (knownStates) {
File serverStateFile = new File(repositoryDir, serverId + ".xml");
KieServerState kieServerState = new KieServerState();
if (serverStateFile.exists()) {
kieServerState = (KieServerState) xs.fromXML(serverStateFile);
// override controllers if given as system property
String defaultController = System.getProperty(KieServerConstants.KIE_SERVER_CONTROLLER);
if (defaultController != null) {
String[] controllerList = defaultController.split(",");
Set<String> controllers = new HashSet<String>();
for (String controller : controllerList) {
controllers.add(controller.trim());
}
kieServerState.setControllers(controllers);
}
populateWithSystemProperties(kieServerState.getConfiguration());
} else {
KieServerConfig config = new KieServerConfig();
populateWithSystemProperties(config);
kieServerState.setConfiguration(config);
}
knownStates.put(serverId, kieServerState);
return kieServerState;
}
}
protected void populateWithSystemProperties(KieServerConfig config) {
// populate the config state with system properties that are valid to kie server
Properties systemProperties = System.getProperties();
for (String property : systemProperties.stringPropertyNames()) {
if (property.startsWith("org.kie.server") || property.startsWith("org.kie.executor")) {
KieServerConfigItem configItem = new KieServerConfigItem(property, systemProperties.getProperty(property), String.class.getName());
config.addConfigItem(configItem);
}
}
}
public void clearCache() {
this.knownStates.clear();
}
}