加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
hessian-20230907.patch 201.85 KB
一键复制 编辑 原始数据 按行查看 历史
xiaohuang 提交于 2023-08-31 13:55 . add patch
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985
diff -Npur hessian-4.0.65-src/META-INF/hessian/deserializers hessian-4.0.65-fix/META-INF/hessian/deserializers
--- hessian-4.0.65-src/META-INF/hessian/deserializers 1970-01-01 08:00:00.000000000 +0800
+++ hessian-4.0.65-fix/META-INF/hessian/deserializers 2023-08-15 18:39:22.000000000 +0800
@@ -0,0 +1,3 @@
+java.io.File=com.caucho.hessian.io.FileDeserializer
+java.math.BigDecimal=com.caucho.hessian.io.BigDecimalDeserializer
+javax.management.ObjectName=com.caucho.hessian.io.ObjectNameDeserializer
diff -Npur hessian-4.0.65-src/META-INF/hessian/serializers hessian-4.0.65-fix/META-INF/hessian/serializers
--- hessian-4.0.65-src/META-INF/hessian/serializers 1970-01-01 08:00:00.000000000 +0800
+++ hessian-4.0.65-fix/META-INF/hessian/serializers 2023-08-15 18:39:22.000000000 +0800
@@ -0,0 +1,6 @@
+com.caucho.hessian.io.HessianRemoteObject=com.caucho.hessian.io.RemoteSerializer
+com.caucho.burlap.io.BurlapRemoteObject=com.caucho.hessian.io.RemoteSerializer
+java.io.File=com.caucho.hessian.io.StringValueSerializer
+java.math.BigDecimal=com.caucho.hessian.io.StringValueSerializer
+java.util.Locale=com.caucho.hessian.io.LocaleSerializer
+javax.management.ObjectName=com.caucho.hessian.io.StringValueSerializer
diff -Npur hessian-4.0.65-src/com/caucho/hessian/client/HessianProxy.java hessian-4.0.65-fix/com/caucho/hessian/client/HessianProxy.java
--- hessian-4.0.65-src/com/caucho/hessian/client/HessianProxy.java 2020-07-23 12:51:28.000000000 +0800
+++ hessian-4.0.65-fix/com/caucho/hessian/client/HessianProxy.java 2023-08-15 18:39:22.000000000 +0800
@@ -1,483 +1,483 @@
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 2001-2004 Caucho Technology, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- * any, must include the following acknowlegement:
- * "This product includes software developed by the
- * Caucho Technology (http://www.caucho.com/)."
- * Alternately, this acknowlegement may appear in the software itself,
- * if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Hessian", "Resin", and "Caucho" must not be used to
- * endorse or promote products derived from this software without prior
- * written permission. For written permission, please contact
- * info@caucho.com.
- *
- * 5. Products derived from this software may not be called "Resin"
- * nor may "Resin" appear in their names without prior written
- * permission of Caucho Technology.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Scott Ferguson
- */
-
-package com.caucho.hessian.client;
-
-import com.caucho.hessian.io.*;
-import com.caucho.services.server.*;
-
-import java.io.*;
-import java.util.logging.*;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.WeakHashMap;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.zip.*;
-
-/**
- * Proxy implementation for Hessian clients. Applications will generally
- * use HessianProxyFactory to create proxy clients.
- */
-public class HessianProxy implements InvocationHandler, Serializable {
- private static final Logger log
- = Logger.getLogger(HessianProxy.class.getName());
-
- protected HessianProxyFactory _factory;
-
- private WeakHashMap<Method,String> _mangleMap
- = new WeakHashMap<Method,String>();
-
- private Class<?> _type;
- private URL _url;
-
- /**
- * Protected constructor for subclassing
- */
- protected HessianProxy(URL url, HessianProxyFactory factory)
- {
- this(url, factory, null);
- }
-
- /**
- * Protected constructor for subclassing
- */
- protected HessianProxy(URL url,
- HessianProxyFactory factory,
- Class<?> type)
- {
- _factory = factory;
- _url = url;
- _type = type;
- }
-
- /**
- * Returns the proxy's URL.
- */
- public URL getURL()
- {
- return _url;
- }
-
- /**
- * Handles the object invocation.
- *
- * @param proxy the proxy object to invoke
- * @param method the method to call
- * @param args the arguments to the proxy object
- */
- public Object invoke(Object proxy, Method method, Object []args)
- throws Throwable
- {
- String mangleName;
-
- synchronized (_mangleMap) {
- mangleName = _mangleMap.get(method);
- }
-
- if (mangleName == null) {
- String methodName = method.getName();
- Class<?> []params = method.getParameterTypes();
-
- // equals and hashCode are special cased
- if (methodName.equals("equals")
- && params.length == 1 && params[0].equals(Object.class)) {
- Object value = args[0];
- if (value == null || ! Proxy.isProxyClass(value.getClass()))
- return Boolean.FALSE;
-
- Object proxyHandler = Proxy.getInvocationHandler(value);
-
- if (! (proxyHandler instanceof HessianProxy))
- return Boolean.FALSE;
-
- HessianProxy handler = (HessianProxy) proxyHandler;
-
- return new Boolean(_url.equals(handler.getURL()));
- }
- else if (methodName.equals("hashCode") && params.length == 0)
- return new Integer(_url.hashCode());
- else if (methodName.equals("getHessianType"))
- return proxy.getClass().getInterfaces()[0].getName();
- else if (methodName.equals("getHessianURL"))
- return _url.toString();
- else if (methodName.equals("toString") && params.length == 0)
- return "HessianProxy[" + _url + "]";
-
- if (! _factory.isOverloadEnabled())
- mangleName = method.getName();
- else
- mangleName = mangleName(method);
-
- synchronized (_mangleMap) {
- _mangleMap.put(method, mangleName);
- }
- }
-
- InputStream is = null;
- HessianConnection conn = null;
-
- try {
- if (log.isLoggable(Level.FINER))
- log.finer("Hessian[" + _url + "] calling " + mangleName);
-
- conn = sendRequest(mangleName, args);
-
- is = getInputStream(conn);
-
- if (log.isLoggable(Level.FINEST)) {
- PrintWriter dbg = new PrintWriter(new LogWriter(log));
- HessianDebugInputStream dIs
- = new HessianDebugInputStream(is, dbg);
-
- dIs.startTop2();
-
- is = dIs;
- }
-
- AbstractHessianInput in;
-
- int code = is.read();
-
- if (code == 'H') {
- int major = is.read();
- int minor = is.read();
-
- in = _factory.getHessian2Input(is);
-
- Object value = in.readReply(method.getReturnType());
-
- if (value instanceof InputStream) {
- value = new ResultInputStream(conn, is, in, (InputStream) value);
- is = null;
- conn = null;
- }
-
- return value;
- }
- else if (code == 'r') {
- int major = is.read();
- int minor = is.read();
-
- in = _factory.getHessianInput(is);
-
- in.startReplyBody();
-
- Object value = in.readObject(method.getReturnType());
-
- if (value instanceof InputStream) {
- value = new ResultInputStream(conn, is, in, (InputStream) value);
- is = null;
- conn = null;
- }
- else {
- in.completeReply();
- }
-
- return value;
- }
- else
- throw new HessianProtocolException("'" + (char) code + "' is an unknown code");
- } catch (HessianProtocolException e) {
- throw new HessianRuntimeException(e);
- } finally {
- try {
- if (is != null)
- is.close();
- } catch (Exception e) {
- log.log(Level.FINE, e.toString(), e);
- }
-
- try {
- if (conn != null)
- conn.destroy();
- } catch (Exception e) {
- log.log(Level.FINE, e.toString(), e);
- }
- }
- }
-
- protected InputStream getInputStream(HessianConnection conn)
- throws IOException
- {
- InputStream is = conn.getInputStream();
-
- if ("deflate".equals(conn.getContentEncoding())) {
- is = new InflaterInputStream(is, new Inflater(true));
- }
-
- return is;
- }
-
- protected String mangleName(Method method)
- {
- Class<?> []param = method.getParameterTypes();
-
- if (param == null || param.length == 0)
- return method.getName();
- else
- return AbstractSkeleton.mangleName(method, false);
- }
-
- /**
- * Sends the HTTP request to the Hessian connection.
- */
- protected HessianConnection sendRequest(String methodName, Object []args)
- throws IOException
- {
- HessianConnection conn = null;
-
- conn = _factory.getConnectionFactory().open(_url);
- boolean isValid = false;
-
- try {
- addRequestHeaders(conn);
-
- OutputStream os = null;
-
- try {
- os = conn.getOutputStream();
- } catch (Exception e) {
- throw new HessianRuntimeException(e);
- }
-
- if (log.isLoggable(Level.FINEST)) {
- PrintWriter dbg = new PrintWriter(new LogWriter(log));
- HessianDebugOutputStream dOs = new HessianDebugOutputStream(os, dbg);
- dOs.startTop2();
- os = dOs;
- }
-
- AbstractHessianOutput out = _factory.getHessianOutput(os);
-
- out.call(methodName, args);
- out.flush();
-
- conn.sendRequest();
-
- isValid = true;
-
- return conn;
- } finally {
- if (! isValid && conn != null)
- conn.destroy();
- }
- }
-
- /**
- * Method that allows subclasses to add request headers such as cookies.
- * Default implementation is empty.
- */
- protected void addRequestHeaders(HessianConnection conn)
- {
- conn.addHeader("Content-Type", "x-application/hessian");
- conn.addHeader("Accept-Encoding", "deflate");
-
- String basicAuth = _factory.getBasicAuth();
-
- if (basicAuth != null)
- conn.addHeader("Authorization", basicAuth);
- }
-
- /**
- * Method that allows subclasses to parse response headers such as cookies.
- * Default implementation is empty.
- * @param conn
- */
- protected void parseResponseHeaders(URLConnection conn)
- {
- }
-
- public Object writeReplace()
- {
- return new HessianRemote(_type.getName(), _url.toString());
- }
-
- static class ResultInputStream extends InputStream {
- private HessianConnection _conn;
- private InputStream _connIs;
- private AbstractHessianInput _in;
- private InputStream _hessianIs;
-
- ResultInputStream(HessianConnection conn,
- InputStream is,
- AbstractHessianInput in,
- InputStream hessianIs)
- {
- _conn = conn;
- _connIs = is;
- _in = in;
- _hessianIs = hessianIs;
- }
-
- public int read()
- throws IOException
- {
- if (_hessianIs != null) {
- int value = _hessianIs.read();
-
- if (value < 0)
- close();
-
- return value;
- }
- else
- return -1;
- }
-
- public int read(byte []buffer, int offset, int length)
- throws IOException
- {
- if (_hessianIs != null) {
- int value = _hessianIs.read(buffer, offset, length);
-
- if (value < 0)
- close();
-
- return value;
- }
- else
- return -1;
- }
-
- public void close()
- throws IOException
- {
- HessianConnection conn = _conn;
- _conn = null;
-
- InputStream connIs = _connIs;
- _connIs = null;
-
- AbstractHessianInput in = _in;
- _in = null;
-
- InputStream hessianIs = _hessianIs;
- _hessianIs = null;
-
- try {
- if (hessianIs != null)
- hessianIs.close();
- } catch (Exception e) {
- log.log(Level.FINE, e.toString(), e);
- }
-
- try {
- if (in != null) {
- in.completeReply();
- in.close();
- }
- } catch (Exception e) {
- log.log(Level.FINE, e.toString(), e);
- }
-
- try {
- if (connIs != null) {
- connIs.close();
- }
- } catch (Exception e) {
- log.log(Level.FINE, e.toString(), e);
- }
-
- try {
- if (conn != null) {
- conn.close();
- }
- } catch (Exception e) {
- log.log(Level.FINE, e.toString(), e);
- }
- }
- }
-
- static class LogWriter extends Writer {
- private Logger _log;
- private Level _level = Level.FINEST;
- private StringBuilder _sb = new StringBuilder();
-
- LogWriter(Logger log)
- {
- _log = log;
- }
-
- public void write(char ch)
- {
- if (ch == '\n' && _sb.length() > 0) {
- _log.fine(_sb.toString());
- _sb.setLength(0);
- }
- else
- _sb.append((char) ch);
- }
-
- public void write(char []buffer, int offset, int length)
- {
- for (int i = 0; i < length; i++) {
- char ch = buffer[offset + i];
-
- if (ch == '\n' && _sb.length() > 0) {
- _log.log(_level, _sb.toString());
- _sb.setLength(0);
- }
- else
- _sb.append((char) ch);
- }
- }
-
- public void flush()
- {
- }
-
- public void close()
- {
- if (_sb.length() > 0)
- _log.log(_level, _sb.toString());
- }
- }
-}
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2001-2004 Caucho Technology, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Caucho Technology (http://www.caucho.com/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Hessian", "Resin", and "Caucho" must not be used to
+ * endorse or promote products derived from this software without prior
+ * written permission. For written permission, please contact
+ * info@caucho.com.
+ *
+ * 5. Products derived from this software may not be called "Resin"
+ * nor may "Resin" appear in their names without prior written
+ * permission of Caucho Technology.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @author Scott Ferguson
+ */
+
+package com.caucho.hessian.client;
+
+import com.caucho.hessian.io.*;
+import com.caucho.services.server.*;
+
+import java.io.*;
+import java.util.logging.*;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.WeakHashMap;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.zip.*;
+
+/**
+ * Proxy implementation for Hessian clients. Applications will generally
+ * use HessianProxyFactory to create proxy clients.
+ */
+public class HessianProxy implements InvocationHandler, Serializable {
+ private static final Logger log
+ = Logger.getLogger(HessianProxy.class.getName());
+
+ protected HessianProxyFactory _factory;
+
+ private WeakHashMap<Method,String> _mangleMap
+ = new WeakHashMap<Method,String>();
+
+ private Class<?> _type;
+ private URL _url;
+
+ /**
+ * Protected constructor for subclassing
+ */
+ protected HessianProxy(URL url, HessianProxyFactory factory)
+ {
+ this(url, factory, null);
+ }
+
+ /**
+ * Protected constructor for subclassing
+ */
+ protected HessianProxy(URL url,
+ HessianProxyFactory factory,
+ Class<?> type)
+ {
+ _factory = factory;
+ _url = url;
+ _type = type;
+ }
+
+ /**
+ * Returns the proxy's URL.
+ */
+ public URL getURL()
+ {
+ return _url;
+ }
+
+ /**
+ * Handles the object invocation.
+ *
+ * @param proxy the proxy object to invoke
+ * @param method the method to call
+ * @param args the arguments to the proxy object
+ */
+ public Object invoke(Object proxy, Method method, Object []args)
+ throws Throwable
+ {
+ String mangleName;
+
+ synchronized (_mangleMap) {
+ mangleName = _mangleMap.get(method);
+ }
+
+ if (mangleName == null) {
+ String methodName = method.getName();
+ Class<?> []params = method.getParameterTypes();
+
+ // equals and hashCode are special cased
+ if (methodName.equals("equals")
+ && params.length == 1 && params[0].equals(Object.class)) {
+ Object value = args[0];
+ if (value == null || ! Proxy.isProxyClass(value.getClass()))
+ return Boolean.FALSE;
+
+ Object proxyHandler = Proxy.getInvocationHandler(value);
+
+ if (! (proxyHandler instanceof HessianProxy))
+ return Boolean.FALSE;
+
+ HessianProxy handler = (HessianProxy) proxyHandler;
+
+ return new Boolean(_url.equals(handler.getURL()));
+ }
+ else if (methodName.equals("hashCode") && params.length == 0)
+ return new Integer(_url.hashCode());
+ else if (methodName.equals("getHessianType"))
+ return proxy.getClass().getInterfaces()[0].getName();
+ else if (methodName.equals("getHessianURL"))
+ return _url.toString();
+ else if (methodName.equals("toString") && params.length == 0)
+ return "HessianProxy[" + _url + "]";
+
+ if (! _factory.isOverloadEnabled())
+ mangleName = method.getName();
+ else
+ mangleName = mangleName(method);
+
+ synchronized (_mangleMap) {
+ _mangleMap.put(method, mangleName);
+ }
+ }
+
+ InputStream is = null;
+ HessianConnection conn = null;
+
+ try {
+ if (log.isLoggable(Level.FINER))
+ log.finer("Hessian[" + _url + "] calling " + mangleName);
+
+ conn = sendRequest(mangleName, args);
+
+ is = getInputStream(conn);
+
+ if (log.isLoggable(Level.FINEST)) {
+ PrintWriter dbg = new PrintWriter(new LogWriter(log));
+ HessianDebugInputStream dIs
+ = new HessianDebugInputStream(is, dbg);
+
+ dIs.startTop2();
+
+ is = dIs;
+ }
+
+ AbstractHessianInput in;
+
+ int code = is.read();
+
+ if (code == 'H') {
+ int major = is.read();
+ int minor = is.read();
+
+ in = _factory.getHessian2Input(is);
+
+ Object value = in.readReply(method.getReturnType());
+
+ if (value instanceof InputStream) {
+ value = new ResultInputStream(conn, is, in, (InputStream) value);
+ is = null;
+ conn = null;
+ }
+
+ return value;
+ }
+ else if (code == 'r') {
+ int major = is.read();
+ int minor = is.read();
+
+ in = _factory.getHessianInput(is);
+
+ in.startReplyBody();
+
+ Object value = in.readObject(method.getReturnType());
+
+ if (value instanceof InputStream) {
+ value = new ResultInputStream(conn, is, in, (InputStream) value);
+ is = null;
+ conn = null;
+ }
+ else {
+ in.completeReply();
+ }
+
+ return value;
+ }
+ else
+ throw new HessianProtocolException("'" + (char) code + "' is an unknown code");
+ } catch (HessianProtocolException e) {
+ throw new HessianRuntimeException(e);
+ } finally {
+ try {
+ if (is != null)
+ is.close();
+ } catch (Exception e) {
+ log.log(Level.FINE, e.toString(), e);
+ }
+
+ try {
+ if (conn != null)
+ conn.destroy();
+ } catch (Exception e) {
+ log.log(Level.FINE, e.toString(), e);
+ }
+ }
+ }
+
+ protected InputStream getInputStream(HessianConnection conn)
+ throws IOException
+ {
+ InputStream is = conn.getInputStream();
+
+ if ("deflate".equals(conn.getContentEncoding())) {
+ is = new InflaterInputStream(is, new Inflater(true));
+ }
+
+ return is;
+ }
+
+ protected String mangleName(Method method)
+ {
+ Class<?> []param = method.getParameterTypes();
+
+ if (param == null || param.length == 0)
+ return method.getName();
+ else
+ return AbstractSkeleton.mangleName(method, false);
+ }
+
+ /**
+ * Sends the HTTP request to the Hessian connection.
+ */
+ protected HessianConnection sendRequest(String methodName, Object []args)
+ throws IOException
+ {
+ HessianConnection conn = null;
+
+ conn = _factory.getConnectionFactory().open(_url);
+ boolean isValid = false;
+
+ try {
+ addRequestHeaders(conn);
+
+ OutputStream os = null;
+
+ try {
+ os = conn.getOutputStream();
+ } catch (Exception e) {
+ throw new HessianRuntimeException(e);
+ }
+
+ if (log.isLoggable(Level.FINEST)) {
+ PrintWriter dbg = new PrintWriter(new LogWriter(log));
+ HessianDebugOutputStream dOs = new HessianDebugOutputStream(os, dbg);
+ dOs.startTop2();
+ os = dOs;
+ }
+
+ AbstractHessianOutput out = _factory.getHessianOutput(os);
+
+ out.call(methodName, args);
+ out.flush();
+
+ conn.sendRequest();
+
+ isValid = true;
+
+ return conn;
+ } finally {
+ if (! isValid && conn != null)
+ conn.destroy();
+ }
+ }
+
+ /**
+ * Method that allows subclasses to add request headers such as cookies.
+ * Default implementation is empty.
+ */
+ protected void addRequestHeaders(HessianConnection conn)
+ {
+ conn.addHeader("Content-Type", "x-application/hessian");
+ conn.addHeader("Interface-Name", this._type.getCanonicalName());
+
+ String basicAuth = _factory.getBasicAuth();
+
+ if (basicAuth != null)
+ conn.addHeader("Authorization", basicAuth);
+ }
+
+ /**
+ * Method that allows subclasses to parse response headers such as cookies.
+ * Default implementation is empty.
+ * @param conn
+ */
+ protected void parseResponseHeaders(URLConnection conn)
+ {
+ }
+
+ public Object writeReplace()
+ {
+ return new HessianRemote(_type.getName(), _url.toString());
+ }
+
+ static class ResultInputStream extends InputStream {
+ private HessianConnection _conn;
+ private InputStream _connIs;
+ private AbstractHessianInput _in;
+ private InputStream _hessianIs;
+
+ ResultInputStream(HessianConnection conn,
+ InputStream is,
+ AbstractHessianInput in,
+ InputStream hessianIs)
+ {
+ _conn = conn;
+ _connIs = is;
+ _in = in;
+ _hessianIs = hessianIs;
+ }
+
+ public int read()
+ throws IOException
+ {
+ if (_hessianIs != null) {
+ int value = _hessianIs.read();
+
+ if (value < 0)
+ close();
+
+ return value;
+ }
+ else
+ return -1;
+ }
+
+ public int read(byte []buffer, int offset, int length)
+ throws IOException
+ {
+ if (_hessianIs != null) {
+ int value = _hessianIs.read(buffer, offset, length);
+
+ if (value < 0)
+ close();
+
+ return value;
+ }
+ else
+ return -1;
+ }
+
+ public void close()
+ throws IOException
+ {
+ HessianConnection conn = _conn;
+ _conn = null;
+
+ InputStream connIs = _connIs;
+ _connIs = null;
+
+ AbstractHessianInput in = _in;
+ _in = null;
+
+ InputStream hessianIs = _hessianIs;
+ _hessianIs = null;
+
+ try {
+ if (hessianIs != null)
+ hessianIs.close();
+ } catch (Exception e) {
+ log.log(Level.FINE, e.toString(), e);
+ }
+
+ try {
+ if (in != null) {
+ in.completeReply();
+ in.close();
+ }
+ } catch (Exception e) {
+ log.log(Level.FINE, e.toString(), e);
+ }
+
+ try {
+ if (connIs != null) {
+ connIs.close();
+ }
+ } catch (Exception e) {
+ log.log(Level.FINE, e.toString(), e);
+ }
+
+ try {
+ if (conn != null) {
+ conn.close();
+ }
+ } catch (Exception e) {
+ log.log(Level.FINE, e.toString(), e);
+ }
+ }
+ }
+
+ static class LogWriter extends Writer {
+ private Logger _log;
+ private Level _level = Level.FINEST;
+ private StringBuilder _sb = new StringBuilder();
+
+ LogWriter(Logger log)
+ {
+ _log = log;
+ }
+
+ public void write(char ch)
+ {
+ if (ch == '\n' && _sb.length() > 0) {
+ _log.fine(_sb.toString());
+ _sb.setLength(0);
+ }
+ else
+ _sb.append((char) ch);
+ }
+
+ public void write(char []buffer, int offset, int length)
+ {
+ for (int i = 0; i < length; i++) {
+ char ch = buffer[offset + i];
+
+ if (ch == '\n' && _sb.length() > 0) {
+ _log.log(_level, _sb.toString());
+ _sb.setLength(0);
+ }
+ else
+ _sb.append((char) ch);
+ }
+ }
+
+ public void flush()
+ {
+ }
+
+ public void close()
+ {
+ if (_sb.length() > 0)
+ _log.log(_level, _sb.toString());
+ }
+ }
+}
diff -Npur hessian-4.0.65-src/com/caucho/hessian/io/ContextSerializerFactory.java hessian-4.0.65-fix/com/caucho/hessian/io/ContextSerializerFactory.java
--- hessian-4.0.65-src/com/caucho/hessian/io/ContextSerializerFactory.java 2020-07-23 12:51:28.000000000 +0800
+++ hessian-4.0.65-fix/com/caucho/hessian/io/ContextSerializerFactory.java 2023-08-15 18:39:22.000000000 +0800
@@ -1,507 +1,519 @@
-/*
- * Copyright (c) 2001-2008 Caucho Technology, Inc. All rights reserved.
- *
- * The Apache Software License, Version 1.1
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- * any, must include the following acknowlegement:
- * "This product includes software developed by the
- * Caucho Technology (http://www.caucho.com/)."
- * Alternately, this acknowlegement may appear in the software itself,
- * if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Burlap", "Resin", and "Caucho" must not be used to
- * endorse or promote products derived from this software without prior
- * written permission. For written permission, please contact
- * info@caucho.com.
- *
- * 5. Products derived from this software may not be called "Resin"
- * nor may "Resin" appear in their names without prior written
- * permission of Caucho Technology.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Scott Ferguson
- */
-
-package com.caucho.hessian.io;
-
-import java.io.InputStream;
-import java.lang.ref.SoftReference;
-import java.lang.ref.WeakReference;
-import java.net.InetAddress;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Properties;
-import java.util.WeakHashMap;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import com.caucho.hessian.HessianException;
-
-/**
- * The classloader-specific Factory for returning serialization
- */
-public class ContextSerializerFactory
-{
- private static final Logger log
- = Logger.getLogger(ContextSerializerFactory.class.getName());
-
- private static Deserializer OBJECT_DESERIALIZER
- = new BasicDeserializer(BasicDeserializer.OBJECT);
-
- private static final WeakHashMap<ClassLoader,SoftReference<ContextSerializerFactory>>
- _contextRefMap
- = new WeakHashMap<ClassLoader,SoftReference<ContextSerializerFactory>>();
-
- private static final ClassLoader _systemClassLoader;
-
- private static HashMap<String,Serializer> _staticSerializerMap;
- private static HashMap<String,Deserializer> _staticDeserializerMap;
- private static HashMap _staticClassNameMap;
-
- private ContextSerializerFactory _parent;
- private WeakReference<ClassLoader> _loaderRef;
-
- private final HashSet<String> _serializerFiles = new HashSet<String>();
- private final HashSet<String> _deserializerFiles = new HashSet<String>();
-
- private final HashMap<String,Serializer> _serializerClassMap
- = new HashMap<String,Serializer>();
-
- private final ConcurrentHashMap<String,Serializer> _customSerializerMap
- = new ConcurrentHashMap<String,Serializer>();
-
- private final HashMap<Class<?>,Serializer> _serializerInterfaceMap
- = new HashMap<Class<?>,Serializer>();
-
- private final HashMap<String,Deserializer> _deserializerClassMap
- = new HashMap<String,Deserializer>();
-
- private final HashMap<String,Deserializer> _deserializerClassNameMap
- = new HashMap<String,Deserializer>();
-
- private final ConcurrentHashMap<String,Deserializer> _customDeserializerMap
- = new ConcurrentHashMap<String,Deserializer>();
-
- private final HashMap<Class<?>,Deserializer> _deserializerInterfaceMap
- = new HashMap<Class<?>,Deserializer>();
-
- public ContextSerializerFactory(ContextSerializerFactory parent,
- ClassLoader loader)
- {
- if (loader == null)
- loader = _systemClassLoader;
-
- _loaderRef = new WeakReference<ClassLoader>(loader);
-
- init();
- }
-
- public static ContextSerializerFactory create()
- {
- return create(Thread.currentThread().getContextClassLoader());
- }
-
- public static ContextSerializerFactory create(ClassLoader loader)
- {
- synchronized (_contextRefMap) {
- SoftReference<ContextSerializerFactory> factoryRef
- = _contextRefMap.get(loader);
-
- ContextSerializerFactory factory = null;
-
- if (factoryRef != null)
- factory = factoryRef.get();
-
- if (factory == null) {
- ContextSerializerFactory parent = null;
-
- if (loader != null)
- parent = create(loader.getParent());
-
- factory = new ContextSerializerFactory(parent, loader);
- factoryRef = new SoftReference<ContextSerializerFactory>(factory);
-
- _contextRefMap.put(loader, factoryRef);
- }
-
- return factory;
- }
- }
-
- public ClassLoader getClassLoader()
- {
- WeakReference<ClassLoader> loaderRef = _loaderRef;
-
- if (loaderRef != null)
- return loaderRef.get();
- else
- return null;
- }
-
- /**
- * Returns the serializer for a given class.
- */
- public Serializer getSerializer(String className)
- {
- Serializer serializer = _serializerClassMap.get(className);
-
- if (serializer == AbstractSerializer.NULL)
- return null;
- else
- return serializer;
- }
-
- /**
- * Returns a custom serializer the class
- *
- * @param cl the class of the object that needs to be serialized.
- *
- * @return a serializer object for the serialization.
- */
- public Serializer getCustomSerializer(Class cl)
- {
- Serializer serializer = _customSerializerMap.get(cl.getName());
-
- if (serializer == AbstractSerializer.NULL)
- return null;
- else if (serializer != null)
- return serializer;
-
- try {
- Class serClass = Class.forName(cl.getName() + "HessianSerializer",
- false, cl.getClassLoader());
-
- Serializer ser = (Serializer) serClass.newInstance();
-
- _customSerializerMap.put(cl.getName(), ser);
-
- return ser;
- } catch (ClassNotFoundException e) {
- log.log(Level.ALL, e.toString(), e);
- } catch (Exception e) {
- throw new HessianException(e);
- }
-
- _customSerializerMap.put(cl.getName(), AbstractSerializer.NULL);
-
- return null;
- }
-
- /**
- * Returns the deserializer for a given class.
- */
- public Deserializer getDeserializer(String className)
- {
- Deserializer deserializer = _deserializerClassMap.get(className);
-
- if (deserializer != null && deserializer != AbstractDeserializer.NULL) {
- return deserializer;
- }
-
- deserializer = _deserializerInterfaceMap.get(className);
-
- if (deserializer != null && deserializer != AbstractDeserializer.NULL) {
- return deserializer;
- }
-
- return null;
- }
-
- /**
- * Returns a custom deserializer the class
- *
- * @param cl the class of the object that needs to be deserialized.
- *
- * @return a deserializer object for the deserialization.
- */
- public Deserializer getCustomDeserializer(Class cl)
- {
- Deserializer deserializer = _customDeserializerMap.get(cl.getName());
-
- if (deserializer == AbstractDeserializer.NULL)
- return null;
- else if (deserializer != null)
- return deserializer;
-
- try {
- Class serClass = Class.forName(cl.getName() + "HessianDeserializer",
- false, cl.getClassLoader());
-
- Deserializer ser = (Deserializer) serClass.newInstance();
-
- _customDeserializerMap.put(cl.getName(), ser);
-
- return ser;
- } catch (ClassNotFoundException e) {
- log.log(Level.ALL, e.toString(), e);
- } catch (Exception e) {
- throw new HessianException(e);
- }
-
- _customDeserializerMap.put(cl.getName(), AbstractDeserializer.NULL);
-
- return null;
- }
-
- /**
- * Initialize the factory
- */
- private void init()
- {
- if (_parent != null) {
- _serializerFiles.addAll(_parent._serializerFiles);
- _deserializerFiles.addAll(_parent._deserializerFiles);
-
- _serializerClassMap.putAll(_parent._serializerClassMap);
- _deserializerClassMap.putAll(_parent._deserializerClassMap);
- }
-
- if (_parent == null) {
- _serializerClassMap.putAll(_staticSerializerMap);
- _deserializerClassMap.putAll(_staticDeserializerMap);
- _deserializerClassNameMap.putAll(_staticClassNameMap);
- }
-
- HashMap<Class,Class> classMap;
-
- classMap = new HashMap<Class,Class>();
- initSerializerFiles("META-INF/hessian/serializers",
- _serializerFiles,
- classMap,
- Serializer.class);
-
- for (Map.Entry<Class,Class> entry : classMap.entrySet()) {
- try {
- Serializer ser = (Serializer) entry.getValue().newInstance();
-
- if (entry.getKey().isInterface())
- _serializerInterfaceMap.put(entry.getKey(), ser);
- else
- _serializerClassMap.put(entry.getKey().getName(), ser);
- } catch (Exception e) {
- throw new HessianException(e);
- }
- }
-
- classMap = new HashMap<Class,Class>();
- initSerializerFiles("META-INF/hessian/deserializers",
- _deserializerFiles,
- classMap,
- Deserializer.class);
-
- for (Map.Entry<Class,Class> entry : classMap.entrySet()) {
- try {
- Deserializer ser = (Deserializer) entry.getValue().newInstance();
-
- if (entry.getKey().isInterface())
- _deserializerInterfaceMap.put(entry.getKey(), ser);
- else {
- _deserializerClassMap.put(entry.getKey().getName(), ser);
- }
- } catch (Exception e) {
- throw new HessianException(e);
- }
- }
- }
-
- private void initSerializerFiles(String fileName,
- HashSet<String> fileList,
- HashMap<Class,Class> classMap,
- Class type)
- {
- try {
- ClassLoader classLoader = getClassLoader();
-
- // on systems with the security manager enabled, the system classloader
- // is null
- if (classLoader == null)
- return;
-
- Enumeration iter;
-
- iter = classLoader.getResources(fileName);
- while (iter.hasMoreElements()) {
- URL url = (URL) iter.nextElement();
-
- if (fileList.contains(url.toString()))
- continue;
-
- fileList.add(url.toString());
-
- InputStream is = null;
- try {
- is = url.openStream();
-
- Properties props = new Properties();
- props.load(is);
-
- for (Map.Entry entry : props.entrySet()) {
- String apiName = (String) entry.getKey();
- String serializerName = (String) entry.getValue();
-
- Class apiClass = null;
- Class serializerClass = null;
-
- try {
- apiClass = Class.forName(apiName, false, classLoader);
- } catch (ClassNotFoundException e) {
- log.fine(url + ": " + apiName + " is not available in this context: " + getClassLoader());
- continue;
- }
-
- try {
- serializerClass = Class.forName(serializerName, false, classLoader);
- } catch (ClassNotFoundException e) {
- log.fine(url + ": " + serializerName + " is not available in this context: " + getClassLoader());
- continue;
- }
-
- if (! type.isAssignableFrom(serializerClass))
- throw new HessianException(url + ": " + serializerClass.getName() + " is invalid because it does not implement " + type.getName());
-
- classMap.put(apiClass, serializerClass);
- }
- } finally {
- if (is != null)
- is.close();
- }
- }
- } catch (RuntimeException e) {
- throw e;
- } catch (Exception e) {
- throw new HessianException(e);
- }
- }
-
- private static void addBasic(Class cl, String typeName, int type)
- {
- _staticSerializerMap.put(cl.getName(), new BasicSerializer(type));
-
- Deserializer deserializer = new BasicDeserializer(type);
- _staticDeserializerMap.put(cl.getName(), deserializer);
- _staticClassNameMap.put(typeName, deserializer);
- }
-
- static {
- _staticSerializerMap = new HashMap();
- _staticDeserializerMap = new HashMap();
- _staticClassNameMap = new HashMap();
-
- FieldDeserializer2Factory fieldFactory = FieldDeserializer2Factory.create();
-
- addBasic(void.class, "void", BasicSerializer.NULL);
-
- addBasic(Boolean.class, "boolean", BasicSerializer.BOOLEAN);
- addBasic(Byte.class, "byte", BasicSerializer.BYTE);
- addBasic(Short.class, "short", BasicSerializer.SHORT);
- addBasic(Integer.class, "int", BasicSerializer.INTEGER);
- addBasic(Long.class, "long", BasicSerializer.LONG);
- addBasic(Float.class, "float", BasicSerializer.FLOAT);
- addBasic(Double.class, "double", BasicSerializer.DOUBLE);
- addBasic(Character.class, "char", BasicSerializer.CHARACTER_OBJECT);
- addBasic(String.class, "string", BasicSerializer.STRING);
- addBasic(Object.class, "object", BasicSerializer.OBJECT);
- addBasic(java.util.Date.class, "date", BasicSerializer.DATE);
-
- addBasic(boolean.class, "boolean", BasicSerializer.BOOLEAN);
- addBasic(byte.class, "byte", BasicSerializer.BYTE);
- addBasic(short.class, "short", BasicSerializer.SHORT);
- addBasic(int.class, "int", BasicSerializer.INTEGER);
- addBasic(long.class, "long", BasicSerializer.LONG);
- addBasic(float.class, "float", BasicSerializer.FLOAT);
- addBasic(double.class, "double", BasicSerializer.DOUBLE);
- addBasic(char.class, "char", BasicSerializer.CHARACTER);
-
- addBasic(boolean[].class, "[boolean", BasicSerializer.BOOLEAN_ARRAY);
- addBasic(byte[].class, "[byte", BasicSerializer.BYTE_ARRAY);
- _staticSerializerMap.put(byte[].class.getName(), ByteArraySerializer.SER);
- addBasic(short[].class, "[short", BasicSerializer.SHORT_ARRAY);
- addBasic(int[].class, "[int", BasicSerializer.INTEGER_ARRAY);
- addBasic(long[].class, "[long", BasicSerializer.LONG_ARRAY);
- addBasic(float[].class, "[float", BasicSerializer.FLOAT_ARRAY);
- addBasic(double[].class, "[double", BasicSerializer.DOUBLE_ARRAY);
- addBasic(char[].class, "[char", BasicSerializer.CHARACTER_ARRAY);
- addBasic(String[].class, "[string", BasicSerializer.STRING_ARRAY);
- addBasic(Object[].class, "[object", BasicSerializer.OBJECT_ARRAY);
-
- Deserializer objectDeserializer = new JavaDeserializer(Object.class, fieldFactory);
- _staticDeserializerMap.put("object", objectDeserializer);
- _staticClassNameMap.put("object", objectDeserializer);
-
- _staticSerializerMap.put(Class.class.getName(), new ClassSerializer());
-
- _staticDeserializerMap.put(Number.class.getName(), new BasicDeserializer(BasicSerializer.NUMBER));
-
- /*
- for (Class cl : new Class[] { BigDecimal.class, File.class, ObjectName.class }) {
- _staticSerializerMap.put(cl, StringValueSerializer.SER);
- _staticDeserializerMap.put(cl, new StringValueDeserializer(cl));
- }
-
- _staticSerializerMap.put(ObjectName.class, StringValueSerializer.SER);
- try {
- _staticDeserializerMap.put(ObjectName.class,
- new StringValueDeserializer(ObjectName.class));
- } catch (Throwable e) {
- }
- */
-
- _staticSerializerMap.put(InetAddress.class.getName(),
- InetAddressSerializer.create());
-
- _staticSerializerMap.put(java.sql.Date.class.getName(),
- new SqlDateSerializer());
- _staticSerializerMap.put(java.sql.Time.class.getName(),
- new SqlDateSerializer());
- _staticSerializerMap.put(java.sql.Timestamp.class.getName(),
- new SqlDateSerializer());
-
- _staticDeserializerMap.put(java.sql.Date.class.getName(),
- new SqlDateDeserializer(java.sql.Date.class));
- _staticDeserializerMap.put(java.sql.Time.class.getName(),
- new SqlDateDeserializer(java.sql.Time.class));
- _staticDeserializerMap.put(java.sql.Timestamp.class.getName(),
- new SqlDateDeserializer(java.sql.Timestamp.class));
-
- // hessian/3bb5
- _staticDeserializerMap.put(StackTraceElement.class.getName(),
- new StackTraceElementDeserializer(fieldFactory));
-
- ClassLoader systemClassLoader = null;
- try {
- systemClassLoader = ClassLoader.getSystemClassLoader();
- } catch (Exception e) {
- }
-
- _systemClassLoader = systemClassLoader;
- }
-}
-
+/*
+ * Copyright (c) 2001-2008 Caucho Technology, Inc. All rights reserved.
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Caucho Technology (http://www.caucho.com/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Burlap", "Resin", and "Caucho" must not be used to
+ * endorse or promote products derived from this software without prior
+ * written permission. For written permission, please contact
+ * info@caucho.com.
+ *
+ * 5. Products derived from this software may not be called "Resin"
+ * nor may "Resin" appear in their names without prior written
+ * permission of Caucho Technology.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @author Scott Ferguson
+ */
+
+package com.caucho.hessian.io;
+
+import java.io.InputStream;
+import java.lang.ref.SoftReference;
+import java.lang.ref.WeakReference;
+import java.net.InetAddress;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Properties;
+import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.caucho.hessian.HessianException;
+
+/**
+ * The classloader-specific Factory for returning serialization
+ */
+public class ContextSerializerFactory
+{
+ private static final Logger log
+ = Logger.getLogger(ContextSerializerFactory.class.getName());
+
+ private static Deserializer OBJECT_DESERIALIZER
+ = new BasicDeserializer(BasicDeserializer.OBJECT);
+
+ private static final WeakHashMap<ClassLoader,SoftReference<ContextSerializerFactory>>
+ _contextRefMap
+ = new WeakHashMap<ClassLoader,SoftReference<ContextSerializerFactory>>();
+
+ private static final ClassLoader _systemClassLoader;
+
+ private static HashMap<String,Serializer> _staticSerializerMap;
+ private static HashMap<String,Deserializer> _staticDeserializerMap;
+ private static HashMap _staticClassNameMap;
+
+ private ContextSerializerFactory _parent;
+ private WeakReference<ClassLoader> _loaderRef;
+
+ private final HashSet<String> _serializerFiles = new HashSet<String>();
+ private final HashSet<String> _deserializerFiles = new HashSet<String>();
+
+ private final HashMap<String,Serializer> _serializerClassMap
+ = new HashMap<String,Serializer>();
+
+ private final ConcurrentHashMap<String,Serializer> _customSerializerMap
+ = new ConcurrentHashMap<String,Serializer>();
+
+ private final HashMap<Class<?>,Serializer> _serializerInterfaceMap
+ = new HashMap<Class<?>,Serializer>();
+
+ private final HashMap<String,Deserializer> _deserializerClassMap
+ = new HashMap<String,Deserializer>();
+
+ private final HashMap<String,Deserializer> _deserializerClassNameMap
+ = new HashMap<String,Deserializer>();
+
+ private final ConcurrentHashMap<String,Deserializer> _customDeserializerMap
+ = new ConcurrentHashMap<String,Deserializer>();
+
+ private final HashMap<Class<?>,Deserializer> _deserializerInterfaceMap
+ = new HashMap<Class<?>,Deserializer>();
+
+ public ContextSerializerFactory(ContextSerializerFactory parent,
+ ClassLoader loader)
+ {
+ if (loader == null)
+ loader = _systemClassLoader;
+
+ _loaderRef = new WeakReference<ClassLoader>(loader);
+
+ init();
+ }
+
+ public static ContextSerializerFactory create()
+ {
+ return create(Thread.currentThread().getContextClassLoader());
+ }
+
+ public static ContextSerializerFactory create(ClassLoader loader)
+ {
+ synchronized (_contextRefMap) {
+ SoftReference<ContextSerializerFactory> factoryRef
+ = _contextRefMap.get(loader);
+
+ ContextSerializerFactory factory = null;
+
+ if (factoryRef != null)
+ factory = factoryRef.get();
+
+ if (factory == null) {
+ ContextSerializerFactory parent = null;
+
+ if (loader != null)
+ parent = create(loader.getParent());
+
+ factory = new ContextSerializerFactory(parent, loader);
+ factoryRef = new SoftReference<ContextSerializerFactory>(factory);
+
+ _contextRefMap.put(loader, factoryRef);
+ }
+
+ return factory;
+ }
+ }
+
+ public ClassLoader getClassLoader()
+ {
+ WeakReference<ClassLoader> loaderRef = _loaderRef;
+
+ if (loaderRef != null)
+ return loaderRef.get();
+ else
+ return null;
+ }
+
+ /**
+ * Returns the serializer for a given class.
+ */
+ public Serializer getSerializer(String className)
+ {
+ Serializer serializer = _serializerClassMap.get(className);
+
+ if (serializer == AbstractSerializer.NULL)
+ return null;
+ else
+ return serializer;
+ }
+
+ /**
+ * Returns a custom serializer the class
+ *
+ * @param cl the class of the object that needs to be serialized.
+ *
+ * @return a serializer object for the serialization.
+ */
+ public Serializer getCustomSerializer(Class cl)
+ {
+ Serializer serializer = _customSerializerMap.get(cl.getName());
+
+ if (serializer == AbstractSerializer.NULL)
+ return null;
+ else if (serializer != null)
+ return serializer;
+
+ try {
+ String className = cl.getName() + "HessianSerializer";
+
+ if (cl.getName().equals("java.util.Locale")) {
+ className = "com.caucho.hessian.io.LocaleHessianSerializer";
+ }
+
+ Class serClass = Class.forName(className, false,
+ Thread.currentThread().getContextClassLoader());
+
+ Serializer ser = (Serializer) serClass.newInstance();
+
+ _customSerializerMap.put(cl.getName(), ser);
+
+ return ser;
+ } catch (ClassNotFoundException e) {
+ log.log(Level.ALL, e.toString(), e);
+ } catch (Exception e) {
+ throw new HessianException(e);
+ }
+
+ _customSerializerMap.put(cl.getName(), AbstractSerializer.NULL);
+
+ return null;
+ }
+
+ /**
+ * Returns the deserializer for a given class.
+ */
+ public Deserializer getDeserializer(String className)
+ {
+ Deserializer deserializer = _deserializerClassMap.get(className);
+
+ if (deserializer != null && deserializer != AbstractDeserializer.NULL) {
+ return deserializer;
+ }
+
+ deserializer = _deserializerInterfaceMap.get(className);
+
+ if (deserializer != null && deserializer != AbstractDeserializer.NULL) {
+ return deserializer;
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns a custom deserializer the class
+ *
+ * @param cl the class of the object that needs to be deserialized.
+ *
+ * @return a deserializer object for the deserialization.
+ */
+ public Deserializer getCustomDeserializer(Class cl)
+ {
+ Deserializer deserializer = _customDeserializerMap.get(cl.getName());
+
+ if (deserializer == AbstractDeserializer.NULL)
+ return null;
+ else if (deserializer != null)
+ return deserializer;
+
+ try {
+ String className = cl.getName() + "HessianDeserializer";
+
+ if (cl.getName().equals("java.util.Locale")) {
+ className = "com.caucho.hessian.io.LocaleHessianDeserializer";
+ }
+
+ Class serClass = Class.forName(className, false,
+ Thread.currentThread().getContextClassLoader());
+
+ Deserializer ser = (Deserializer) serClass.newInstance();
+
+ _customDeserializerMap.put(cl.getName(), ser);
+
+ return ser;
+ } catch (ClassNotFoundException e) {
+ log.log(Level.ALL, e.toString(), e);
+ } catch (Exception e) {
+ throw new HessianException(e);
+ }
+
+ _customDeserializerMap.put(cl.getName(), AbstractDeserializer.NULL);
+
+ return null;
+ }
+
+ /**
+ * Initialize the factory
+ */
+ private void init()
+ {
+ if (_parent != null) {
+ _serializerFiles.addAll(_parent._serializerFiles);
+ _deserializerFiles.addAll(_parent._deserializerFiles);
+
+ _serializerClassMap.putAll(_parent._serializerClassMap);
+ _deserializerClassMap.putAll(_parent._deserializerClassMap);
+ }
+
+ if (_parent == null) {
+ _serializerClassMap.putAll(_staticSerializerMap);
+ _deserializerClassMap.putAll(_staticDeserializerMap);
+ _deserializerClassNameMap.putAll(_staticClassNameMap);
+ }
+
+ HashMap<Class,Class> classMap;
+
+ classMap = new HashMap<Class,Class>();
+ initSerializerFiles("META-INF/hessian/serializers",
+ _serializerFiles,
+ classMap,
+ Serializer.class);
+
+ for (Map.Entry<Class,Class> entry : classMap.entrySet()) {
+ try {
+ Serializer ser = (Serializer) entry.getValue().newInstance();
+
+ if (entry.getKey().isInterface())
+ _serializerInterfaceMap.put(entry.getKey(), ser);
+ else
+ _serializerClassMap.put(entry.getKey().getName(), ser);
+ } catch (Exception e) {
+ throw new HessianException(e);
+ }
+ }
+
+ classMap = new HashMap<Class,Class>();
+ initSerializerFiles("META-INF/hessian/deserializers",
+ _deserializerFiles,
+ classMap,
+ Deserializer.class);
+
+ for (Map.Entry<Class,Class> entry : classMap.entrySet()) {
+ try {
+ Deserializer ser = (Deserializer) entry.getValue().newInstance();
+
+ if (entry.getKey().isInterface())
+ _deserializerInterfaceMap.put(entry.getKey(), ser);
+ else {
+ _deserializerClassMap.put(entry.getKey().getName(), ser);
+ }
+ } catch (Exception e) {
+ throw new HessianException(e);
+ }
+ }
+ }
+
+ private void initSerializerFiles(String fileName,
+ HashSet<String> fileList,
+ HashMap<Class,Class> classMap,
+ Class type)
+ {
+ try {
+ ClassLoader classLoader = getClassLoader();
+
+ // on systems with the security manager enabled, the system classloader
+ // is null
+ if (classLoader == null)
+ return;
+
+ Enumeration iter;
+
+ iter = classLoader.getResources(fileName);
+ while (iter.hasMoreElements()) {
+ URL url = (URL) iter.nextElement();
+
+ if (fileList.contains(url.toString()))
+ continue;
+
+ fileList.add(url.toString());
+
+ InputStream is = null;
+ try {
+ is = url.openStream();
+
+ Properties props = new Properties();
+ props.load(is);
+
+ for (Map.Entry entry : props.entrySet()) {
+ String apiName = (String) entry.getKey();
+ String serializerName = (String) entry.getValue();
+
+ Class apiClass = null;
+ Class serializerClass = null;
+
+ try {
+ apiClass = Class.forName(apiName, false, classLoader);
+ } catch (ClassNotFoundException e) {
+ log.fine(url + ": " + apiName + " is not available in this context: " + getClassLoader());
+ continue;
+ }
+
+ try {
+ serializerClass = Class.forName(serializerName, false, classLoader);
+ } catch (ClassNotFoundException e) {
+ log.fine(url + ": " + serializerName + " is not available in this context: " + getClassLoader());
+ continue;
+ }
+
+ if (! type.isAssignableFrom(serializerClass))
+ throw new HessianException(url + ": " + serializerClass.getName() + " is invalid because it does not implement " + type.getName());
+
+ classMap.put(apiClass, serializerClass);
+ }
+ } finally {
+ if (is != null)
+ is.close();
+ }
+ }
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new HessianException(e);
+ }
+ }
+
+ private static void addBasic(Class cl, String typeName, int type)
+ {
+ _staticSerializerMap.put(cl.getName(), new BasicSerializer(type));
+
+ Deserializer deserializer = new BasicDeserializer(type);
+ _staticDeserializerMap.put(cl.getName(), deserializer);
+ _staticClassNameMap.put(typeName, deserializer);
+ }
+
+ static {
+ _staticSerializerMap = new HashMap();
+ _staticDeserializerMap = new HashMap();
+ _staticClassNameMap = new HashMap();
+
+ FieldDeserializer2Factory fieldFactory = FieldDeserializer2Factory.create();
+
+ addBasic(void.class, "void", BasicSerializer.NULL);
+
+ addBasic(Boolean.class, "boolean", BasicSerializer.BOOLEAN);
+ addBasic(Byte.class, "byte", BasicSerializer.BYTE);
+ addBasic(Short.class, "short", BasicSerializer.SHORT);
+ addBasic(Integer.class, "int", BasicSerializer.INTEGER);
+ addBasic(Long.class, "long", BasicSerializer.LONG);
+ addBasic(Float.class, "float", BasicSerializer.FLOAT);
+ addBasic(Double.class, "double", BasicSerializer.DOUBLE);
+ addBasic(Character.class, "char", BasicSerializer.CHARACTER_OBJECT);
+ addBasic(String.class, "string", BasicSerializer.STRING);
+ addBasic(Object.class, "object", BasicSerializer.OBJECT);
+ addBasic(java.util.Date.class, "date", BasicSerializer.DATE);
+
+ addBasic(boolean.class, "boolean", BasicSerializer.BOOLEAN);
+ addBasic(byte.class, "byte", BasicSerializer.BYTE);
+ addBasic(short.class, "short", BasicSerializer.SHORT);
+ addBasic(int.class, "int", BasicSerializer.INTEGER);
+ addBasic(long.class, "long", BasicSerializer.LONG);
+ addBasic(float.class, "float", BasicSerializer.FLOAT);
+ addBasic(double.class, "double", BasicSerializer.DOUBLE);
+ addBasic(char.class, "char", BasicSerializer.CHARACTER);
+
+ addBasic(boolean[].class, "[boolean", BasicSerializer.BOOLEAN_ARRAY);
+ addBasic(byte[].class, "[byte", BasicSerializer.BYTE_ARRAY);
+ _staticSerializerMap.put(byte[].class.getName(), ByteArraySerializer.SER);
+ addBasic(short[].class, "[short", BasicSerializer.SHORT_ARRAY);
+ addBasic(int[].class, "[int", BasicSerializer.INTEGER_ARRAY);
+ addBasic(long[].class, "[long", BasicSerializer.LONG_ARRAY);
+ addBasic(float[].class, "[float", BasicSerializer.FLOAT_ARRAY);
+ addBasic(double[].class, "[double", BasicSerializer.DOUBLE_ARRAY);
+ addBasic(char[].class, "[char", BasicSerializer.CHARACTER_ARRAY);
+ addBasic(String[].class, "[string", BasicSerializer.STRING_ARRAY);
+ addBasic(Object[].class, "[object", BasicSerializer.OBJECT_ARRAY);
+
+ Deserializer objectDeserializer = new JavaDeserializer(Object.class, fieldFactory);
+ _staticDeserializerMap.put("object", objectDeserializer);
+ _staticClassNameMap.put("object", objectDeserializer);
+
+ _staticSerializerMap.put(Class.class.getName(), new ClassSerializer());
+
+ _staticDeserializerMap.put(Number.class.getName(), new BasicDeserializer(BasicSerializer.NUMBER));
+
+ /*
+ for (Class cl : new Class[] { BigDecimal.class, File.class, ObjectName.class }) {
+ _staticSerializerMap.put(cl, StringValueSerializer.SER);
+ _staticDeserializerMap.put(cl, new StringValueDeserializer(cl));
+ }
+
+ _staticSerializerMap.put(ObjectName.class, StringValueSerializer.SER);
+ try {
+ _staticDeserializerMap.put(ObjectName.class,
+ new StringValueDeserializer(ObjectName.class));
+ } catch (Throwable e) {
+ }
+ */
+
+ _staticSerializerMap.put(InetAddress.class.getName(),
+ InetAddressSerializer.create());
+
+ _staticSerializerMap.put(java.sql.Date.class.getName(),
+ new SqlDateSerializer());
+ _staticSerializerMap.put(java.sql.Time.class.getName(),
+ new SqlDateSerializer());
+ _staticSerializerMap.put(java.sql.Timestamp.class.getName(),
+ new SqlDateSerializer());
+
+ _staticDeserializerMap.put(java.sql.Date.class.getName(),
+ new SqlDateDeserializer(java.sql.Date.class));
+ _staticDeserializerMap.put(java.sql.Time.class.getName(),
+ new SqlDateDeserializer(java.sql.Time.class));
+ _staticDeserializerMap.put(java.sql.Timestamp.class.getName(),
+ new SqlDateDeserializer(java.sql.Timestamp.class));
+
+ // hessian/3bb5
+ _staticDeserializerMap.put(StackTraceElement.class.getName(),
+ new StackTraceElementDeserializer(fieldFactory));
+
+ ClassLoader systemClassLoader = null;
+ try {
+ systemClassLoader = ClassLoader.getSystemClassLoader();
+ } catch (Exception e) {
+ }
+
+ _systemClassLoader = systemClassLoader;
+ }
+}
+
diff -Npur hessian-4.0.65-src/com/caucho/hessian/io/LocaleHessianDeserializer.java hessian-4.0.65-fix/com/caucho/hessian/io/LocaleHessianDeserializer.java
--- hessian-4.0.65-src/com/caucho/hessian/io/LocaleHessianDeserializer.java 1970-01-01 08:00:00.000000000 +0800
+++ hessian-4.0.65-fix/com/caucho/hessian/io/LocaleHessianDeserializer.java 2023-08-15 18:39:22.000000000 +0800
@@ -0,0 +1,85 @@
+package com.caucho.hessian.io;
+import com.caucho.hessian.io.AbstractDeserializer;
+import com.caucho.hessian.io.AbstractHessianInput;
+
+import java.io.IOException;
+import java.util.Locale;
+
+public class LocaleHessianDeserializer extends AbstractDeserializer {
+
+ public Class getType() {
+ return Locale.class;
+ }
+
+ public Object readMap(AbstractHessianInput in)
+ throws IOException {
+ int ref = in.addRef(null);
+
+ String languageValue = null;
+ String countryValue = null;
+ String variantValue = null;
+
+ while (!in.isEnd()) {
+ String key = in.readString();
+
+ if (key.equals("language"))
+ languageValue = in.readString();
+ else if (key.equals("country"))
+ countryValue = in.readString();
+ else if (key.equals("variant"))
+ variantValue = in.readString();
+ else
+ in.readString();
+ }
+
+ in.readMapEnd();
+
+ Object value = getObject(languageValue, countryValue, variantValue);
+
+ in.setRef(ref, value);
+
+ return value;
+ }
+
+ @Override
+ public Object readObject(AbstractHessianInput in, Object[] fields) throws IOException {
+ int ref = in.addRef(null);
+
+ String languageValue = null;
+ String countryValue = null;
+ String variantValue = null;
+
+ for (Object key : fields) {
+ if (key.equals("language"))
+ languageValue = in.readString();
+ else if (key.equals("country"))
+ countryValue = in.readString();
+ else if (key.equals("variant"))
+ variantValue = in.readString();
+ else
+ in.readObject();
+
+ }
+
+ Object value = getObject(languageValue, countryValue, variantValue);
+
+ in.setRef(ref, value);
+
+ return value;
+ }
+
+ private Object getObject(String languageValue, String countryValue, String variantValue) {
+ Object value = null;
+ if (languageValue != null && countryValue != null && variantValue != null) {
+ value = new Locale(languageValue, countryValue, variantValue);
+ } else if (languageValue != null && countryValue != null) {
+ value = new Locale(languageValue, countryValue);
+ } else if (languageValue != null) {
+ value = new Locale(languageValue);
+ } else {
+ value = Locale.getDefault();
+ }
+ return value;
+ }
+
+}
\ No newline at end of file
diff -Npur hessian-4.0.65-src/com/caucho/hessian/io/LocaleHessianSerializer.java hessian-4.0.65-fix/com/caucho/hessian/io/LocaleHessianSerializer.java
--- hessian-4.0.65-src/com/caucho/hessian/io/LocaleHessianSerializer.java 1970-01-01 08:00:00.000000000 +0800
+++ hessian-4.0.65-fix/com/caucho/hessian/io/LocaleHessianSerializer.java 2023-08-15 18:39:22.000000000 +0800
@@ -0,0 +1,64 @@
+package com.caucho.hessian.io;
+import com.caucho.hessian.io.AbstractHessianOutput;
+import com.caucho.hessian.io.AbstractSerializer;
+
+import java.io.IOException;
+import java.util.Locale;
+
+public class LocaleHessianSerializer extends AbstractSerializer
+{
+ public void writeObject(Object obj, AbstractHessianOutput out)
+ throws IOException
+ {
+
+ if (obj == null)
+ out.writeNull();
+ else
+ {
+ Class cl = obj.getClass();
+
+ if (out.addRef(obj))
+ return;
+
+ int ref = out.writeObjectBegin(cl.getName());
+
+ Locale loc = (Locale) obj;
+
+ if (ref < -1)
+ {
+ if (loc.getLanguage() != null)
+ {
+ out.writeString("language");
+ out.writeString(loc.getLanguage());
+ }
+ if (loc.getCountry() != null)
+ {
+ out.writeString("country");
+ out.writeString(loc.getCountry());
+ }
+ if (loc.getVariant() != null)
+ {
+ out.writeString("variant");
+ out.writeString(loc.getVariant());
+ }
+
+ out.writeMapEnd();
+ }
+ else
+ {
+ if (ref == -1)
+ {
+ out.writeInt(3);
+ out.writeString("language");
+ out.writeString("country");
+ out.writeString("variant");
+ out.writeObjectBegin(cl.getName());
+ }
+
+ out.writeString(loc.getLanguage());
+ out.writeString(loc.getCountry());
+ out.writeString(loc.getVariant());
+ }
+ }
+ }
+}
\ No newline at end of file
diff -Npur hessian-4.0.65-src/com/caucho/hessian/io/NonTransientUnsafeDeserializer.java hessian-4.0.65-fix/com/caucho/hessian/io/NonTransientUnsafeDeserializer.java
--- hessian-4.0.65-src/com/caucho/hessian/io/NonTransientUnsafeDeserializer.java 1970-01-01 08:00:00.000000000 +0800
+++ hessian-4.0.65-fix/com/caucho/hessian/io/NonTransientUnsafeDeserializer.java 2023-08-15 18:39:22.000000000 +0800
@@ -0,0 +1,755 @@
+/**
+ *
+ */
+package com.caucho.hessian.io;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.HashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import sun.misc.Unsafe;
+
+/**
+ * @author l65882
+ *
+ */
+public class NonTransientUnsafeDeserializer extends AbstractMapDeserializer {
+ private static final Logger log
+ = Logger.getLogger(JavaDeserializer.class.getName());
+
+ private static boolean _isEnabled;
+ @SuppressWarnings("restriction")
+ private static Unsafe _unsafe;
+
+ private Class<?> _type;
+ private HashMap<String,FieldDeserializer> _fieldMap;
+ private Method _readResolve;
+
+ public NonTransientUnsafeDeserializer(Class<?> cl)
+ {
+ _type = cl;
+ _fieldMap = getFieldMap(cl);
+
+ _readResolve = getReadResolve(cl);
+
+ if (_readResolve != null) {
+ _readResolve.setAccessible(true);
+ }
+ }
+
+ public static boolean isEnabled()
+ {
+ return _isEnabled;
+ }
+
+ @Override
+ public Class<?> getType()
+ {
+ return _type;
+ }
+
+ @Override
+ public boolean isReadResolve()
+ {
+ return _readResolve != null;
+ }
+
+ public Object readMap(AbstractHessianInput in)
+ throws IOException
+ {
+ try {
+ Object obj = instantiate();
+
+ return readMap(in, obj);
+ } catch (IOException e) {
+ throw e;
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new IOExceptionWrapper(_type.getName() + ":" + e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public Object []createFields(int len)
+ {
+ return new FieldDeserializer[len];
+ }
+
+ public Object createField(String name)
+ {
+ Object reader = _fieldMap.get(name);
+
+ if (reader == null)
+ reader = NullFieldDeserializer.DESER;
+
+ return reader;
+ }
+
+ @Override
+ public Object readObject(AbstractHessianInput in,
+ Object []fields)
+ throws IOException
+ {
+ try {
+ Object obj = instantiate();
+
+ return readObject(in, obj, (FieldDeserializer []) fields);
+ } catch (IOException e) {
+ throw e;
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new IOExceptionWrapper(_type.getName() + ":" + e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public Object readObject(AbstractHessianInput in,
+ String []fieldNames)
+ throws IOException
+ {
+ try {
+ Object obj = instantiate();
+
+ return readObject(in, obj, fieldNames);
+ } catch (IOException e) {
+ throw e;
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new IOExceptionWrapper(_type.getName() + ":" + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Returns the readResolve method
+ */
+ protected Method getReadResolve(Class<?> cl)
+ {
+ for (; cl != null; cl = cl.getSuperclass()) {
+ Method []methods = cl.getDeclaredMethods();
+
+ for (int i = 0; i < methods.length; i++) {
+ Method method = methods[i];
+
+ if (method.getName().equals("readResolve")
+ && method.getParameterTypes().length == 0)
+ return method;
+ }
+ }
+
+ return null;
+ }
+
+ public Object readMap(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ try {
+ int ref = in.addRef(obj);
+
+ while (! in.isEnd()) {
+ Object key = in.readObject();
+
+ FieldDeserializer deser = (FieldDeserializer) _fieldMap.get(key);
+
+ if (deser != null)
+ deser.deserialize(in, obj);
+ else
+ in.readObject();
+ }
+
+ in.readMapEnd();
+
+ Object resolve = resolve(in, obj);
+
+ if (obj != resolve)
+ in.setRef(ref, resolve);
+
+ return resolve;
+ } catch (IOException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new IOExceptionWrapper(e);
+ }
+ }
+
+ public Object readObject(AbstractHessianInput in,
+ Object obj,
+ FieldDeserializer []fields)
+ throws IOException
+ {
+ try {
+ int ref = in.addRef(obj);
+
+ for (FieldDeserializer reader : fields) {
+ reader.deserialize(in, obj);
+ }
+
+ Object resolve = resolve(in, obj);
+
+ if (obj != resolve)
+ in.setRef(ref, resolve);
+
+ return resolve;
+ } catch (IOException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new IOExceptionWrapper(obj.getClass().getName() + ":" + e, e);
+ }
+ }
+
+ public Object readObject(AbstractHessianInput in,
+ Object obj,
+ String []fieldNames)
+ throws IOException
+ {
+ try {
+ int ref = in.addRef(obj);
+
+ for (String fieldName : fieldNames) {
+ FieldDeserializer reader = _fieldMap.get(fieldName);
+
+ if (reader != null)
+ reader.deserialize(in, obj);
+ else
+ in.readObject();
+ }
+
+ Object resolve = resolve(in, obj);
+
+ if (obj != resolve)
+ in.setRef(ref, resolve);
+
+ return resolve;
+ } catch (IOException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new IOExceptionWrapper(obj.getClass().getName() + ":" + e, e);
+ }
+ }
+
+ protected Object resolve(AbstractHessianInput in, Object obj)
+ throws Exception
+ {
+ // if there's a readResolve method, call it
+ try {
+ if (_readResolve != null)
+ return _readResolve.invoke(obj, new Object[0]);
+ } catch (InvocationTargetException e) {
+ if (e.getCause() instanceof Exception)
+ throw (Exception) e.getCause();
+ else
+ throw e;
+ }
+
+ return obj;
+ }
+
+ @SuppressWarnings("restriction")
+ protected Object instantiate()
+ throws Exception
+ {
+ return _unsafe.allocateInstance(_type);
+ }
+
+ /**
+ * Creates a map of the classes fields.
+ */
+ protected HashMap<String,FieldDeserializer> getFieldMap(Class<?> cl)
+ {
+ HashMap<String,FieldDeserializer> fieldMap
+ = new HashMap<String,FieldDeserializer>();
+
+ for (; cl != null; cl = cl.getSuperclass()) {
+ Field []fields = cl.getDeclaredFields();
+ for (int i = 0; i < fields.length; i++) {
+ Field field = fields[i];
+
+ if (Modifier.isStatic(field.getModifiers()))
+ continue;
+ else if (fieldMap.get(field.getName()) != null)
+ continue;
+ // XXX: could parameterize the handler to only deal with public
+ try {
+ field.setAccessible(true);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+
+ Class<?> type = field.getType();
+ FieldDeserializer deser;
+
+ if (String.class.equals(type)) {
+ deser = new StringFieldDeserializer(field);
+ }
+ else if (byte.class.equals(type)) {
+ deser = new ByteFieldDeserializer(field);
+ }
+ else if (char.class.equals(type)) {
+ deser = new CharFieldDeserializer(field);
+ }
+ else if (short.class.equals(type)) {
+ deser = new ShortFieldDeserializer(field);
+ }
+ else if (int.class.equals(type)) {
+ deser = new IntFieldDeserializer(field);
+ }
+ else if (long.class.equals(type)) {
+ deser = new LongFieldDeserializer(field);
+ }
+ else if (float.class.equals(type)) {
+ deser = new FloatFieldDeserializer(field);
+ }
+ else if (double.class.equals(type)) {
+ deser = new DoubleFieldDeserializer(field);
+ }
+ else if (boolean.class.equals(type)) {
+ deser = new BooleanFieldDeserializer(field);
+ }
+ else if (java.sql.Date.class.equals(type)) {
+ deser = new SqlDateFieldDeserializer(field);
+ }
+ else if (java.sql.Timestamp.class.equals(type)) {
+ deser = new SqlTimestampFieldDeserializer(field);
+ }
+ else if (java.sql.Time.class.equals(type)) {
+ deser = new SqlTimeFieldDeserializer(field);
+ }
+ else {
+ deser = new ObjectFieldDeserializer(field);
+ }
+
+ fieldMap.put(field.getName(), deser);
+ }
+ }
+
+ return fieldMap;
+ }
+
+ abstract static class FieldDeserializer {
+ abstract void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException;
+ }
+
+ static class NullFieldDeserializer extends FieldDeserializer {
+ static NullFieldDeserializer DESER = new NullFieldDeserializer();
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ in.readObject();
+ }
+ }
+
+ static class ObjectFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+ private final long _offset;
+
+ @SuppressWarnings("restriction")
+ ObjectFieldDeserializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(_field);
+ }
+
+ @SuppressWarnings("restriction")
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ Object value = null;
+
+ try {
+ value = in.readObject(_field.getType());
+
+ _unsafe.putObject(obj, _offset, value);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+ static class BooleanFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+ private final long _offset;
+
+ @SuppressWarnings("restriction")
+ BooleanFieldDeserializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(_field);
+ }
+
+ @SuppressWarnings("restriction")
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ boolean value = false;
+
+ try {
+ value = in.readBoolean();
+
+ _unsafe.putBoolean(obj, _offset, value);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+ static class ByteFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+ private final long _offset;
+
+ @SuppressWarnings("restriction")
+ ByteFieldDeserializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(_field);
+ }
+
+ @SuppressWarnings("restriction")
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ int value = 0;
+
+ try {
+ value = in.readInt();
+
+ _unsafe.putByte(obj, _offset, (byte) value);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+ static class CharFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+ private final long _offset;
+
+ @SuppressWarnings("restriction")
+ CharFieldDeserializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(_field);
+ }
+
+ @SuppressWarnings("restriction")
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ String value = null;
+
+ try {
+ value = in.readString();
+
+ char ch;
+
+ if (value != null && value.length() > 0)
+ ch = value.charAt(0);
+ else
+ ch = 0;
+
+ _unsafe.putChar(obj, _offset, ch);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+ static class ShortFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+ private final long _offset;
+
+ @SuppressWarnings("restriction")
+ ShortFieldDeserializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(_field);
+ }
+
+ @SuppressWarnings("restriction")
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ int value = 0;
+
+ try {
+ value = in.readInt();
+
+ _unsafe.putShort(obj, _offset, (short) value);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+ static class IntFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+ private final long _offset;
+
+ @SuppressWarnings("restriction")
+ IntFieldDeserializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(_field);
+ }
+
+ @SuppressWarnings("restriction")
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ int value = 0;
+
+ try {
+ value = in.readInt();
+
+ _unsafe.putInt(obj, _offset, value);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+ static class LongFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+ private final long _offset;
+
+ @SuppressWarnings("restriction")
+ LongFieldDeserializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(_field);
+ }
+
+ @SuppressWarnings("restriction")
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ long value = 0;
+
+ try {
+ value = in.readLong();
+
+ _unsafe.putLong(obj, _offset, value);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+ static class FloatFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+ private final long _offset;
+
+ @SuppressWarnings("restriction")
+ FloatFieldDeserializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(_field);
+ }
+
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ double value = 0;
+
+ try {
+ value = in.readDouble();
+
+ _unsafe.putFloat(obj, _offset, (float) value);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+ static class DoubleFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+ private final long _offset;
+
+ DoubleFieldDeserializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(_field);
+ }
+
+ @SuppressWarnings("restriction")
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ double value = 0;
+
+ try {
+ value = in.readDouble();
+
+ _unsafe.putDouble(obj, _offset, value);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+ static class StringFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+ private final long _offset;
+
+ @SuppressWarnings("restriction")
+ StringFieldDeserializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(_field);
+ }
+
+ @SuppressWarnings("restriction")
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ String value = null;
+
+ try {
+ value = in.readString();
+
+ _unsafe.putObject(obj, _offset, value);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+ static class SqlDateFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+ private final long _offset;
+
+ @SuppressWarnings("restriction")
+ SqlDateFieldDeserializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(_field);
+ }
+
+ @SuppressWarnings("restriction")
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ java.sql.Date value = null;
+
+ try {
+ java.util.Date date = (java.util.Date) in.readObject();
+ value = new java.sql.Date(date.getTime());
+
+ _unsafe.putObject(obj, _offset, value);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+ static class SqlTimestampFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+ private final long _offset;
+
+ @SuppressWarnings("restriction")
+ SqlTimestampFieldDeserializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(_field);
+ }
+
+ @SuppressWarnings("restriction")
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ java.sql.Timestamp value = null;
+
+ try {
+ java.util.Date date = (java.util.Date) in.readObject();
+ value = new java.sql.Timestamp(date.getTime());
+
+ _unsafe.putObject(obj, _offset, value);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+ static class SqlTimeFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+ private final long _offset;
+
+ @SuppressWarnings("restriction")
+ SqlTimeFieldDeserializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(_field);
+ }
+
+ @SuppressWarnings("restriction")
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException
+ {
+ java.sql.Time value = null;
+
+ try {
+ java.util.Date date = (java.util.Date) in.readObject();
+ value = new java.sql.Time(date.getTime());
+
+ _unsafe.putObject(obj, _offset, value);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+ static void logDeserializeError(Field field, Object obj, Object value,
+ Throwable e)
+ throws IOException
+ {
+ String fieldName = (field.getDeclaringClass().getName()
+ + "." + field.getName());
+
+ if (e instanceof HessianFieldException)
+ throw (HessianFieldException) e;
+ else if (e instanceof IOException)
+ throw new HessianFieldException(fieldName + ": " + e.getMessage(), e);
+
+ if (value != null)
+ throw new HessianFieldException(fieldName + ": " + value.getClass().getName() + " (" + value + ")"
+ + " cannot be assigned to '" + field.getType().getName() + "'", e);
+ else
+ throw new HessianFieldException(fieldName + ": " + field.getType().getName() + " cannot be assigned from null", e);
+ }
+
+ static {
+ boolean isEnabled = false;
+
+ try {
+ Class<?> unsafe = Class.forName("sun.misc.Unsafe");
+ Field theUnsafe = null;
+ for (Field field : unsafe.getDeclaredFields()) {
+ if (field.getName().equals("theUnsafe"))
+ theUnsafe = field;
+ }
+
+ if (theUnsafe != null) {
+ theUnsafe.setAccessible(true);
+ _unsafe = (Unsafe) theUnsafe.get(null);
+ }
+
+ isEnabled = _unsafe != null;
+
+ String unsafeProp = System.getProperty("com.caucho.hessian.unsafe");
+
+ if ("false".equals(unsafeProp))
+ isEnabled = false;
+ } catch (Throwable e) {
+ log.log(Level.FINER, e.toString(), e);
+ }
+
+ _isEnabled = isEnabled;
+ }
+}
diff -Npur hessian-4.0.65-src/com/caucho/hessian/io/NonTransientUnsafeSerializer.java hessian-4.0.65-fix/com/caucho/hessian/io/NonTransientUnsafeSerializer.java
--- hessian-4.0.65-src/com/caucho/hessian/io/NonTransientUnsafeSerializer.java 1970-01-01 08:00:00.000000000 +0800
+++ hessian-4.0.65-fix/com/caucho/hessian/io/NonTransientUnsafeSerializer.java 2023-08-15 18:39:22.000000000 +0800
@@ -0,0 +1,518 @@
+/**
+ *
+ */
+package com.caucho.hessian.io;
+
+import java.io.IOException;
+import java.lang.ref.SoftReference;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.WeakHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import sun.misc.Unsafe;
+
+
+
+/**
+ * @author l65882
+ *
+ */
+public class NonTransientUnsafeSerializer extends AbstractSerializer {
+
+ private static final Logger log
+ = Logger.getLogger(NonTransientUnsafeSerializer.class.getName());
+
+ private static boolean _isEnabled;
+ private static Unsafe _unsafe;
+
+ private static final WeakHashMap<Class<?>,SoftReference<NonTransientUnsafeSerializer>> _serializerMap
+ = new WeakHashMap<Class<?>,SoftReference<NonTransientUnsafeSerializer>>();
+
+ private static Object []NULL_ARGS = new Object[0];
+
+ private Field []_fields;
+ private FieldSerializer []_fieldSerializers;
+
+ public static boolean isEnabled()
+ {
+ return _isEnabled;
+ }
+
+ public NonTransientUnsafeSerializer(Class<?> cl)
+ {
+ introspect(cl);
+ }
+
+ public static NonTransientUnsafeSerializer create(Class<?> cl)
+ {
+ ClassLoader loader = cl.getClassLoader();
+
+ synchronized (_serializerMap) {
+ SoftReference<NonTransientUnsafeSerializer> baseRef
+ = _serializerMap.get(cl);
+
+ NonTransientUnsafeSerializer base = baseRef != null ? baseRef.get() : null;
+
+ if (base == null) {
+ base = new NonTransientUnsafeSerializer(cl);
+ baseRef = new SoftReference<NonTransientUnsafeSerializer>(base);
+ _serializerMap.put(cl, baseRef);
+ }
+
+ return base;
+ }
+ }
+
+ protected void introspect(Class<?> cl)
+ {
+ ArrayList<Field> primitiveFields = new ArrayList<Field>();
+ ArrayList<Field> compoundFields = new ArrayList<Field>();
+
+ for (; cl != null; cl = cl.getSuperclass()) {
+ Field []fields = cl.getDeclaredFields();
+ for (int i = 0; i < fields.length; i++) {
+ Field field = fields[i];
+
+ if (Modifier.isStatic(field.getModifiers()))
+ continue;
+
+ // XXX: could parameterize the handler to only deal with public
+ field.setAccessible(true);
+
+ if (field.getType().isPrimitive()
+ || (field.getType().getName().startsWith("java.lang.")
+ && ! field.getType().equals(Object.class)))
+ primitiveFields.add(field);
+ else
+ compoundFields.add(field);
+ }
+ }
+
+ ArrayList<Field> fields = new ArrayList<Field>();
+ fields.addAll(primitiveFields);
+ fields.addAll(compoundFields);
+
+ _fields = new Field[fields.size()];
+ fields.toArray(_fields);
+
+ _fieldSerializers = new FieldSerializer[_fields.length];
+
+ for (int i = 0; i < _fields.length; i++) {
+ _fieldSerializers[i] = getFieldSerializer(_fields[i]);
+ }
+ }
+
+ @Override
+ public void writeObject(Object obj, AbstractHessianOutput out)
+ throws IOException
+ {
+ if (out.addRef(obj)) {
+ return;
+ }
+
+ Class<?> cl = obj.getClass();
+
+ int ref = out.writeObjectBegin(cl.getName());
+
+ if (ref >= 0) {
+ writeInstance(obj, out);
+ }
+ else if (ref == -1) {
+ writeDefinition20(out);
+ out.writeObjectBegin(cl.getName());
+ writeInstance(obj, out);
+ }
+ else {
+ writeObject10(obj, out);
+ }
+ }
+
+ protected void writeObject10(Object obj, AbstractHessianOutput out)
+ throws IOException
+ {
+ for (int i = 0; i < _fields.length; i++) {
+ Field field = _fields[i];
+
+ out.writeString(field.getName());
+
+ _fieldSerializers[i].serialize(out, obj);
+ }
+
+ out.writeMapEnd();
+ }
+
+ private void writeDefinition20(AbstractHessianOutput out)
+ throws IOException
+ {
+ out.writeClassFieldLength(_fields.length);
+
+ for (int i = 0; i < _fields.length; i++) {
+ Field field = _fields[i];
+
+ out.writeString(field.getName());
+ }
+ }
+
+ final public void writeInstance(Object obj, AbstractHessianOutput out)
+ throws IOException
+ {
+ try {
+ FieldSerializer []fieldSerializers = _fieldSerializers;
+ int length = fieldSerializers.length;
+
+ for (int i = 0; i < length; i++) {
+ fieldSerializers[i].serialize(out, obj);
+ }
+ } catch (RuntimeException e) {
+ throw new RuntimeException(e.getMessage() + "\n class: "
+ + obj.getClass().getName()
+ + " (object=" + obj + ")",
+ e);
+ } catch (IOException e) {
+ throw new IOExceptionWrapper(e.getMessage() + "\n class: "
+ + obj.getClass().getName()
+ + " (object=" + obj + ")",
+ e);
+ }
+ }
+
+ private static FieldSerializer getFieldSerializer(Field field)
+ {
+ Class<?> type = field.getType();
+
+ if (boolean.class.equals(type)) {
+ return new BooleanFieldSerializer(field);
+ }
+ else if (byte.class.equals(type)) {
+ return new ByteFieldSerializer(field);
+ }
+ else if (char.class.equals(type)) {
+ return new CharFieldSerializer(field);
+ }
+ else if (short.class.equals(type)) {
+ return new ShortFieldSerializer(field);
+ }
+ else if (int.class.equals(type)) {
+ return new IntFieldSerializer(field);
+ }
+ else if (long.class.equals(type)) {
+ return new LongFieldSerializer(field);
+ }
+ else if (double.class.equals(type)) {
+ return new DoubleFieldSerializer(field);
+ }
+ else if (float.class.equals(type)) {
+ return new FloatFieldSerializer(field);
+ }
+ else if (String.class.equals(type)) {
+ return new StringFieldSerializer(field);
+ }
+ else if (java.util.Date.class.equals(type)
+ || java.sql.Date.class.equals(type)
+ || java.sql.Timestamp.class.equals(type)
+ || java.sql.Time.class.equals(type)) {
+ return new DateFieldSerializer(field);
+ }
+ else
+ return new ObjectFieldSerializer(field);
+ }
+
+ abstract static class FieldSerializer {
+ abstract void serialize(AbstractHessianOutput out, Object obj)
+ throws IOException;
+ }
+
+ final static class ObjectFieldSerializer extends FieldSerializer {
+ private final Field _field;
+ private final long _offset;
+
+ ObjectFieldSerializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(field);
+
+ if (_offset == Unsafe.INVALID_FIELD_OFFSET)
+ throw new IllegalStateException();
+ }
+
+ @Override
+ final void serialize(AbstractHessianOutput out, Object obj)
+ throws IOException
+ {
+ try {
+ Object value = _unsafe.getObject(obj, _offset);
+
+ out.writeObject(value);
+ } catch (RuntimeException e) {
+ throw new RuntimeException(e.getMessage() + "\n field: "
+ + _field.getDeclaringClass().getName()
+ + '.' + _field.getName(),
+ e);
+ } catch (IOException e) {
+ throw new IOExceptionWrapper(e.getMessage() + "\n field: "
+ + _field.getDeclaringClass().getName()
+ + '.' + _field.getName(),
+ e);
+ }
+ }
+ }
+
+ final static class BooleanFieldSerializer extends FieldSerializer {
+ private final Field _field;
+ private final long _offset;
+
+ BooleanFieldSerializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(field);
+
+ if (_offset == Unsafe.INVALID_FIELD_OFFSET)
+ throw new IllegalStateException();
+ }
+
+ void serialize(AbstractHessianOutput out, Object obj)
+ throws IOException
+ {
+ boolean value = _unsafe.getBoolean(obj, _offset);
+
+ out.writeBoolean(value);
+ }
+ }
+
+ final static class ByteFieldSerializer extends FieldSerializer {
+ private final Field _field;
+ private final long _offset;
+
+ ByteFieldSerializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(field);
+
+ if (_offset == Unsafe.INVALID_FIELD_OFFSET)
+ throw new IllegalStateException();
+ }
+
+ final void serialize(AbstractHessianOutput out, Object obj)
+ throws IOException
+ {
+ int value = _unsafe.getByte(obj, _offset);
+
+ out.writeInt(value);
+ }
+ }
+
+ final static class CharFieldSerializer extends FieldSerializer {
+ private final Field _field;
+ private final long _offset;
+
+ CharFieldSerializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(field);
+
+ if (_offset == Unsafe.INVALID_FIELD_OFFSET)
+ throw new IllegalStateException();
+ }
+
+ final void serialize(AbstractHessianOutput out, Object obj)
+ throws IOException
+ {
+ char value = _unsafe.getChar(obj, _offset);
+
+ out.writeString(String.valueOf(value));
+ }
+ }
+
+ final static class ShortFieldSerializer extends FieldSerializer {
+ private final Field _field;
+ private final long _offset;
+
+ ShortFieldSerializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(field);
+
+ if (_offset == Unsafe.INVALID_FIELD_OFFSET)
+ throw new IllegalStateException();
+ }
+
+ final void serialize(AbstractHessianOutput out, Object obj)
+ throws IOException
+ {
+ int value = _unsafe.getShort(obj, _offset);
+
+ out.writeInt(value);
+ }
+ }
+
+ final static class IntFieldSerializer extends FieldSerializer {
+ private final Field _field;
+ private final long _offset;
+
+ IntFieldSerializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(field);
+
+ if (_offset == Unsafe.INVALID_FIELD_OFFSET)
+ throw new IllegalStateException();
+ }
+
+ final void serialize(AbstractHessianOutput out, Object obj)
+ throws IOException
+ {
+ int value = _unsafe.getInt(obj, _offset);
+
+ out.writeInt(value);
+ }
+ }
+
+ final static class LongFieldSerializer extends FieldSerializer {
+ private final Field _field;
+ private final long _offset;
+
+ LongFieldSerializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(field);
+
+ if (_offset == Unsafe.INVALID_FIELD_OFFSET)
+ throw new IllegalStateException();
+ }
+
+ final void serialize(AbstractHessianOutput out, Object obj)
+ throws IOException
+ {
+ long value = _unsafe.getLong(obj, _offset);
+
+ out.writeLong(value);
+ }
+ }
+
+ final static class FloatFieldSerializer extends FieldSerializer {
+ private final Field _field;
+ private final long _offset;
+
+ FloatFieldSerializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(field);
+
+ if (_offset == Unsafe.INVALID_FIELD_OFFSET)
+ throw new IllegalStateException();
+ }
+
+ final void serialize(AbstractHessianOutput out, Object obj)
+ throws IOException
+ {
+ double value = _unsafe.getFloat(obj, _offset);
+
+ out.writeDouble(value);
+ }
+ }
+
+ final static class DoubleFieldSerializer extends FieldSerializer {
+ private final Field _field;
+ private final long _offset;
+
+ DoubleFieldSerializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(field);
+
+ if (_offset == Unsafe.INVALID_FIELD_OFFSET)
+ throw new IllegalStateException();
+ }
+
+ final void serialize(AbstractHessianOutput out, Object obj)
+ throws IOException
+ {
+ double value = _unsafe.getDouble(obj, _offset);
+
+ out.writeDouble(value);
+ }
+ }
+
+ final static class StringFieldSerializer extends FieldSerializer {
+ private final Field _field;
+ private final long _offset;
+
+ StringFieldSerializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(field);
+
+ if (_offset == Unsafe.INVALID_FIELD_OFFSET)
+ throw new IllegalStateException();
+ }
+
+ @Override
+ final void serialize(AbstractHessianOutput out, Object obj)
+ throws IOException
+ {
+ String value = (String) _unsafe.getObject(obj, _offset);
+
+ out.writeString(value);
+ }
+ }
+
+ final static class DateFieldSerializer extends FieldSerializer {
+ private final Field _field;
+ private final long _offset;
+
+ DateFieldSerializer(Field field)
+ {
+ _field = field;
+ _offset = _unsafe.objectFieldOffset(field);
+
+ if (_offset == Unsafe.INVALID_FIELD_OFFSET)
+ throw new IllegalStateException();
+ }
+
+ @Override
+ void serialize(AbstractHessianOutput out, Object obj)
+ throws IOException
+ {
+ java.util.Date value
+ = (java.util.Date) _unsafe.getObject(obj, _offset);
+
+ if (value == null)
+ out.writeNull();
+ else
+ out.writeUTCDate(value.getTime());
+ }
+ }
+
+ static {
+ boolean isEnabled = false;
+
+ try {
+ Class unsafe = Class.forName("sun.misc.Unsafe");
+ Field theUnsafe = null;
+ for (Field field : unsafe.getDeclaredFields()) {
+ if (field.getName().equals("theUnsafe"))
+ theUnsafe = field;
+ }
+
+ if (theUnsafe != null) {
+ theUnsafe.setAccessible(true);
+ _unsafe = (Unsafe) theUnsafe.get(null);
+ }
+
+ isEnabled = _unsafe != null;
+
+ String unsafeProp = System.getProperty("com.caucho.hessian.unsafe");
+
+ if ("false".equals(unsafeProp))
+ isEnabled = false;
+ } catch (Throwable e) {
+ log.log(Level.FINER, e.toString(), e);
+ }
+
+ _isEnabled = isEnabled;
+ }
+
+}
diff -Npur hessian-4.0.65-src/com/caucho/hessian/io/SerializerFactory.java hessian-4.0.65-fix/com/caucho/hessian/io/SerializerFactory.java
--- hessian-4.0.65-src/com/caucho/hessian/io/SerializerFactory.java 2020-07-23 12:51:28.000000000 +0800
+++ hessian-4.0.65-fix/com/caucho/hessian/io/SerializerFactory.java 2023-08-15 18:39:22.000000000 +0800
@@ -1,804 +1,810 @@
-/*
- * Copyright (c) 2001-2008 Caucho Technology, Inc. All rights reserved.
- *
- * The Apache Software License, Version 1.1
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- * any, must include the following acknowlegement:
- * "This product includes software developed by the
- * Caucho Technology (http://www.caucho.com/)."
- * Alternately, this acknowlegement may appear in the software itself,
- * if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Burlap", "Resin", and "Caucho" must not be used to
- * endorse or promote products derived from this software without prior
- * written permission. For written permission, please contact
- * info@caucho.com.
- *
- * 5. Products derived from this software may not be called "Resin"
- * nor may "Resin" appear in their names without prior written
- * permission of Caucho Technology.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Scott Ferguson
- */
-
-package com.caucho.hessian.io;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.lang.annotation.Annotation;
-import java.lang.ref.SoftReference;
-import java.lang.ref.WeakReference;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.WeakHashMap;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import com.caucho.burlap.io.BurlapRemoteObject;
-
-/**
- * Factory for returning serialization methods.
- */
-public class SerializerFactory extends AbstractSerializerFactory
-{
- private static final Logger log
- = Logger.getLogger(SerializerFactory.class.getName());
-
- private static final Deserializer OBJECT_DESERIALIZER
- = new BasicDeserializer(BasicDeserializer.OBJECT);
-
- private static final ClassLoader _systemClassLoader;
-
- private static final HashMap _staticTypeMap;
-
- private static final
- WeakHashMap<ClassLoader,SoftReference<SerializerFactory>>
- _defaultFactoryRefMap
- = new WeakHashMap<ClassLoader,SoftReference<SerializerFactory>>();
-
- private ContextSerializerFactory _contextFactory;
- private WeakReference<ClassLoader> _loaderRef;
-
- protected Serializer _defaultSerializer;
-
- // Additional factories
- protected ArrayList _factories = new ArrayList();
-
- protected CollectionSerializer _collectionSerializer;
- protected MapSerializer _mapSerializer;
-
- private Deserializer _hashMapDeserializer;
- private Deserializer _arrayListDeserializer;
- private Map _cachedSerializerMap;
- private Map _cachedDeserializerMap;
- private HashMap _cachedTypeDeserializerMap;
-
- private boolean _isAllowNonSerializable;
- private boolean _isEnableUnsafeSerializer
- = (UnsafeSerializer.isEnabled()
- && UnsafeDeserializer.isEnabled());
-
- private FieldDeserializer2Factory _fieldDeserializerFactory;
-
- private ClassFactory _classFactory;
-
- public SerializerFactory()
- {
- this(Thread.currentThread().getContextClassLoader());
- }
-
- public SerializerFactory(ClassLoader loader)
- {
- _loaderRef = new WeakReference<ClassLoader>(loader);
-
- _contextFactory = ContextSerializerFactory.create(loader);
-
- if (_isEnableUnsafeSerializer) {
- _fieldDeserializerFactory = new FieldDeserializer2FactoryUnsafe();
- }
- else {
- _fieldDeserializerFactory = new FieldDeserializer2Factory();
- }
- }
-
- public static SerializerFactory createDefault()
- {
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
-
- synchronized (_defaultFactoryRefMap) {
- SoftReference<SerializerFactory> factoryRef
- = _defaultFactoryRefMap.get(loader);
-
- SerializerFactory factory = null;
-
- if (factoryRef != null)
- factory = factoryRef.get();
-
- if (factory == null) {
- factory = new SerializerFactory();
-
- factoryRef = new SoftReference<SerializerFactory>(factory);
-
- _defaultFactoryRefMap.put(loader, factoryRef);
- }
-
- return factory;
- }
- }
-
- public ClassLoader getClassLoader()
- {
- return _loaderRef.get();
- }
-
- /**
- * Set true if the collection serializer should send the java type.
- */
- public void setSendCollectionType(boolean isSendType)
- {
- if (_collectionSerializer == null)
- _collectionSerializer = new CollectionSerializer();
-
- _collectionSerializer.setSendJavaType(isSendType);
-
- if (_mapSerializer == null)
- _mapSerializer = new MapSerializer();
-
- _mapSerializer.setSendJavaType(isSendType);
- }
-
- /**
- * Adds a factory.
- */
- public void addFactory(AbstractSerializerFactory factory)
- {
- _factories.add(factory);
- }
-
- /**
- * If true, non-serializable objects are allowed.
- */
- public void setAllowNonSerializable(boolean allow)
- {
- _isAllowNonSerializable = allow;
- }
-
- /**
- * If true, non-serializable objects are allowed.
- */
- public boolean isAllowNonSerializable()
- {
- return _isAllowNonSerializable;
- }
-
- /**
- * Returns the serializer for a class.
- *
- * @param cl the class of the object that needs to be serialized.
- *
- * @return a serializer object for the serialization.
- */
- public Serializer getObjectSerializer(Class<?> cl)
- throws HessianProtocolException
- {
- Serializer serializer = getSerializer(cl);
-
- if (serializer instanceof ObjectSerializer)
- return ((ObjectSerializer) serializer).getObjectSerializer();
- else
- return serializer;
- }
-
- public Class<?> loadSerializedClass(String className)
- throws ClassNotFoundException
- {
- return getClassFactory().load(className);
- }
-
- public ClassFactory getClassFactory()
- {
- synchronized (this) {
- if (_classFactory == null) {
- _classFactory = new ClassFactory(getClassLoader());
- }
-
- return _classFactory;
- }
- }
-
- public FieldDeserializer2Factory getFieldDeserializerFactory()
- {
- return _fieldDeserializerFactory;
- }
-
- /**
- * Returns the serializer for a class.
- *
- * @param cl the class of the object that needs to be serialized.
- *
- * @return a serializer object for the serialization.
- */
- public Serializer getSerializer(Class cl)
- throws HessianProtocolException
- {
- Serializer serializer;
-
- if (_cachedSerializerMap != null) {
- serializer = (Serializer) _cachedSerializerMap.get(cl);
-
- if (serializer != null) {
- return serializer;
- }
- }
-
- serializer = loadSerializer(cl);
-
- if (_cachedSerializerMap == null)
- _cachedSerializerMap = new ConcurrentHashMap(8);
-
- _cachedSerializerMap.put(cl, serializer);
-
- return serializer;
- }
-
- protected Serializer loadSerializer(Class<?> cl)
- throws HessianProtocolException
- {
- Serializer serializer = null;
-
- for (int i = 0;
- _factories != null && i < _factories.size();
- i++) {
- AbstractSerializerFactory factory;
-
- factory = (AbstractSerializerFactory) _factories.get(i);
-
- serializer = factory.getSerializer(cl);
-
- if (serializer != null)
- return serializer;
- }
-
- serializer = _contextFactory.getSerializer(cl.getName());
-
- if (serializer != null)
- return serializer;
-
- ClassLoader loader = cl.getClassLoader();
-
- if (loader == null)
- loader = _systemClassLoader;
-
- ContextSerializerFactory factory = null;
-
- factory = ContextSerializerFactory.create(loader);
-
- serializer = factory.getCustomSerializer(cl);
-
- if (serializer != null) {
- return serializer;
- }
-
- if (HessianRemoteObject.class.isAssignableFrom(cl)) {
- return new RemoteSerializer();
- }
- else if (BurlapRemoteObject.class.isAssignableFrom(cl)) {
- return new RemoteSerializer();
- }
- else if (InetAddress.class.isAssignableFrom(cl)) {
- return InetAddressSerializer.create();
- }
- else if (JavaSerializer.getWriteReplace(cl) != null) {
- Serializer baseSerializer = getDefaultSerializer(cl);
-
- return new WriteReplaceSerializer(cl, getClassLoader(), baseSerializer);
- }
- else if (Map.class.isAssignableFrom(cl)) {
- if (_mapSerializer == null)
- _mapSerializer = new MapSerializer();
-
- return _mapSerializer;
- }
- else if (Collection.class.isAssignableFrom(cl)) {
- if (_collectionSerializer == null) {
- _collectionSerializer = new CollectionSerializer();
- }
-
- return _collectionSerializer;
- }
-
- else if (cl.isArray()) {
- return new ArraySerializer();
- }
-
- else if (Throwable.class.isAssignableFrom(cl))
- return new ThrowableSerializer(getDefaultSerializer(cl));
-
- else if (InputStream.class.isAssignableFrom(cl))
- return new InputStreamSerializer();
-
- else if (Iterator.class.isAssignableFrom(cl))
- return IteratorSerializer.create();
-
- else if (Calendar.class.isAssignableFrom(cl))
- return CalendarSerializer.SER;
-
- else if (Enumeration.class.isAssignableFrom(cl))
- return EnumerationSerializer.create();
-
- else if (Enum.class.isAssignableFrom(cl))
- return new EnumSerializer(cl);
-
- else if (Annotation.class.isAssignableFrom(cl))
- return new AnnotationSerializer(cl);
-
- return getDefaultSerializer(cl);
- }
-
- /**
- * Returns the default serializer for a class that isn't matched
- * directly. Application can override this method to produce
- * bean-style serialization instead of field serialization.
- *
- * @param cl the class of the object that needs to be serialized.
- *
- * @return a serializer object for the serialization.
- */
- protected Serializer getDefaultSerializer(Class cl)
- {
- if (_defaultSerializer != null)
- return _defaultSerializer;
-
- if (! Serializable.class.isAssignableFrom(cl)
- && ! _isAllowNonSerializable) {
- throw new IllegalStateException("Serialized class " + cl.getName() + " must implement java.io.Serializable");
- }
-
- if (_isEnableUnsafeSerializer
- && JavaSerializer.getWriteReplace(cl) == null) {
- return UnsafeSerializer.create(cl);
- }
- else
- return JavaSerializer.create(cl);
- }
-
- /**
- * Returns the deserializer for a class.
- *
- * @param cl the class of the object that needs to be deserialized.
- *
- * @return a deserializer object for the serialization.
- */
- public Deserializer getDeserializer(Class cl)
- throws HessianProtocolException
- {
- Deserializer deserializer;
-
- if (_cachedDeserializerMap != null) {
- deserializer = (Deserializer) _cachedDeserializerMap.get(cl);
-
- if (deserializer != null)
- return deserializer;
- }
-
- deserializer = loadDeserializer(cl);
-
- if (_cachedDeserializerMap == null)
- _cachedDeserializerMap = new ConcurrentHashMap(8);
-
- _cachedDeserializerMap.put(cl, deserializer);
-
- return deserializer;
- }
-
- protected Deserializer loadDeserializer(Class cl)
- throws HessianProtocolException
- {
- Deserializer deserializer = null;
-
- for (int i = 0;
- deserializer == null && _factories != null && i < _factories.size();
- i++) {
- AbstractSerializerFactory factory;
- factory = (AbstractSerializerFactory) _factories.get(i);
-
- deserializer = factory.getDeserializer(cl);
- }
-
- if (deserializer != null)
- return deserializer;
-
- // XXX: need test
- deserializer = _contextFactory.getDeserializer(cl.getName());
-
- if (deserializer != null)
- return deserializer;
-
- ContextSerializerFactory factory = null;
-
- if (cl.getClassLoader() != null)
- factory = ContextSerializerFactory.create(cl.getClassLoader());
- else
- factory = ContextSerializerFactory.create(_systemClassLoader);
-
- deserializer = factory.getDeserializer(cl.getName());
-
- if (deserializer != null)
- return deserializer;
-
- deserializer = factory.getCustomDeserializer(cl);
-
- if (deserializer != null)
- return deserializer;
-
- if (Collection.class.isAssignableFrom(cl))
- deserializer = new CollectionDeserializer(cl);
-
- else if (Map.class.isAssignableFrom(cl)) {
- deserializer = new MapDeserializer(cl);
- }
- else if (Iterator.class.isAssignableFrom(cl)) {
- deserializer = IteratorDeserializer.create();
- }
- else if (Annotation.class.isAssignableFrom(cl)) {
- deserializer = new AnnotationDeserializer(cl);
- }
- else if (cl.isInterface()) {
- deserializer = new ObjectDeserializer(cl);
- }
- else if (cl.isArray()) {
- deserializer = new ArrayDeserializer(cl.getComponentType());
- }
- else if (Enumeration.class.isAssignableFrom(cl)) {
- deserializer = EnumerationDeserializer.create();
- }
- else if (Enum.class.isAssignableFrom(cl))
- deserializer = new EnumDeserializer(cl);
-
- else if (Class.class.equals(cl))
- deserializer = new ClassDeserializer(getClassLoader());
-
- else
- deserializer = getDefaultDeserializer(cl);
-
- return deserializer;
- }
-
- /**
- * Returns a custom serializer the class
- *
- * @param cl the class of the object that needs to be serialized.
- *
- * @return a serializer object for the serialization.
- */
- protected Deserializer getCustomDeserializer(Class cl)
- {
- try {
- Class serClass = Class.forName(cl.getName() + "HessianDeserializer",
- false, cl.getClassLoader());
-
- Deserializer ser = (Deserializer) serClass.newInstance();
-
- return ser;
- } catch (ClassNotFoundException e) {
- log.log(Level.FINEST, e.toString(), e);
-
- return null;
- } catch (Exception e) {
- log.log(Level.FINE, e.toString(), e);
-
- return null;
- }
- }
-
- /**
- * Returns the default serializer for a class that isn't matched
- * directly. Application can override this method to produce
- * bean-style serialization instead of field serialization.
- *
- * @param cl the class of the object that needs to be serialized.
- *
- * @return a serializer object for the serialization.
- */
- protected Deserializer getDefaultDeserializer(Class cl)
- {
- if (InputStream.class.equals(cl))
- return InputStreamDeserializer.DESER;
-
- if (_isEnableUnsafeSerializer) {
- return new UnsafeDeserializer(cl, _fieldDeserializerFactory);
- }
- else
- return new JavaDeserializer(cl, _fieldDeserializerFactory);
- }
-
- /**
- * Reads the object as a list.
- */
- public Object readList(AbstractHessianInput in, int length, String type)
- throws HessianProtocolException, IOException
- {
- Deserializer deserializer = getDeserializer(type);
-
- if (deserializer != null)
- return deserializer.readList(in, length);
- else
- return new CollectionDeserializer(ArrayList.class).readList(in, length);
- }
-
- /**
- * Reads the object as a map.
- */
- public Object readMap(AbstractHessianInput in, String type)
- throws HessianProtocolException, IOException
- {
- Deserializer deserializer = getDeserializer(type);
-
- if (deserializer != null)
- return deserializer.readMap(in);
- else if (_hashMapDeserializer != null)
- return _hashMapDeserializer.readMap(in);
- else {
- _hashMapDeserializer = new MapDeserializer(HashMap.class);
-
- return _hashMapDeserializer.readMap(in);
- }
- }
-
- /**
- * Reads the object as a map.
- */
- public Object readObject(AbstractHessianInput in,
- String type,
- String []fieldNames)
- throws HessianProtocolException, IOException
- {
- Deserializer deserializer = getDeserializer(type);
-
- if (deserializer != null)
- return deserializer.readObject(in, fieldNames);
- else if (_hashMapDeserializer != null)
- return _hashMapDeserializer.readObject(in, fieldNames);
- else {
- _hashMapDeserializer = new MapDeserializer(HashMap.class);
-
- return _hashMapDeserializer.readObject(in, fieldNames);
- }
- }
-
- /**
- * Reads the object as a map.
- */
- public Deserializer getObjectDeserializer(String type, Class cl)
- throws HessianProtocolException
- {
- Deserializer reader = getObjectDeserializer(type);
-
- if (cl == null
- || cl.equals(reader.getType())
- || cl.isAssignableFrom(reader.getType())
- || reader.isReadResolve()
- || HessianHandle.class.isAssignableFrom(reader.getType())) {
- return reader;
- }
-
- if (log.isLoggable(Level.FINE)) {
- log.fine("hessian: expected deserializer '" + cl.getName() + "' at '" + type + "' ("
- + reader.getType().getName() + ")");
- }
-
- return getDeserializer(cl);
- }
-
- /**
- * Reads the object as a map.
- */
- public Deserializer getObjectDeserializer(String type)
- throws HessianProtocolException
- {
- Deserializer deserializer = getDeserializer(type);
-
- if (deserializer != null)
- return deserializer;
- else if (_hashMapDeserializer != null)
- return _hashMapDeserializer;
- else {
- _hashMapDeserializer = new MapDeserializer(HashMap.class);
-
- return _hashMapDeserializer;
- }
- }
-
- /**
- * Reads the object as a map.
- */
- public Deserializer getListDeserializer(String type, Class cl)
- throws HessianProtocolException
- {
- Deserializer reader = getListDeserializer(type);
-
- if (cl == null
- || cl.equals(reader.getType())
- || cl.isAssignableFrom(reader.getType())) {
- return reader;
- }
-
- if (log.isLoggable(Level.FINE)) {
- log.fine("hessian: expected '" + cl.getName() + "' at '" + type + "' ("
- + reader.getType().getName() + ")");
- }
-
- return getDeserializer(cl);
- }
-
- /**
- * Reads the object as a map.
- */
- public Deserializer getListDeserializer(String type)
- throws HessianProtocolException
- {
- Deserializer deserializer = getDeserializer(type);
-
- if (deserializer != null)
- return deserializer;
- else if (_arrayListDeserializer != null)
- return _arrayListDeserializer;
- else {
- _arrayListDeserializer = new CollectionDeserializer(ArrayList.class);
-
- return _arrayListDeserializer;
- }
- }
-
- /**
- * Returns a deserializer based on a string type.
- */
- public Deserializer getDeserializer(String type)
- throws HessianProtocolException
- {
- if (type == null || type.equals(""))
- return null;
-
- Deserializer deserializer;
-
- if (_cachedTypeDeserializerMap != null) {
- synchronized (_cachedTypeDeserializerMap) {
- deserializer = (Deserializer) _cachedTypeDeserializerMap.get(type);
- }
-
- if (deserializer != null)
- return deserializer;
- }
-
-
- deserializer = (Deserializer) _staticTypeMap.get(type);
- if (deserializer != null)
- return deserializer;
-
- if (type.startsWith("[")) {
- Deserializer subDeserializer = getDeserializer(type.substring(1));
-
- if (subDeserializer != null)
- deserializer = new ArrayDeserializer(subDeserializer.getType());
- else
- deserializer = new ArrayDeserializer(Object.class);
- }
- else {
- try {
- //Class cl = Class.forName(type, false, getClassLoader());
-
- Class cl = loadSerializedClass(type);
-
- deserializer = getDeserializer(cl);
- } catch (Exception e) {
- log.warning("Hessian/Burlap: '" + type + "' is an unknown class in " + getClassLoader() + ":\n" + e);
-
- log.log(Level.FINER, e.toString(), e);
- }
- }
-
- if (deserializer != null) {
- if (_cachedTypeDeserializerMap == null)
- _cachedTypeDeserializerMap = new HashMap(8);
-
- synchronized (_cachedTypeDeserializerMap) {
- _cachedTypeDeserializerMap.put(type, deserializer);
- }
- }
-
- return deserializer;
- }
-
- private static void addBasic(Class<?> cl, String typeName, int type)
- {
- Deserializer deserializer = new BasicDeserializer(type);
-
- _staticTypeMap.put(typeName, deserializer);
- }
-
- static {
- _staticTypeMap = new HashMap();
-
- addBasic(void.class, "void", BasicSerializer.NULL);
-
- addBasic(Boolean.class, "boolean", BasicSerializer.BOOLEAN);
- addBasic(Byte.class, "byte", BasicSerializer.BYTE);
- addBasic(Short.class, "short", BasicSerializer.SHORT);
- addBasic(Integer.class, "int", BasicSerializer.INTEGER);
- addBasic(Long.class, "long", BasicSerializer.LONG);
- addBasic(Float.class, "float", BasicSerializer.FLOAT);
- addBasic(Double.class, "double", BasicSerializer.DOUBLE);
- addBasic(Character.class, "char", BasicSerializer.CHARACTER_OBJECT);
- addBasic(String.class, "string", BasicSerializer.STRING);
- addBasic(StringBuilder.class, "string", BasicSerializer.STRING_BUILDER);
- addBasic(Object.class, "object", BasicSerializer.OBJECT);
- addBasic(java.util.Date.class, "date", BasicSerializer.DATE);
-
- addBasic(boolean.class, "boolean", BasicSerializer.BOOLEAN);
- addBasic(byte.class, "byte", BasicSerializer.BYTE);
- addBasic(short.class, "short", BasicSerializer.SHORT);
- addBasic(int.class, "int", BasicSerializer.INTEGER);
- addBasic(long.class, "long", BasicSerializer.LONG);
- addBasic(float.class, "float", BasicSerializer.FLOAT);
- addBasic(double.class, "double", BasicSerializer.DOUBLE);
- addBasic(char.class, "char", BasicSerializer.CHARACTER);
-
- addBasic(boolean[].class, "[boolean", BasicSerializer.BOOLEAN_ARRAY);
- addBasic(byte[].class, "[byte", BasicSerializer.BYTE_ARRAY);
- addBasic(short[].class, "[short", BasicSerializer.SHORT_ARRAY);
- addBasic(int[].class, "[int", BasicSerializer.INTEGER_ARRAY);
- addBasic(long[].class, "[long", BasicSerializer.LONG_ARRAY);
- addBasic(float[].class, "[float", BasicSerializer.FLOAT_ARRAY);
- addBasic(double[].class, "[double", BasicSerializer.DOUBLE_ARRAY);
- addBasic(char[].class, "[char", BasicSerializer.CHARACTER_ARRAY);
- addBasic(String[].class, "[string", BasicSerializer.STRING_ARRAY);
- addBasic(Object[].class, "[object", BasicSerializer.OBJECT_ARRAY);
-
- Deserializer objectDeserializer = new JavaDeserializer(Object.class, new FieldDeserializer2Factory());
- _staticTypeMap.put("object", objectDeserializer);
- _staticTypeMap.put(HessianRemote.class.getName(),
- RemoteDeserializer.DESER);
-
-
- ClassLoader systemClassLoader = null;
- try {
- systemClassLoader = ClassLoader.getSystemClassLoader();
- } catch (Exception e) {
- }
-
- _systemClassLoader = systemClassLoader;
- }
-}
+/*
+ * Copyright (c) 2001-2008 Caucho Technology, Inc. All rights reserved.
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Caucho Technology (http://www.caucho.com/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Burlap", "Resin", and "Caucho" must not be used to
+ * endorse or promote products derived from this software without prior
+ * written permission. For written permission, please contact
+ * info@caucho.com.
+ *
+ * 5. Products derived from this software may not be called "Resin"
+ * nor may "Resin" appear in their names without prior written
+ * permission of Caucho Technology.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @author Scott Ferguson
+ */
+
+package com.caucho.hessian.io;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
+import java.lang.ref.SoftReference;
+import java.lang.ref.WeakReference;
+import java.net.InetAddress;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.caucho.burlap.io.BurlapRemoteObject;
+
+/**
+ * Factory for returning serialization methods.
+ */
+public class SerializerFactory extends AbstractSerializerFactory
+{
+ private static final Logger log
+ = Logger.getLogger(SerializerFactory.class.getName());
+
+ private static final Deserializer OBJECT_DESERIALIZER
+ = new BasicDeserializer(BasicDeserializer.OBJECT);
+
+ private static final ClassLoader _systemClassLoader;
+
+ private static final HashMap _staticTypeMap;
+
+ private static final
+ WeakHashMap<ClassLoader,SoftReference<SerializerFactory>>
+ _defaultFactoryRefMap
+ = new WeakHashMap<ClassLoader,SoftReference<SerializerFactory>>();
+
+ private ContextSerializerFactory _contextFactory;
+ private WeakReference<ClassLoader> _loaderRef;
+
+ protected Serializer _defaultSerializer;
+
+ // Additional factories
+ protected ArrayList _factories = new ArrayList();
+
+ protected CollectionSerializer _collectionSerializer;
+ protected MapSerializer _mapSerializer;
+
+ private Deserializer _hashMapDeserializer;
+ private Deserializer _arrayListDeserializer;
+ private Map _cachedSerializerMap;
+ private Map _cachedDeserializerMap;
+ private HashMap _cachedTypeDeserializerMap;
+
+ private boolean _isAllowNonSerializable;
+ private boolean _isEnableUnsafeSerializer
+ = (UnsafeSerializer.isEnabled()
+ && UnsafeDeserializer.isEnabled());
+
+ private FieldDeserializer2Factory _fieldDeserializerFactory;
+
+ private ClassFactory _classFactory;
+
+ public SerializerFactory()
+ {
+ this(Thread.currentThread().getContextClassLoader());
+ }
+
+ public SerializerFactory(ClassLoader loader)
+ {
+ _loaderRef = new WeakReference<ClassLoader>(loader);
+
+ _contextFactory = ContextSerializerFactory.create(loader);
+
+ if (_isEnableUnsafeSerializer) {
+ _fieldDeserializerFactory = new FieldDeserializer2FactoryUnsafe();
+ }
+ else {
+ _fieldDeserializerFactory = new FieldDeserializer2Factory();
+ }
+ }
+
+ public static SerializerFactory createDefault()
+ {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+
+ synchronized (_defaultFactoryRefMap) {
+ SoftReference<SerializerFactory> factoryRef
+ = _defaultFactoryRefMap.get(loader);
+
+ SerializerFactory factory = null;
+
+ if (factoryRef != null)
+ factory = factoryRef.get();
+
+ if (factory == null) {
+ factory = new SerializerFactory();
+
+ factoryRef = new SoftReference<SerializerFactory>(factory);
+
+ _defaultFactoryRefMap.put(loader, factoryRef);
+ }
+
+ return factory;
+ }
+ }
+
+ public ClassLoader getClassLoader()
+ {
+ return _loaderRef.get();
+ }
+
+ /**
+ * Set true if the collection serializer should send the java type.
+ */
+ public void setSendCollectionType(boolean isSendType)
+ {
+ if (_collectionSerializer == null)
+ _collectionSerializer = new CollectionSerializer();
+
+ _collectionSerializer.setSendJavaType(isSendType);
+
+ if (_mapSerializer == null)
+ _mapSerializer = new MapSerializer();
+
+ _mapSerializer.setSendJavaType(isSendType);
+ }
+
+ /**
+ * Adds a factory.
+ */
+ public void addFactory(AbstractSerializerFactory factory)
+ {
+ _factories.add(factory);
+ }
+
+ /**
+ * If true, non-serializable objects are allowed.
+ */
+ public void setAllowNonSerializable(boolean allow)
+ {
+ _isAllowNonSerializable = allow;
+ }
+
+ /**
+ * If true, non-serializable objects are allowed.
+ */
+ public boolean isAllowNonSerializable()
+ {
+ return _isAllowNonSerializable;
+ }
+
+ /**
+ * Returns the serializer for a class.
+ *
+ * @param cl the class of the object that needs to be serialized.
+ *
+ * @return a serializer object for the serialization.
+ */
+ public Serializer getObjectSerializer(Class<?> cl)
+ throws HessianProtocolException
+ {
+ Serializer serializer = getSerializer(cl);
+
+ if (serializer instanceof ObjectSerializer)
+ return ((ObjectSerializer) serializer).getObjectSerializer();
+ else
+ return serializer;
+ }
+
+ public Class<?> loadSerializedClass(String className)
+ throws ClassNotFoundException
+ {
+ return getClassFactory().load(className);
+ }
+
+ public ClassFactory getClassFactory()
+ {
+ synchronized (this) {
+ if (_classFactory == null) {
+ _classFactory = new ClassFactory(getClassLoader());
+ }
+
+ return _classFactory;
+ }
+ }
+
+ public FieldDeserializer2Factory getFieldDeserializerFactory()
+ {
+ return _fieldDeserializerFactory;
+ }
+
+ /**
+ * Returns the serializer for a class.
+ *
+ * @param cl the class of the object that needs to be serialized.
+ *
+ * @return a serializer object for the serialization.
+ */
+ public Serializer getSerializer(Class cl)
+ throws HessianProtocolException
+ {
+ Serializer serializer;
+
+ if (_cachedSerializerMap != null) {
+ serializer = (Serializer) _cachedSerializerMap.get(cl);
+
+ if (serializer != null) {
+ return serializer;
+ }
+ }
+
+ serializer = loadSerializer(cl);
+
+ if (_cachedSerializerMap == null)
+ _cachedSerializerMap = new ConcurrentHashMap(8);
+
+ _cachedSerializerMap.put(cl, serializer);
+
+ return serializer;
+ }
+
+ protected Serializer loadSerializer(Class<?> cl)
+ throws HessianProtocolException
+ {
+ Serializer serializer = null;
+
+ for (int i = 0;
+ _factories != null && i < _factories.size();
+ i++) {
+ AbstractSerializerFactory factory;
+
+ factory = (AbstractSerializerFactory) _factories.get(i);
+
+ serializer = factory.getSerializer(cl);
+
+ if (serializer != null)
+ return serializer;
+ }
+
+ serializer = _contextFactory.getSerializer(cl.getName());
+
+ if (serializer != null)
+ return serializer;
+
+ ClassLoader loader = cl.getClassLoader();
+
+ if (loader == null)
+ loader = _systemClassLoader;
+
+ ContextSerializerFactory factory = null;
+
+ factory = ContextSerializerFactory.create(loader);
+
+ serializer = factory.getCustomSerializer(cl);
+
+ if (serializer != null) {
+ return serializer;
+ }
+
+ if (HessianRemoteObject.class.isAssignableFrom(cl)) {
+ return new RemoteSerializer();
+ }
+ else if (BurlapRemoteObject.class.isAssignableFrom(cl)) {
+ return new RemoteSerializer();
+ }
+ else if (InetAddress.class.isAssignableFrom(cl)) {
+ return InetAddressSerializer.create();
+ }
+ else if (JavaSerializer.getWriteReplace(cl) != null) {
+ Serializer baseSerializer = getDefaultSerializer(cl);
+
+ return new WriteReplaceSerializer(cl, getClassLoader(), baseSerializer);
+ }
+ else if (Map.class.isAssignableFrom(cl)) {
+ if (_mapSerializer == null)
+ _mapSerializer = new MapSerializer();
+
+ return _mapSerializer;
+ }
+ else if (Collection.class.isAssignableFrom(cl)) {
+ if (_collectionSerializer == null) {
+ _collectionSerializer = new CollectionSerializer();
+ }
+
+ return _collectionSerializer;
+ }
+
+ else if (cl.isArray()) {
+ return new ArraySerializer();
+ }
+
+ else if (Throwable.class.isAssignableFrom(cl))
+ return new ThrowableSerializer(getDefaultSerializer(cl));
+
+ else if (InputStream.class.isAssignableFrom(cl))
+ return new InputStreamSerializer();
+
+ else if (Iterator.class.isAssignableFrom(cl))
+ return IteratorSerializer.create();
+
+ else if (Calendar.class.isAssignableFrom(cl))
+ return CalendarSerializer.SER;
+
+ else if (Enumeration.class.isAssignableFrom(cl))
+ return EnumerationSerializer.create();
+
+ else if (Enum.class.isAssignableFrom(cl))
+ return new EnumSerializer(cl);
+
+ else if (Annotation.class.isAssignableFrom(cl))
+ return new AnnotationSerializer(cl);
+
+ else if (BigDecimal.class.isAssignableFrom(cl))
+ return new NonTransientUnsafeSerializer(cl);
+ else
+ return getDefaultSerializer(cl);
+ }
+
+ /**
+ * Returns the default serializer for a class that isn't matched
+ * directly. Application can override this method to produce
+ * bean-style serialization instead of field serialization.
+ *
+ * @param cl the class of the object that needs to be serialized.
+ *
+ * @return a serializer object for the serialization.
+ */
+ protected Serializer getDefaultSerializer(Class cl)
+ {
+ if (_defaultSerializer != null)
+ return _defaultSerializer;
+
+ if (! Serializable.class.isAssignableFrom(cl)
+ && ! _isAllowNonSerializable) {
+ throw new IllegalStateException("Serialized class " + cl.getName() + " must implement java.io.Serializable");
+ }
+
+ if (_isEnableUnsafeSerializer
+ && JavaSerializer.getWriteReplace(cl) == null) {
+ return UnsafeSerializer.create(cl);
+ }
+ else
+ return JavaSerializer.create(cl);
+ }
+
+ /**
+ * Returns the deserializer for a class.
+ *
+ * @param cl the class of the object that needs to be deserialized.
+ *
+ * @return a deserializer object for the serialization.
+ */
+ public Deserializer getDeserializer(Class cl)
+ throws HessianProtocolException
+ {
+ Deserializer deserializer;
+
+ if (_cachedDeserializerMap != null) {
+ deserializer = (Deserializer) _cachedDeserializerMap.get(cl);
+
+ if (deserializer != null)
+ return deserializer;
+ }
+
+ deserializer = loadDeserializer(cl);
+
+ if (_cachedDeserializerMap == null)
+ _cachedDeserializerMap = new ConcurrentHashMap(8);
+
+ _cachedDeserializerMap.put(cl, deserializer);
+
+ return deserializer;
+ }
+
+ protected Deserializer loadDeserializer(Class cl)
+ throws HessianProtocolException
+ {
+ Deserializer deserializer = null;
+
+ for (int i = 0;
+ deserializer == null && _factories != null && i < _factories.size();
+ i++) {
+ AbstractSerializerFactory factory;
+ factory = (AbstractSerializerFactory) _factories.get(i);
+
+ deserializer = factory.getDeserializer(cl);
+ }
+
+ if (deserializer != null)
+ return deserializer;
+
+ // XXX: need test
+ deserializer = _contextFactory.getDeserializer(cl.getName());
+
+ if (deserializer != null)
+ return deserializer;
+
+ ContextSerializerFactory factory = null;
+
+ if (cl.getClassLoader() != null)
+ factory = ContextSerializerFactory.create(cl.getClassLoader());
+ else
+ factory = ContextSerializerFactory.create(_systemClassLoader);
+
+ deserializer = factory.getDeserializer(cl.getName());
+
+ if (deserializer != null)
+ return deserializer;
+
+ deserializer = factory.getCustomDeserializer(cl);
+
+ if (deserializer != null)
+ return deserializer;
+
+ if (Collection.class.isAssignableFrom(cl))
+ deserializer = new CollectionDeserializer(cl);
+
+ else if (Map.class.isAssignableFrom(cl)) {
+ deserializer = new MapDeserializer(cl);
+ }
+ else if (Iterator.class.isAssignableFrom(cl)) {
+ deserializer = IteratorDeserializer.create();
+ }
+ else if (Annotation.class.isAssignableFrom(cl)) {
+ deserializer = new AnnotationDeserializer(cl);
+ }
+ else if (cl.isInterface()) {
+ deserializer = new ObjectDeserializer(cl);
+ }
+ else if (cl.isArray()) {
+ deserializer = new ArrayDeserializer(cl.getComponentType());
+ }
+ else if (Enumeration.class.isAssignableFrom(cl)) {
+ deserializer = EnumerationDeserializer.create();
+ }
+ else if (Enum.class.isAssignableFrom(cl)){
+ deserializer = new EnumDeserializer(cl);
+ }
+ else if (Class.class.equals(cl))
+ deserializer = new ClassDeserializer(getClassLoader());
+
+ else if (BigDecimal.class.equals(cl))
+ deserializer = new NonTransientUnsafeDeserializer(cl);
+ else
+ deserializer = getDefaultDeserializer(cl);
+
+ return deserializer;
+ }
+
+ /**
+ * Returns a custom serializer the class
+ *
+ * @param cl the class of the object that needs to be serialized.
+ *
+ * @return a serializer object for the serialization.
+ */
+ protected Deserializer getCustomDeserializer(Class cl)
+ {
+ try {
+ Class serClass = Class.forName(cl.getName() + "HessianDeserializer",
+ false, cl.getClassLoader());
+
+ Deserializer ser = (Deserializer) serClass.newInstance();
+
+ return ser;
+ } catch (ClassNotFoundException e) {
+ log.log(Level.FINEST, e.toString(), e);
+
+ return null;
+ } catch (Exception e) {
+ log.log(Level.FINE, e.toString(), e);
+
+ return null;
+ }
+ }
+
+ /**
+ * Returns the default serializer for a class that isn't matched
+ * directly. Application can override this method to produce
+ * bean-style serialization instead of field serialization.
+ *
+ * @param cl the class of the object that needs to be serialized.
+ *
+ * @return a serializer object for the serialization.
+ */
+ protected Deserializer getDefaultDeserializer(Class cl)
+ {
+ if (InputStream.class.equals(cl))
+ return InputStreamDeserializer.DESER;
+
+ if (_isEnableUnsafeSerializer) {
+ return new UnsafeDeserializer(cl, _fieldDeserializerFactory);
+ }
+ else
+ return new JavaDeserializer(cl, _fieldDeserializerFactory);
+ }
+
+ /**
+ * Reads the object as a list.
+ */
+ public Object readList(AbstractHessianInput in, int length, String type)
+ throws HessianProtocolException, IOException
+ {
+ Deserializer deserializer = getDeserializer(type);
+
+ if (deserializer != null)
+ return deserializer.readList(in, length);
+ else
+ return new CollectionDeserializer(ArrayList.class).readList(in, length);
+ }
+
+ /**
+ * Reads the object as a map.
+ */
+ public Object readMap(AbstractHessianInput in, String type)
+ throws HessianProtocolException, IOException
+ {
+ Deserializer deserializer = getDeserializer(type);
+
+ if (deserializer != null)
+ return deserializer.readMap(in);
+ else if (_hashMapDeserializer != null)
+ return _hashMapDeserializer.readMap(in);
+ else {
+ _hashMapDeserializer = new MapDeserializer(HashMap.class);
+
+ return _hashMapDeserializer.readMap(in);
+ }
+ }
+
+ /**
+ * Reads the object as a map.
+ */
+ public Object readObject(AbstractHessianInput in,
+ String type,
+ String []fieldNames)
+ throws HessianProtocolException, IOException
+ {
+ Deserializer deserializer = getDeserializer(type);
+
+ if (deserializer != null)
+ return deserializer.readObject(in, fieldNames);
+ else if (_hashMapDeserializer != null)
+ return _hashMapDeserializer.readObject(in, fieldNames);
+ else {
+ _hashMapDeserializer = new MapDeserializer(HashMap.class);
+
+ return _hashMapDeserializer.readObject(in, fieldNames);
+ }
+ }
+
+ /**
+ * Reads the object as a map.
+ */
+ public Deserializer getObjectDeserializer(String type, Class cl)
+ throws HessianProtocolException
+ {
+ Deserializer reader = getObjectDeserializer(type);
+
+ if (cl == null
+ || cl.equals(reader.getType())
+ || cl.isAssignableFrom(reader.getType())
+ || reader.isReadResolve()
+ || HessianHandle.class.isAssignableFrom(reader.getType())) {
+ return reader;
+ }
+
+ if (log.isLoggable(Level.FINE)) {
+ log.fine("hessian: expected deserializer '" + cl.getName() + "' at '" + type + "' ("
+ + reader.getType().getName() + ")");
+ }
+
+ return getDeserializer(cl);
+ }
+
+ /**
+ * Reads the object as a map.
+ */
+ public Deserializer getObjectDeserializer(String type)
+ throws HessianProtocolException
+ {
+ Deserializer deserializer = getDeserializer(type);
+
+ if (deserializer != null)
+ return deserializer;
+ else if (_hashMapDeserializer != null)
+ return _hashMapDeserializer;
+ else {
+ _hashMapDeserializer = new MapDeserializer(HashMap.class);
+
+ return _hashMapDeserializer;
+ }
+ }
+
+ /**
+ * Reads the object as a map.
+ */
+ public Deserializer getListDeserializer(String type, Class cl)
+ throws HessianProtocolException
+ {
+ Deserializer reader = getListDeserializer(type);
+
+ if (cl == null
+ || cl.equals(reader.getType())
+ || cl.isAssignableFrom(reader.getType())) {
+ return reader;
+ }
+
+ if (log.isLoggable(Level.FINE)) {
+ log.fine("hessian: expected '" + cl.getName() + "' at '" + type + "' ("
+ + reader.getType().getName() + ")");
+ }
+
+ return getDeserializer(cl);
+ }
+
+ /**
+ * Reads the object as a map.
+ */
+ public Deserializer getListDeserializer(String type)
+ throws HessianProtocolException
+ {
+ Deserializer deserializer = getDeserializer(type);
+
+ if (deserializer != null)
+ return deserializer;
+ else if (_arrayListDeserializer != null)
+ return _arrayListDeserializer;
+ else {
+ _arrayListDeserializer = new CollectionDeserializer(ArrayList.class);
+
+ return _arrayListDeserializer;
+ }
+ }
+
+ /**
+ * Returns a deserializer based on a string type.
+ */
+ public Deserializer getDeserializer(String type)
+ throws HessianProtocolException
+ {
+ if (type == null || type.equals(""))
+ return null;
+
+ Deserializer deserializer;
+
+ if (_cachedTypeDeserializerMap != null) {
+ synchronized (_cachedTypeDeserializerMap) {
+ deserializer = (Deserializer) _cachedTypeDeserializerMap.get(type);
+ }
+
+ if (deserializer != null)
+ return deserializer;
+ }
+
+
+ deserializer = (Deserializer) _staticTypeMap.get(type);
+ if (deserializer != null)
+ return deserializer;
+
+ if (type.startsWith("[")) {
+ Deserializer subDeserializer = getDeserializer(type.substring(1));
+
+ if (subDeserializer != null)
+ deserializer = new ArrayDeserializer(subDeserializer.getType());
+ else
+ deserializer = new ArrayDeserializer(Object.class);
+ }
+ else {
+ try {
+ //Class cl = Class.forName(type, false, getClassLoader());
+
+ Class cl = loadSerializedClass(type);
+
+ deserializer = getDeserializer(cl);
+ } catch (Exception e) {
+ log.warning("Hessian/Burlap: '" + type + "' is an unknown class in " + getClassLoader() + ":\n" + e);
+
+ log.log(Level.FINER, e.toString(), e);
+ }
+ }
+
+ if (deserializer != null) {
+ if (_cachedTypeDeserializerMap == null)
+ _cachedTypeDeserializerMap = new HashMap(8);
+
+ synchronized (_cachedTypeDeserializerMap) {
+ _cachedTypeDeserializerMap.put(type, deserializer);
+ }
+ }
+
+ return deserializer;
+ }
+
+ private static void addBasic(Class<?> cl, String typeName, int type)
+ {
+ Deserializer deserializer = new BasicDeserializer(type);
+
+ _staticTypeMap.put(typeName, deserializer);
+ }
+
+ static {
+ _staticTypeMap = new HashMap();
+
+ addBasic(void.class, "void", BasicSerializer.NULL);
+
+ addBasic(Boolean.class, "boolean", BasicSerializer.BOOLEAN);
+ addBasic(Byte.class, "byte", BasicSerializer.BYTE);
+ addBasic(Short.class, "short", BasicSerializer.SHORT);
+ addBasic(Integer.class, "int", BasicSerializer.INTEGER);
+ addBasic(Long.class, "long", BasicSerializer.LONG);
+ addBasic(Float.class, "float", BasicSerializer.FLOAT);
+ addBasic(Double.class, "double", BasicSerializer.DOUBLE);
+ addBasic(Character.class, "char", BasicSerializer.CHARACTER_OBJECT);
+ addBasic(String.class, "string", BasicSerializer.STRING);
+ addBasic(StringBuilder.class, "string", BasicSerializer.STRING_BUILDER);
+ addBasic(Object.class, "object", BasicSerializer.OBJECT);
+ addBasic(java.util.Date.class, "date", BasicSerializer.DATE);
+
+ addBasic(boolean.class, "boolean", BasicSerializer.BOOLEAN);
+ addBasic(byte.class, "byte", BasicSerializer.BYTE);
+ addBasic(short.class, "short", BasicSerializer.SHORT);
+ addBasic(int.class, "int", BasicSerializer.INTEGER);
+ addBasic(long.class, "long", BasicSerializer.LONG);
+ addBasic(float.class, "float", BasicSerializer.FLOAT);
+ addBasic(double.class, "double", BasicSerializer.DOUBLE);
+ addBasic(char.class, "char", BasicSerializer.CHARACTER);
+
+ addBasic(boolean[].class, "[boolean", BasicSerializer.BOOLEAN_ARRAY);
+ addBasic(byte[].class, "[byte", BasicSerializer.BYTE_ARRAY);
+ addBasic(short[].class, "[short", BasicSerializer.SHORT_ARRAY);
+ addBasic(int[].class, "[int", BasicSerializer.INTEGER_ARRAY);
+ addBasic(long[].class, "[long", BasicSerializer.LONG_ARRAY);
+ addBasic(float[].class, "[float", BasicSerializer.FLOAT_ARRAY);
+ addBasic(double[].class, "[double", BasicSerializer.DOUBLE_ARRAY);
+ addBasic(char[].class, "[char", BasicSerializer.CHARACTER_ARRAY);
+ addBasic(String[].class, "[string", BasicSerializer.STRING_ARRAY);
+ addBasic(Object[].class, "[object", BasicSerializer.OBJECT_ARRAY);
+
+ Deserializer objectDeserializer = new JavaDeserializer(Object.class, new FieldDeserializer2Factory());
+ _staticTypeMap.put("object", objectDeserializer);
+ _staticTypeMap.put(HessianRemote.class.getName(),
+ RemoteDeserializer.DESER);
+
+
+ ClassLoader systemClassLoader = null;
+ try {
+ systemClassLoader = ClassLoader.getSystemClassLoader();
+ } catch (Exception e) {
+ }
+
+ _systemClassLoader = systemClassLoader;
+ }
+}
diff -Npur hessian-4.0.65-src/com/caucho/hessian/server/HessianDispatcher.java hessian-4.0.65-fix/com/caucho/hessian/server/HessianDispatcher.java
--- hessian-4.0.65-src/com/caucho/hessian/server/HessianDispatcher.java 1970-01-01 08:00:00.000000000 +0800
+++ hessian-4.0.65-fix/com/caucho/hessian/server/HessianDispatcher.java 2023-08-15 18:39:22.000000000 +0800
@@ -0,0 +1,337 @@
+
+package com.caucho.hessian.server;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Logger;
+
+import javax.servlet.GenericServlet;
+import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.web.context.support.WebApplicationContextUtils;
+
+import com.caucho.hessian.io.Hessian2Input;
+import com.caucho.hessian.io.SerializerFactory;
+import com.caucho.services.server.Service;
+import com.caucho.services.server.ServiceContext;
+
+
+public class HessianDispatcher extends GenericServlet
+{
+
+
+ private static final long serialVersionUID = -8611469561907416355L;
+
+ private SerializerFactory _serializerFactory;
+
+ private static final String SERVICE_FILE_PATH = "config-file";
+
+ private static Map<String, HessianSkeleton> registry = new ConcurrentHashMap<String, HessianSkeleton>();
+
+ private static Properties props = new Properties();
+
+ public HessianDispatcher()
+ {
+ }
+
+ public String getServletInfo()
+ {
+ return "Hessian Dispatcher";
+ }
+
+ /**
+ * Sets the serializer factory.
+ */
+ public void setSerializerFactory(SerializerFactory factory)
+ {
+ _serializerFactory = factory;
+ }
+
+ /**
+ * Gets the serializer factory.
+ */
+ public SerializerFactory getSerializerFactory()
+ {
+ if (_serializerFactory == null)
+ _serializerFactory = new SerializerFactory();
+
+ return _serializerFactory;
+ }
+
+ /**
+ * Sets the serializer send collection java type.
+ */
+ public void setSendCollectionType(boolean sendType)
+ {
+ getSerializerFactory().setSendCollectionType(sendType);
+ }
+
+ /**
+ * Initialize the service, including the service object.
+ */
+ public void init(ServletConfig config) throws ServletException
+ {
+ super.init(config);
+
+ try
+ {
+ String serviceConfigFile = getInitParameter(SERVICE_FILE_PATH);
+
+ if (null == serviceConfigFile)
+ {
+ throw new ServletException(
+ "Hessian service registry file path must be set in classpath when using 'HessianDispatcher'");
+ }
+
+ props.load(this.getClass().getClassLoader()
+ .getResourceAsStream(serviceConfigFile));
+ }
+
+ catch (Exception e)
+ {
+ throw new ServletException(e);
+ }
+ }
+
+ private Class<?> loadClass(String className) throws ClassNotFoundException
+ {
+ ClassLoader loader = getContextClassLoader();
+
+ if (loader != null)
+ return Class.forName(className, false, loader);
+ else
+ return Class.forName(className);
+ }
+
+ protected ClassLoader getContextClassLoader()
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+
+ private void init(Object service) throws ServletException
+ {
+ if (!this.getClass().equals(HessianDispatcher.class))
+ {
+ }
+ else if (service instanceof Service)
+ ((Service) service).init(getServletConfig());
+ else if (service instanceof Servlet)
+ ((Servlet) service).init(getServletConfig());
+ }
+
+ /**
+ * Execute a request. The path-info of the request selects the bean. Once
+ * the bean's selected, it will be applied.
+ */
+ public void service(ServletRequest request, ServletResponse response)
+ throws IOException, ServletException
+ {
+ HttpServletRequest req = (HttpServletRequest) request;
+ HttpServletResponse res = (HttpServletResponse) response;
+
+ if (!req.getMethod().equals("POST"))
+ {
+ res.setStatus(500, "Hessian Requires POST");
+ PrintWriter out = res.getWriter();
+
+ res.setContentType("text/html");
+ out.println("<h1>Hessian Requires POST</h1>");
+
+ return;
+ }
+
+ String serviceInterface = req.getHeader("Interface-Name");
+
+ if (null == serviceInterface)
+ {
+ throw new ServletException(
+ "The service interface you reqeust is null. please check the client setting.");
+ }
+
+ try
+ {
+ HessianSkeleton skeleton = findHessianSkeleton(serviceInterface);
+
+ String serviceId = req.getPathInfo();
+
+ String objectId = req.getParameter("id");
+
+ if (objectId == null)
+ objectId = req.getParameter("ejbid");
+
+ ServiceContext.begin(req, serviceId, objectId);
+
+ InputStream is = request.getInputStream();
+
+ OutputStream os = response.getOutputStream();
+
+ response.setContentType("application/x-hessian");
+
+ SerializerFactory serializerFactory = getSerializerFactory();
+
+ invoke(is, os, skeleton, serializerFactory);
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (ServletException e)
+ {
+ throw e;
+ }
+ catch (Throwable e)
+ {
+ throw new ServletException(e);
+ }
+ finally
+ {
+ ServiceContext.end();
+ }
+ }
+
+
+ private HessianSkeleton findHessianSkeleton(String serviceInterface)
+ throws ServletException, ClassNotFoundException,
+ IllegalAccessException, InstantiationException
+ {
+ HessianSkeleton skeleton = null;
+
+ if (registry.containsKey(serviceInterface))// find in cache first
+ {
+ skeleton = registry.get(serviceInterface);
+ }
+ else
+ // parse serviceImpl string to create skeleton.
+ {
+ String serviceImpl = (String) this.props.get(serviceInterface);
+
+ if (null == serviceImpl)
+ {
+ throw new ServletException(
+ "Your request service of "
+ + serviceInterface
+ + " dose not exsit.please check the server configuration.");
+ }
+ if (serviceImpl.startsWith("#"))// for get bean from spring
+ {
+ skeleton = findSpringSkeleton(serviceInterface, serviceImpl);
+ }
+ else
+ {
+ skeleton = findLocalSkeleton(serviceInterface, serviceImpl);
+ }
+
+ }
+
+ registry.put(serviceInterface, skeleton);
+
+ return skeleton;
+ }
+
+
+ private HessianSkeleton findLocalSkeleton(String serviceInterface,
+ String serviceImpl) throws ClassNotFoundException,
+ InstantiationException, IllegalAccessException, ServletException
+ {
+ HessianSkeleton skeleton;
+ Class homeClass = loadClass(serviceImpl);
+
+ Object localBean = homeClass.newInstance();
+
+ init(localBean);
+
+ skeleton = new HessianSkeleton(localBean, loadClass(serviceInterface));
+ return skeleton;
+ }
+
+
+ private HessianSkeleton findSpringSkeleton(String serviceInterface,
+ String serviceImpl) throws ServletException, ClassNotFoundException
+ {
+ HessianSkeleton skeleton;
+ String beanId = serviceImpl.substring(1, serviceImpl.length());
+
+ ApplicationContext wac = WebApplicationContextUtils
+ .getWebApplicationContext(getServletContext());
+
+ Object springBean = wac.getBean(beanId.trim());
+
+ init(springBean);
+
+ skeleton = new HessianSkeleton(springBean, loadClass(serviceInterface));
+
+ return skeleton;
+ }
+
+ protected void invoke(InputStream is, OutputStream os,
+ HessianSkeleton skeleton, SerializerFactory serializerFactory)
+ throws Exception
+ {
+ skeleton.invoke(is, os, serializerFactory);
+ }
+
+ protected Hessian2Input createHessian2Input(InputStream is)
+ {
+ return new Hessian2Input(is);
+ }
+
+ static class LogWriter extends Writer
+ {
+ private Logger _log;
+
+ private StringBuilder _sb = new StringBuilder();
+
+ LogWriter(Logger log)
+ {
+ _log = log;
+ }
+
+ public void write(char ch)
+ {
+ if (ch == '\n' && _sb.length() > 0)
+ {
+ _log.fine(_sb.toString());
+ _sb.setLength(0);
+ }
+ else
+ _sb.append((char) ch);
+ }
+
+ public void write(char[] buffer, int offset, int length)
+ {
+ for (int i = 0; i < length; i++)
+ {
+ char ch = buffer[offset + i];
+
+ if (ch == '\n' && _sb.length() > 0)
+ {
+ _log.fine(_sb.toString());
+ _sb.setLength(0);
+ }
+ else
+ _sb.append((char) ch);
+ }
+ }
+
+ public void flush()
+ {
+ }
+
+ public void close()
+ {
+ }
+ }
+}
diff -Npur hessian-4.0.65-src/com/caucho/hessian/server/HessianServlet.java hessian-4.0.65-fix/com/caucho/hessian/server/HessianServlet.java
--- hessian-4.0.65-src/com/caucho/hessian/server/HessianServlet.java 2020-07-23 12:51:28.000000000 +0800
+++ hessian-4.0.65-fix/com/caucho/hessian/server/HessianServlet.java 2023-08-15 18:39:22.000000000 +0800
@@ -1,477 +1,551 @@
-/*
- * Copyright (c) 2001-2008 Caucho Technology, Inc. All rights reserved.
- *
- * The Apache Software License, Version 1.1
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- * any, must include the following acknowlegement:
- * "This product includes software developed by the
- * Caucho Technology (http://www.caucho.com/)."
- * Alternately, this acknowlegement may appear in the software itself,
- * if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Hessian", "Resin", and "Caucho" must not be used to
- * endorse or promote products derived from this software without prior
- * written permission. For written permission, please contact
- * info@caucho.com.
- *
- * 5. Products derived from this software may not be called "Resin"
- * nor may "Resin" appear in their names without prior written
- * permission of Caucho Technology.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Scott Ferguson
- */
-
-package com.caucho.hessian.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.util.logging.Logger;
-
-import javax.servlet.GenericServlet;
-import javax.servlet.Servlet;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import com.caucho.hessian.io.Hessian2Input;
-import com.caucho.hessian.io.SerializerFactory;
-import com.caucho.services.server.Service;
-import com.caucho.services.server.ServiceContext;
-
-/**
- * Servlet for serving Hessian services.
- *
- * Applications can use ServletContext inside a Hessian service to get
- * ServletRequest, ServletResponse and session information.
- */
-@SuppressWarnings("serial")
-public class HessianServlet extends HttpServlet {
- private Class<?> _homeAPI;
- private Object _homeImpl;
-
- private Class<?> _objectAPI;
- private Object _objectImpl;
-
- private HessianSkeleton _homeSkeleton;
- private HessianSkeleton _objectSkeleton;
-
- private SerializerFactory _serializerFactory;
-
- public HessianServlet()
- {
- }
-
- public String getServletInfo()
- {
- return "Hessian Servlet";
- }
-
- /**
- * Sets the home api.
- */
- public void setHomeAPI(Class<?> api)
- {
- _homeAPI = api;
- }
-
- /**
- * Sets the home implementation
- */
- public void setHome(Object home)
- {
- _homeImpl = home;
- }
-
- /**
- * Sets the object api.
- */
- public void setObjectAPI(Class<?> api)
- {
- _objectAPI = api;
- }
-
- /**
- * Sets the object implementation
- */
- public void setObject(Object object)
- {
- _objectImpl = object;
- }
-
- /**
- * Sets the service class.
- */
- public void setService(Object service)
- {
- setHome(service);
- }
-
- /**
- * Sets the api-class.
- */
- public void setAPIClass(Class<?> api)
- {
- setHomeAPI(api);
- }
-
- /**
- * Gets the api-class.
- */
- public Class<?> getAPIClass()
- {
- return _homeAPI;
- }
-
- /**
- * Sets the serializer factory.
- */
- public void setSerializerFactory(SerializerFactory factory)
- {
- _serializerFactory = factory;
- }
-
- /**
- * Gets the serializer factory.
- */
- public SerializerFactory getSerializerFactory()
- {
- if (_serializerFactory == null)
- _serializerFactory = new SerializerFactory();
-
- return _serializerFactory;
- }
-
- /**
- * Sets the serializer send collection java type.
- */
- public void setSendCollectionType(boolean sendType)
- {
- getSerializerFactory().setSendCollectionType(sendType);
- }
-
- /**
- * Sets whitelist mode for the deserializer
- */
- public void setWhitelist(boolean isWhitelist)
- {
- getSerializerFactory().getClassFactory().setWhitelist(isWhitelist);
- }
-
- /**
- * Adds an allow rule to the deserializer
- *
- * Examples: "java.util.*", "com.foo.io.Bean"
- */
- public void allow(String pattern)
- {
- getSerializerFactory().getClassFactory().allow(pattern);
- }
-
- /**
- * Adds a deny rule to the deserializer
- */
- public void deny(String pattern)
- {
- getSerializerFactory().getClassFactory().deny(pattern);
- }
-
- /**
- * Sets the debugging flag.
- */
- public void setDebug(boolean isDebug)
- {
- }
-
- /**
- * Sets the debugging log name.
- */
- public void setLogName(String name)
- {
- // _log = Logger.getLogger(name);
- }
-
- /**
- * Initialize the service, including the service object.
- */
- public void init(ServletConfig config)
- throws ServletException
- {
- super.init(config);
-
- try {
- if (_homeImpl != null) {
- }
- else if (getInitParameter("home-class") != null) {
- String className = getInitParameter("home-class");
-
- Class<?> homeClass = loadClass(className);
-
- _homeImpl = homeClass.newInstance();
-
- init(_homeImpl);
- }
- else if (getInitParameter("service-class") != null) {
- String className = getInitParameter("service-class");
-
- Class<?> homeClass = loadClass(className);
-
- _homeImpl = homeClass.newInstance();
-
- init(_homeImpl);
- }
- else {
- if (getClass().equals(HessianServlet.class))
- throw new ServletException("server must extend HessianServlet");
-
- _homeImpl = this;
- }
-
- if (_homeAPI != null) {
- }
- else if (getInitParameter("home-api") != null) {
- String className = getInitParameter("home-api");
-
- _homeAPI = loadClass(className);
- }
- else if (getInitParameter("api-class") != null) {
- String className = getInitParameter("api-class");
-
- _homeAPI = loadClass(className);
- }
- else if (_homeImpl != null) {
- _homeAPI = findRemoteAPI(_homeImpl.getClass());
-
- if (_homeAPI == null)
- _homeAPI = _homeImpl.getClass();
-
- _homeAPI = _homeImpl.getClass();
- }
-
- if (_objectImpl != null) {
- }
- else if (getInitParameter("object-class") != null) {
- String className = getInitParameter("object-class");
-
- Class<?> objectClass = loadClass(className);
-
- _objectImpl = objectClass.newInstance();
-
- init(_objectImpl);
- }
-
- if (_objectAPI != null) {
- }
- else if (getInitParameter("object-api") != null) {
- String className = getInitParameter("object-api");
-
- _objectAPI = loadClass(className);
- }
- else if (_objectImpl != null)
- _objectAPI = _objectImpl.getClass();
-
- _homeSkeleton = new HessianSkeleton(_homeImpl, _homeAPI);
-
- if (_objectAPI != null)
- _homeSkeleton.setObjectClass(_objectAPI);
-
- if (_objectImpl != null) {
- _objectSkeleton = new HessianSkeleton(_objectImpl, _objectAPI);
- _objectSkeleton.setHomeClass(_homeAPI);
- }
- else
- _objectSkeleton = _homeSkeleton;
-
- if ("true".equals(getInitParameter("debug"))) {
- }
-
- if ("false".equals(getInitParameter("send-collection-type")))
- setSendCollectionType(false);
- } catch (ServletException e) {
- throw e;
- } catch (Exception e) {
- throw new ServletException(e);
- }
- }
-
- private Class<?> findRemoteAPI(Class<?> implClass)
- {
- // hessian/34d0
- return null;
-
- /*
- if (implClass == null || implClass.equals(GenericService.class))
- return null;
-
- Class []interfaces = implClass.getInterfaces();
-
- if (interfaces.length == 1)
- return interfaces[0];
-
- return findRemoteAPI(implClass.getSuperclass());
- */
- }
-
- private Class<?> loadClass(String className)
- throws ClassNotFoundException
- {
- ClassLoader loader = getContextClassLoader();
-
- if (loader != null)
- return Class.forName(className, false, loader);
- else
- return Class.forName(className);
- }
-
- protected ClassLoader getContextClassLoader()
- {
- return Thread.currentThread().getContextClassLoader();
- }
-
- private void init(Object service)
- throws ServletException
- {
- if (! this.getClass().equals(HessianServlet.class)) {
- }
- else if (service instanceof Service)
- ((Service) service).init(getServletConfig());
- else if (service instanceof Servlet)
- ((Servlet) service).init(getServletConfig());
- }
-
- /**
- * Execute a request. The path-info of the request selects the bean.
- * Once the bean's selected, it will be applied.
- */
- public void service(ServletRequest request, ServletResponse response)
- throws IOException, ServletException
- {
- HttpServletRequest req = (HttpServletRequest) request;
- HttpServletResponse res = (HttpServletResponse) response;
-
- if (! req.getMethod().equals("POST")) {
- res.setStatus(500); // , "Hessian Requires POST");
- PrintWriter out = res.getWriter();
-
- res.setContentType("text/html");
- out.println("<h1>Hessian Requires POST</h1>");
-
- return;
- }
-
- String serviceId = req.getPathInfo();
- String objectId = req.getParameter("id");
- if (objectId == null)
- objectId = req.getParameter("ejbid");
-
- ServiceContext.begin(req, res, serviceId, objectId);
-
- try {
- InputStream is = request.getInputStream();
- OutputStream os = response.getOutputStream();
-
- response.setContentType("x-application/hessian");
-
- SerializerFactory serializerFactory = getSerializerFactory();
-
- invoke(is, os, objectId, serializerFactory);
- } catch (RuntimeException e) {
- throw e;
- } catch (ServletException e) {
- throw e;
- } catch (Throwable e) {
- throw new ServletException(e);
- } finally {
- ServiceContext.end();
- }
- }
-
- protected void invoke(InputStream is, OutputStream os,
- String objectId,
- SerializerFactory serializerFactory)
- throws Exception
- {
- if (objectId != null)
- _objectSkeleton.invoke(is, os, serializerFactory);
- else
- _homeSkeleton.invoke(is, os, serializerFactory);
- }
-
- protected Hessian2Input createHessian2Input(InputStream is)
- {
- return new Hessian2Input(is);
- }
-
- static class LogWriter extends Writer {
- private Logger _log;
- private StringBuilder _sb = new StringBuilder();
-
- LogWriter(Logger log)
- {
- _log = log;
- }
-
- public void write(char ch)
- {
- if (ch == '\n' && _sb.length() > 0) {
- _log.fine(_sb.toString());
- _sb.setLength(0);
- }
- else
- _sb.append((char) ch);
- }
-
- public void write(char []buffer, int offset, int length)
- {
- for (int i = 0; i < length; i++) {
- char ch = buffer[offset + i];
-
- if (ch == '\n' && _sb.length() > 0) {
- _log.fine(_sb.toString());
- _sb.setLength(0);
- }
- else
- _sb.append((char) ch);
- }
- }
-
- public void flush()
- {
- }
-
- public void close()
- {
- }
- }
-}
+/*
+ * Copyright (c) 2001-2008 Caucho Technology, Inc. All rights reserved.
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Caucho Technology (http://www.caucho.com/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Hessian", "Resin", and "Caucho" must not be used to
+ * endorse or promote products derived from this software without prior
+ * written permission. For written permission, please contact
+ * info@caucho.com.
+ *
+ * 5. Products derived from this software may not be called "Resin"
+ * nor may "Resin" appear in their names without prior written
+ * permission of Caucho Technology.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @author Scott Ferguson
+ */
+
+package com.caucho.hessian.server;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.util.logging.Logger;
+
+import javax.servlet.GenericServlet;
+import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.web.context.support.WebApplicationContextUtils;
+
+import com.caucho.hessian.io.Hessian2Input;
+import com.caucho.hessian.io.SerializerFactory;
+import com.caucho.services.server.GenericService;
+import com.caucho.services.server.Service;
+import com.caucho.services.server.ServiceContext;
+
+/**
+ * Servlet for serving Hessian services.
+ *
+ * Applications can use ServletContext inside a Hessian service to get
+ * ServletRequest, ServletResponse and session information.
+ */
+@SuppressWarnings("serial")
+public class HessianServlet extends HttpServlet {
+ private static final long serialVersionUID = 1345616653808440850L;
+ private Logger _log = Logger.getLogger(HessianServlet.class.getName());
+ private Class<?> _homeAPI;
+ private Object _homeImpl;
+
+ private Class<?> _objectAPI;
+ private Object _objectImpl;
+
+ private HessianSkeleton _homeSkeleton;
+ private HessianSkeleton _objectSkeleton;
+
+ private SerializerFactory _serializerFactory;
+ private boolean _isDebug;
+
+ public HessianServlet()
+ {
+ }
+
+ public String getServletInfo()
+ {
+ return "Hessian Servlet";
+ }
+
+ /**
+ * Sets the home api.
+ */
+ public void setHomeAPI(Class<?> api)
+ {
+ _homeAPI = api;
+ }
+
+ /**
+ * Sets the home implementation
+ */
+ public void setHome(Object home)
+ {
+ _homeImpl = home;
+ }
+
+ /**
+ * Sets the object api.
+ */
+ public void setObjectAPI(Class<?> api)
+ {
+ _objectAPI = api;
+ }
+
+ /**
+ * Sets the object implementation
+ */
+ public void setObject(Object object)
+ {
+ _objectImpl = object;
+ }
+
+ /**
+ * Sets the service class.
+ */
+ public void setService(Object service)
+ {
+ setHome(service);
+ }
+
+ /**
+ * Sets the api-class.
+ */
+ public void setAPIClass(Class<?> api)
+ {
+ setHomeAPI(api);
+ }
+
+ /**
+ * Gets the api-class.
+ */
+ public Class<?> getAPIClass()
+ {
+ return _homeAPI;
+ }
+
+ /**
+ * Sets the serializer factory.
+ */
+ public void setSerializerFactory(SerializerFactory factory)
+ {
+ _serializerFactory = factory;
+ }
+
+ /**
+ * Gets the serializer factory.
+ */
+ public SerializerFactory getSerializerFactory()
+ {
+ if (_serializerFactory == null)
+ _serializerFactory = new SerializerFactory();
+
+ return _serializerFactory;
+ }
+
+ /**
+ * Sets the serializer send collection java type.
+ */
+ public void setSendCollectionType(boolean sendType)
+ {
+ getSerializerFactory().setSendCollectionType(sendType);
+ }
+
+ /**
+ * Sets whitelist mode for the deserializer
+ */
+ public void setWhitelist(boolean isWhitelist)
+ {
+ getSerializerFactory().getClassFactory().setWhitelist(isWhitelist);
+ }
+
+ /**
+ * Adds an allow rule to the deserializer
+ *
+ * Examples: "java.util.*", "com.foo.io.Bean"
+ */
+ public void allow(String pattern)
+ {
+ getSerializerFactory().getClassFactory().allow(pattern);
+ }
+
+ /**
+ * Adds a deny rule to the deserializer
+ */
+ public void deny(String pattern)
+ {
+ getSerializerFactory().getClassFactory().deny(pattern);
+ }
+
+ /**
+ * Sets the debugging flag.
+ */
+ public void setDebug(boolean isDebug)
+ {
+ _isDebug = isDebug;
+ }
+
+ /**
+ * Sets the debugging log name.
+ */
+ public void setLogName(String name)
+ {
+ _log = Logger.getLogger(name);
+ }
+
+ /**
+ * Initialize the service, including the service object.
+ */
+ public void init(ServletConfig config) throws ServletException {
+ super.init(config);
+
+ try {
+ String homeClassValue = getInitParameter("home-class");
+
+ if ((homeClassValue != null) & homeClassValue.startsWith("#")) //for get bean from spring
+ {
+ SpringPrepareForSkeleton(config, homeClassValue);
+ } else {
+ LocalPrepareForSkeleton();
+ }
+
+ _homeSkeleton = new HessianSkeleton(_homeImpl, _homeAPI);
+
+ if (_objectAPI != null) {
+ _homeSkeleton.setObjectClass(_objectAPI);
+ }
+
+ if (_objectImpl != null) {
+ _objectSkeleton = new HessianSkeleton(_objectImpl, _objectAPI);
+ _objectSkeleton.setHomeClass(_homeAPI);
+ } else {
+ _objectSkeleton = _homeSkeleton;
+ }
+
+ if ("true".equals(getInitParameter("debug"))) {
+ _isDebug = true;
+ }
+
+ if ("false".equals(getInitParameter("send-collection-type"))) {
+ setSendCollectionType(false);
+ }
+ } catch (ServletException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new ServletException(e);
+ }
+ }
+
+ /**
+ * TODO
+ *
+ * @param config
+ * @param homeClassValue
+ * @throws ServletException
+ */
+ private void SpringPrepareForSkeleton(ServletConfig config,
+ String homeClassValue)
+ throws ClassNotFoundException, InstantiationException,
+ IllegalAccessException, ServletException {
+ if (getInitParameter("home-api") != null) {
+ String className = getInitParameter("home-api");
+ _homeAPI = loadClass(className);
+ }
+
+ String beanID = homeClassValue.substring(1, homeClassValue.length());
+ ApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(config.getServletContext());
+ _homeImpl = wac.getBean(beanID);
+
+ init(_homeImpl);
+ }
+
+ /**
+ * @throws ClassNotFoundException
+ * @throws InstantiationException
+ * @throws IllegalAccessException
+ * @throws ServletException
+ */
+ private void LocalPrepareForSkeleton()
+ throws ClassNotFoundException, InstantiationException,
+ IllegalAccessException, ServletException {
+
+ if (_homeImpl != null) {
+ }
+ else if (getInitParameter("home-class") != null) {
+ String className = getInitParameter("home-class");
+
+ Class<?> homeClass = loadClass(className);
+
+ _homeImpl = homeClass.newInstance();
+
+ init(_homeImpl);
+ }
+ else if (getInitParameter("service-class") != null) {
+ String className = getInitParameter("service-class");
+
+ Class<?> homeClass = loadClass(className);
+
+ _homeImpl = homeClass.newInstance();
+
+ init(_homeImpl);
+ }
+ else {
+ if (getClass().equals(HessianServlet.class))
+ throw new ServletException("server must extend HessianServlet");
+
+ _homeImpl = this;
+ }
+
+ if (_homeAPI != null) {
+ }
+ else if (getInitParameter("home-api") != null) {
+ String className = getInitParameter("home-api");
+
+ _homeAPI = loadClass(className);
+ }
+ else if (getInitParameter("api-class") != null) {
+ String className = getInitParameter("api-class");
+
+ _homeAPI = loadClass(className);
+ }
+ else if (_homeImpl != null) {
+ _homeAPI = findRemoteAPI(_homeImpl.getClass());
+
+ if (_homeAPI == null)
+ _homeAPI = _homeImpl.getClass();
+
+ // _homeAPI = _homeImpl.getClass();
+ }
+
+ if (_objectImpl != null) {
+ }
+ else if (getInitParameter("object-class") != null) {
+ String className = getInitParameter("object-class");
+
+ Class<?> objectClass = loadClass(className);
+
+ _objectImpl = objectClass.newInstance();
+
+ init(_objectImpl);
+ }
+
+ if (_objectAPI != null) {
+ }
+ else if (getInitParameter("object-api") != null) {
+ String className = getInitParameter("object-api");
+
+ _objectAPI = loadClass(className);
+ }
+ else if (_objectImpl != null)
+ _objectAPI = _objectImpl.getClass();
+
+ /* _homeSkeleton = new HessianSkeleton(_homeImpl, _homeAPI);
+
+ if (_objectAPI != null)
+ _homeSkeleton.setObjectClass(_objectAPI);
+
+ if (_objectImpl != null) {
+ _objectSkeleton = new HessianSkeleton(_objectImpl, _objectAPI);
+ _objectSkeleton.setHomeClass(_homeAPI);
+ }
+ else
+ _objectSkeleton = _homeSkeleton;
+
+ if ("true".equals(getInitParameter("debug"))) {
+ }
+
+ if ("false".equals(getInitParameter("send-collection-type")))
+ setSendCollectionType(false);
+ } catch (ServletException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new ServletException(e);
+ }
+ */
+
+ }
+
+ private Class<?> findRemoteAPI(Class<?> implClass)
+ {
+
+ if (implClass == null || implClass.equals(GenericService.class))
+ return null;
+
+ Class []interfaces = implClass.getInterfaces();
+
+ if (interfaces.length == 1)
+ return interfaces[0];
+
+ return findRemoteAPI(implClass.getSuperclass());
+
+ }
+
+ private Class<?> loadClass(String className)
+ throws ClassNotFoundException
+ {
+ ClassLoader loader = getContextClassLoader();
+
+ if (loader != null)
+ return Class.forName(className, false, loader);
+ else
+ return Class.forName(className);
+ }
+
+ protected ClassLoader getContextClassLoader()
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+
+ private void init(Object service)
+ throws ServletException
+ {
+ if (! this.getClass().equals(HessianServlet.class)) {
+ }
+ else if (service instanceof Service)
+ ((Service) service).init(getServletConfig());
+ else if (service instanceof Servlet)
+ ((Servlet) service).init(getServletConfig());
+ }
+
+ /**
+ * Execute a request. The path-info of the request selects the bean.
+ * Once the bean's selected, it will be applied.
+ */
+ public void service(ServletRequest request, ServletResponse response)
+ throws IOException, ServletException
+ {
+ HttpServletRequest req = (HttpServletRequest) request;
+ HttpServletResponse res = (HttpServletResponse) response;
+
+ if (! req.getMethod().equals("POST")) {
+ res.setStatus(500); // , "Hessian Requires POST");
+ PrintWriter out = res.getWriter();
+
+ res.setContentType("text/html");
+ out.println("<h1>Hessian Requires POST</h1>");
+
+ return;
+ }
+
+ String serviceId = req.getPathInfo();
+ String objectId = req.getParameter("id");
+ if (objectId == null)
+ objectId = req.getParameter("ejbid");
+
+ ServiceContext.begin(req, res, serviceId, objectId);
+
+ try {
+ InputStream is = request.getInputStream();
+ OutputStream os = response.getOutputStream();
+
+ response.setContentType("x-application/hessian");
+
+ SerializerFactory serializerFactory = getSerializerFactory();
+
+ invoke(is, os, objectId, serializerFactory);
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (ServletException e) {
+ throw e;
+ } catch (Throwable e) {
+ throw new ServletException(e);
+ } finally {
+ ServiceContext.end();
+ }
+ }
+
+ protected void invoke(InputStream is, OutputStream os,
+ String objectId,
+ SerializerFactory serializerFactory)
+ throws Exception
+ {
+ if (objectId != null)
+ _objectSkeleton.invoke(is, os, serializerFactory);
+ else
+ _homeSkeleton.invoke(is, os, serializerFactory);
+ }
+
+ protected Hessian2Input createHessian2Input(InputStream is)
+ {
+ return new Hessian2Input(is);
+ }
+
+ static class LogWriter extends Writer {
+ private Logger _log;
+ private StringBuilder _sb = new StringBuilder();
+
+ LogWriter(Logger log)
+ {
+ _log = log;
+ }
+
+ public void write(char ch)
+ {
+ if (ch == '\n' && _sb.length() > 0) {
+ _log.fine(_sb.toString());
+ _sb.setLength(0);
+ }
+ else
+ _sb.append((char) ch);
+ }
+
+ public void write(char []buffer, int offset, int length)
+ {
+ for (int i = 0; i < length; i++) {
+ char ch = buffer[offset + i];
+
+ if (ch == '\n' && _sb.length() > 0) {
+ _log.fine(_sb.toString());
+ _sb.setLength(0);
+ }
+ else
+ _sb.append((char) ch);
+ }
+ }
+
+ public void flush()
+ {
+ }
+
+ public void close()
+ {
+ }
+ }
+}
diff -Npur hessian-4.0.65-src/com/caucho/services/server/ServiceContext.java hessian-4.0.65-fix/com/caucho/services/server/ServiceContext.java
--- hessian-4.0.65-src/com/caucho/services/server/ServiceContext.java 2020-07-23 12:51:28.000000000 +0800
+++ hessian-4.0.65-fix/com/caucho/services/server/ServiceContext.java 2023-08-15 18:39:24.000000000 +0800
@@ -1,259 +1,274 @@
-/*
- * Copyright (c) 2001-2008 Caucho Technology, Inc. All rights reserved.
- *
- * The Apache Software License, Version 1.1
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- * any, must include the following acknowlegement:
- * "This product includes software developed by the
- * Caucho Technology (http://www.caucho.com/)."
- * Alternately, this acknowlegement may appear in the software itself,
- * if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "Hessian", "Resin", and "Caucho" must not be used to
- * endorse or promote products derived from this software without prior
- * written permission. For written permission, please contact
- * info@caucho.com.
- *
- * 5. Products derived from this software may not be called "Resin"
- * nor may "Resin" appear in their names without prior written
- * permission of Caucho Technology.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Scott Ferguson
- */
-
-package com.caucho.services.server;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-import java.util.HashMap;
-
-/**
- * Context for a service, to handle request-specific information.
- *
- * Applications can use the ServiceContext to get servlet session ids or
- * HTTP headers.
- *
- * <code><pre>
- * ServletRequest req = ServiceContext.getContext().getRequest();
- * </pre></code>
- */
-public class ServiceContext {
- private static final ThreadLocal<ServiceContext> _localContext
- = new ThreadLocal<ServiceContext>();
-
- private ServletRequest _request;
- private ServletResponse _response;
- private String _serviceName;
- private String _objectId;
- private int _count;
- private HashMap _headers = new HashMap();
-
- private ServiceContext()
- {
- }
-
- /**
- * Sets the request object prior to calling the service's method.
- *
- * @param request the calling servlet request
- * @param serviceId the service identifier
- * @param objectId the object identifier
- */
- public static void begin(ServletRequest request,
- ServletResponse response,
- String serviceName,
- String objectId)
- throws ServletException
- {
- ServiceContext context = (ServiceContext) _localContext.get();
-
- if (context == null) {
- context = new ServiceContext();
- _localContext.set(context);
- }
-
- context._request = request;
- context._response = response;
- context._serviceName = serviceName;
- context._objectId = objectId;
- context._count++;
- }
-
- /**
- * Returns the service request.
- */
- public static ServiceContext getContext()
- {
- return (ServiceContext) _localContext.get();
- }
-
- /**
- * Adds a header.
- */
- public void addHeader(String header, Object value)
- {
- _headers.put(header, value);
- }
-
- /**
- * Gets a header.
- */
- public Object getHeader(String header)
- {
- return _headers.get(header);
- }
-
- /**
- * Gets a header from the context.
- */
- public static Object getContextHeader(String header)
- {
- ServiceContext context = (ServiceContext) _localContext.get();
-
- if (context != null)
- return context.getHeader(header);
- else
- return null;
- }
-
- /**
- * Returns the service request.
- */
- public static ServletRequest getContextRequest()
- {
- ServiceContext context = (ServiceContext) _localContext.get();
-
- if (context != null)
- return context._request;
- else
- return null;
- }
-
- /**
- * Returns the service request.
- */
- public static ServletResponse getContextResponse()
- {
- ServiceContext context = (ServiceContext) _localContext.get();
-
- if (context != null)
- return context._response;
- else
- return null;
- }
-
- /**
- * Returns the service id, corresponding to the pathInfo of the URL.
- */
- public static String getContextServiceName()
- {
- ServiceContext context = (ServiceContext) _localContext.get();
-
- if (context != null)
- return context._serviceName;
- else
- return null;
- }
-
- /**
- * Returns the object id, corresponding to the ?id= of the URL.
- */
- public static String getContextObjectId()
- {
- ServiceContext context = (ServiceContext) _localContext.get();
-
- if (context != null)
- return context._objectId;
- else
- return null;
- }
-
- /**
- * Cleanup at the end of a request.
- */
- public static void end()
- {
- ServiceContext context = (ServiceContext) _localContext.get();
-
- if (context != null && --context._count == 0) {
- context._request = null;
- context._response = null;
-
- context._headers.clear();
-
- _localContext.set(null);
- }
- }
-
- /**
- * Returns the service request.
- *
- * @deprecated
- */
- public static ServletRequest getRequest()
- {
- ServiceContext context = (ServiceContext) _localContext.get();
-
- if (context != null)
- return context._request;
- else
- return null;
- }
-
- /**
- * Returns the service id, corresponding to the pathInfo of the URL.
- *
- * @deprecated
- */
- public static String getServiceName()
- {
- ServiceContext context = (ServiceContext) _localContext.get();
-
- if (context != null)
- return context._serviceName;
- else
- return null;
- }
-
- /**
- * Returns the object id, corresponding to the ?id= of the URL.
- *
- * @deprecated
- */
- public static String getObjectId()
- {
- ServiceContext context = (ServiceContext) _localContext.get();
-
- if (context != null)
- return context._objectId;
- else
- return null;
- }
-}
+/*
+ * Copyright (c) 2001-2008 Caucho Technology, Inc. All rights reserved.
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Caucho Technology (http://www.caucho.com/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Hessian", "Resin", and "Caucho" must not be used to
+ * endorse or promote products derived from this software without prior
+ * written permission. For written permission, please contact
+ * info@caucho.com.
+ *
+ * 5. Products derived from this software may not be called "Resin"
+ * nor may "Resin" appear in their names without prior written
+ * permission of Caucho Technology.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @author Scott Ferguson
+ */
+
+package com.caucho.services.server;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import java.util.HashMap;
+
+/**
+ * Context for a service, to handle request-specific information.
+ *
+ * Applications can use the ServiceContext to get servlet session ids or
+ * HTTP headers.
+ *
+ * <code><pre>
+ * ServletRequest req = ServiceContext.getContext().getRequest();
+ * </pre></code>
+ */
+public class ServiceContext {
+ private static final ThreadLocal<ServiceContext> _localContext
+ = new ThreadLocal<ServiceContext>();
+
+ private ServletRequest _request;
+ private ServletResponse _response;
+ private String _serviceName;
+ private String _objectId;
+ private int _count;
+ private HashMap _headers = new HashMap();
+
+ private ServiceContext()
+ {
+ }
+
+ /**
+ * Sets the request object prior to calling the service's method.
+ *
+ * @param request the calling servlet request
+ * @param serviceId the service identifier
+ * @param objectId the object identifier
+ */
+ public static void begin(ServletRequest request,
+ ServletResponse response,
+ String serviceName,
+ String objectId)
+ throws ServletException
+ {
+ ServiceContext context = (ServiceContext) _localContext.get();
+
+ if (context == null) {
+ context = new ServiceContext();
+ _localContext.set(context);
+ }
+
+ context._request = request;
+ context._response = response;
+ context._serviceName = serviceName;
+ context._objectId = objectId;
+ context._count++;
+ }
+
+ public static void begin(ServletRequest request, String serviceName,
+ String objectId) throws ServletException {
+ ServiceContext context = (ServiceContext) _localContext.get();
+
+ if (context == null) {
+ context = new ServiceContext();
+ _localContext.set(context);
+ }
+
+ context._request = request;
+ context._serviceName = serviceName;
+ context._objectId = objectId;
+ context._count++;
+ }
+
+ /**
+ * Returns the service request.
+ */
+ public static ServiceContext getContext()
+ {
+ return (ServiceContext) _localContext.get();
+ }
+
+ /**
+ * Adds a header.
+ */
+ public void addHeader(String header, Object value)
+ {
+ _headers.put(header, value);
+ }
+
+ /**
+ * Gets a header.
+ */
+ public Object getHeader(String header)
+ {
+ return _headers.get(header);
+ }
+
+ /**
+ * Gets a header from the context.
+ */
+ public static Object getContextHeader(String header)
+ {
+ ServiceContext context = (ServiceContext) _localContext.get();
+
+ if (context != null)
+ return context.getHeader(header);
+ else
+ return null;
+ }
+
+ /**
+ * Returns the service request.
+ */
+ public static ServletRequest getContextRequest()
+ {
+ ServiceContext context = (ServiceContext) _localContext.get();
+
+ if (context != null)
+ return context._request;
+ else
+ return null;
+ }
+
+ /**
+ * Returns the service request.
+ */
+ public static ServletResponse getContextResponse()
+ {
+ ServiceContext context = (ServiceContext) _localContext.get();
+
+ if (context != null)
+ return context._response;
+ else
+ return null;
+ }
+
+ /**
+ * Returns the service id, corresponding to the pathInfo of the URL.
+ */
+ public static String getContextServiceName()
+ {
+ ServiceContext context = (ServiceContext) _localContext.get();
+
+ if (context != null)
+ return context._serviceName;
+ else
+ return null;
+ }
+
+ /**
+ * Returns the object id, corresponding to the ?id= of the URL.
+ */
+ public static String getContextObjectId()
+ {
+ ServiceContext context = (ServiceContext) _localContext.get();
+
+ if (context != null)
+ return context._objectId;
+ else
+ return null;
+ }
+
+ /**
+ * Cleanup at the end of a request.
+ */
+ public static void end()
+ {
+ ServiceContext context = (ServiceContext) _localContext.get();
+
+ if (context != null && --context._count == 0) {
+ context._request = null;
+ context._response = null;
+
+ context._headers.clear();
+
+ _localContext.set(null);
+ }
+ }
+
+ /**
+ * Returns the service request.
+ *
+ * @deprecated
+ */
+ public static ServletRequest getRequest()
+ {
+ ServiceContext context = (ServiceContext) _localContext.get();
+
+ if (context != null)
+ return context._request;
+ else
+ return null;
+ }
+
+ /**
+ * Returns the service id, corresponding to the pathInfo of the URL.
+ *
+ * @deprecated
+ */
+ public static String getServiceName()
+ {
+ ServiceContext context = (ServiceContext) _localContext.get();
+
+ if (context != null)
+ return context._serviceName;
+ else
+ return null;
+ }
+
+ /**
+ * Returns the object id, corresponding to the ?id= of the URL.
+ *
+ * @deprecated
+ */
+ public static String getObjectId()
+ {
+ ServiceContext context = (ServiceContext) _localContext.get();
+
+ if (context != null)
+ return context._objectId;
+ else
+ return null;
+ }
+}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化