/*
* ProActive Parallel Suite(TM):
* The Open Source library for parallel and distributed
* Workflows & Scheduling, Orchestration, Cloud Automation
* and Big Data Analysis on Enterprise Grids & Clouds.
*
* Copyright (c) 2007 - 2017 ActiveEon
* Contact: contact@activeeon.com
*
* This library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation: version 3 of
* the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If needed, contact us to obtain a release under GPL Version 2 or 3
* or a different license than the AGPL.
*/
package org.ow2.proactive.resourcemanager.frontend;
import org.apache.log4j.Logger;
import org.objectweb.proactive.annotation.PublicAPI;
import org.objectweb.proactive.core.util.URIBuilder;
import org.ow2.proactive.authentication.Connection;
import org.ow2.proactive.resourcemanager.authentication.RMAuthentication;
import org.ow2.proactive.resourcemanager.common.RMConstants;
import org.ow2.proactive.resourcemanager.exception.RMException;
/**
* This class provides means to connect to an existing RM.
* As a result of connection returns {@link RMAuthentication} for further authentication.
*
* @author The ProActive Team
* @since ProActive Scheduling 0.9
*
*/
@PublicAPI
public class RMConnection extends Connection<RMAuthentication> {
private static RMConnection instance;
private RMConnection() {
super(RMAuthentication.class);
}
public Logger getLogger() {
return Logger.getLogger(RMConnection.class);
}
public static synchronized RMConnection getInstance() {
if (instance == null) {
instance = new RMConnection();
}
return instance;
}
/**
* Returns the {@link RMAuthentication} from the specified
* URL. If resource manager is not available or initializing throws an exception.
*
* @param url the URL of the resource manager to join.
* @return the resource manager authentication at the specified URL.
* @throws RMException
* thrown if the connection to the resource manager cannot be
* established.
*/
public static RMAuthentication join(String url) throws RMException {
try {
return getInstance().connect(normalizeRM(url));
} catch (Exception e) {
throw new RMException("Cannot join the Resource Manager at " + url + " due to " + e.getMessage(), e);
}
}
/**
* Connects to the resource manager using given URL. The current thread will be block until
* connection established or an error occurs.
*/
public static RMAuthentication waitAndJoin(String url) throws RMException {
return waitAndJoin(url, 0);
}
/**
* Connects to the resource manager with a specified timeout value. A timeout of
* zero is interpreted as an infinite timeout. The connection will then
* block until established or an error occurs.
*/
public static RMAuthentication waitAndJoin(String url, long timeout) throws RMException {
try {
return getInstance().waitAndConnect(normalizeRM(url), timeout);
} catch (Exception e) {
throw new RMException("Cannot join the Resource Manager at " + url + " due to " + e.getMessage(), e);
}
}
/**
* Normalize the URL of the RESOURCE MANAGER.<br>
*
* @param url, the URL to normalize.
* @return //localhost/RM_NAME if the given url is null.<br>
* the given URL if it terminates by the RM_NAME<br>
* the given URL with /RM_NAME appended if URL does not end with /<br>
* the given URL with RM_NAME appended if URL does end with /<br>
* the given URL with RM_NAME appended if URL does not end with RM_NAME
*/
private static String normalizeRM(String url) {
return URIBuilder.buildURI(Connection.normalize(url), RMConstants.NAME_ACTIVE_OBJECT_RMAUTHENTICATION)
.toString();
}
}