/*
* Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved.
*
* 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 com.hazelcast.internal.usercodedeployment;
import com.hazelcast.config.UserCodeDeploymentConfig;
import com.hazelcast.core.Member;
import com.hazelcast.internal.usercodedeployment.impl.ClassData;
import com.hazelcast.internal.usercodedeployment.impl.ClassDataProvider;
import com.hazelcast.internal.usercodedeployment.impl.ClassLocator;
import com.hazelcast.internal.usercodedeployment.impl.ClassSource;
import com.hazelcast.internal.util.filter.Filter;
import com.hazelcast.logging.ILogger;
import com.hazelcast.spi.ManagedService;
import com.hazelcast.spi.NodeEngine;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import static com.hazelcast.internal.usercodedeployment.impl.filter.ClassNameFilterParser.parseClassNameFilters;
import static com.hazelcast.internal.usercodedeployment.impl.filter.MemberProviderFilterParser.parseMemberFilter;
public final class UserCodeDeploymentService implements ManagedService {
public static final String SERVICE_NAME = "user-code-deployment-service";
private volatile boolean enabled;
private ClassDataProvider provider;
private ClassLocator locator;
@Override
public void init(NodeEngine nodeEngine, Properties properties) {
UserCodeDeploymentConfig config = nodeEngine.getConfig().getUserCodeDeploymentConfig();
if (!config.isEnabled()) {
return;
}
ClassLoader parent = nodeEngine.getConfigClassLoader().getParent();
Filter<String> classNameFilter = parseClassNameFilters(config);
Filter<Member> memberFilter = parseMemberFilter(config.getProviderFilter());
ConcurrentMap<String, ClassSource> classMap = new ConcurrentHashMap<String, ClassSource>();
UserCodeDeploymentConfig.ProviderMode providerMode = config.getProviderMode();
ILogger providerLogger = nodeEngine.getLogger(ClassDataProvider.class);
provider = new ClassDataProvider(providerMode, parent, classMap, providerLogger);
UserCodeDeploymentConfig.ClassCacheMode classCacheMode = config.getClassCacheMode();
locator = new ClassLocator(classMap, parent, classNameFilter, memberFilter, classCacheMode, nodeEngine);
enabled = config.isEnabled();
}
// called by operations sent by other members
public ClassData getClassDataOrNull(String className) {
if (!enabled) {
return null;
}
return provider.getClassDataOrNull(className);
}
// called by User Code Deployment classloader on this member
public Class<?> handleClassNotFoundException(String name)
throws ClassNotFoundException {
if (!enabled) {
throw new ClassNotFoundException("User Code Deployment is not enabled. Cannot find class " + name);
}
return locator.handleClassNotFoundException(name);
}
// called by User Code Deployment classloader on this member
public Class<?> findLoadedClass(String name) {
if (!enabled) {
return null;
}
return locator.findLoadedClass(name);
}
@Override
public void reset() {
}
@Override
public void shutdown(boolean terminate) {
}
}