blob: 93c0c75326e08a573ef2b73f7cd190c1fad3d0e6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You 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.apache.geode.internal.process;
import static org.apache.commons.lang3.Validate.isTrue;
import static org.apache.commons.lang3.Validate.notEmpty;
import static org.apache.commons.lang3.Validate.notNull;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ServiceConfigurationError;
import java.util.concurrent.TimeoutException;
import org.apache.geode.util.internal.GeodeGlossary;
/**
* Manages which implementation of {@link ProcessController} will be used and constructs the
* instance.
*
* @since GemFire 8.0
*/
public class ProcessControllerFactory {
/**
* For testing only
*/
public static final String PROPERTY_DISABLE_ATTACH_API =
GeodeGlossary.GEMFIRE_PREFIX + "test.ProcessControllerFactory.DisableAttachApi";
private final boolean disableAttachApi;
public ProcessControllerFactory() {
this.disableAttachApi = Boolean.getBoolean(PROPERTY_DISABLE_ATTACH_API);
}
public ProcessController createProcessController(final ProcessControllerParameters parameters,
final int pid) {
notNull(parameters, "Invalid parameters '" + parameters + "' specified");
isTrue(pid > 0, "Invalid pid '" + pid + "' specified");
if (!isAttachAPIFound()) {
return new FileProcessController(parameters, pid);
}
return new MBeanOrFileProcessController(parameters, pid);
}
public ProcessController createProcessController(final ProcessControllerParameters parameters,
final File directory, final String pidFileName)
throws IOException, InterruptedException, TimeoutException {
notNull(parameters, "Invalid parameters '" + parameters + "' specified");
notNull(directory, "Invalid directory '" + directory + "' specified");
notEmpty(pidFileName, "Invalid pidFileName '" + pidFileName + "' specified");
return createProcessController(parameters, readPid(directory, pidFileName));
}
public boolean isAttachAPIFound() {
if (disableAttachApi) {
return false;
}
boolean found = false;
try {
final Class<?> virtualMachineClass = Class.forName("com.sun.tools.attach.spi.AttachProvider");
if (virtualMachineClass != null) {
Method providersMethod = virtualMachineClass.getMethod("providers");
providersMethod.invoke(virtualMachineClass);
found = true;
}
} catch (ClassNotFoundException | IllegalAccessException | InvocationTargetException
| NoSuchMethodException | ServiceConfigurationError ignore) {
}
return found;
}
private int readPid(final File directory, final String pidFileName) throws IOException {
return new PidFile(directory, pidFileName).readPid();
}
}