/*
* 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.ignite.internal.visor.node;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.visor.VisorDataTransferObject;
import org.apache.ignite.spi.IgniteSpi;
import org.apache.ignite.spi.IgniteSpiConfiguration;
import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactClass;
import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactObject;
/**
* Data transfer object for node SPIs configuration properties.
*/
public class VisorSpisConfiguration extends VisorDataTransferObject {
/** */
private static final long serialVersionUID = 0L;
/** Discovery SPI. */
private VisorSpiDescription discoSpi;
/** Communication SPI. */
private VisorSpiDescription commSpi;
/** Event storage SPI. */
private VisorSpiDescription evtSpi;
/** Collision SPI. */
private VisorSpiDescription colSpi;
/** Deployment SPI. */
private VisorSpiDescription deploySpi;
/** Checkpoint SPIs. */
private VisorSpiDescription[] cpSpis;
/** Failover SPIs. */
private VisorSpiDescription[] failSpis;
/** Load balancing SPIs. */
private VisorSpiDescription[] loadBalancingSpis;
/** Indexing SPIs. */
private VisorSpiDescription[] indexingSpis;
/**
* Default constructor.
*/
public VisorSpisConfiguration() {
// No-op.
}
/**
* Collects SPI information based on GridSpiConfiguration-annotated methods.
* Methods with {@code Deprecated} annotation are skipped.
*
* @param spi SPI to collect information on.
* @return Tuple where first component is SPI name and map with properties as second.
*/
private static VisorSpiDescription collectSpiInfo(IgniteSpi spi) {
Class<? extends IgniteSpi> spiCls = spi.getClass();
HashMap<String, Object> res = new HashMap<>();
res.put("Class Name", compactClass(spi));
for (Method mtd : spiCls.getDeclaredMethods()) {
if (mtd.isAnnotationPresent(IgniteSpiConfiguration.class) && !mtd.isAnnotationPresent(Deprecated.class)) {
String mtdName = mtd.getName();
if (mtdName.startsWith("set")) {
String propName = Character.toLowerCase(mtdName.charAt(3)) + mtdName.substring(4);
try {
String[] getterNames = new String[] {
"get" + mtdName.substring(3),
"is" + mtdName.substring(3),
"get" + mtdName.substring(3) + "Formatted"
};
for (String getterName : getterNames) {
try {
Method getter = spiCls.getDeclaredMethod(getterName);
Object getRes = getter.invoke(spi);
res.put(propName, compactObject(getRes));
break;
}
catch (NoSuchMethodException ignored) {
// No-op.
}
}
}
catch (IllegalAccessException ignored) {
res.put(propName, "Error: Method Cannot Be Accessed");
}
catch (InvocationTargetException ite) {
res.put(propName, ("Error: Method Threw An Exception: " + ite));
}
}
}
}
return new VisorSpiDescription(spi.getName(), res);
}
/**
* @param spis Array of spi to process.
* @return Tuple where first component is SPI name and map with properties as second.
*/
private static VisorSpiDescription[] collectSpiInfo(IgniteSpi[] spis) {
VisorSpiDescription[] res = new VisorSpiDescription[spis.length];
for (int i = 0; i < spis.length; i++)
res[i] = collectSpiInfo(spis[i]);
return res;
}
/**
* Create data transfer object for node SPIs configuration properties.
*
* @param c Grid configuration.
*/
public VisorSpisConfiguration(IgniteConfiguration c) {
discoSpi = collectSpiInfo(c.getDiscoverySpi());
commSpi = collectSpiInfo(c.getCommunicationSpi());
evtSpi = collectSpiInfo(c.getEventStorageSpi());
colSpi = collectSpiInfo(c.getCollisionSpi());
deploySpi = collectSpiInfo(c.getDeploymentSpi());
cpSpis = collectSpiInfo(c.getCheckpointSpi());
failSpis = collectSpiInfo(c.getFailoverSpi());
loadBalancingSpis = collectSpiInfo(c.getLoadBalancingSpi());
indexingSpis = F.asArray(collectSpiInfo(c.getIndexingSpi()));
}
/**
* @return Discovery SPI.
*/
public VisorSpiDescription getDiscoverySpi() {
return discoSpi;
}
/**
* @return Communication SPI.
*/
public VisorSpiDescription getCommunicationSpi() {
return commSpi;
}
/**
* @return Event storage SPI.
*/
public VisorSpiDescription getEventStorageSpi() {
return evtSpi;
}
/**
* @return Collision SPI.
*/
public VisorSpiDescription getCollisionSpi() {
return colSpi;
}
/**
* @return Deployment SPI.
*/
public VisorSpiDescription getDeploymentSpi() {
return deploySpi;
}
/**
* @return Checkpoint SPIs.
*/
public VisorSpiDescription[] getCheckpointSpis() {
return cpSpis;
}
/**
* @return Failover SPIs.
*/
public VisorSpiDescription[] getFailoverSpis() {
return failSpis;
}
/**
* @return Load balancing SPIs.
*/
public VisorSpiDescription[] getLoadBalancingSpis() {
return loadBalancingSpis;
}
/**
* @return Indexing SPIs.
*/
public VisorSpiDescription[] getIndexingSpis() {
return indexingSpis;
}
/** {@inheritDoc} */
@Override protected void writeExternalData(ObjectOutput out) throws IOException {
out.writeObject(discoSpi);
out.writeObject(commSpi);
out.writeObject(evtSpi);
out.writeObject(colSpi);
out.writeObject(deploySpi);
out.writeObject(cpSpis);
out.writeObject(failSpis);
out.writeObject(loadBalancingSpis);
out.writeObject(indexingSpis);
}
/** {@inheritDoc} */
@Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
discoSpi = (VisorSpiDescription)in.readObject();
commSpi = (VisorSpiDescription)in.readObject();
evtSpi = (VisorSpiDescription)in.readObject();
colSpi = (VisorSpiDescription)in.readObject();
deploySpi = (VisorSpiDescription)in.readObject();
cpSpis = (VisorSpiDescription[])in.readObject();
failSpis = (VisorSpiDescription[])in.readObject();
loadBalancingSpis = (VisorSpiDescription[])in.readObject();
indexingSpis = (VisorSpiDescription[])in.readObject();
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(VisorSpisConfiguration.class, this);
}
}