/* * Copyright 2014 Red Hat, Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php * * You may elect to redistribute this code under either of these licenses. */ package io.vertx.core.spi; import io.vertx.core.DeploymentOptions; import io.vertx.core.Future; import io.vertx.core.Verticle; import io.vertx.core.Vertx; /** * * Has responsibility for creating verticle instances. * <p> * Implementations of this are responsible for creating verticle written in various different JVM languages and * for other purposes. * * @author <a href="http://tfox.org">Tim Fox</a> */ public interface VerticleFactory { /** * Helper method to remove a prefix from an identifier string * @param identifer the identifier * @return The identifier without the prefix (if it had any) */ static String removePrefix(String identifer) { int pos = identifer.indexOf(':'); if (pos != -1) { if (pos == identifer.length() - 1) { throw new IllegalArgumentException("Invalid identifier: " + identifer); } return identifer.substring(pos + 1); } else { return identifer; } } /** * The order of the factory. If there is more than one matching verticle they will be tried in ascending order. * @return the order */ default int order() { return 0; } /** * Does the factory require resolution? See {@link #resolve(String, DeploymentOptions, ClassLoader, Future)} for more * information. * @return true if yes */ default boolean requiresResolve() { return false; } /** * If the {@link #createVerticle(String, ClassLoader)} method might be slow Vert.x will call it using a worker * thread instead of an event loop if this returns true * @return true if {@link #createVerticle(String, ClassLoader)} should be called on a worker thread. */ default boolean blockingCreate() { return false; } /** * Some verticle factories can "resolve" the identifer to another identifier which is then used to look up the real * verticle factory. An Example is the Vert.x service factory which takes an identifier of form `service:com.mycompany.clever-db-service" * then looks for a JSON file which it loads to get the real identifier (main verticle). * * @param identifier The identifier * @param deploymentOptions The deployment options - these can be changed inside the resolve method (e.g. to add an extra classpath) * @param classLoader The classloader * @param resolution A future which will receive the result of the resolution. */ default void resolve(String identifier, DeploymentOptions deploymentOptions, ClassLoader classLoader, Future<String> resolution) { resolution.complete(identifier); } /** * Initialise the factory * @param vertx The Vert.x instance */ default void init(Vertx vertx) { } /** * Close the factory. The implementation must release all resources. */ default void close() { } /** * @return The prefix for the factory, e.g. "java", or "js". */ String prefix(); /** * Create a verticle instance. If this method is likely to be slow (e.g. Ruby or JS verticles which might have to * start up a language engine) then make sure it is run on a worker thread by returning `true` from * {@link #blockingCreate()}. * * @param verticleName The verticle name * @param classLoader The class loader * @return The instance * @throws Exception */ Verticle createVerticle(String verticleName, ClassLoader classLoader) throws Exception; }