+/** * 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 * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * 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 com.qlangtech.tis.plugin.ontology;import com.alibaba.citrus.turbine.Context;import com.google.common.collect.Lists;import com.qlangtech.tis.datax.DataXName;import com.qlangtech.tis.datax.StoreResourceType;import com.qlangtech.tis.extension.Descriptor;import com.qlangtech.tis.extension.OneStepOfMultiSteps;import com.qlangtech.tis.extension.TISExtension;import com.qlangtech.tis.manage.common.AppAndRuntime;import com.qlangtech.tis.manage.common.Option;import com.qlangtech.tis.plugin.IPluginStore;import com.qlangtech.tis.plugin.IdentityName;import com.qlangtech.tis.plugin.annotation.FormField;import com.qlangtech.tis.plugin.annotation.FormFieldType;import com.qlangtech.tis.plugin.annotation.Validator;import com.qlangtech.tis.plugin.ds.ColumnMetaData;import com.qlangtech.tis.plugin.ds.DBIdentity;import com.qlangtech.tis.plugin.ds.DataSourceFactory;import com.qlangtech.tis.plugin.ds.DataSourceFactoryManipulate;import com.qlangtech.tis.plugin.ds.TableInDB;import com.qlangtech.tis.plugin.ds.manipulate.ManipulateItemsProcessor;import com.qlangtech.tis.plugin.ds.manipulate.ManipuldateUtils;import com.qlangtech.tis.plugin.ontology.impl.objtype.DataSourceBinding;import com.qlangtech.tis.plugin.ontology.impl.objtype.DefaultOntologyObjectType;import com.qlangtech.tis.plugin.ontology.impl.objtype.DefaultOntologyProperty;import com.qlangtech.tis.plugin.ontology.impl.objtype.ObjectTypeProfile;import com.qlangtech.tis.plugin.ontology.impl.objtype.ObjectTypeProperties;import com.qlangtech.tis.plugin.ontology.impl.objtype.ObjectTypePropertiesRelevant;import com.qlangtech.tis.runtime.module.misc.IControlMsgHandler;import com.qlangtech.tis.sql.parser.tuple.creator.EntityName;import com.qlangtech.tis.util.IPluginContext;import com.qlangtech.tis.util.UploadPluginMeta;import org.apache.commons.collections.CollectionUtils;import org.apache.commons.lang3.StringUtils;import org.apache.commons.lang3.tuple.Pair;import java.util.List;import java.util.Objects;import java.util.Optional;/** * 从数据源中导出本体对象 * * @author 百岁 (baisui@qlangtech.com) * @date 2026/4/13 */public class ExportToOntologyInDataSource extends DataSourceFactoryManipulate { public static final String KEY_ONTOLOGY_PKG = "ontologyPkg"; /** * 目标本体管理域 */ @FormField(ordinal = 0, type = FormFieldType.SELECTABLE, validate = {Validator.require, Validator.identity}) public String ontologyPkg; /** * 需要导入到本体域的表对象 */ @FormField(ordinal = 200, type = FormFieldType.MULTI_SELECTABLE, validate = {Validator.require}) public List<IdentityName> targetTables = Lists.newArrayList(); public static List<Option> getCandidateTargetTables() { AppAndRuntime appAndRuntime = AppAndRuntime.getAppAndRuntime(); DataXName appName = Objects.requireNonNull(appAndRuntime, "appAndRuntime can not be null").getAppName(); DataSourceFactory dataSource = DataSourceFactory.load(appName.getPipelineName()); TableInDB tablesInDB = dataSource.getTablesInDB(); List<String> tabs = tablesInDB.getTabs(); return tabs.stream().map(Option::new).toList(); } // public static final String KEY_DATASOURCE_META = "ds.json"; @Override public void manipuldateProcess(IPluginContext pluginContext, UploadPluginMeta pluginMeta, Optional<Context> context) { if (StringUtils.isEmpty(this.ontologyPkg)) { throw new IllegalArgumentException("property ontologyPkg can not be null"); } Context ctx = context.orElseThrow(); ManipulateItemsProcessor itemsProcessor = ManipuldateUtils.instance(pluginContext, ctx, null, (meta) -> { meta.putExtraParams(DBIdentity.KEY_UPDATE, Boolean.FALSE.toString()); meta.putExtraParams(StoreResourceType.DATAX_DB_NAME, meta.getExtraParam(DBIdentity.KEY_DB_NAME)); }); DataXName ds = itemsProcessor.getPluginMeta().getDataXName(); DataSourceFactory fromSource = Objects.requireNonNull(DataSourceFactory.load(ds.getPipelineName()), "ds:" + ds.getPipelineName() + " relevant instance can not be null"); if (CollectionUtils.isEmpty(targetTables)) { throw new IllegalStateException("targetTables can not be null"); } // File objectTypeDir = new File(OntologyDomain.getObjectTypeDir(this.ontologyPkg), fromSource // .identityValue()); // new File(objectTypeDir,KEY_DATASOURCE_META); fromSource.visitFirstConnection((conn) -> { // try { EntityName entityName = null; for (IdentityName tab : targetTables) { entityName = EntityName.parse(tab.identityValue()); //JSONObject tabObj = new JSONObject(); List<ColumnMetaData> tableMetadata = fromSource.getTableMetadata(conn, false, entityName); OntologyObjectType objectType = new DefaultOntologyObjectType(); ObjectTypeProfile profile = new ObjectTypeProfile(); DataSourceBinding dsBinding = new DataSourceBinding(); dsBinding.dbName = fromSource.identityValue(); profile.binding = dsBinding; ObjectTypeProperties propsSetter = new ObjectTypeProperties(); profile.name = entityName.getTableName(); // objectType.setDataSourceName(fromSource.identityValue()); List<OntologyProperty> cols = Lists.newArrayList(); ObjectTypePropertiesRelevant propRelevant = new ObjectTypePropertiesRelevant(); for (ColumnMetaData c : tableMetadata) { cols.add(new DefaultOntologyProperty(c.getName(), c.isPk(), c.isNullable(), c.getComment(), OntologyType.convert(c.getType()))); if (c.isPk()) { propRelevant.pkField = c.getKey();// pkCol = c; } } propsSetter.setCols(cols); // propRelevant.pkField objectType.setSteps(new OneStepOfMultiSteps[]{profile, propsSetter, propRelevant}); IPluginStore<OntologyObjectType> objTypeStore = OntologyObjectType.getPluginStore(ontologyPkg, entityName.getTableName()); objTypeStore.setPlugins(null, Optional.empty(), List.of(new Descriptor.ParseDescribable<>(objectType))); } // } catch (IOException e) { // throw new RuntimeException(e); // } }); } @TISExtension public static final class DftDesc extends BasicDesc { public DftDesc() { super(); List<Pair<OntologyDomain, IPluginStore<OntologyDomain>>> doaminList = OntologyDomain.getDoaminList(); List<OntologyDomain> domains = doaminList.stream().map(Pair::getKey).toList(); this.registerSelectOptions(KEY_ONTOLOGY_PKG, () -> domains); } @Override protected boolean validateAll(IControlMsgHandler msgHandler, Context context, PostFormVals postFormVals) { ExportToOntologyInDataSource export = postFormVals.newInstance(); return super.validateAll(msgHandler, context, postFormVals); } @Override public String getDisplayName() { return "Export To Ontology"; } @Override public EndType getEndType() { return EndType.Ontology; } }}
0 commit comments