de/backend/src/main/java/io/dataease/service/datasource/DriverService.java
2022-05-22 11:39:10 +08:00

177 lines
6.7 KiB
Java

package io.dataease.service.datasource;
import io.dataease.commons.utils.BeanUtils;
import io.dataease.commons.utils.DeFileUtils;
import io.dataease.dto.DriverDTO;
import io.dataease.plugins.common.base.domain.DeDriver;
import io.dataease.plugins.common.base.domain.DeDriverDetails;
import io.dataease.plugins.common.base.domain.DeDriverDetailsExample;
import io.dataease.plugins.common.base.mapper.DeDriverDetailsMapper;
import io.dataease.plugins.common.base.mapper.DeDriverMapper;
import io.dataease.plugins.datasource.provider.ExtendedJdbcClassLoader;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Modifier;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.UUID;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@Transactional(rollbackFor = Exception.class)
@Service
public class DriverService {
private static String DRIVER_PATH = "/opt/dataease/drivers/custom/";
@Resource
private DeDriverMapper deDriverMapper;
@Resource
private DeDriverDetailsMapper deDriverDetailsMapper;
@Resource
private DatasourceService datasourceService;
public List<DriverDTO> list() throws Exception {
List<DriverDTO> driverDTOS = new ArrayList<>();
deDriverMapper.selectByExample(null).forEach(deDriver -> {
DriverDTO driverDTO = new DriverDTO();
BeanUtils.copyBean(driverDTO, deDriver);
datasourceService.types().forEach(dataSourceType -> {
if (dataSourceType.getType().equalsIgnoreCase(deDriver.getType())) {
driverDTO.setTypeDesc(dataSourceType.getName());
}
});
driverDTOS.add(driverDTO);
});
return driverDTOS;
}
public void delete(String driverId) {
deDriverMapper.deleteByPrimaryKey(driverId);
DeDriverDetailsExample example = new DeDriverDetailsExample();
example.createCriteria().andDeDriverIdEqualTo(driverId);
deDriverDetailsMapper.deleteByExample(example);
DeFileUtils.deleteFile(DRIVER_PATH + driverId + "/");
}
public DeDriver save(DeDriver deDriver) {
deDriver.setCreateTime(System.currentTimeMillis());
deDriver.setId(UUID.randomUUID().toString());
deDriverMapper.insert(deDriver);
return deDriver;
}
public DeDriver update(DeDriver deDriver) {
deDriverMapper.updateByPrimaryKey(deDriver);
return deDriver;
}
public List<DeDriverDetails> listDriverDetails(String driverId) {
DeDriverDetailsExample example = new DeDriverDetailsExample();
example.createCriteria().andDeDriverIdEqualTo(driverId);
return deDriverDetailsMapper.selectByExampleWithBLOBs(example);
}
public void deleteDriverFile(String driverFileId) {
DeDriverDetails deDriverDetails = deDriverDetailsMapper.selectByPrimaryKey(driverFileId);
DeFileUtils.deleteFile(DRIVER_PATH + deDriverDetails.getDeDriverId() + "/" + deDriverDetails.getFileName());
deDriverDetailsMapper.deleteByPrimaryKey(driverFileId);
}
public DeDriverDetails saveJar(MultipartFile file, String driverId) throws Exception {
String filename = file.getOriginalFilename();
String dirPath = DRIVER_PATH + driverId + "/";
String filePath = dirPath + filename;
saveFile(file, dirPath, filePath);
List<String> jdbcList = new ArrayList<>();
String version = "";
// ExtendedJdbcClassLoader extendedJdbcClassLoader = new ExtendedJdbcClassLoader(new URL[]{new File(filePath).toURI().toURL()}, null);
// for (String className : getClassNameFrom(filePath)) {
// if (isChildClass(className, java.sql.Driver.class, extendedJdbcClassLoader)) {
// jdbcList.add(className);
// version = classVersion(extendedJdbcClassLoader, className);
// }
// }
DeDriverDetails deDriverDetails = new DeDriverDetails();
deDriverDetails.setId(UUID.randomUUID().toString());
deDriverDetails.setDeDriverId(driverId);
deDriverDetails.setVersion(version);
deDriverDetails.setFileName(filename);
deDriverDetails.setDriverClass(String.join(",", jdbcList));
deDriverDetailsMapper.insert(deDriverDetails);
return deDriverDetails;
}
private List<String> getClassNameFrom(String jarName) {
List<String> fileList = new ArrayList<String>();
try {
JarFile jarFile = new JarFile(new File(jarName));
Enumeration<JarEntry> en = jarFile.entries(); // 枚举获得JAR文件内的实体,即相对路径
while (en.hasMoreElements()) {
String name1 = en.nextElement().getName();
if (!name1.endsWith(".class")) {//不是class文件
continue;
}
String name2 = name1.substring(0, name1.lastIndexOf(".class"));
String name3 = name2.replaceAll("/", ".");
fileList.add(name3);
}
} catch (IOException e) {
e.printStackTrace();
}
return fileList;
}
public boolean isChildClass(String className, Class parentClazz, ExtendedJdbcClassLoader extendedJdbcClassLoader) {
if (className == null) return false;
Class clazz = null;
try {
clazz = extendedJdbcClassLoader.loadClass(className);
if (Modifier.isAbstract(clazz.getModifiers())) {//抽象类忽略
return false;
}
if (Modifier.isInterface(clazz.getModifiers())) {//接口忽略
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return parentClazz.isAssignableFrom(clazz);
}
private String classVersion(ExtendedJdbcClassLoader extendedJdbcClassLoader, String className) throws Exception {
Class clazz = extendedJdbcClassLoader.loadClass(className);
return clazz.getPackage().getImplementationVersion();
}
private String saveFile(MultipartFile file, String dirPath, String filePath) throws Exception {
File p = new File(dirPath);
if (!p.exists()) {
p.mkdirs();
}
File f = new File(filePath);
FileOutputStream fileOutputStream = new FileOutputStream(f);
fileOutputStream.write(file.getBytes());
fileOutputStream.flush();
fileOutputStream.close();
return filePath;
}
}