package org.teiid.runtime; import java.io.InputStream; import java.io.StringReader; import java.io.StringWriter; import java.util.*; import javax.xml.transform.OutputKeys; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.teiid.adminapi.*; import org.teiid.adminapi.VDB.ConnectionType; import org.teiid.adminapi.VDB.Status; import org.teiid.adminapi.impl.DataPolicyMetadata; import org.teiid.adminapi.impl.EngineStatisticsMetadata; import org.teiid.adminapi.impl.ModelMetaData; import org.teiid.adminapi.impl.PropertyDefinitionMetadata; import org.teiid.adminapi.impl.SourceMappingMetadata; import org.teiid.adminapi.impl.VDBMetaData; import org.teiid.adminapi.impl.VDBTranslatorMetaData; import org.teiid.client.plan.PlanNode; import org.teiid.core.TeiidComponentException; import org.teiid.deployers.ExtendedPropertyMetadata; import org.teiid.deployers.ExtendedPropertyMetadataList; import org.teiid.deployers.UDFMetaData; import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository; import org.teiid.dqp.internal.process.DQPWorkContext; import org.teiid.dqp.internal.process.SessionAwareCache; import org.teiid.dqp.service.SessionServiceException; import org.teiid.metadata.MetadataStore; import org.teiid.metadata.Schema; import org.teiid.query.metadata.DDLStringVisitor; import org.teiid.query.metadata.TransformationMetadata; import org.teiid.query.metadata.VDBResources; import org.teiid.translator.TranslatorProperty.PropertyType; import org.teiid.vdb.runtime.VDBKey; public class EmbeddedAdminImpl implements Admin { private EmbeddedServer embeddedServer; public EmbeddedAdminImpl(EmbeddedServer embeddedServer) { this.embeddedServer = embeddedServer; } @Override public void setProfileName(String name) { //no op } @Override public void clearCache(String cacheType, String vdbName, int vdbVersion) throws AdminException { clearCache(cacheType, vdbName, String.valueOf(vdbVersion)); } @Override public void addDataRoleMapping(String vdbName, int vdbVersion, String dataRole, String mappedRoleName) throws AdminException { addDataRoleMapping(vdbName, String.valueOf(vdbVersion), dataRole, mappedRoleName); } @Override public void removeDataRoleMapping(String vdbName, int vdbVersion, String dataRole, String mappedRoleName) throws AdminException { removeDataRoleMapping(vdbName, String.valueOf(vdbVersion), dataRole, mappedRoleName); } @Override public void setAnyAuthenticatedForDataRole(String vdbName, int vdbVersion, String dataRole, boolean anyAuthenticated) throws AdminException { setAnyAuthenticatedForDataRole(vdbName, String.valueOf(vdbVersion), dataRole, anyAuthenticated); } @Override public void changeVDBConnectionType(String vdbName, int vdbVersion, ConnectionType type) throws AdminException { changeVDBConnectionType(vdbName, String.valueOf(vdbVersion), type); } @Override public void updateSource(String vdbName, int vdbVersion, String sourceName, String translatorName, String dsName) throws AdminException { updateSource(vdbName, String.valueOf(vdbVersion), sourceName, translatorName, dsName); } @Override public void addSource(String vdbName, int vdbVersion, String modelName, String sourceName, String translatorName, String dsName) throws AdminException { addSource(vdbName, String.valueOf(vdbVersion), modelName, sourceName, translatorName, dsName); } @Override public VDB getVDB(String vdbName, int vdbVersion) throws AdminException { return getVDB(vdbName, String.valueOf(vdbVersion)); } @Override public void removeSource(String vdbName, int vdbVersion, String modelName, String sourceName) throws AdminException { removeSource(vdbName, String.valueOf(vdbVersion), modelName, sourceName); } @Override public void restartVDB(String vdbName, int vdbVersion, String... models) throws AdminException { restartVDB(vdbName, String.valueOf(vdbVersion), models); } @Override public String getSchema(String vdbName, int vdbVersion, String modelName, EnumSet<SchemaObjectType> allowedTypes, String typeNamePattern) throws AdminException { return getSchema(vdbName, String.valueOf(vdbVersion), modelName, allowedTypes, typeNamePattern); } @Override public void removeSource(String vdbName, String vdbVersion, String modelName, String sourceName) throws AdminException { VDBMetaData vdb = checkVDB(vdbName, vdbVersion); synchronized(vdb) { ModelMetaData model = vdb.getModel(modelName); if (model == null) { throw new AdminProcessingException(RuntimePlugin.Event.TEIID40090, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40090, modelName, vdb.getName(), vdb.getVersion())); } SourceMappingMetadata source = model.getSourceMapping(sourceName); if(source == null) { throw new AdminProcessingException(RuntimePlugin.Event.TEIID40107, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40107, sourceName, modelName, vdb.getName(), vdb.getVersion())); } source = model.getSources().remove(sourceName); if(source == null) { throw new AdminProcessingException(RuntimePlugin.Event.TEIID40091, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40091, sourceName, modelName, vdb.getName(), vdb.getVersion())); } } } private VDBMetaData checkVDB(String vdbName) throws AdminProcessingException { VDBMetaData vdb = this.embeddedServer.repo.getLiveVDB(vdbName); return vdb; } private VDBMetaData checkVDB(String vdbName, String vdbVersion) throws AdminProcessingException { VDBMetaData vdb = this.embeddedServer.repo.getLiveVDB(vdbName, vdbVersion); if (vdb == null){ throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40131, vdbName, vdbVersion)); } Status status = vdb.getStatus(); if (status != VDB.Status.ACTIVE) { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40132, vdbName, vdbVersion, status)); } return vdb; } @Override public void addSource(String vdbName, String vdbVersion, String modelName, String sourceName, String translatorName, String dsName) throws AdminException { VDBMetaData vdb = checkVDB(vdbName, vdbVersion); synchronized(vdb) { ModelMetaData model = vdb.getModel(modelName); if (model == null) { throw new AdminProcessingException(RuntimePlugin.Event.TEIID40090, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40090, modelName, vdb.getName(), vdb.getVersion())); } if (!model.isSupportsMultiSourceBindings()) { throw new AdminProcessingException(RuntimePlugin.Event.TEIID40108, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40108, modelName, vdb.getName(), vdb.getVersion())); } SourceMappingMetadata source = model.getSourceMapping(sourceName); if(source != null) { throw new AdminProcessingException(RuntimePlugin.Event.TEIID40107, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40107, sourceName, modelName, vdb.getName(), vdb.getVersion())); } SourceMappingMetadata mapping = new SourceMappingMetadata(sourceName, translatorName, dsName); model.addSourceMapping(mapping); } } @Override public void updateSource(String vdbName, String vdbVersion, String sourceName, String translatorName, String dsName) throws AdminException { VDBMetaData vdb = checkVDB(vdbName, vdbVersion); synchronized(vdb) { for (ModelMetaData m : vdb.getModelMetaDatas().values()) { SourceMappingMetadata mapping = m.getSourceMapping(sourceName); if (mapping != null) { mapping.setTranslatorName(translatorName); mapping.setConnectionJndiName(dsName); } } } } @Override public void changeVDBConnectionType(String vdbName, String vdbVersion, ConnectionType type) throws AdminException { VDBMetaData vdb = checkVDB(vdbName, vdbVersion); synchronized(vdb) { vdb.setConnectionType(type); } } @Override public void deploy(String deployName, InputStream content) throws AdminException { if (!deployName.endsWith("-vdb.xml")) { //$NON-NLS-1$ throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40142, deployName)); } try { this.embeddedServer.deployVDB(content); } catch (Exception e) { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40133, deployName, e), e); } //non xml would be inelegant for embedded - we don't want to create an intermediate copy /*File f = null; try { f = File.createTempFile(deployName, "vdb"); //$NON-NLS-1$ f.deleteOnExit(); ObjectConverterUtil.write(content, f); this.embeddedServer.deployVDBZip(f.toURI().toURL()); } catch (Exception e) { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40133, deployName, e), e); }*/ } @Override public void deploy(String deployName, InputStream content, boolean peristent) throws AdminException { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40137, "deploy")); //$NON-NLS-1$ } @Override public void undeploy(String deployedName) throws AdminException { VDBMetaData vdb = checkVDB(deployedName); if(null == vdb) { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40134, deployedName)); } this.embeddedServer.undeployVDB(deployedName); } @Override public Collection<? extends VDB> getVDBs() throws AdminException { List<VDB> list = new ArrayList<VDB>(); list.addAll(this.embeddedServer.repo.getVDBs()); return list; } @Override public VDB getVDB(String vdbName, String vdbVersion) throws AdminException { return this.embeddedServer.repo.getVDB(vdbName, vdbVersion); } @Override public void restartVDB(String vdbName, String vdbVersion, String... models) throws AdminException { VDBMetaData vdb = checkVDB(vdbName, vdbVersion); synchronized(vdb) { try { // need remove model cache first VDBMetaData currentVdb = this.embeddedServer.repo.removeVDB(vdbName, vdbVersion); ConnectorManagerRepository cmr = this.embeddedServer.cmr; UDFMetaData udf = currentVdb.getAttachment(UDFMetaData.class); // need get the visibilityMap from runtime LinkedHashMap<String, VDBResources.Resource> visibilityMap = new LinkedHashMap<String, VDBResources.Resource>(); MetadataStore store = new MetadataStore(); this.embeddedServer.repo.addVDB(currentVdb, store, visibilityMap, udf, cmr); } catch (Exception e) { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40135, vdbName, vdbVersion, models), e); } } } @Override public Collection<? extends org.teiid.adminapi.Translator> getTranslators() throws AdminException { return this.embeddedServer.getTranslatorRepository().getTranslators(); } @Override public org.teiid.adminapi.Translator getTranslator(String deployedName) throws AdminException { return this.embeddedServer.getTranslatorRepository().getTranslatorMetaData(deployedName); } @Override public Collection<? extends WorkerPoolStatistics> getWorkerPoolStats() throws AdminException { return Arrays.asList(this.embeddedServer.dqp.getWorkerPoolStatistics()); } @Override public Collection<String> getCacheTypes() throws AdminException { Set<String> cacheTypes = new HashSet<String>(); cacheTypes.addAll(SessionAwareCache.getCacheTypes()); return cacheTypes; } @Override public Collection<? extends Session> getSessions() throws AdminException { List<Session> list = new ArrayList<Session>(); list.addAll(this.embeddedServer.sessionService.getActiveSessions()); return list; } @Override public Collection<? extends Request> getRequests() throws AdminException { List<Request> list = new ArrayList<Request>(); list.addAll(this.embeddedServer.dqp.getRequests()); return list; } @Override public Collection<? extends Request> getRequestsForSession(String sessionId) throws AdminException { List<Request> list = new ArrayList<Request>(); list.addAll(this.embeddedServer.dqp.getRequestsForSession(sessionId)); return list; } @Override public Collection<? extends PropertyDefinition> getTemplatePropertyDefinitions(String templateName) throws AdminException { // Embedded dosn't load ra.xml throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40137, "getTemplatePropertyDefinitions")); //$NON-NLS-1$ } @Override public Collection<? extends PropertyDefinition> getTranslatorPropertyDefinitions(String translatorName) throws AdminException { //deprecated throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40130, "getTranslatorPropertyDefinitions")); //$NON-NLS-1$ } @Override public Collection<? extends PropertyDefinition> getTranslatorPropertyDefinitions(String translatorName, TranlatorPropertyType type) throws AdminException { List<PropertyDefinition> list = new ArrayList<PropertyDefinition>(); VDBTranslatorMetaData translator = this.embeddedServer.getTranslatorRepository().getTranslatorMetaData(translatorName); TranlatorPropertyType translatorPropertyType = TranlatorPropertyType.valueOf(type.toString().toUpperCase()); if (translator != null) { ExtendedPropertyMetadataList properties = translator.getAttachment(ExtendedPropertyMetadataList.class); if (translatorPropertyType.equals(TranlatorPropertyType.ALL)) { for (ExtendedPropertyMetadata epm:properties) { list.add(buildNode(epm)); } } else { PropertyType propType = PropertyType.valueOf(type.toString().toUpperCase()); for (ExtendedPropertyMetadata epm:properties) { if (PropertyType.valueOf(epm.category()).equals(propType)) { list.add(buildNode(epm)); } } } } return list; } private PropertyDefinitionMetadata buildNode( ExtendedPropertyMetadata epm) { PropertyDefinitionMetadata pdm = new PropertyDefinitionMetadata(); pdm.setAdvanced(epm.advanced() ); pdm.setAllowedValues(Arrays.asList(epm.allowed())); pdm.setDefaultValue(epm.defaultValue()); pdm.setDescription(epm.description()); pdm.setDisplayName(epm.display()); pdm.setMasked(epm.masked()); pdm.setName(epm.name()); pdm.setPropertyTypeClassName(epm.datatype()); if(epm.readOnly()){ pdm.setModifiable(false); } else { pdm.setModifiable(true); } pdm.setRequired(epm.required()); pdm.setCategory(epm.category()); return pdm; } @Override public Collection<? extends Transaction> getTransactions() throws AdminException { return this.embeddedServer.dqp.getTransactions(); } @Override public void clearCache(String cacheType) throws AdminException { if(cacheType.equals(Admin.Cache.QUERY_SERVICE_RESULT_SET_CACHE.name())){ this.embeddedServer.getRsCache().clearAll(); } else if(cacheType.equals(Admin.Cache.PREPARED_PLAN_CACHE.name())) { this.embeddedServer.getPpcCache().clearAll(); } else { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40139, cacheType, Admin.Cache.QUERY_SERVICE_RESULT_SET_CACHE, Admin.Cache.PREPARED_PLAN_CACHE)); } } @Override public void clearCache(String cacheType, String vdbName, String vdbVersion) throws AdminException { checkVDB(vdbName, vdbVersion); if(cacheType.equals(Admin.Cache.QUERY_SERVICE_RESULT_SET_CACHE.name())){ this.embeddedServer.getRsCache().clearForVDB(new VDBKey(vdbName, vdbVersion)); } else if(cacheType.equals(Admin.Cache.PREPARED_PLAN_CACHE.name())) { this.embeddedServer.getPpcCache().clearForVDB(new VDBKey(vdbName, vdbVersion)); } else { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40139, cacheType, Admin.Cache.QUERY_SERVICE_RESULT_SET_CACHE, Admin.Cache.PREPARED_PLAN_CACHE)); } } @Override public Collection<? extends CacheStatistics> getCacheStats(String cacheType) throws AdminException { if(cacheType.equals(Admin.Cache.QUERY_SERVICE_RESULT_SET_CACHE.name())){ return Arrays.asList(this.embeddedServer.getRsCache().buildCacheStats(cacheType)); } else if(cacheType.equals(Admin.Cache.PREPARED_PLAN_CACHE.name())) { return Arrays.asList(this.embeddedServer.getPpcCache().buildCacheStats(cacheType)); } else { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40139, cacheType, Admin.Cache.QUERY_SERVICE_RESULT_SET_CACHE, Admin.Cache.PREPARED_PLAN_CACHE)); } } @Override public Collection<? extends EngineStatistics> getEngineStats() throws AdminException { try { //embedded no logon, odata, odbc EngineStatisticsMetadata stats = EmbeddedAdminFactory.createEngineStats( this.embeddedServer.sessionService.getActiveSessionsCount(), this.embeddedServer.bufferService, this.embeddedServer.dqp); return Arrays.asList(stats); } catch (SessionServiceException e) { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40140, "getEngineStats", e)); //$NON-NLS-1$ } } @Override public void terminateSession(String sessionId)throws AdminException { this.embeddedServer.sessionService.terminateSession(sessionId, DQPWorkContext.getWorkContext().getSessionId()); } @Override public void cancelRequest(String sessionId, long executionId)throws AdminException { try { this.embeddedServer.dqp.cancelRequest(sessionId, executionId); } catch (TeiidComponentException e) { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40141, sessionId, executionId, e)); } } @Override public void terminateTransaction(String transactionId)throws AdminException { this.embeddedServer.dqp.terminateTransaction(transactionId); } @Override public void close() { //nothing to do } @Override public void addDataRoleMapping(String vdbName, String vdbVersion, String dataRole, String mappedRoleName) throws AdminException { VDBMetaData vdb = checkVDB(vdbName, vdbVersion); synchronized(vdb) { DataPolicyMetadata policy = getPolicy(vdb, dataRole); policy.addMappedRoleName(mappedRoleName); } } private DataPolicyMetadata getPolicy(VDBMetaData vdb, String policyName)throws AdminProcessingException { DataPolicyMetadata policy = vdb.getDataPolicyMap().get(policyName); if (policy == null) { throw new AdminProcessingException(RuntimePlugin.Event.TEIID40092, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40092, policyName, vdb.getName(), vdb.getVersion())); } return policy; } @Override public void removeDataRoleMapping(String vdbName, String vdbVersion, String dataRole, String mappedRoleName) throws AdminException { VDBMetaData vdb = checkVDB(vdbName, vdbVersion); synchronized(vdb) { DataPolicyMetadata policy = getPolicy(vdb, dataRole); policy.removeMappedRoleName(mappedRoleName); } } @Override public void setAnyAuthenticatedForDataRole(String vdbName, String vdbVersion, String dataRole, boolean anyAuthenticated) throws AdminException { VDBMetaData vdb = checkVDB(vdbName, vdbVersion); synchronized(vdb) { DataPolicyMetadata policy = getPolicy(vdb, dataRole); policy.setAnyAuthenticated(anyAuthenticated); } } @Override public void createDataSource(String deploymentName, String templateName, Properties properties) throws AdminException { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40137, "createDataSource")); //$NON-NLS-1$ } @Override public Properties getDataSource(String deployedName) throws AdminException { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40137, "getDataSource")); //$NON-NLS-1$ } @Override public void deleteDataSource(String deployedName) throws AdminException { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40137, "deleteDataSource")); //$NON-NLS-1$ } @Override public Collection<String> getDataSourceNames() throws AdminException { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40137, "getDataSourceNames")); //$NON-NLS-1$ } @Override public Set<String> getDataSourceTemplateNames() throws AdminException { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40137, "getDataSourceTemplateNames")); //$NON-NLS-1$ } @Override public void markDataSourceAvailable(String jndiName) throws AdminException { throw new AdminProcessingException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40137, "markDataSourceAvailable")); //$NON-NLS-1$ } @Override public String getSchema(String vdbName, String vdbVersion, String modelName, EnumSet<SchemaObjectType> allowedTypes, String typeNamePattern) throws AdminException { VDBMetaData vdb = checkVDB(vdbName, vdbVersion); MetadataStore metadataStore = vdb.getAttachment(TransformationMetadata.class).getMetadataStore(); Schema schema = metadataStore.getSchema(modelName); return DDLStringVisitor.getDDLString(schema, allowedTypes, typeNamePattern); } public static String prettyFormat(String input) throws TransformerException { Source xmlInput = new StreamSource(new StringReader(input)); StringWriter stringWriter = new StringWriter(); StreamResult xmlOutput = new StreamResult(stringWriter); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); transformer.transform(xmlInput, xmlOutput); return xmlOutput.getWriter().toString(); } @Override public String getQueryPlan(String sessionId, long executionId)throws AdminException { PlanNode plan = this.embeddedServer.dqp.getPlan(sessionId, executionId); if (plan == null) { return null; } return plan.toXml(); } @Override public void restart() { // embedded once stop can not restart throw new RuntimeException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40137, "restart")); //$NON-NLS-1$ } @Override public List<String> getDeployments() throws AdminException { return Collections.emptyList(); } }