/*
* 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 com.sun.jini.tool.envcheck.plugins;
import com.sun.jini.tool.envcheck.AbstractPlugin;
import com.sun.jini.tool.envcheck.Plugin;
import com.sun.jini.tool.envcheck.EnvCheck;
import com.sun.jini.tool.envcheck.Reporter;
import com.sun.jini.tool.envcheck.Reporter.Message;
import com.sun.jini.tool.envcheck.SubVMTask;
import com.sun.jini.tool.envcheck.Util;
import java.net.InetAddress;
import java.rmi.activation.ActivationGroup;
import java.rmi.activation.ActivationException;
import java.rmi.RMISecurityManager;
import java.security.AccessControlException;
import net.jini.config.ConfigurationException;
import net.jini.config.NoSuchEntryException;
import com.sun.jini.start.ServiceDescriptor;
import com.sun.jini.start.SharedActivatableServiceDescriptor;
/**
* Plugin which checks the liveness of the activation system. The
* check will be performed if either:
*
* <ul>
* <li>the <code>Configuration</code> for the tool includes an entry
* named <code>activation</code> which is a boolean and has a
* value of <code>true</code>.
* <li>a service starter configuration is being checked and it contains
* an entry of type <code>SharedActivatableServiceDescriptor</code>.
* </ul>
* The check is performed by calling <code>ActivationGroup.getSystem()</code>.
* A non-exceptional return indicates liveness.
*/
public class CheckActivationSystem extends AbstractPlugin {
/** reference to the container */
private EnvCheck envCheck;
/** flag indicating whether to perform the check */
private static boolean doCheck = false;
/**
* Test whether to unconditionally test for the presence of the
* activation system. This will be the case if <code>opt</code> is
* the command-line option <code>-activation</code>.
*
* @param opt the command-line option
* @return true if the option is recognized by this plugin
*/
public boolean isPluginOption(String opt) {
if (opt.equals("-activation")) {
doCheck = true;
return true;
}
return false;
}
/**
* Determine whether to perform this check, and perform the
* check if appropriate.
*/
// XXX add support for non-default host/port values
public void run(EnvCheck envCheck) {
this.envCheck = envCheck;
if (doCheck || envCheck.getGroupDescriptor() != null) {
checkAvailability();
}
}
/**
* Performs the check
*/
private void checkAvailability() {
Message message;
String taskName = taskName("CheckActivationTask");
// OK if envCheck.getGroupDescriptor() returns null
Object launchReturn = envCheck.launch(null,
envCheck.getGroupDescriptor(),
taskName);
if (launchReturn == null) {
message = new Message(Reporter.INFO,
getString("running"),
getString("explanationString"));
} else {
Throwable ex = (Throwable) launchReturn;
Throwable t = ex.getCause();
if (t == null) {
t = ex;
}
if (t instanceof java.rmi.ConnectException) {
message = new Message(Reporter.WARNING,
getString("notRunning"),
t,
getString("explanationString"));
} else if (t instanceof AccessControlException) {
message = new Message(Reporter.WARNING,
getString("nopermission"),
t,
getString("noPermExplanationString"));
} else {
message = new Message(Reporter.WARNING,
getString("unexpectedException"),
ex,
getString("unexpectedExplanationString"));
}
}
Reporter.print(message);
}
/** subtask to perform the actual check */
public static class CheckActivationTask implements SubVMTask {
public Object run(String[] args) {
// don't make the test sensitive to policy settings for now
// System.setSecurityManager(new RMISecurityManager());
try {
ActivationGroup.getSystem();
return null;
} catch (Throwable e) {
return e;
}
}
}
}