blob: 8103d85bee352e1d62fcc6871abb534146b481f3 [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.netbeans.modules.glassfish.tooling.admin;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.logging.Level;
import org.netbeans.modules.glassfish.tooling.data.GlassFishAdminInterface;
import org.netbeans.modules.glassfish.tooling.data.GlassFishServer;
import org.netbeans.modules.glassfish.tooling.data.GlassFishVersion;
import org.netbeans.modules.glassfish.tooling.logging.Logger;
/**
* GlassFish Abstract Server Command Factory.
* <p/>
* Selects correct GlassFish server administration functionality depending
* on given GlassFish server entity object.
* <p/>
* @author Tomas Kraus, Peter Benedikovic
*/
public abstract class AdminFactory {
////////////////////////////////////////////////////////////////////////////
// Class attributes //
////////////////////////////////////////////////////////////////////////////
/** Logger instance for this class. */
private static final Logger LOGGER = new Logger(AdminFactory.class);
////////////////////////////////////////////////////////////////////////////
// Static methods //
////////////////////////////////////////////////////////////////////////////
/**
* Creates specific <code>AdminFactory</code> child class instance
* to build GlassFish server administration command runner and data objects
* based on provided GlassFish server version.
* <p>
* @param version GlassFish server version.
* @return Child factory class instance to work with given GlassFish server.
*/
static AdminFactory getInstance(final GlassFishVersion version)
throws CommandException {
switch (version) {
// Use HTTP interface for any GlassFish older than 3.
case GF_1:
throw new CommandException(
CommandException.UNSUPPORTED_VERSION);
case GF_2:
case GF_2_1:
case GF_2_1_1:
return AdminFactoryHttp.getInstance();
// Use REST interface for GlassFish 3 and 4.
case GF_3:
case GF_3_0_1:
case GF_3_1:
case GF_3_1_1:
case GF_3_1_2:
case GF_3_1_2_2:
case GF_3_1_2_3:
case GF_3_1_2_4:
case GF_3_1_2_5:
case GF_4:
case GF_4_0_1:
case GF_4_1:
case GF_4_1_1:
case GF_4_1_2:
case GF_5:
case GF_5_0_1:
case GF_5_1_0:
case GF_6:
case GF_6_1_0:
case GF_6_2_0:
case GF_6_2_1:
case GF_6_2_2:
case GF_6_2_3:
case GF_6_2_4:
case GF_6_2_5:
return AdminFactoryRest.getInstance();
// Anything else is not unknown.
default:
throw new CommandException(CommandException.UNKNOWN_VERSION);
}
}
/**
* Creates specific <code>AdminFactory</code> child class instance
* to build GlassFish server administration command runner and data objects
* based on provided GlassFish server administration interface type.
* <p/>
* @param adminInterface GlassFish server administration interface type.
* @return Child factory class instance to work with given GlassFish server.
*/
public static AdminFactory getInstance(
final GlassFishAdminInterface adminInterface) throws CommandException {
switch (adminInterface) {
case REST: return AdminFactoryRest.getInstance();
case HTTP: return AdminFactoryHttp.getInstance();
// Anything else is unknown.
default:
throw new CommandException(
CommandException.UNKNOWN_ADMIN_INTERFACE);
}
}
////////////////////////////////////////////////////////////////////////////
// Abstract methods //
////////////////////////////////////////////////////////////////////////////
/**
* Build runner for command interface execution and connect it with
* provided <code>Command</code> instance.
* <p/>
* @param srv Target GlassFish server.
* @param cmd GlassFish server administration command entity.
* @return GlassFish server administration command execution object.
*/
public abstract Runner getRunner(
final GlassFishServer srv, final Command cmd);
////////////////////////////////////////////////////////////////////////////
// Methods //
////////////////////////////////////////////////////////////////////////////
/**
* Constructs an instance of selected <code>Runner</code> child class.
* <p/>
* @param srv Target GlassFish server.
* @param cmd GlassFish server administration command entity.
* @param runnerClass Class of newly instantiated <code>runner</code>
* @return GlassFish server administration command execution object.
* @throws <code>CommandException</code> if construction of new instance
* fails.
*/
Runner newRunner(final GlassFishServer srv, final Command cmd,
final Class runnerClass) throws CommandException {
final String METHOD = "newRunner";
Constructor<Runner> con = null;
Runner runner = null;
try {
con = runnerClass.getConstructor(
GlassFishServer.class, Command.class);
} catch (NoSuchMethodException | SecurityException nsme) {
throw new CommandException(CommandException.RUNNER_INIT, nsme);
}
if (con == null) {
return runner;
}
try {
runner = con.newInstance(srv, cmd);
} catch (InstantiationException | IllegalAccessException ie) {
throw new CommandException(CommandException.RUNNER_INIT, ie);
} catch (InvocationTargetException ite) {
LOGGER.log(Level.WARNING, "exceptionMsg", ite.getMessage());
Throwable t = ite.getCause();
if (t != null) {
LOGGER.log(Level.WARNING, "cause", t.getMessage());
}
throw new CommandException(CommandException.RUNNER_INIT, ite);
}
return runner;
}
}