from pathlib import Path
import subprocess,sys
out=Path(__file__).resolve().parent;root=out.parent/'code';label='red' if '--baseline' in sys.argv else 'green'
if label=='red':root=out.parent/'review-round2-baseline'
base=Path('/Users/yixiay/Documents/codexWorkSpace/issues/output/597084-review/impact-2026-11-04/source');java=out/('cache-roundtrip-'+label);java.mkdir(exist_ok=True)
p=java/'cn/jojo/cc/biz/utils/UriToolsUtil.java';p.parent.mkdir(parents=True,exist_ok=True);p.write_text('package cn.jojo.cc.biz.utils; public class UriToolsUtil {public static String getPath(String s){return s;}}')
p=java/'cn/jojo/cc/common/enums/DataBaseTypeEnum.java';p.parent.mkdir(parents=True,exist_ok=True);p.write_text('package cn.jojo.cc.common.enums;public enum DataBaseTypeEnum{TEACHING,PROD,BOTH}')
s=r'''import cn.jojo.cc.biz.model.cache.*;import cn.jojo.cc.biz.service.english.segment.*;import cn.jojo.cc.common.enums.*;import com.alibaba.fastjson.*;
public class CacheRoundTripProbe{static int failed;static void check(boolean b,String n){System.out.println((b?"PASS ":"FAIL ")+n);if(!b)failed++;}public static void main(String[]args)throws Exception{
 var output=JSON.parseObject("{\"questionInfo\":{\"body\":\"hello\",\"explicitNull\":null},\"array\":[1,null,2]}");String expected=SegmentPayloadIdentity.outputHash(output);
 var bo=new FormAndDataCacheBo(8L,1,2,1,"/v2.json",output);bo.setSegmentSourceFormDataId(7L);bo.setSegmentSourcePayloadHash(SegmentPayloadIdentity.hash(output));
 try{var f=FormAndDataCacheBo.class.getDeclaredField("segmentSourceOutputHash");f.setAccessible(true);f.set(bo,expected);}catch(NoSuchFieldException old){}
 var direct=SelectedSegmentOutput.capture(DataBaseTypeEnum.TEACHING,8L,bo,"/v2.json");check(direct.known()&&expected.equals(direct.identity().outputPayloadHash()),"direct DB BO output identity matches");
 String serialized=JSON.toJSONString(bo);System.out.println("actual default BO serializer="+serialized);
 var fromRedis=JSON.parseObject(serialized,FormAndDataCacheBo.class);var selected=SelectedSegmentOutput.capture(DataBaseTypeEnum.TEACHING,8L,fromRedis,"/v2.json");
 check(selected.known()&&expected.equals(selected.identity().outputPayloadHash()),"real BO default serializer Redis roundtrip preserves scalar identity despite nested null loss");
 // A cache from the preceding app version has old source fields but lacks the new output scalar.
 try{var f=FormAndDataCacheBo.class.getDeclaredField("segmentSourceOutputHash");f.setAccessible(true);f.set(fromRedis,null);}catch(NoSuchFieldException old){}
 check(!SelectedSegmentOutput.capture(DataBaseTypeEnum.TEACHING,8L,fromRedis,"/v2.json").known(),"legacy missing output scalar fails closed without synthesizing from object or DB");
 if(failed>0)System.exit(1);}}
'''
(java/'CacheRoundTripProbe.java').write_text(s)
m2=Path.home()/'.m2/repository';names=['org/projectlombok/lombok/1.18.36/lombok-1.18.36.jar','org/slf4j/slf4j-api/2.0.16/slf4j-api-2.0.16.jar','com/alibaba/fastjson/1.2.83/fastjson-1.2.83.jar','io/swagger/core/v3/swagger-annotations-jakarta/2.2.25/swagger-annotations-jakarta-2.2.25.jar'];cp=':'.join(str(m2/n) for n in names)
files=list(java.rglob('*.java'))+[root/'application/src/main/java/cn/jojo/cc/biz/model/cache/FormAndDataCacheBo.java',root/'application/src/main/java/cn/jojo/cc/biz/service/english/segment/SegmentPayloadIdentity.java',root/'application/src/main/java/cn/jojo/cc/biz/service/english/segment/SelectedSegmentOutput.java',base/'application/src/main/java/cn/jojo/cc/biz/utils/MD5Util.java']
r=subprocess.run(['javac','-cp',cp,'-processorpath',str(m2/names[0]),'-d',str(java),*map(str,files)],capture_output=True,text=True)
if r.returncode:print(r.stderr);sys.exit(r.returncode)
r=subprocess.run(['java','-cp',str(java)+':'+cp,'CacheRoundTripProbe'],capture_output=True,text=True);(out/(label+'-cache-roundtrip.txt')).write_text(r.stdout+r.stderr+'exit='+str(r.returncode)+'\n');print(r.stdout,r.stderr,'exit=',r.returncode);sys.exit(r.returncode)
