/*******************************************************************************
* Copyright (c) 2011 GigaSpaces Technologies Ltd. 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 org.cloudifysource.utilitydomain.context;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import org.cloudifysource.domain.context.ServiceInstance;
import org.cloudifysource.dsl.internal.CloudifyConstants;
import org.openspaces.admin.internal.pu.DefaultProcessingUnitInstance;
import org.openspaces.admin.pu.ProcessingUnitInstance;
import org.openspaces.pu.service.ServiceDetails;
import org.openspaces.pu.service.ServiceMonitors;
/******************
* Represents a single instance of a service.
*
* @author barakme
*
*/
public class ServiceInstanceImpl implements ServiceInstance {
private static final int DEFAULT_TIMEOUT_IN_MINUTES = 1;
private static java.util.logging.Logger logger = java.util.logging.Logger
.getLogger(ServiceInstanceImpl.class.getName());
private final ProcessingUnitInstance pui;
ServiceInstanceImpl(final ProcessingUnitInstance pui) {
this.pui = pui;
}
/* (non-Javadoc)
* @see org.cloudifysource.dsl.internal.context.ServiceInstance#getInstanceId()
*/
@Override
public int getInstanceId() {
if (pui == null) {
return 1;
}
return pui.getInstanceId();
}
/* (non-Javadoc)
* @see org.cloudifysource.dsl.internal.context.ServiceInstance#getHostAddress()
*/
@Override
public String getHostAddress() {
if (pui != null) {
return pui.getMachine().getHostAddress();
} else {
try {
return InetAddress.getLocalHost().getHostAddress();
} catch (final UnknownHostException e) {
logger.log(Level.SEVERE, "Failed to read local host address", e);
return null;
}
}
}
/* (non-Javadoc)
* @see org.cloudifysource.dsl.internal.context.ServiceInstance#getHostName()
*/
@Override
public String getHostName() {
if (pui != null) {
return pui.getMachine().getHostName();
} else {
try {
return InetAddress.getLocalHost().getHostName();
} catch (final UnknownHostException e) {
logger.log(Level.SEVERE, "Failed to read local host address", e);
return null;
}
}
}
@Override
public String toString() {
return "ServiceInstance [getInstanceID()=" + getInstanceId() + ", getHostAddress()=" + getHostAddress()
+ ", getHostName()=" + getHostName() + "]";
}
/* (non-Javadoc)
* @see org.cloudifysource.dsl.internal.context.ServiceInstance#getDetails(java.lang.String)
*/
@Override
public Object getDetails(final String serviceDetailsKey) {
if (this.pui == null) { // running in integrated container
return null;
}
final Collection<ServiceDetails> allDetails = this.pui.getServiceDetailsByServiceId().values();
for (final ServiceDetails serviceDetails : allDetails) {
final Object res = serviceDetails.getAttributes().get(serviceDetailsKey);
if (res != null) {
return res;
}
}
return null;
}
/* (non-Javadoc)
* @see org.cloudifysource.dsl.internal.context.ServiceInstance#getMonitors(java.lang.String)
*/
@Override
public Object getMonitors(final String serviceMonitorsKey) {
if (this.pui == null) { // running in integrated container
return null;
}
final Collection<ServiceMonitors> allMonitors = this.pui.getStatistics().getMonitors().values();
for (final ServiceMonitors serviceMonitors : allMonitors) {
final Object res = serviceMonitors.getMonitors().get(serviceMonitorsKey);
if (res != null) {
return res;
}
}
return null;
}
/***********
* Invokes a custom command on this instance, returning immediately.
*
* @param commandName
* the command name.
* @param params
* the command parameters, may be zero-length.
* @return Future for the invocation result.
*/
Future<Object> invokeAsync(final String commandName, final Object[] params) {
logger.log(Level.FINE, "Invoking command: {0} on instance {1}",
new Object[] { commandName, this.getInstanceId() });
final Map<String, Object> paramsMap = new HashMap<String, Object>();
paramsMap.put(CloudifyConstants.INVOCATION_PARAMETER_COMMAND_NAME, commandName);
for (int i = 0; i < params.length; i++) {
paramsMap.put(CloudifyConstants.INVOCATION_PARAMETERS_KEY + i, params[i]);
}
final Future<Object> future = ((DefaultProcessingUnitInstance) pui).invoke("universalServiceManagerBean",
paramsMap);
return new InvocationFuture(future);
}
/* (non-Javadoc)
* @see org.cloudifysource.dsl.internal.context.ServiceInstance#invoke(java.lang.String, java.lang.Object[])
*/
@Override
public Object invoke(final String commandName, final Object[] params) throws InterruptedException,
ExecutionException, TimeoutException {
return invoke(commandName, params, DEFAULT_TIMEOUT_IN_MINUTES, TimeUnit.MINUTES);
}
@Override
public Object invoke(final String commandName, final Object[] params, final long timeout,
final TimeUnit unit) throws InterruptedException, ExecutionException,
TimeoutException {
final Future<Object> future = invokeAsync(commandName, params);
final Object result = future.get(timeout, unit);
return result;
}
}