/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.runtime.adapter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.eclipse.core.runtime.IAdapterFactory; import org.eclipse.core.runtime.IStatus; import org.eclipse.wst.server.core.IServer; import org.jboss.ide.eclipse.as.core.server.internal.JBossServer; import org.jboss.ide.eclipse.as.core.server.internal.v7.JBoss7Server; import org.jboss.ide.eclipse.as.core.server.internal.v7.Wildfly8Server; import org.teiid.designer.runtime.DqpPlugin; import org.teiid.designer.runtime.TeiidParentServerListener; import org.teiid.designer.runtime.TeiidServerFactory; import org.teiid.designer.runtime.TeiidServerFactory.ServerOptions; import org.teiid.designer.runtime.spi.ITeiidAdminInfo; import org.teiid.designer.runtime.spi.ITeiidJdbcInfo; import org.teiid.designer.runtime.spi.ITeiidServer; import org.teiid.designer.runtime.spi.ITeiidServerManager; import org.teiid.designer.runtime.version.spi.ITeiidServerVersion; /** * Adapter factory that can adapt an {@link IServer} to a {@link ITeiidServer} * * @since 8.0 */ public class TeiidServerAdapterFactory implements IAdapterFactory { private Object lock = new Object(); private ITeiidServerManager serverManager; @Override public Class[] getAdapterList() { return new Class[] { ITeiidServer.class }; } @Override public Object getAdapter(Object adaptableObject, Class adapterType) { if (! ITeiidServer.class.isAssignableFrom(adapterType)) return null; try { if (adaptableObject instanceof IServer) { return adaptServer((IServer) adaptableObject, ServerOptions.ADD_TO_REGISTRY, ServerOptions.CONNECT); } } catch (Exception ex) { if(! ex.getMessage().contains(TeiidParentServerListener.JBAS013493_CODE)) { // Teiid really isn't installed and this is called as part of this factory's extension point. // So look for the DqpPlugin.Util.log(IStatus.ERROR, ex, "Failed to determine if server supports teiid"); //$NON-NLS-1$ } } return null; } private ITeiidServerManager getTeiidServerManager() { if (serverManager == null) serverManager = DqpPlugin.getInstance().getServerManager(); return serverManager; } /** * Adapt the given server to an {@link ITeiidServer} passing in any {@link ServerOptions} * if required * * @param server * @param options * * @return {@link ITeiidServer} or null * @throws Exception */ public ITeiidServer adaptServer(final IServer server, ServerOptions... options) throws Exception { if (! getTeiidServerManager().isStarted()) return null; JBoss7Server jb7 = (JBoss7Server) server.loadAdapter(JBoss7Server.class, null); Wildfly8Server wf8 = (Wildfly8Server) server.loadAdapter(Wildfly8Server.class, null); if (jb7 != null) { return adaptJBoss7Server(server, jb7, options); } else if( wf8 != null ) { return adaptJBoss8Server(server, wf8, options); } else { JBossServer jb = (JBossServer) server.loadAdapter(JBossServer.class, null); if (jb != null) return adaptJBossServer(server, jb, options); } return null; } /** * Adapt the older JBoss Server to an {@link ITeiidServer} only if * JB is started and contains a Teiid Instance * * @param jbossServer * @param options * * @return * @throws Exception */ private ITeiidServer adaptJBossServer(IServer parentServer, JBossServer jbossServer, ServerOptions... options) throws Exception { ITeiidServer teiidServer = null; List<ServerOptions> optionList = Collections.emptyList(); if (options != null) optionList = Arrays.asList(options); /* * In some cases we want to return a new Teiid Instance even if its in the registry * Such Teiid Instances should be disposed of and not kept around. */ if (! optionList.contains(ServerOptions.NO_CHECK_SERVER_REGISTRY)) { // No specific option specifying we should not check the registry so check // and return any Teiid Instance found that fits the url teiidServer = getTeiidServerManager().getServer(parentServer); if (teiidServer != null) return teiidServer; } synchronized (lock) { if (! optionList.contains(ServerOptions.NO_CHECK_CONNECTION)) { if (! JBossServerUtil.isJBossServerConnected(parentServer, jbossServer)) return null; if (! JBossServerUtil.isTeiidServer(parentServer, jbossServer)) return null; } // Check again in case the thread had to wait for the lock if (! optionList.contains(ServerOptions.NO_CHECK_SERVER_REGISTRY)) { teiidServer = getTeiidServerManager().getServer(parentServer); } if (teiidServer == null) teiidServer = createJbossTeiidServer(parentServer, jbossServer, options); return teiidServer; } } /** * Adapt the JBoss 7 server to an {@link ITeiidServer} only if * JB is started and contains a Teiid Instance. * * @param parentServer * @param jboss7Server * @param options * * @throws Exception * @return */ private ITeiidServer adaptJBoss7Server(IServer parentServer, JBoss7Server jboss7Server, ServerOptions... options) throws Exception { ITeiidServer teiidServer = null; List<ServerOptions> optionList = Collections.emptyList(); if (options != null) optionList = Arrays.asList(options); /* * In some cases we want to return a new Teiid Instance even if its in the registry * Such Teiid Instances should be disposed of and not kept around. */ if (! optionList.contains(ServerOptions.NO_CHECK_SERVER_REGISTRY)) { // No specific option specifying we should not check the registry so check // and return any Teiid Instance found that fits the url teiidServer = getTeiidServerManager().getServer(parentServer); if (teiidServer != null) return teiidServer; } synchronized (lock) { if (! optionList.contains(ServerOptions.NO_CHECK_CONNECTION)) { if (! JBoss7ServerUtil.isJBossServerConnected(parentServer, jboss7Server)) return null; if (! JBoss7ServerUtil.isTeiidServer(parentServer, jboss7Server)) return null; } // Check again in case the thread had to wait for the lock if (! optionList.contains(ServerOptions.NO_CHECK_SERVER_REGISTRY)) { teiidServer = getTeiidServerManager().getServer(parentServer); } if (teiidServer == null) teiidServer = createJboss7TeiidServer(parentServer, jboss7Server, options); return teiidServer; } } /** * Adapt the JBoss 7 server to an {@link ITeiidServer} only if * JB is started and contains a Teiid Instance. * * @param parentServer * @param jboss7Server * @param options * * @throws Exception * @return */ private ITeiidServer adaptJBoss8Server(IServer parentServer, Wildfly8Server jboss8Server, ServerOptions... options) throws Exception { ITeiidServer teiidServer = null; List<ServerOptions> optionList = Collections.emptyList(); if (options != null) optionList = Arrays.asList(options); /* * In some cases we want to return a new Teiid Instance even if its in the registry * Such Teiid Instances should be disposed of and not kept around. */ if (! optionList.contains(ServerOptions.NO_CHECK_SERVER_REGISTRY)) { // No specific option specifying we should not check the registry so check // and return any Teiid Instance found that fits the url teiidServer = getTeiidServerManager().getServer(parentServer); if (teiidServer != null) return teiidServer; } synchronized (lock) { if (! optionList.contains(ServerOptions.NO_CHECK_CONNECTION)) { if (! JBoss7ServerUtil.isJBossServerConnected(parentServer, jboss8Server)) return null; if (! JBoss7ServerUtil.isTeiidServer(parentServer, jboss8Server)) return null; } // Check again in case the thread had to wait for the lock if (! optionList.contains(ServerOptions.NO_CHECK_SERVER_REGISTRY)) { teiidServer = getTeiidServerManager().getServer(parentServer); } if (teiidServer == null) teiidServer = createJboss7TeiidServer(parentServer, jboss8Server, options); return teiidServer; } } /** * Create a new {@link ITeiidServer}. * * @see ServerOptions for the options parameter. * * @param parentServer * @param jboss7Server * @param options * * @return new {@link ITeiidServer} * @throws Exception */ private ITeiidServer createJboss7TeiidServer(final IServer parentServer, final JBoss7Server jboss7Server, ServerOptions... options) throws Exception { TeiidServerFactory factory = new TeiidServerFactory(); // Check if ADD_TO_REGISTRY option is set, then assume new server // If so, then set default username/PWD to null String defaultJdbcUsername = ITeiidJdbcInfo.DEFAULT_JDBC_USERNAME; String defaultJdbcPassword = ITeiidJdbcInfo.DEFAULT_JDBC_PASSWORD; List<ServerOptions> optionList = Collections.emptyList(); if (options != null) optionList = Arrays.asList(options); // If ADD_TO_REGISTRY exists, it's being added as part of a NEW SERVER action // If so, then null out default username/pwd values if (optionList.contains(ServerOptions.ADD_TO_REGISTRY)) { defaultJdbcUsername = null; defaultJdbcPassword = null; } ITeiidServer teiidServer = factory.createTeiidServer(JBoss7ServerUtil.getTeiidRuntimeVersion(parentServer, jboss7Server), getTeiidServerManager(), parentServer, new Integer(jboss7Server.getManagementPort()).toString(), jboss7Server.getUsername(), jboss7Server.getPassword(), JBoss7ServerUtil.getJdbcPort(parentServer, jboss7Server), defaultJdbcUsername, defaultJdbcPassword, options); return teiidServer; } /** * Create a new {@link ITeiidServer}. * * @see ServerOptions for the options parameter. * * @param parentServer * @param jbossServer * @param options * * @return new {@link ITeiidServer} */ private ITeiidServer createJbossTeiidServer(final IServer parentServer, final JBossServer jbossServer, ServerOptions... options) { List<ServerOptions> optionList = new ArrayList<ServerOptions>(); if (options != null) { for (ServerOptions serverOption : options) { optionList.add(serverOption); } } // Default teiid instances prior to 8.x had the admin connection secured optionList.add(ServerOptions.ADMIN_SECURE_CONNECTION); TeiidServerFactory factory = new TeiidServerFactory(); ITeiidServer teiidServer = factory.createTeiidServer(JBossServerUtil.getTeiidRuntimeVersion(parentServer, jbossServer), getTeiidServerManager(), parentServer, ITeiidAdminInfo.DEFAULT_LEGACY_PORT, ITeiidAdminInfo.DEFAULT_ADMIN_USERNAME, ITeiidAdminInfo.DEFAULT_ADMIN_PASSWORD, ITeiidJdbcInfo.DEFAULT_PORT, ITeiidJdbcInfo.DEFAULT_JDBC_USERNAME, ITeiidJdbcInfo.DEFAULT_JDBC_PASSWORD, optionList.toArray(new ServerOptions[0])); return teiidServer; } /** * @param server * * @return true if connected * @throws Exception */ public boolean isParentServerConnected(IServer server) throws Exception { if (server.getServerState() != IServer.STATE_STARTED) return false; JBoss7Server jb7 = (JBoss7Server) server.loadAdapter(JBoss7Server.class, null); if (jb7 != null) { return JBoss7ServerUtil.isJBossServerConnected(server, jb7); } else { JBossServer jb = (JBossServer) server.loadAdapter(JBossServer.class, null); if (jb != null) return JBossServerUtil.isJBossServerConnected(server, jb); } return false; } /** * @param server * * @return the teiid runtime version of the given server * @throws Exception */ public ITeiidServerVersion getTeiidRuntimeVersion(IServer server) throws Exception { if (! getTeiidServerManager().isStarted()) return null; JBoss7Server jb7 = (JBoss7Server) server.loadAdapter(JBoss7Server.class, null); if (jb7 != null) { return JBoss7ServerUtil.getTeiidRuntimeVersion(server, jb7); } else { JBossServer jb = (JBossServer) server.loadAdapter(JBossServer.class, null); if (jb != null) return JBossServerUtil.getTeiidRuntimeVersion(server, jb); } return null; } /** * @param server * @return the request execution timeout value. The server parameter is not currently * necessary but may be in the future is different server implementations require * different timeouts. */ public int getParentRequestExecutionTimeout(IServer server) { return DqpPlugin.getInstance().getJbossRequestTimeout(); } }