blob: eff749e976d0c20f0dbe97f157845b5ab2d98584 [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.apache.ignite.internal;
import java.lang.reflect.Constructor;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.internal.processors.compress.CompressionProcessor;
import org.apache.ignite.internal.processors.query.NoOpQueryEngine;
import org.apache.ignite.internal.util.IgniteUtils;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.plugin.extensions.communication.MessageFactory;
import org.jetbrains.annotations.Nullable;
/**
* Component type.
*/
public enum IgniteComponentType {
/** @deprecated Component was removed. Enum can't be removed because enum ordinal is important. */
@Deprecated
IGFS(
"org.apache.ignite.internal.processors.igfs.IgfsNoopProcessor",
"org.apache.ignite.internal.processors.igfs.IgfsProcessor",
"ignite-hadoop"
),
/** @deprecated Component was removed. Enum can't be removed because enum ordinal is important. */
@Deprecated
HADOOP(
"org.apache.ignite.internal.processors.hadoop.HadoopNoopProcessor",
"org.apache.ignite.internal.processors.hadoop.HadoopProcessor",
"ignite-hadoop"
),
/** @deprecated Component was removed. Enum can't be removed because enum ordinal is important. */
@Deprecated
HADOOP_HELPER(
"org.apache.ignite.internal.processors.hadoop.HadoopNoopHelper",
"org.apache.ignite.internal.processors.hadoop.HadoopHelperImpl",
"ignite-hadoop"
),
/** @deprecated Component was removed. Enum can't be removed because enum ordinal is important. */
@Deprecated
IGFS_HELPER(
"org.apache.ignite.internal.processors.igfs.IgfsNoopHelper",
"org.apache.ignite.internal.processors.igfs.IgfsHelperImpl",
"ignite-hadoop"
),
/** Spring XML parsing. */
SPRING(
null,
"org.apache.ignite.internal.util.spring.IgniteSpringHelperImpl",
"ignite-spring"
),
/** Indexing. */
INDEXING(
null,
"org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing",
"ignite-indexing",
"org.apache.ignite.internal.processors.query.h2.twostep.msg.GridH2ValueMessageFactory"
),
/** Nodes starting using SSH. */
SSH(
null,
"org.apache.ignite.internal.util.nodestart.IgniteSshHelperImpl",
"ignite-ssh"
),
/** Integration of cache transactions with JTA. */
JTA(
"org.apache.ignite.internal.processors.cache.jta.CacheNoopJtaManager",
"org.apache.ignite.internal.processors.cache.jta.CacheJtaManager",
"ignite-jta"
),
/** Cron-based scheduling, see {@link org.apache.ignite.IgniteScheduler}. */
SCHEDULE(
"org.apache.ignite.internal.processors.schedule.IgniteNoopScheduleProcessor",
"org.apache.ignite.internal.processors.schedule.IgniteScheduleProcessor",
"ignite-schedule"
),
/** */
COMPRESSION(
CompressionProcessor.class.getName(),
"org.apache.ignite.internal.processors.compress.CompressionProcessorImpl",
"ignite-compress"
),
/** OpenCensus tracing implementation. */
TRACING(
null,
"org.apache.ignite.spi.tracing.opencensus.OpenCensusTracingSpi",
"ignite-opencensus"
),
/** Experimental calcite based query engine. */
QUERY_ENGINE(
NoOpQueryEngine.class.getName(),
"org.apache.ignite.internal.processors.query.calcite.CalciteQueryProcessor",
"ignite-calcite",
"org.apache.ignite.internal.processors.query.calcite.message.CalciteMessageFactory"
);
/** No-op class name. */
private final String noOpClsName;
/** Class name. */
private final String clsName;
/** Module name. */
private final String module;
/** Optional message factory for component. */
private final String msgFactoryCls;
/**
* Constructor.
*
* @param noOpClsName Class name for no-op implementation.
* @param clsName Class name.
* @param module Module name.
*/
IgniteComponentType(String noOpClsName, String clsName, String module) {
this(noOpClsName, clsName, module, null);
}
/**
* Constructor.
*
* @param noOpClsName Class name for no-op implementation.
* @param clsName Class name.
* @param module Module name.
* @param msgFactoryCls {@link MessageFactory} class for the component.
*/
IgniteComponentType(String noOpClsName, String clsName, String module, String msgFactoryCls) {
this.noOpClsName = noOpClsName;
this.clsName = clsName;
this.module = module;
this.msgFactoryCls = msgFactoryCls;
}
/**
* @return Component class name.
*/
public String className() {
return clsName;
}
/**
* @return Component module name.
*/
public String module() {
return module;
}
/**
* Check whether real component class is in classpath.
*
* @return {@code True} if in classpath.
*/
public boolean inClassPath() {
return IgniteUtils.inClassPath(clsName);
}
/**
* Creates component.
*
* @param ctx Kernal context.
* @param noOp No-op flag.
* @return Created component.
* @throws IgniteCheckedException If failed.
*/
public <T> T create(GridKernalContext ctx, boolean noOp) throws IgniteCheckedException {
return create0(ctx, noOp ? noOpClsName : clsName);
}
/**
* Creates component.
*
* @param ctx Kernal context.
* @param mandatory If the component is mandatory.
* @return Created component.
* @throws IgniteCheckedException If failed.
*/
public <T> T createIfInClassPath(GridKernalContext ctx, boolean mandatory)
throws IgniteCheckedException {
String cls = clsName;
try {
Class.forName(cls);
}
catch (ClassNotFoundException e) {
if (mandatory)
throw componentException(e);
cls = noOpClsName;
}
return create0(ctx, cls);
}
/**
* Creates component.
*
* @param noOp No-op flag.
* @return Created component.
* @throws IgniteCheckedException If failed.
*/
public <T> T create(boolean noOp) throws IgniteCheckedException {
return create0(null, noOp ? noOpClsName : clsName);
}
/**
* First tries to find main component class, if it is not found creates no-op implementation.
*
* @param ctx Kernal context.
* @return Created component or no-op implementation.
* @throws IgniteCheckedException If failed.
*/
public <T> T createOptional(GridKernalContext ctx) throws IgniteCheckedException {
return createOptional0(ctx);
}
/**
* First tries to find main component class, if it is not found creates no-op implementation.
*
* @return Created component or no-op implementation.
* @throws IgniteCheckedException If failed.
*/
public <T> T createOptional() throws IgniteCheckedException {
return createOptional0(null);
}
/**
* First tries to find main component class, if it is not found creates no-op implementation.
*
* @param ctx Kernal context.
* @return Created component or no-op implementation.
* @throws IgniteCheckedException If failed.
*/
private <T> T createOptional0(@Nullable GridKernalContext ctx) throws IgniteCheckedException {
Class<?> cls;
try {
cls = Class.forName(clsName);
}
catch (ClassNotFoundException ignored) {
try {
cls = Class.forName(noOpClsName);
}
catch (ClassNotFoundException e) {
throw new IgniteCheckedException("Failed to find both real component class and no-op class.", e);
}
}
try {
if (ctx == null) {
Constructor<?> ctor = cls.getConstructor();
return (T)ctor.newInstance();
}
else {
Constructor<?> ctor = cls.getConstructor(GridKernalContext.class);
return (T)ctor.newInstance(ctx);
}
}
catch (Exception e) {
throw componentException(e);
}
}
/**
* Creates component instance.
*
* @param ctx Kernal context.
* @param clsName Component class name.
* @return Component instance.
* @throws IgniteCheckedException If failed.
*/
private <T> T create0(@Nullable GridKernalContext ctx, String clsName) throws IgniteCheckedException {
try {
Class<?> cls = Class.forName(clsName);
if (ctx == null) {
Constructor<?> ctor = cls.getConstructor();
return (T)ctor.newInstance();
}
else {
Constructor<?> ctor = cls.getConstructor(GridKernalContext.class);
return (T)ctor.newInstance(ctx);
}
}
catch (Throwable e) {
throw componentException(e);
}
}
/**
* Creates message factory for the component.
*
* @return Message factory or {@code null} if none or the component is not in classpath.
* @throws IgniteCheckedException If failed.
*/
@Nullable public MessageFactory messageFactory() throws IgniteCheckedException {
Class<?> cls;
if (msgFactoryCls == null || null == (cls = U.classForName(msgFactoryCls, null)))
return null;
return (MessageFactory)U.newInstance(cls);
}
/**
* @param err Creation error.
* @return Component creation exception.
*/
private IgniteCheckedException componentException(Throwable err) {
return new IgniteCheckedException("Failed to create Ignite component (consider adding " + module +
" module to classpath) [component=" + this + ", cls=" + clsName + ']', err);
}
}