Xiang Xu

200 papers A* 10A 3B 1C 1Misc 2Journal 141Unranked 42
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Geosci. Remote. Sens. Lett.
Wenxin Ou, Bo Li, Xiang Xu, Yalun Shu, Yonghua Cai, Pingping Lu
2026 J jnl
Biomed. Signal Process. Control.
Han Liao, Xuting Hu, Xiaorong Zhang, Tao Tang, Xiang Xu
2026 J jnl
Pattern Recognit.
Jipeng Guo, Xiang Xu, Yu Cao, Man Cao, Mengyuan Xin, Tianxiang Zhao, Ye Su, Junbin Gao, Mingliang Cui, Youqing Wang
2026 J jnl
J. Frankl. Inst.
Zhicheng Li, Xiaona Liu, Xiang Xu, Yang Wang
2026 J jnl
CoRR
Jason Wu, Tianchen Zhao, Chang Liu, Jiarui Cai, Zheng Zhang, Zhuowei Li, Aaditya Singh, Xiang Xu, Mani Srivastava, Jonathan Wu
2026 J jnl
SIAM J. Appl. Math.
Tianjiao Wang, Xiang Xu, Yue Zhao
2026 J jnl
CoRR
Zhiqi Sun, Xiang Xu, Yiwen Lin
2026 J jnl
Neurocomputing
Chao Wang, Xiang Xu
2026 J jnl
Medical Image Anal.
Yucheng Tang, Yipeng Hu, Jing Li, Hu Lin, Chao Rong, Ciyuan Feng, Xiuzhen Yang, Xiang Xu, Ke Huang, Hongxiang Lin
2025 J jnl
Entropy
Dianli Qu, Jia Yan, Xiang Xu, Zhan Liu
2025 J jnl
CoRR
Kaiyan Zhang, Yuxin Zuo, Bingxiang He, Youbang Sun, Runze Liu, Che Jiang, Yuchen Fan, Kai Tian, Guoli Jia, Pengfei Li, Yu Fu, Xingtai Lv, Yuchen Zhang, Sihang Zeng, Shang Qu, Haozhan Li, Shijie Wang, Yuru wang, Xinwei Long, Fangfu Liu, Xiang Xu, Jiaze Ma, Xuekai Zhu, Ermo Hua, Yihao Liu, Zonglin Li, Huayu Chen, Xiaoye Qu, Yafu Li, Weize Chen, Zhenzhao Yuan, Junqi Gao, Dong Li, Zhiyuan Ma, Ganqu Cui, Zhiyuan Liu, Biqing Qi, Ning Ding, Bowen Zhou
2025 J jnl
CoRR
Hao Gu, Tianjiao Wang, Xiang Xu, Yue Zhao
2025 J jnl
CoRR
Guangyu Shen, Zhihua Li, Xiang Xu, Tianchen Zhao, Zheng Zhang, Dongsheng An, Zhuowen Tu, Yifan Xing, Qin Zhang
2025 A* conf
ACM Multimedia
Jiye Xie, Yifei Gao, Liangliang You, Xiang Xu, Haoran Xu, Zhiqiang Kou, Kexue Fu, Youyang Qu, Wenjie Yang, Jianwei Guo, Weiliang Meng, Longxiang Gao, Haoran Yang, Changwei Wang, Yu Zhang
2025 J jnl
IEEE Trans. Instrum. Meas.
Zhuangkai Wang, Xiaohui Du, Rengui Huang, Xiang Xu, Chen Zhou
2025 J jnl
CoRR
Xiang Xu
2025 J jnl
Virtual Real. Intell. Hardw.
Xiao Hu, Xiaolong Wu, Mingcong Ma, Xiang Xu, Yiping Gu, Gaoyuan Wang, Yanning Xu, Xiangxu Meng, Lu Wang
2025 J jnl
Neurocomputing
Xiang Xu, Gangquan Si, Minglin Xu, Yukaichen Yang, Chenhao Li
2025 A* conf
CVPR
Yongshuo Zong, Qin Zhang, Dongsheng An, Zhihua Li, Xiang Xu, Linghan Xu, Zhuowen Tu, Yifan Xing, Onkar Dabeer
2025 J jnl
CoRR
Yongshuo Zong, Qin Zhang, Dongsheng An, Zhihua Li, Xiang Xu, Linghan Xu, Zhuowen Tu, Yifan Xing, Onkar Dabeer
2025 J jnl
CoRR
Haoyang Pei, Ding Xia, Xiang Xu, William Moore, Yao Wang, Hersh Chandarana, Li Feng
2025 J jnl
SIAM J. Imaging Sci.
Tianjiao Wang, Chen Qing, Xiang Xu
2025 J jnl
CoRR
Xiang Xu, Ruotong Li, Mengjun Yi, Baile Xu, Furao Shen, Jian Zhao
2025 J jnl
Multiscale Model. Simul.
Tianjiao Wang, Xiang Xu, Yue Zhao
2025 J jnl
CoRR
Lingling Zeng, Gen Zhang, Jialin Peng, Xiang Xu, Yuan Xu, Lijun Ma
2025 J jnl
Comput. Ind. Eng.
Xiang Xu, Fen Li, Ting Wu, Xinru Huang, Xueling Guan, Tingyu Zheng, Liang Shen
2025 conf
WWW (Companion Volume)
Rui Zhou, Hao Wang, Wei Guo, Qinglin Jia, Wenjia Xie, Xiang Xu, Yong Liu, Defu Lian, Enhong Chen
2025 A* conf
CVPR
Xuanbai Chen, Xiang Xu, Zhihua Li, Tianchen Zhao, Pietro Perona, Qin Zhang, Yifan Xing
2025 conf
KDD (1)
Xiang Xu, Hao Wang, Wei Guo, Luankang Zhang, Wanshan Yang, Runlong Yu, Yong Liu, Defu Lian, Enhong Chen
2025 J jnl
Frontiers Artif. Intell.
Xiang Xu, Zhengxiong Li, Hongwei Zhang, Kai Ma
2025 J jnl
IEEE Trans Autom. Sci. Eng.
Fajun Yang, Xiang Xu, Zhiyuan Yang, Chao Li, Lu Zhen, Naiqi Wu
2025 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Xiang Xu, Wanchun Chen, Liang Yang
2025 J jnl
Numer. Algorithms
Xiaowen Li, Xiaoying Jiang, Xiang Xu
2025 A* conf
CVPR
Zhuowei Li, Tianchen Zhao, Xiang Xu, Zheng Zhang, Zhihua Li, Xuanbai Chen, Qin Zhang, Alessandro Bergamo, Anil K. Jain, Yifan Xing
2025 J jnl
CoRR
Zhuowei Li, Tianchen Zhao, Xiang Xu, Zheng Zhang, Zhihua Li, Xuanbai Chen, Qin Zhang, Alessandro Bergamo, Anil K. Jain, Yifan Xing
2025 J jnl
CoRR
Hongxia Guo, Tianjiao Wang, Xiang Xu, Yue Zhao
2025 J jnl
IEEE Trans. Vis. Comput. Graph.
Xiao Hu, Xiang Xu, JiuXing Zhang, Yanning Xu, Lu Wang
2025 J jnl
Graph. Model.
Ran Chen, Xiang Xu, Kaiyao Ge, Yanning Xu, Xiangxu Meng, Lu Wang
2025 J jnl
IEEE Access
Dong Yujie, Tong Zhou, Xiang Xu
2025 J jnl
CoRR
Hu Wei, Ze Xu, Boyu Yang, Linlin Miao, Weiqi Zhai, Yihan Li, Zixuan Li, Zhijun Wang, Boya Wang, Jianwei Yu, Jialing Yuan, Xiaoyue Zhang, Cheng He, Minglei Chen, Zifan Zhang, Qianhui Li, Wei Wang, Xiang Xu
2025 J jnl
CoRR
Tianchen Zhao, Xuanbai Chen, Zhihua Li, Jun Fang, Dongsheng An, Xiang Xu, Zhuowen Tu, Yifan Xing
2025 J jnl
Autom.
Xiang Xu, Bin Li
2025 J jnl
Sustain. Comput. Informatics Syst.
Xuan Wang, Xiaofeng Zhang, Feng Zhou, Xiang Xu
2025 J jnl
J. Frankl. Inst.
Yige Guo, Fei Wang, Yihan Guo, Xiang Xu
2025 J jnl
SIAM/ASA J. Uncertain. Quantification
Tianjiao Wang, Xiang Xu, Yue Zhao
2025 J jnl
Multiscale Model. Simul.
Tianjiao Wang, Xiang Xu, Yue Zhao
2025 J jnl
SIAM J. Appl. Math.
Tianjiao Wang, Xiang Xu, Ganghua Yuan, Yue Zhao
2025 J jnl
SIAM J. Math. Anal.
Guanghui Hu, Tianjiao Wang, Xiang Xu, Yue Zhao
2025 conf
WWW (Companion Volume)
Xianyang Tian, Xiang Xu, Chao Wang, Tong Ruan, Baohua Wu, Maofei Que, Shenghua Ni, Zhuoran Zhuang, Jingping Liu
2025 J jnl
IEEE Trans. Vis. Comput. Graph.
Huiyu Li, Ying Ding, Yuang He, Linwei Fan, Xiang Xu
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Tian Xiang, Moran Liu, Shimin He, Xiang Xu, Chen Zhou
2024 J jnl
IEEE Trans. Multim.
Xiaobin Tan, Shunyi Wang, Xiang Xu, Quan Zheng, Jian Yang, Shuangwu Chen
2024 conf
ICCA
Zheng Yang, Ji Ma, Xiang Xu
2024 J jnl
Quant. Biol.
Yuyang Wang, Yu Sun, Zeyu Liu, Bijia Chen, Hebing Chen, Chao Ren, Xuanwei Lin, Pengzhen Hu, Peiheng Jia, Xiang Xu, Kang Xu, Ximeng Liu, Hao Li, Xiaochen Bo
2024 conf
PPSN (4)
Runlong Yu, Robert Ladwig, Xiang Xu, Peijun Zhu, Paul C. Hanson, Yiqun Xie, Xiaowei Jia
2024 J jnl
IEEE Trans. Knowl. Data Eng.
Jingping Liu, Tao Chen, Hao Guo, Chao Wang, Haiyun Jiang, Yanghua Xiao, Xiang Xu, Baohua Wu
2024 J jnl
IEEE Robotics Autom. Lett.
Kun Song, Wenhang Liu, Gaoming Chen, Xiang Xu, Zhenhua Xiong
2024 J jnl
Int. J. Syst. Sci.
Xiang Xu
2024 J jnl
Frontiers Comput. Sci.
Shangsen Li, Lailong Luo, Yun Zhou, Deke Guo, Xiang Xu
2024 J jnl
J. Comput. Phys.
Hao Gu, Xiang Xu, Liang Yan
2024 J jnl
CoRR
Xiang Xu, Hao Wang, Wei Guo, Luankang Zhang, Wanshan Yang, Runlong Yu, Yong Liu, Defu Lian, Enhong Chen
2024 J jnl
CoRR
Runlong Yu, Robert Ladwig, Xiang Xu, Peijun Zhu, Paul C. Hanson, Yiqun Xie, Xiaowei Jia
2024 J jnl
Autom.
Xiang Xu, Bin Li
2024 J jnl
CoRR
Xiang Xu, Tianchen Zhao, Zheng Zhang, Zhihua Li, Jon Wu, Alessandro Achille, Mani Srivastava
2024 J jnl
IEEE Robotics Autom. Lett.
Gaoming Chen, Kun Song, Xiang Xu, Wenhang Liu, Zhenhua Xiong
2024 J jnl
CoRR
Gaoming Chen, Kun Song, Xiang Xu, Wenhang Liu, Zhenhua Xiong
2024 J jnl
IEEE Instrum. Meas. Mag.
Duoyang Qiu, Hao Yang, Xiang Xu, Yalin Hu, Zhiyuan Fang
2024 conf
CVPR Workshops
Muchao Ye, Xiang Xu, Qin Zhang, Jonathan Wu
2024 J jnl
SIAM J. Math. Anal.
Geng Chen, Tao Huang, Xiang Xu
2024 J jnl
Briefings Bioinform.
Bijia Chen, Chao Ren, Zhangyi Ouyang, Jingxuan Xu, Kang Xu, Yaru Li, Hejiang Guo, Xuemei Bai, Mengge Tian, Xiang Xu, Yuyang Wang, Hao Li, Xiaochen Bo, Hebing Chen
2024 J jnl
IEEE Trans. Vis. Comput. Graph.
Xiang Xu, Lu Wang, Arsène Pérard-Gayot, Richard Membarth, Cuiyu Li, Chenglei Yang, Philipp Slusallek
2023 conf
CGI (4)
Jie Jiang, Xiang Xu, Beibei Wang
2023 J jnl
BMC Medical Informatics Decis. Mak.
Tianlai Lin, Xinjue Zhang, Jianbing Gong, Rundong Tan, Weiming Li, Lijun Wang, Yingxia Pan, Xiang Xu, Junhui Gao
2023 J jnl
Int. J. Circuit Theory Appl.
Babajide Oluwatosin Oresanya, Gangquan Si, Xiang Xu, Jiahui Gong, Zhang Guo
2023 A conf
CIKM
Mingjia Yin, Hao Wang, Xiang Xu, Likang Wu, Sirui Zhao, Wei Guo, Yong Liu, Ruiming Tang, Defu Lian, Enhong Chen
2023 J jnl
CoRR
Mingjia Yin, Hao Wang, Xiang Xu, Likang Wu, Sirui Zhao, Wei Guo, Yong Liu, Ruiming Tang, Defu Lian, Enhong Chen
2023 A* conf
KDD
Runlong Yu, Xiang Xu, Yuyang Ye, Qi Liu, Enhong Chen
2023 J jnl
Int. J. Circuit Theory Appl.
Babajide Oluwatosin Oresanya, Gangquan Si, Xiang Xu, Jiahui Gong, Zhang Guo
2023 conf
IC4E
Hairu Yang, Qiuhong Li, Jiamin Dong, Xinye Bai, Minghan Cai, Xiang Xu
2023 J jnl
J. Comput. Methods Sci. Eng.
Xiang Xu, Shuhui Shi
2023 J jnl
Comput. Ind. Eng.
Xiang Xu, Feiran Wang, Yuyue Chen, Bainan Yang, Song Zhang, Xiaokang Song, Liang Shen
2023 conf
ICME Workshops
Xiang Xu, Wei Zhong, Yi Zou, Long Ye, Qin Zhang
2023 J jnl
CoRR
Kun Song, Wenhang Liu, Gaoming Chen, Xiang Xu, Zhenhua Xiong
2023 conf
CCBR
Li Yang, Xiang Xu, Qiong Yao
2023 J jnl
Complex Intell. Syst.
Xiang Xu, Xianqiang Zhu, Cheng Zhu
2023 conf
ICIAI
Wenhe Long, Wei Zhao, Xiang Xu, Xinyuan Zhao, Zhiheng Li
2023 A* conf
KDD
JingSong Yang, Guanzhou Han, Deqing Yang, Jingping Liu, Yanghua Xiao, Xiang Xu, Baohua Wu, Shenghua Ni
2023 J jnl
CoRR
JingSong Yang, Guanzhou Han, Deqing Yang, Jingping Liu, Yanghua Xiao, Xiang Xu, Baohua Wu, Shenghua Ni
2023 conf
HCI (14)
Ting Jiang, Zheng Zhang, Changhua Jiang, Hao Li, Teng Zhang, Zhen Zhang, Xiang Xu, Yueqi An, Weifeng Gao, Chunhui Wang, Jianwei Niu
2023 conf
HCI (14)
Hao Li, Weifeng Gao, Changhua Jiang, Shoupeng Huang, Teng Zhang, Zhen Zhang, Xiang Xu, Yueqi An, Zheng Zhang, Jianwei Niu, Chunhui Wang
2023 conf
MetaCom
Xiang Xu, Xiaobin Tan, Shunyi Wang, Zhuolin Liu, Quan Zheng
2023 J jnl
SIAM J. Math. Anal.
Jiali Xu, Xiang Xu
2023 conf
MICCAI (2)
Yucheng Tang, Yipeng Hu, Jing Li, Hu Lin, Xiang Xu, Ke Huang, Hongxiang Lin
2023 conf
IC4E
Hongyan Zhu, Liping Ye, Hairu Yang, Qiancheng Xiang, Ling Liu, Xiang Xu
2023 J jnl
J. Comput. Methods Sci. Eng.
Xiang Xu, Feng Liu, Haijing Liang
2023 J jnl
Autom.
Xiang Xu
2023 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Xiang Xu, Jian Zhao, Jianmin Wu, Furao Shen
2022 J jnl
Remote. Sens.
Xiang Xu, Waishan Qiu, Wenjing Li, Xun Liu, Ziye Zhang, Xiaojiang Li, Dan Luo
2022 J jnl
Sensors
Xiang Xu, Shuang Wu, Weidong Fang, Zhe Yu, Zeyu Jia, Xiaoxu Wang, Jian Bai, Qianbo Lu
2022 J jnl
J. Nonlinear Sci.
Xin Yang Lu, Xiang Xu, Wujun Zhang
2022 J jnl
Complex.
Yishan Ding, Dongwei He, Jun Wu, Xiang Xu
2022 J jnl
Sensors
Xiang Xu, Weidong Fang, Jian Bai, Jiaxiao Chen, Yuan Yao, Qianbo Lu
2022 J jnl
Sensors
Jing Li, Renjie Li, Yan Liu, Fei Li, Xin Lin, Xilong Yu, Weiwei Shao, Xiang Xu
2022 J jnl
Numer. Algorithms
Xiaoying Jiang, Xiaowen Li, Xiang Xu
2022 conf
CISP-BMEI
Mianpeng Li, Xiang Xu
2022 J jnl
Syst.
Xueqin Huang, Xianqiang Zhu, Xiang Xu, Qianzhen Zhang, Ailin Liang
2022 conf
IC4E
Wenfeng Wu, Qing Li, Jiawen Zhang, Xiang Xu, Hairu Yang
2022 J jnl
Ecol. Informatics
Xiang Xu, Huade Guan, Grzegorz Skrzypek, David G. Williams
2021 conf
ICIRA (1)
Xiang Xu, Ziqi Chai, Zhenhua Xiong, Jianhua Wu
2021 J jnl
Appl. Math. Lett.
Xiaoying Jiang, Xiang Xu
2021 J jnl
Asia Pac. J. Oper. Res.
Xiang Xu, Huiwen Wang, Yiwei Wu, Wen Yi
2021 J jnl
CoRR
Xiang Xu, Hanbyul Joo, Greg Mori, Manolis Savva
2021 J jnl
BMC Medical Imaging
Zhongtao Bao, Yanchun Zhao, Shuqiang Chen, Xiaoyu Chen, Xiang Xu, Linglin Wei, Ling Chen
2021 J jnl
SIAM J. Appl. Math.
Gang Bao, Xiang Xu, Jian Zhai
2021 A* conf
ICCV
Tianchen Zhao, Xiang Xu, Mingze Xu, Hui Ding, Yuanjun Xiong, Wei Xia
2021 J jnl
Simul. Model. Pract. Theory
Xiang Xu, José C. Outeiro, Jun Zhang, Binbin Xu, Wanhua Zhao, Viktor Astakhov
2021 J jnl
Comput. Oper. Res.
Xiang Xu, Daoli Zhu
2021 J jnl
Remote. Sens.
Zhuangkai Wang, Chen Zhou, Shufan Zhao, Xiang Xu, Moran Liu, Yi Liu, Li Liao, Xuhui Shen
2021 conf
ICCVW
Xiang Xu, Yuanjun Xiong, Wei Xia
2021 J jnl
SIAM J. Math. Anal.
Yuning Liu, Xin Yang Lu, Xiang Xu
2021 conf
MMBD/MLIS
Xiang Xu, Yongqiang Wang, Kai Li, Junsong Xin
2021 conf
CSAE
Ting Liu, Mengting Zhu, Xiang Xu, Xianqiang Zhu, Cheng Zhu
2021 conf
ICCVW
Matej Kristan, Jirí Matas, Ales Leonardis, Michael Felsberg, Roman P. Pflugfelder, Joni-Kristian Kämäräinen, Hyung Jin Chang, Martin Danelljan, Luka Cehovin Zajc, Alan Lukezic, Ondrej Drbohlav, Jani Käpylä, Gustav Häger, Song Yan, Jinyu Yang, Zhongqun Zhang, Gustavo Fernández, Mohamed H. Abdelpakey, Goutam Bhat, Llukman Cerkezi, Hakan Cevikalp, Shengyong Chen, Xin Chen, Miao Cheng, Ziyi Cheng, Yu-Chen Chiu, Ozgun Cirakman, Yutao Cui, Kenan Dai, Mohana Murali Dasari, Qili Deng, Xingping Dong, Daniel K. Du, Matteo Dunnhofer, Zhenhua Feng, Zhiyong Feng, Zhihong Fu, Shiming Ge, Rama Krishna Sai S. Gorthi, Yuzhang Gu, Bilge Günsel, Qing Guo, Filiz Gurkan, Wencheng Han, Yanyan Huang, Felix Järemo Lawin, Shang-Jhih Jhang, Rongrong Ji, Cheng Jiang, Yingjie Jiang, Felix Juefei-Xu, J. Yin, Xiao Ke, Fahad Shahbaz Khan, Byeong Hak Kim, Josef Kittler, Xiangyuan Lan, Jun Ha Lee, Bastian Leibe, Hui Li, Jianhua Li, Xianxian Li, Yuezhou Li, Bo Liu, Chang Liu, Jingen Liu, Li Liu, Qingjie Liu, Huchuan Lu, Wei Lu, Jonathon Luiten, Jie Ma, Ziang Ma, Niki Martinel, Christoph Mayer, Alireza Memarmoghadam, Christian Micheloni, Yuzhen Niu, Danda Pani Paudel, Houwen Peng, Shoumeng Qiu, Aravindh Rajiv, Muhammad Rana, Andreas Robinson, Hasan Saribas, Ling Shao, Mohamed Shehata, Furao Shen, Jianbing Shen, Kristian Simonato, Xiaoning Song, Zhangyong Tang, Radu Timofte, Philip H. S. Torr, Chi-Yi Tsai, Bedirhan Uzun, Luc Van Gool, Paul Voigtlaender, Dong Wang, Guangting Wang, Liangliang Wang, Lijun Wang, Limin Wang, Linyuan Wang, Yong Wang, Yunhong Wang, Chenyan Wu, Gangshan Wu, Xiaojun Wu, Fei Xie, Tianyang Xu, Xiang Xu, Wanli Xue, Bin Yan, Wankou Yang, Xiaoyun Yang, Yu Ye, Jun Yin, Chengwei Zhang, Chunhui Zhang, Haitao Zhang, Kaihua Zhang, Kangkai Zhang, Xiaohan Zhang, Xiaolin Zhang, Xinyu Zhang, Zhibin Zhang, Shao-Chuan Zhao, Ming Zhen, Bineng Zhong, Jiawen Zhu, Xuefeng Zhu
2021 J jnl
Comput. Graph. Forum
Jia-Qi Zhang, Xiang Xu, Zhi-Meng Shen, Zehuan Huang, Yang Zhao, Yan-Pei Cao, Pengfei Wan, Miao Wang
2020 J jnl
Int. J. Bifurc. Chaos
Zhang Guo, Herbert H. C. Iu, Gangquan Si, Xiang Xu, Babajide Oluwatosin Oresanya, Yiyuan Bie
2020 conf
MSN
Shunyi Wang, Xiaobin Tan, Simin Li, Xiang Xu, Jian Yang, Quan Zheng
2020 J jnl
Telecommun. Syst.
Weidong Fang, Rong Hu, Xiang Xu, Ye Xia, Mao-Hsiung Hung
2020 J jnl
CoRR
Gang Bao, Xiang Xu, Jian Zhai
2020 J jnl
CoRR
Sookyung Joo, Xiang Xu, Yanxiang Zhao
2020 conf
ACAI
Yan Wang, Min Wang, Jia Li, Xiang Xu
2020 J jnl
IEEE Access
Jia Peng, Bin Liu, Yiqi Liu, Xiang Xu
2020 J jnl
SIAM J. Numer. Anal.
Gang Bao, Yiwen Lin, Xiang Xu
2020 J jnl
CoRR
Tianchen Zhao, Xiang Xu, Mingze Xu, Hui Ding, Yuanjun Xiong, Wei Xia
2020 J jnl
CoRR
Xiang Xu, Megha Nawhal, Greg Mori, Manolis Savva
2020 J jnl
J. Sci. Comput.
Xiang Xu, Yanxiang Zhao
2020 J jnl
CoRR
Xiang Xu, Yanxiang Zhao
2020 J jnl
CoRR
Yuxuan Gong, Peijun Li, Xu Wang, Xiang Xu
2020 J jnl
CoRR
Xiang Xu, Yuanjun Xiong, Wei Xia
2019 J jnl
Comput. Graph.
Xiang Xu, Beibei Wang, Lu Wang, Yanning Xu, Chenglei Yang, Xiangxu Meng
2019 J jnl
J. Nonlinear Sci.
Andres Contreras, Xiang Xu, Wujun Zhang
2019 J jnl
Appl. Soft Comput.
Zhou Zhou, Gangquan Si, Kai Zheng, Xiang Xu, Kai Qu, Yanbin Zhang
2019 J jnl
J. Sci. Comput.
Xiang Xu, Yanxiang Zhao
2019 J jnl
Clust. Comput.
Lulu Gao, Fei Li, Xiang Xu, Yong Liu
2019 J jnl
CoRR
Xiang Xu, Jian Zhai
2019 J jnl
Appl. Math. Lett.
Yibin Ding, Xiang Xu
2019 J jnl
CoRR
Yundong Zhang, Xiang Xu, Xiaotao Liu
2019 J jnl
J. Supercomput.
Wenxia Guo, Ping Kuang, Yaqiu Jiang, Xiang Xu, Wenhong Tian
2019 B conf
ICPADS
Xiang Xu
2019 A* conf
CVPR
Xiang Xu, Xiong Zhou, Ragav Venkatesan, Gurumurthy Swaminathan, Orchid Majumder
2019 J jnl
CoRR
Xiang Xu, Xiong Zhou, Ragav Venkatesan, Gurumurthy Swaminathan, Orchid Majumder
2018 J jnl
IEEE Access
Ping Kuang, Wenxia Guo, Xiang Xu, Hongjian Li, Wenhong Tian, Rajkumar Buyya
2018 A conf
BMVC
Xiang Xu, Xiaofang Wang, Kris M. Kitani
2018 J jnl
CoRR
Xiang Xu, Xiaofang Wang, Kris M. Kitani
2018 J jnl
CoRR
Changzheng Zhang, Xiang Xu, Dandan Tu
2018 J jnl
IEEE Internet Things J.
Yan Shi, Shanzhi Chen, Xiang Xu
2018 J jnl
Neurocomputing
Gangquan Si, Kai Zheng, Zhou Zhou, Chengjie Pan, Xiang Xu, Kai Qu, Yanbin Zhang
2018 J jnl
Cybern. Syst.
Fei Li, Haoxi Zhang, Juan Wang, Yong Liu, Lulu Gao, Xiang Xu, Cesar Sanín, Edward Szczerbicki
2018 J jnl
Comput. J.
Jialei Liu, Shangguang Wang, Ao Zhou, Xiang Xu, Sathish A. P. Kumar, Fangchun Yang
2018 J jnl
Comput. Graph.
Xiang Xu, Beibei Wang, Lu Wang, Yanning Xu, Tamy Boubekeur
2017 conf
Computer-Aided Diagnosis
Quan Chen, Xiang Xu, Shiliang Hu, Xiao Li, Qing Zou, Yunpeng Li
2017 J jnl
Commun. Nonlinear Sci. Numer. Simul.
Wenting Chen, Meiyu Du, Xiang Xu
2017 conf
HCI (11)
Yongmeng Wu, Nick Bryan-Kinns, Wei Wang, Jennifer G. Sheridan, Xiang Xu
2017 J jnl
Int. J. High Perform. Comput. Netw.
Xiang Xu, Shuming Zhou, Li Xu
2017 J jnl
Comput. J.
Xiang Xu, Shuming Zhou, Jinqiang Li
2017 J jnl
Theor. Comput. Sci.
Xiang Xu, Xiaowang Li, Shuming Zhou, Rong-Xia Hao, Mei-Mei Gu
2016 conf
IIKI
Xiang Xu, Lu Wang, Yanning Xu, Chenglei Yang, Xiangxu Meng
2016 J jnl
KSII Trans. Internet Inf. Syst.
Yan Shi, Xiang Xu, Changkai Lu, Shanzhi Chen
2016 conf
Eurographics (Posters)
Xiang Xu, Pei Wang, Beibei Wang, Lu Wang, Changhe Tu, Xiangxu Meng, Tamy Boubekeur
2016 J jnl
SIAM J. Math. Anal.
Cecilia Cavaterra, Elisabetta Rocca, Hao Wu, Xiang Xu
2016 J jnl
ISPRS Int. J. Geo Inf.
Liang Zhang, Liqiang Zhang, Xiang Xu
2016 J jnl
IEEE Trans. Reliab.
Xiaowang Li, Shuming Zhou, Xiang Xu, Limei Lin, Dajin Wang
2016 conf
ICIA
Bo Fan, Xiang Xu, Jianwei Ma
2016 J jnl
计算机科学
Luyang Zhou, Wenjie Cheng, Jianpeng Xu, Xiang Xu
2015 J jnl
Comput. Math. Appl.
Wen-Ting Chen, Xiang Xu, Song-Ping Zhu
2015 conf
ECC
Xiang Xu, Fumin Zou, Quan Zhu, Xianghai Ge
2015 J jnl
Neurocomputing
Yu Zhou, Xiaokang Yang, Yongzheng Zhang, Xiang Xu, Yipeng Wang, Xiujuan Chai, Weiyao Lin
2014 conf
IEEE WISA
Xiang Xu, Qing Liu, Yaping Li, Lin Xiao
2013 conf
BIC-TA
Xinpeng Du, Xiang Xu, Lizhi Cheng
2013 conf
AuCC
Xiang Xu, Wanquan Liu, Ling Li
2013 J jnl
SIAM J. Math. Anal.
Hao Wu, Xiang Xu
2012 conf
ICPCA/SWS
Qianping Wang, Xiang Xu, Jin Liu, Liangyin Wang
2012 J jnl
Int. J. Mach. Learn. Cybern.
Xiang Xu, Wanquan Liu, Svetha Venkatesh
2012 Misc conf
WISA
Qing Liu, Chenhe Liu, Huian Li, Xiang Xu, Lexi Gao
2011 conf
ISCID (1)
Rong Li, Kun Zou, Xiang Xu, Yueqiao Li, Zan Li
2011 conf
EMEIT
Mengsheng Wang, Ruiping Zhou, Xiang Xu, Yanguo Wang
2011 conf
CSEE (1)
Xiang Xu, Kun Zou
2010 conf
AlgoSyn
Xiang Xu
2010 J jnl
Adv. Comput. Math.
Xiaoyi Hu, Xiang Xu, Wenbin Chen
2009 J jnl
J. Comput. Chem.
Guohua Gao, Xiang Xu, Hong Seok Kang
2009 J jnl
SIAM J. Math. Anal.
Xiang Xu, Liyun Zhao, Chun Liu
2009 A* conf
ICDE
Himanshu Gupta, Xianjin Zhu, Xiang Xu
2009 J jnl
BMC Bioinform.
Jinyu Wu, Xiang Xu, Jian Xiao, Long Xu, Huiguang Yi, Shengjie Gao, Jing Liu, Qiyu Bao, Fangqing Zhao, Xiaokun Li
2008 Misc conf
TASE
Liannan Lin, Jinzhao Wu, Xiang Xu
2008 J jnl
Bioinform.
Xiang Xu, Jinyu Wu, Jian Xiao, Yi Tan, Qiyu Bao, Fangqing Zhao, Xiaokun Li
2007 conf
DEXA Workshops
Hao Wang, Yuyi Ou, Jie Ling, Xiang Xu, Heqing Guo
2007 C conf
IAS
Hao Wang, Yuyi Ou, Jie Ling, Lu Liang, Xiang Xu
2007 conf
ICNC (2)
Xiang Xu, Ruqing Chen
2004 A conf
IPDPS
Xiang Xu, Wen-Jing Hsu, Yahong Hu
2004 A* conf
ICRA
Yahong Hu, Wen-Jing Hsu, Xiang Xu
2003 conf
CIRA
Yahong Hu, Xiang Xu, Wen-Jing Hsu, Ah Cheong Toh, Chee Kit Loh, Tiancheng Song
s3-storage/s3_uploader.py
← Index s3-storage/s3_uploader.py python
# python s3_uploader.py /path/to/files repository_name --notes "Optional notes"
import hashlib
import multiprocessing
from multiprocessing import Pool
import sys
import logging
from logging.handlers import QueueHandler
from datetime import datetime
import os
import time
import json
from enum import Enum
import tempfile
import magic
from typing import Optional, Dict, Any
from dotenv import load_dotenv
from datetime import timezone

# File handling
import py7zr
import pyzipper
from magika import Magika

# S3 and database
from minio import Minio
import clickhouse_connect

load_dotenv(override=True)

class UploadResult(Enum):
    CORRECTLY = 0
    FAILED = 1
    SKIPPED = 2  # For duplicates

class FileNameFormatter(logging.Formatter):
    def format(self, record):
        record.filenameinfo = getattr(record, "filenameinfo", "unknown")
        return super().format(record)

def setup_logger(log_file, filename):
    """Set up a logger for a specific file"""
    logger = logging.getLogger(filename)
    if not logger.handlers:
        if os.getenv("SERVER_ENV") == "prod":
            logger.setLevel(logging.INFO)
        else:
            logger.setLevel(logging.DEBUG)
            
        # Create file handler
        handler = logging.FileHandler(log_file)
        formatter = FileNameFormatter(
            "%(asctime)s - %(filenameinfo)s - %(levelname)s - %(message)s"
        )
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        logger.propagate = False
    return logger

def logger_thread(log_queue, log_file):
    handler = logging.FileHandler(log_file)
    formatter = FileNameFormatter(
        "%(asctime)s - %(filenameinfo)s - %(levelname)s - %(message)s"
    )
    handler.setFormatter(formatter)

    while True:
        try:
            record = log_queue.get()
            if record is None:
                break
            message = formatter.format(record)
            handler.stream.write(message + "\n")
            handler.stream.flush()
        except Exception:
            import traceback
            print("[ERR] Error in logger thread:", file=sys.stderr)
            traceback.print_exc(file=sys.stderr)

def get_s3_key(sha256: str, is_archived: bool, original_ext: str = None) -> str:
    """
    Generate S3 key using sharding pattern with appropriate extension
    
    Args:
        sha256: The file's SHA256 hash
        is_archived: Whether the file was already archived (zip/7z)
        original_ext: The original file extension (if any)
    """
    # If file was already archived, keep its extension
    if is_archived and original_ext and original_ext.lower() in ['.zip', '.7z']:
        extension = original_ext
    else:
        # For files we archived ourselves, use .zip
        extension = '.zip'
        
    return f"{sha256[:2]}/{sha256[2:4]}/{sha256}{extension}"

def process_single_file(args):
    """Independent worker function for processing a single file"""
    filepath, file_number, total_files, config, log_file = args
    filename = os.path.basename(filepath)
    base_logger = setup_logger(log_file, filename)
    extra = {"filenameinfo": filename}
    logger = logging.LoggerAdapter(base_logger, extra)
    s3_client = None
    ch_client = None

    try:
        logger.info(f"Processing file {file_number}/{total_files}: {filepath}")

        # Create connections for this process
        s3_client = Minio(
            config["s3_endpoint"],
            access_key=config["s3_access_key"],
            secret_key=config["s3_secret_key"],
            secure=True
        )
        
        ch_client = clickhouse_connect.get_client(
            host=config['clickhouse_host'],
            port=config['clickhouse_port'],
            username=config['clickhouse_user'],
            password=config['clickhouse_password'],
            database=config['clickhouse_database'],
            verify=config['clickhouse_verify']
        )

        # Process the file and get contents
        ext = os.path.splitext(filepath.lower())[1]
        is_archived = ext in ['.zip', '.7z']

        with tempfile.TemporaryDirectory() as temp_dir:
            try:
                if filename.startswith("."):
                    logger.debug(f"Skipping hidden file: {filename}")
                    return UploadResult.SKIPPED

                elif ext == ".zip":
                    logger.debug(f"Processing ZIP file: {filepath}")
                    with pyzipper.AESZipFile(filepath) as zf:
                        zf.pwd = b"infected"
                        filename = zf.namelist()[0]
                        zf.extractall(temp_dir)
                        extracted_path = os.path.join(temp_dir, filename)
                        
                        with open(extracted_path, "rb") as f:
                            file_content = f.read()
                        with open(filepath, "rb") as f:
                            archive_content = f.read()
                            
                elif ext == ".7z":
                    logger.debug(f"Processing 7z file: {filepath}")
                    with py7zr.SevenZipFile(filepath, mode="r", password="infected") as z:
                        z.extractall(path=temp_dir)
                        # Get first file in the archive
                        for root, _, files in os.walk(temp_dir):
                            if files:
                                filename = files[0]
                                extracted_path = os.path.join(root, filename)
                                break
                                
                        with open(extracted_path, "rb") as f:
                            file_content = f.read()
                        with open(filepath, "rb") as f:
                            archive_content = f.read()
                else:
                    logger.debug(f"Processing non-archived file: {filepath}")
                    # For non-archived files, create password protected zip
                    with open(filepath, "rb") as f:
                        file_content = f.read()
                    filename = os.path.basename(filepath)
                    
                    # Create password protected zip
                    with tempfile.NamedTemporaryFile(delete=False) as temp_zip:
                        with pyzipper.AESZipFile(
                            temp_zip.name,
                            'w',
                            compression=pyzipper.ZIP_LZMA,
                            encryption=pyzipper.WZ_AES
                        ) as zf:
                            zf.pwd = b'infected'
                            zf.writestr(filename, file_content)
                        
                        with open(temp_zip.name, 'rb') as f:
                            archive_content = f.read()
                    
                    os.unlink(temp_zip.name)

                # Calculate hash
                sha256 = hashlib.sha256(file_content).hexdigest()
                # s3_key = f"{sha256[:2]}/{sha256[2:4]}/{sha256}"
                s3_key = get_s3_key(sha256, is_archived, ext if is_archived else None)
                logger.debug(f"Calculated SHA256: {sha256}")

                # Check if exists in S3
                try:
                    s3_client.stat_object(config["s3_bucket"], s3_key)
                    exists = True
                    logger.debug(f"File exists in S3: {s3_key}")
                except:
                    exists = False
                    logger.debug(f"File does not exist in S3: {s3_key}")

                # Prepare metadata
                max_timestamp = int(datetime(9999, 12, 31, 23, 59, 59, tzinfo=timezone.utc).timestamp() * 1000)
                now = datetime.now(timezone.utc)
                now_timestamp = int(now.timestamp() * 1000)
                inverted_timestamp = datetime.fromtimestamp((max_timestamp - now_timestamp)/1000, tz=timezone.utc)


                data = [[
                    sha256,                     # String
                    filename,                   # String
                    config['repository'],       # String
                    len(file_content),         # UInt64
                    magic.from_buffer(file_content),        # String
                    magic.from_buffer(file_content, mime=True),  # String
                    Magika().identify_bytes(file_content).output.ct_label,  # String
                    now,                       # upload_date
                    now,                       # first_seen
                    inverted_timestamp,        # version_date for replacing
                    config['s3_bucket'],       # String
                    s3_key,                    # String
                    config['notes'] if config['notes'] else None  # Nullable(String)
                ]]

                column_names = [
                    'sha256', 'filename', 'repository', 'file_size',
                    'filetype', 'filetype_mime', 'filetype_magika',
                    'upload_date', 'first_seen', 'version_date', 's3_bucket', 's3_key', 'notes'
                ]

                column_type_names = [
                    'String', 'String', 'LowCardinality(String)', 'UInt64',
                    'String', 'String', 'String',
                    'DateTime64(3, \'UTC\')', 'DateTime64(3, \'UTC\')', 
                    'DateTime64(3, \'UTC\')', 'String', 'String', 'Nullable(String)'
                ]
                
                if exists:
                    # Just update database
                    try:
                        ch_client.insert(
                            'samples_catalog',
                            data,
                            column_names=column_names,
                            column_type_names=column_type_names,
                            settings={'input_format_values_interpret_expressions': 0}
                        )
                        logger.info(f"Updated metadata for existing file: {sha256}")
                    except Exception as e:
                        logger.error(f"Error inserting metadata: {str(e)}")
                        import traceback
                        logger.error(f"Full traceback: {traceback.format_exc()}")
                    return UploadResult.SKIPPED
                else:
                    try:    
                        # Upload to S3 and insert metadata
                        import io
                        file_data = io.BytesIO(archive_content)
                        s3_client.put_object(
                            bucket_name=config['s3_bucket'],
                                object_name=s3_key,
                                data=file_data,
                                length=len(archive_content)
                            )
                        logger.info(f"Uploaded to S3: {s3_key}")
                    except Exception as e:
                        logger.error(f"Error uploading to S3: {str(e)}")
                        import traceback
                        logger.error(f"Full traceback: {traceback.format_exc()}")
                        return UploadResult.FAILED
                    
                    try:
                        ch_client.insert(
                            'samples_catalog',
                            data,
                            column_names=column_names,
                            column_type_names=column_type_names,
                            settings={'input_format_values_interpret_expressions': 0}
                        )
                        logger.info(f"Successfully processed file: {sha256}")
                        return UploadResult.CORRECTLY
                    except Exception as e:
                        logger.error(f"Error inserting metadata: {str(e)}")
                        import traceback
                        logger.error(f"Full traceback: {traceback.format_exc()}")
                        return UploadResult.FAILED

            except Exception as e:
                logger.error(f"Error processing file: {str(e)}")
                import traceback
                logger.error(f"Full traceback: {traceback.format_exc()}")
                return UploadResult.FAILED

    except Exception as e:
        logger.error(f"Error in worker: {str(e)}")
        return UploadResult.FAILED
    finally:
        # if s3_client:
        #     s3_client.close()
        if ch_client:
            ch_client.close()
        if base_logger and base_logger.handlers:
            for handler in base_logger.handlers:
                handler.close()
            base_logger.handlers.clear()

class S3Uploader:
    def __init__(self, path: str, repository: str, notes: Optional[str] = None):
        """
        Initialize S3 uploader
        
        Args:
            path: Path to file or directory to process
            repository: Repository name
            notes: Optional notes to add to all files
        """
        self.path = path
        self.repository = repository
        self.notes = notes
        
        # Initialize multiprocessing components
        self.manager = multiprocessing.Manager()
        # self.log_queue = self.manager.Queue()
        self.total_results = self.manager.dict({result: 0 for result in UploadResult})
        
        # Set up logging
        self.today = datetime.today().strftime("%Y%m%dT%H%M%S")
        # self.log_file = os.getenv("LOG_FILE_PATH", "./logs/") + f"{self.today}-{self.repository}-upload.txt"
        log_base_path = os.getenv("LOG_FILE_PATH")
        if not log_base_path:
            log_base_path = os.path.join(os.getcwd(), "logs")  # Default to ./logs directory
        self.log_file = os.path.join(log_base_path, f"{self.today}-{self.repository}-upload.txt")
        os.makedirs(os.path.dirname(self.log_file), exist_ok=True)

        # Initialize S3 client
        self.s3_client = Minio(
            os.getenv("S3_ENDPOINT"),
            access_key=os.getenv("S3_ACCESS_KEY"),
            secret_key=os.getenv("S3_SECRET_KEY"),
            secure=True  # Set to False if not using HTTPS
        )
        self.bucket_name = os.getenv("S3_BUCKET")

        # Initialize ClickHouse client
        self.ch_client = clickhouse_connect.get_client(
            host=os.getenv('CLICKHOUSE_HOST'),
            port=os.getenv('CLICKHOUSE_PORT'),
            username=os.getenv('CLICKHOUSE_USER'),
            password=os.getenv('CLICKHOUSE_PASSWORD'),
            database=os.getenv('CLICKHOUSE_DATABASE'),
            verify=os.getenv('CLICKHOUSE_ENFORCE_SSL', 'False')
        )
        
        # Ensure database table exists
        self._create_table()

    def _create_table(self):
        """Create the file catalog table if it doesn't exist"""
        create_table_query = """
            CREATE TABLE IF NOT EXISTS samples_catalog (
                sha256 String,
                filename String,
                repository LowCardinality(String),
                file_size UInt64,
                filetype String,
                filetype_mime String,
                filetype_magika String,
                upload_date DateTime64(3, 'UTC'),
                first_seen DateTime64(3, 'UTC'),
                version_date DateTime64(3, 'UTC'),  -- This will be inverted timestamp
                s3_bucket String,
                s3_key String,
                notes Nullable(String),
                PRIMARY KEY (sha256, repository)
            ) ENGINE = ReplacingMergeTree(version_date)
            ORDER BY (sha256, repository)
        """
        self.ch_client.command(create_table_query)

    # # def upload(self):
    # #     """Main upload function with multiprocessing support"""
    # #     start_time = time.time()

    # #     config = {
    # #         "s3_endpoint": os.getenv("S3_ENDPOINT"),
    # #         "s3_access_key": os.getenv("S3_ACCESS_KEY"),
    # #         "s3_secret_key": os.getenv("S3_SECRET_KEY"),
    # #         "s3_bucket": os.getenv("S3_BUCKET"),
    # #         "clickhouse_host": os.getenv("CLICKHOUSE_HOST"),
    # #         "clickhouse_port": os.getenv("CLICKHOUSE_PORT"),
    # #         "clickhouse_user": os.getenv("CLICKHOUSE_USER"),
    # #         "clickhouse_password": os.getenv("CLICKHOUSE_PASSWORD"),
    # #         "clickhouse_database": os.getenv("CLICKHOUSE_DATABASE"),
    # #         "clickhouse_verify": os.getenv("CLICKHOUSE_ENFORCE_SSL", "False"),
    # #         "repository": self.repository,
    # #         "notes": self.notes
    # #     }

    # #     try:
    # #         # Get list of files
    # #         if os.path.isfile(self.path):
    # #             files = [self.path] if not self.path.endswith('.txt') else [
    # #                 line.strip() for line in open(self.path) 
    # #                 if line.strip() and not os.path.basename(line.strip()).startswith('.')
    # #             ]
    # #         elif os.path.isdir(self.path):
    # #             files = [
    # #                 os.path.join(root, file)
    # #                 for root, _, files in os.walk(self.path)
    # #                 for file in files
    # #                 if not file.startswith('.')
    # #             ]
    # #         else:
    # #             print(f"[ERR] Invalid path: {self.path}")
    # #             return

    # #         total_files = len(files)
    # #         print(f"Found {total_files} files to process")

    # #         with Pool(processes=max(1, multiprocessing.cpu_count() - 1)) as pool:
    # #             results = pool.map(
    # #                 process_single_file,
    # #                 [(f, i + 1, total_files, config, self.log_file) for i, f in enumerate(files)]
    # #             )

    # #         # Update statistics
    # #         for result in results:
    # #             if result is not None:
    # #                 self.total_results[result] += 1

    # #         # Generate summary
    # #         end_time = time.time()
    # #         elapsed_time = end_time - start_time
    # #         elapsed_time_pretty = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))

    # #         summary = (
    # #             f"\n\nUpload finished for {self.path}"
    # #             f"\nTime required: {elapsed_time_pretty}"
    # #             f"\nResults:"
    # #             f"\n- Total processed: {sum(self.total_results.values())}"
    # #             f"\n- Successfully uploaded: {self.total_results[UploadResult.CORRECTLY]}"
    # #             f"\n- Skipped (already exists): {self.total_results[UploadResult.SKIPPED]}"
    # #             f"\n- Failed: {self.total_results[UploadResult.FAILED]}\n"
    # #         )

    # #         with open(self.log_file, "a") as f:
    # #             f.write(summary)

    # #         print(summary)

    # #     except Exception as e:
    # #         print(f"[ERR] Error in upload process: {str(e)}")

    # def upload(self):
    #     """Main upload function with multiprocessing support"""
    #     start_time = time.time()
    #     BATCH_SIZE = 1000  # Process files in batches of 1000

    #     config = {
    #         "s3_endpoint": os.getenv("S3_ENDPOINT"),
    #         "s3_access_key": os.getenv("S3_ACCESS_KEY"),
    #         "s3_secret_key": os.getenv("S3_SECRET_KEY"),
    #         "s3_bucket": os.getenv("S3_BUCKET"),
    #         "clickhouse_host": os.getenv("CLICKHOUSE_HOST"),
    #         "clickhouse_port": os.getenv("CLICKHOUSE_PORT"),
    #         "clickhouse_user": os.getenv("CLICKHOUSE_USER"),
    #         "clickhouse_password": os.getenv("CLICKHOUSE_PASSWORD"),
    #         "clickhouse_database": os.getenv("CLICKHOUSE_DATABASE"),
    #         "clickhouse_verify": os.getenv("CLICKHOUSE_ENFORCE_SSL", "False"),
    #         "repository": self.repository,
    #         "notes": self.notes
    #     }

    #     try:
    #         # Get list of files
    #         if os.path.isfile(self.path):
    #             files = [self.path] if not self.path.endswith('.txt') else [
    #                 line.strip() for line in open(self.path) 
    #                 if line.strip() and not os.path.basename(line.strip()).startswith('.')
    #             ]
    #         elif os.path.isdir(self.path):
    #             files = [
    #                 os.path.join(root, file)
    #                 for root, _, files in os.walk(self.path)
    #                 for file in files
    #                 if not file.startswith('.')
    #             ]
    #         else:
    #             print(f"[ERR] Invalid path: {self.path}")
    #             return

    #         total_files = len(files)
    #         print(f"Found {total_files} files to process")

    #         # Process files in batches
    #         for i in range(0, total_files, BATCH_SIZE):
    #             batch_files = files[i:i + BATCH_SIZE]
    #             batch_start = i + 1
    #             batch_end = min(i + BATCH_SIZE, total_files)
    #             print(f"\nProcessing batch {batch_start}-{batch_end} of {total_files}")
                
    #             with Pool(processes=max(1, multiprocessing.cpu_count() - 1)) as pool:
    #                 batch_results = pool.map(
    #                     process_single_file,
    #                     [(f, j + 1, total_files, config, self.log_file) 
    #                         for j, f in enumerate(batch_files, start=i)]
    #                 )
                    
    #                 # Update statistics for this batch
    #                 for result in batch_results:
    #                     if result is not None:
    #                         self.total_results[result] += 1

    #                 # Print intermediate summary
    #                 print(f"Batch {batch_start}-{batch_end} completed:")
    #                 print(f"- Successfully uploaded: {sum(1 for r in batch_results if r == UploadResult.CORRECTLY)}")
    #                 print(f"- Skipped (exists): {sum(1 for r in batch_results if r == UploadResult.SKIPPED)}")
    #                 print(f"- Failed: {sum(1 for r in batch_results if r == UploadResult.FAILED)}")

    #         # Generate final summary
    #         end_time = time.time()
    #         elapsed_time = end_time - start_time
    #         elapsed_time_pretty = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))

    #         summary = (
    #             f"\n\nUpload finished for {self.path}"
    #             f"\nTime required: {elapsed_time_pretty}"
    #             f"\nResults:"
    #             f"\n- Total processed: {sum(self.total_results.values())}"
    #             f"\n- Successfully uploaded: {self.total_results[UploadResult.CORRECTLY]}"
    #             f"\n- Skipped (already exists): {self.total_results[UploadResult.SKIPPED]}"
    #             f"\n- Failed: {self.total_results[UploadResult.FAILED]}\n"
    #         )

    #         with open(self.log_file, "a") as f:
    #             f.write(summary)

    #         print(summary)

    #     except Exception as e:
    #         print(f"[ERR] Error in upload process: {str(e)}")

    def upload(self):
        """Main upload function with multiprocessing support"""
        start_time = time.time()
        BATCH_SIZE = 1000  # Process files in batches of 1000

        config = {
            "s3_endpoint": os.getenv("S3_ENDPOINT"),
            "s3_access_key": os.getenv("S3_ACCESS_KEY"),
            "s3_secret_key": os.getenv("S3_SECRET_KEY"),
            "s3_bucket": os.getenv("S3_BUCKET"),
            "clickhouse_host": os.getenv("CLICKHOUSE_HOST"),
            "clickhouse_port": os.getenv("CLICKHOUSE_PORT"),
            "clickhouse_user": os.getenv("CLICKHOUSE_USER"),
            "clickhouse_password": os.getenv("CLICKHOUSE_PASSWORD"),
            "clickhouse_database": os.getenv("CLICKHOUSE_DATABASE"),
            "clickhouse_verify": os.getenv("CLICKHOUSE_ENFORCE_SSL", "False"),
            "repository": self.repository,
            "notes": self.notes
        }

        try:
            # Get all existing filenames for this repository
            query = f"SELECT filename FROM samples_catalog WHERE repository = '{self.repository}'"
            # existing_files = set()
            # for row in self.ch_client.query(query).result_rows:
            #     filename = os.path.splitext(row[0])[0]  # Strip extension
            #     existing_files.add(filename)
            existing_files = set(row[0] for row in self.ch_client.query(query).result_rows)
            print(f"Found {len(existing_files)} existing files in repository")

            # Get list of files to process
            if os.path.isfile(self.path):
                files = [self.path] if not self.path.endswith('.txt') else [
                    line.strip() for line in open(self.path) 
                    if line.strip() and not os.path.basename(line.strip()).startswith('.')
                ]
            elif os.path.isdir(self.path):
                files = [
                    os.path.join(root, file)
                    for root, _, files in os.walk(self.path)
                    for file in files
                    if not file.startswith('.')
                ]
            else:
                print(f"[ERR] Invalid path: {self.path}")
                return

            # Filter out files that are already in the repository
            files_to_process = []
            for f in files:
                basename = os.path.splitext(os.path.basename(f))[0]
                if basename not in existing_files:
                    files_to_process.append(f)

            total_files = len(files_to_process)
            skipped_files = len(files) - total_files
            print(f"Found {total_files} new files to process (skipped {skipped_files} existing files)")

            if total_files == 0:
                print("No new files to process")
                return

            # Process files in batches
            for i in range(0, total_files, BATCH_SIZE):
                batch_files = files_to_process[i:i + BATCH_SIZE]
                batch_start = i + 1
                batch_end = min(i + BATCH_SIZE, total_files)
                print(f"\nProcessing batch {batch_start}-{batch_end} of {total_files}")
                
                with Pool(processes=max(1, multiprocessing.cpu_count() - 1)) as pool:
                    batch_results = pool.map(
                        process_single_file,
                        [(f, j + 1, total_files, config, self.log_file) 
                        for j, f in enumerate(batch_files, start=i)]
                    )
                    
                    # Update statistics for this batch
                    for result in batch_results:
                        if result is not None:
                            self.total_results[result] += 1

                    # Print intermediate summary
                    print(f"Batch {batch_start}-{batch_end} completed:")
                    print(f"- Successfully uploaded: {sum(1 for r in batch_results if r == UploadResult.CORRECTLY)}")
                    print(f"- Skipped (exists): {sum(1 for r in batch_results if r == UploadResult.SKIPPED)}")
                    print(f"- Failed: {sum(1 for r in batch_results if r == UploadResult.FAILED)}")

            # Generate final summary
            end_time = time.time()
            elapsed_time = end_time - start_time
            elapsed_time_pretty = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))

            summary = (
                f"\n\nUpload finished for {self.path}"
                f"\nTime required: {elapsed_time_pretty}"
                f"\nResults:"
                f"\n- Files already in repository: {skipped_files}"
                f"\n- New files processed: {total_files}"
                f"\n- Successfully uploaded: {self.total_results[UploadResult.CORRECTLY]}"
                f"\n- Skipped (already exists): {self.total_results[UploadResult.SKIPPED]}"
                f"\n- Failed: {self.total_results[UploadResult.FAILED]}\n"
            )

            with open(self.log_file, "a") as f:
                f.write(summary)

            print(summary)

        except Exception as e:
            print(f"[ERR] Error in upload process: {str(e)}")
            import traceback
            print(traceback.format_exc())

if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(description='Upload malware samples to S3 and catalog them.')
    parser.add_argument('path', help='Path to file or directory to process')
    parser.add_argument('repository', help='Repository name')
    parser.add_argument('--notes', help='Optional notes to add to all files', default=None)
    
    args = parser.parse_args()
    
    uploader = S3Uploader(args.path, args.repository, args.notes)
    uploader.upload()