From 9e4ff028b27263e7d9b89cc717480d73623efd42 Mon Sep 17 00:00:00 2001 From: Christoph Rueger Date: Sat, 11 May 2024 12:48:51 +0200 Subject: [PATCH 1/7] set resolution loglevel based on -resolvedebug previously resolving used the ResolverLogger() default constructor. This commit checks if -resolvedebug instruction has been set e.g. in a .bndrun file and if yes it uses the value from it and initializes the ResolveLogger with it. also we now print the resolvedebug log to the resolutionFailurePanel. This also shows the logfile location on disk if the log is too large for display. Signed-off-by: Christoph Rueger --- .../src/biz/aQute/resolve/ResolverLogger.java | 25 +++++++++++++++++++ .../src/biz/aQute/resolve/RunResolution.java | 2 +- .../core/resolve/ResolveOperation.java | 8 +++--- .../resolve/ui/ResolutionFailurePanel.java | 1 + 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/biz.aQute.resolve/src/biz/aQute/resolve/ResolverLogger.java b/biz.aQute.resolve/src/biz/aQute/resolve/ResolverLogger.java index 6cef957b67..5f33475f5e 100644 --- a/biz.aQute.resolve/src/biz/aQute/resolve/ResolverLogger.java +++ b/biz.aQute.resolve/src/biz/aQute/resolve/ResolverLogger.java @@ -11,6 +11,10 @@ import org.osgi.framework.ServiceReference; import org.osgi.service.log.LogService; +import aQute.bnd.exceptions.Exceptions; +import aQute.bnd.osgi.Constants; +import aQute.bnd.osgi.Processor; +import aQute.lib.converter.Converter; import aQute.lib.io.IO; public class ResolverLogger implements LogService, AutoCloseable { @@ -106,6 +110,9 @@ public String getLog() { } else { StringBuilder sb = new StringBuilder(10000); + sb.append("Log level:") + .append(getLogLevel()) + .append(" "); sb.append("Log too large. Split from ") .append(file.getAbsolutePath()) .append("\nsize ") @@ -162,4 +169,22 @@ public void log(ServiceReference sr, int level, String message) { public void log(ServiceReference sr, int level, String message, Throwable exception) { log(level, message, exception); } + + public static ResolverLogger newLogger(Processor processor) { + if (processor == null) { + return new ResolverLogger(); + } + + try { + Integer level = Converter.cnv(Integer.class, + processor.getProperty(Constants.RESOLVEDEBUG, Integer.toString(DEFAULT_LEVEL))); + if (level != null) { + return new ResolverLogger(level); + } + return new ResolverLogger(); + } catch (Exception e) { + throw Exceptions.duck(e); + } + + } } diff --git a/biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java b/biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java index 9a24e7e31c..4abc24b4e7 100644 --- a/biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java +++ b/biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java @@ -98,7 +98,7 @@ public static RunResolution resolve(Project project, Processor actualProperties, Collection callbacks, ResolverLogger resolverLogger) { if (callbacks == null) callbacks = Collections.emptyList(); - ResolverLogger logger = resolverLogger == null ? new ResolverLogger() : resolverLogger; + ResolverLogger logger = resolverLogger == null ? ResolverLogger.newLogger(actualProperties) : resolverLogger; try { try { ResolveProcess resolve = new ResolveProcess(); diff --git a/bndtools.core/src/org/bndtools/core/resolve/ResolveOperation.java b/bndtools.core/src/org/bndtools/core/resolve/ResolveOperation.java index c4744ebdbe..f255978980 100644 --- a/bndtools.core/src/org/bndtools/core/resolve/ResolveOperation.java +++ b/bndtools.core/src/org/bndtools/core/resolve/ResolveOperation.java @@ -50,13 +50,14 @@ public void run(IProgressMonitor monitor) { try { coordinate(() -> { - logger = new ResolverLogger(); + Project run = model.getOwner(Project.class) + .orElse(null); + + logger = ResolverLogger.newLogger(run); List operationCallbacks = new ArrayList<>(callbacks.size() + 1); operationCallbacks.addAll(callbacks); operationCallbacks.add(new ResolutionProgressCallback(monitor)); - Project run = model.getOwner(Project.class) - .orElse(null); RunResolution resolution = RunResolution.resolve(run, model.getProperties(), @@ -115,4 +116,5 @@ private void coordinate(RunnableWithException inCoordination) throws Exception { } } + } diff --git a/bndtools.core/src/org/bndtools/core/resolve/ui/ResolutionFailurePanel.java b/bndtools.core/src/org/bndtools/core/resolve/ui/ResolutionFailurePanel.java index 564d70e073..ade1184389 100644 --- a/bndtools.core/src/org/bndtools/core/resolve/ui/ResolutionFailurePanel.java +++ b/bndtools.core/src/org/bndtools/core/resolve/ui/ResolutionFailurePanel.java @@ -137,6 +137,7 @@ else if (composite.isDisposed()) // kind of silly // String diagnostic = ResolveProcess.format(resolutionException, false); + diagnostic += "\n\nresolvedebug log: " + resolutionResult.getLog(); processingErrorsText.setText(diagnostic); sectUnresolved.setExpanded(true); From cd0ea42c49f96d7309c9cb225c85514617c35250 Mon Sep 17 00:00:00 2001 From: Christoph Rueger Date: Sat, 11 May 2024 12:50:16 +0200 Subject: [PATCH 2/7] fix unrelated typo Signed-off-by: Christoph Rueger --- .../src/biz/aQute/resolve/BndrunResolveContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/biz.aQute.resolve/src/biz/aQute/resolve/BndrunResolveContext.java b/biz.aQute.resolve/src/biz/aQute/resolve/BndrunResolveContext.java index ab26577420..d9d33566e1 100644 --- a/biz.aQute.resolve/src/biz/aQute/resolve/BndrunResolveContext.java +++ b/biz.aQute.resolve/src/biz/aQute/resolve/BndrunResolveContext.java @@ -265,7 +265,7 @@ void loadFramework(ResourceBuilder system) throws Exception { String version = bsn.getValue() .getVersion(); - log.log(LogService.LOG_INFO, "Using frameowork " + name + ";" + version); + log.log(LogService.LOG_INFO, "Using framework " + name + ";" + version); if ("none".equals(name)) return; From 53a0eae75ad764c1dce9e8385f74ba4b5d5047da Mon Sep 17 00:00:00 2001 From: Christoph Rueger Date: Sat, 11 May 2024 22:23:50 +0200 Subject: [PATCH 3/7] implement logUsesConstraintViolation the default impl in the inherited base class is empty. Thus nothing was logged. Overriding this impl and actually logging something here now. Signed-off-by: Christoph Rueger --- .../src/biz/aQute/resolve/InternalResolverLogger.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/biz.aQute.resolve/src/biz/aQute/resolve/InternalResolverLogger.java b/biz.aQute.resolve/src/biz/aQute/resolve/InternalResolverLogger.java index 5e90b66333..943a5b1edf 100644 --- a/biz.aQute.resolve/src/biz/aQute/resolve/InternalResolverLogger.java +++ b/biz.aQute.resolve/src/biz/aQute/resolve/InternalResolverLogger.java @@ -1,6 +1,8 @@ package biz.aQute.resolve; import org.apache.felix.resolver.Logger; +import org.apache.felix.resolver.ResolutionError; +import org.osgi.resource.Resource; class InternalResolverLogger extends Logger { @@ -15,4 +17,10 @@ public InternalResolverLogger(ResolverLogger logger) { protected void doLog(int level, String msg, Throwable throwable) { logger.log(level, msg, throwable); } + + @Override + public void logUsesConstraintViolation(Resource resource, ResolutionError error) { + logger.log(logger.getLogLevel(), String.format("Resource: %s, ResolutionError: %s", resource, error), + error.toException()); + } } From e31fd29b33e4fef2d17067d5ee2869cb40909468 Mon Sep 17 00:00:00 2001 From: Christoph Rueger Date: Sun, 12 May 2024 23:34:40 +0200 Subject: [PATCH 4/7] add testcase triggering Uses constraint violation Signed-off-by: Christoph Rueger --- .../test/biz/aQute/resolve/ResolveTest.java | 29 +++ .../repo-usesconstrainterror/BundleA.jar | Bin 0 -> 3514 bytes .../repo-usesconstrainterror/BundleA2.jar | Bin 0 -> 2910 bytes .../repo-usesconstrainterror/BundleB.jar | Bin 0 -> 2591 bytes .../repo-usesconstrainterror/BundleC.jar | Bin 0 -> 2739 bytes .../repo-usesconstrainterror/index.xml | 165 ++++++++++++++++++ .../repo-usesconstrainterror/run.bndrun | 7 + 7 files changed, 201 insertions(+) create mode 100644 biz.aQute.resolve/testdata/repo-usesconstrainterror/BundleA.jar create mode 100644 biz.aQute.resolve/testdata/repo-usesconstrainterror/BundleA2.jar create mode 100644 biz.aQute.resolve/testdata/repo-usesconstrainterror/BundleB.jar create mode 100644 biz.aQute.resolve/testdata/repo-usesconstrainterror/BundleC.jar create mode 100644 biz.aQute.resolve/testdata/repo-usesconstrainterror/index.xml create mode 100644 biz.aQute.resolve/testdata/repo-usesconstrainterror/run.bndrun diff --git a/biz.aQute.resolve/test/biz/aQute/resolve/ResolveTest.java b/biz.aQute.resolve/test/biz/aQute/resolve/ResolveTest.java index fe63a8b3ec..3b62536f33 100644 --- a/biz.aQute.resolve/test/biz/aQute/resolve/ResolveTest.java +++ b/biz.aQute.resolve/test/biz/aQute/resolve/ResolveTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -765,4 +766,32 @@ public void testDot() throws Exception { } } + /** + * This test triggers a Uses constraint violation. And we want to check that + * it gets logged via + * {@link InternalResolverLogger#logUsesConstraintViolation(Resource, org.apache.felix.resolver.ResolutionError)} + */ + @Test + public void testResolveUsesConstraintErrorLogging() throws Exception { + File f = IO.getFile("testdata/repo-usesconstrainterror/run.bndrun"); + + try (Run run = Run.createRun(null, f)) { + + RunResolution resolution = RunResolution.resolve(run, null); + assertFalse(resolution.isOK()); + assertNotNull(resolution.exception); + System.out.println(resolution.exception); + assertTrue(resolution.exception.getMessage() + .contains( + "Uses constraint violation. Unable to resolve resource BundleC [BundleC version=1.0.0.SNAPSHOT] " + + "because it is exposed to package 'com.example.util.internal' from resources " + + "BundleA2 [BundleA2 version=1.0.0.SNAPSHOT] and " + + "BundleA [BundleA version=1.0.0.SNAPSHOT] via two dependency chains."), + resolution.exception.getMessage()); + + // Log level set via -resolvedebug: 1 in run.bndrun + assertTrue(resolution.log.startsWith("Log level:1")); + } + } + } diff --git a/biz.aQute.resolve/testdata/repo-usesconstrainterror/BundleA.jar b/biz.aQute.resolve/testdata/repo-usesconstrainterror/BundleA.jar new file mode 100644 index 0000000000000000000000000000000000000000..febf516f745b7cb3a622d603cd961bffd2047ba4 GIT binary patch literal 3514 zcmWIWW@Zs#;Nak3P+Yzyf&mF|GO#fCx`sIFdiuHP|2xINz|0Wf&CUT*!30$nfK#&w zPz7AGucM!*n`>~0p08VNU~Kjw1Cd((FZNUHdc<-vvX@4DbX>Zj_vb;arZ<|~!gof` zD#_LQ^e(kw1fSdaT-iKWt$=%LQFy>r4cDAsSBy_YJbA~x`fA9t9j+%#Wq$6B zlW29k{`q&+0zpgm@~Vm3UoBXgwx;2RO}v}#EV=I9Co}G*hbt6C9!=XdPxWQdU+(?W zF00S&6?^%(CUb%(tB>QmzW(KHvtG?En^dTiZQ#CBN7Sq}dBT%`Q(il{r`2wld+uzC zt z(EA6wd+PcJgy@qJXS~Q7i;I#;(kzIsIXORVvrbt$sqB8@KJ(e$f6G#0jdRlLI)o)RZOM%Lmsa{(9F#c1doPBT10A~* zh;b(lb%Nf>%qvMP%1gu_O3YJHL&=DEV?9!H3Q~)}p_O}XBiA7Z9<~R2{RQWgSeEGJ z@x5!R-qR-Jv))~AZPS;#Yu`@Qn(@*9ld9lf*=(l!W_|N+xF}wi?0%fEgmI}(*NwX^ zwiO4bJn#|nd>DElB5vPYYlUyP6Cm4Jzg-c8Cm>y~uhW?azE-v-=HD-1csGXa$ zX^pDj$3VY3LhWbxIrOG1%IbDLQCqgvbmhsMEMJlTUBXWvu>S}=m6Nkjqqt)I?&b0O z-);XsJ)EIB;(MTCj>^r54|8SwO}bZxM#WeJe7o1~p3(PYtw_|YkU2+{{d5-YTivti zcT3iCYn2N2o2u+9lI&b~OP!R1+WeP4p7FU@GFxrSBAtm<8pWYcQZH`4{;F+*Ub>X)(}%qd$vit2NKIcP-C5{Z(wJyJg_BP*DyZvMq@9?W z-X8}0Qx?Hlq9%otPR^}OE(DTNJc2E*zxZ|;`b5@p))gEVl3`(M?MIA z7-L|V)W|qj!G6K^D}q;ETZi9eEOusEeB9~O(HRRa{Mwh>&iMV;ah92F+B=RP4rW># z^;+OXdR>3&1XYc)2!m()!Y$Xxhs?Sh?jxXc%R|w3LUv()tY2HKSj^>h30?=wSH8H= zu-Z;;ne@fqVkROvPbN;3ddNGytt{$)>m;_dcHFb$1--7`idS6ok>6+MFX=^1k#f7e z9l~zUXVJ5Mek!p{D=ge3=XA@gKNX#UhEF}++1l=~EPL}UB~&|h!@NZMQR zeX^+Y(R1NG<<+}<-|kPSoVUnTq?*e?P&Lwb%0{8d<;jkJIlmp2x$g1AXHAlBnv80Z zG2dE_8B^unN}l|xp?c7*<<1`#P%21HK2@6mOaYbPs+f^UgaNe?1#2OJ8d0bK-YNn$ zsRF!FwIbK>pe7Uo*aDewtw;?jbQ3^25SAnKGcfD`Iv3t9z^4t=4nTm9$l5@y0(@FQ z#S;SP0UZLj5u_DV@Zi%9Y6BoZJ~r*Jf)AfDpfU~tcHlDxTz(>(1*-p%t5Q(?j{t1U zSbPL?64)$QQ3`4eAe#$oUBluAR1qV~0p08W!gtK{v3bTg+`3i8LMFJh@~zIJBI0@;Ndiln~& z_MByNG_$7ef~Mlcv+F)aTkVT1USaTAZ~DhrJ-@4A-dg`RUSH9YXSDvtna@dEe=fcM z`eyK%$=JE*>@$jwR{r(CKmIm z>#^XfD5dv2o_?ni7CZ3qi(gtHUU>S|&U4;h&3`enKM=Zduk_x>)r;9~ie%lGq>}9Y zqRd~WaEEec{TVmg{|EPHEe@B~{dC}eqD!Vg#38Tj%<{zYdGlu4@I6*};~r>H;d7%l zMZ!u~HG9unskJOxk)FQpC z#InTR^9Q*O8St<@_&rbQ%MuRfy?ps{d${ibt9%KneEtV@9JjK%eH~O|UFL6{MyX9;hC2 z5(p@%g6xCoB{@w#IPTrc$Hi1f2_PK^%Mtn+80G+-3$J_dX#>?Y z2yhiy8>r^Nrxlca5kLs&5V(yXt)QHZPdlidL4aUv+F=C)K4U<&3GeD&^awY_o)(GIiilrKXn}b|- U2Y9oxf%NeK;a*@wbhCqa0L%d*o&W#< literal 0 HcmV?d00001 diff --git a/biz.aQute.resolve/testdata/repo-usesconstrainterror/BundleB.jar b/biz.aQute.resolve/testdata/repo-usesconstrainterror/BundleB.jar new file mode 100644 index 0000000000000000000000000000000000000000..96ed07c52716e08303079ecbc04e7a4b1c4b89db GIT binary patch literal 2591 zcmWIWW@Zs#;Nak3a9qA7f&mF|GO#fCx`sIFdiuHP|2xINz|0Wf&CUT*!30$nfK#&w zPz7AGucM!*n`>~0p08W!#Q5w(1|moAGyml~+J4a~`qsLon;$iIZRmZOBIuu8Z>Qd;0Yi6U$_+?cGmHV$Mw8 z|Al*wbUat%F>o=b8 zd3dcMPTgRS!k1G@`X6pCVybt^-sRMHYmb+iG!H{n_7gRg_vLe>pD+0;&l_r3Hh2CF zjpA5gv+0v&-rpeY(=9uRUx4;{FegAmB*ZIT?3iw?sx9>G)WMKFU#JB^V6BzLR z!S0^A{sAHSq{J96vc}?~WRf%sqH9jh&n3wKNo)qBRwU*YVl5;Xs^GcHN z8n|;JYBn$=#=y|x)X$AJgwi0yDo%w8?bNK@$%f(FASG6 zbq=24pW73)q`t6!Kch9``)!3t zGxsyhlUYxzslE^vyL8a|;IgLojcyW}u4boi#yj5?`4`yfp!b_aPX71Syj$}>Zc=ev z?kpyo{^`)Zb-UiUyS?ZOIGDKpg7B&DzMku|YMDXlsIlPrjTt~sy#!+1>4*g=OKK$Y zK=qIlZ=eDLWFJf~F;S(6R${5*FatSul5-M^i(7+k=UsLXu)V!(NP47LCe$ZJdu#^A6Vu8(ltc_xc-qxFoEsN9A z_W%F!i}!%BjoF4H8(zCBx7UAi+xVnUpOydW0ZX~h$*M~NCa-H`a(;T|_Y2EQ-0kOP zAC&wq>ilsfM{Cu&4R^A>OLFNiYKV?-J9&(&izhX_&Ag;jc4s|d{;|8 z>Tb4eqw|@?Q>1Pd8E@~Hv%Qle)L-?EbSY0v>WxT`kS8)_!HUfDX6!hYP+PwQ|wU%ZC{Gc<-d&*s&y0+I`ku!R*OAp5D(lr>xlhf0nWC(O0gS zk3LU#(%-yk!v^Kp7O7>1&h_3)E*@TRdBJSwNfTpk&Oi8P&Q4vc?qcPzms^VO9uu9! zlf8e^{lyL+58SgnrEa`tcYJ`Y``aZ^^B?{?D6%{F&a6lGM1Jp|c-=^f&F9x_ja1QX z&owGpg-aKGRZ#wBaJu@7FesVZoWIfk09aINGlP;jBa;XNYBdL|!$8#>DuCBpph^#2 zD{?6eO0x)H3uMBzB2{_lCV+GxEJx^PVAuw9F1+l#e(+2LS(g?5(pE0n40NFTD8I4?wfy!tEU5s3b%HBcK7uWg9-bP}5W%nogMOkxc-Vg2;&- fR0<-%CLAUp`yX5;26(fwfwb`ep$gE8Pr*C@My>BN literal 0 HcmV?d00001 diff --git a/biz.aQute.resolve/testdata/repo-usesconstrainterror/BundleC.jar b/biz.aQute.resolve/testdata/repo-usesconstrainterror/BundleC.jar new file mode 100644 index 0000000000000000000000000000000000000000..bdec813c6f2c8caad6986880b5047f5c76608ca2 GIT binary patch literal 2739 zcmWIWW@Zs#;Nak3a9qA7f&mF|GO#fCx`sIFdiuHP|2xINz|0Wf&CUT*!30$nfK#&w zPz7AGucM!*n`>~0p08VO;Ki&%1|qfmPvpJi-MF`H*}87?qvoy+y)RQl9lwd(UVTT` zcbCc3pWnTgU*;6@*zx?%VaxAn$5`?fUc1K?(i^lS>;?Oj9@mF^H$!Y531XS-zk zjx*iQOkQ`>@$0Ip!mK{d4}1A@ot(ewrq3!~leNLEb&ZMHQty+&k)BKUvYxiTdG5!v zOtdFfn!z4*ccmfd2lYmac)-I(`NqhCKg z$^E3$!+R}z-sWv;x?riA|KaKaru;)%+Z_9D`KY{>{l(C%Ta-MLFZcO5%f!R!$rF5I zpXGOEPmZODdi9vJ%S@OZzwa9d_Vp`)<=ZRa5ZN)-^6Vy39Ot z7reP{ZN9PKo!>@&sfGKj9ruPM9cb45x!wM^|Fzm1atDuId~mX_^P+_s&#PUl78xG( z{NEATdA81TN%8mh46H{rBh1d9;9Sl+^;6@?#$;`#>Vr);4wbWdi~Ka6#O^=o#yS0m z60^6x*k70^=~(Nu^~j|wyI;KYc=1qHeWApIdutZ1D7}3!i#4B_bH~9pIo1*ffvsH) z%Uk@WpFPYoTgFB?CvWhGAj_22^G+nf_tPk|v+gEvvK09BBhB6y&B$VmjC0tjRuOfNCj;EG)UFO-H zQhx2k`Ah5uW*^yqEbb|9yrE@!?(kmY@@Mmk-_QL0`1$tt4D%BG5Az(J^|)O3-^q91 zRJO}#?pQAK+TcmMm&d|irM#SNXFC60+_vOx>6-0th2LqkJqdou`E^d>wwO#ql~?;t zm!46|P2lrvJKFZ)$LtlipB=2;t!wGL?VL<7Apsyx%3J>1CWb&>WGpR=jf63N|8D__0hqsWtUX18bg zGzoe59m#GhGbv9owTgTq`E%!4#i04_*R5_o(U@_>CNlX?!yl%~Ht+qDtvxPOCn)d! zAv)bZ&_e2w*JJLkERf$RxsmTJ^%}RZ!K73gC4qs3Jz!id-## z(mev$0-12FNYya92_PK^%Mtn+7I@EHTDHV|MZK4V~o39@mZN&~ql1XUUczy*wP3{Sya1v3u0 zTme-f$i~B3XRug8O(1?iE}>uom8J;L1l0j^13tS@)6_mRoiNuUn*b_FkrO+pBt-xw dR_tXnvj4&5YJfK@8%P@u5UKz}u#z3b0|4K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/biz.aQute.resolve/testdata/repo-usesconstrainterror/run.bndrun b/biz.aQute.resolve/testdata/repo-usesconstrainterror/run.bndrun new file mode 100644 index 0000000000..cf466da40b --- /dev/null +++ b/biz.aQute.resolve/testdata/repo-usesconstrainterror/run.bndrun @@ -0,0 +1,7 @@ +-standalone: ${.}/index.xml +-runfw: org.apache.felix.framework +-runee: JavaSE-17 +-resolvedebug: 1 +-runrequires: \ + bnd.identity;id=BundleC,\ + bnd.identity;id=BundleB From 32e6b2e2d9efc4919e48d52d769f523c3ca8d5d8 Mon Sep 17 00:00:00 2001 From: Christoph Rueger Date: Mon, 13 May 2024 00:23:36 +0200 Subject: [PATCH 5/7] keep resolve logfile until jvm exists before this change the logfile containing the Uses Constraint violation was closed too early so that manually opening wasn't possible anymore. since it is a tmp file anyway which gets removed when JVM / Eclipse exits, this should be better and a bit longer. still not ideal, since I don't know exactly how this would work with the resolver being triggered e.g. via maven. Signed-off-by: Christoph Rueger --- .../src/biz/aQute/resolve/ResolverLogger.java | 32 ++++++++++++++++--- .../src/biz/aQute/resolve/RunResolution.java | 3 +- .../core/resolve/ResolveOperation.java | 2 +- .../ui/ResolutionResultsWizardPage.java | 2 +- .../core/resolve/ui/ResolutionWizard.java | 2 +- 5 files changed, 33 insertions(+), 8 deletions(-) diff --git a/biz.aQute.resolve/src/biz/aQute/resolve/ResolverLogger.java b/biz.aQute.resolve/src/biz/aQute/resolve/ResolverLogger.java index 5f33475f5e..1993549800 100644 --- a/biz.aQute.resolve/src/biz/aQute/resolve/ResolverLogger.java +++ b/biz.aQute.resolve/src/biz/aQute/resolve/ResolverLogger.java @@ -147,6 +147,17 @@ public void close() { } } + /** + * like {@link #close()} but it deletes the logfile regardless of + * {@link #keepLogFile} + */ + public void closeAndDeleteLogfile() { + IO.close(printer); + if (file != null) { + IO.delete(file); + } + } + public void setKeepLogFileTillExit(boolean keep) { this.keepLogFile = keep; } @@ -170,18 +181,31 @@ public void log(ServiceReference sr, int level, String message, Throwable except log(level, message, exception); } - public static ResolverLogger newLogger(Processor processor) { + /** + * @param processor + * @param keepLogFileTillJvmExit if true the logfile is kept + * until JVM exit, otherwise deleted immediately after resolve + * finishes + * @return a new logger + */ + public static ResolverLogger newLogger(Processor processor, boolean keepLogFileTillJvmExit) { if (processor == null) { - return new ResolverLogger(); + ResolverLogger logger = new ResolverLogger(); + logger.setKeepLogFileTillExit(keepLogFileTillJvmExit); + return logger; } try { Integer level = Converter.cnv(Integer.class, processor.getProperty(Constants.RESOLVEDEBUG, Integer.toString(DEFAULT_LEVEL))); if (level != null) { - return new ResolverLogger(level); + ResolverLogger logger = new ResolverLogger(level); + logger.setKeepLogFileTillExit(keepLogFileTillJvmExit); + return logger; } - return new ResolverLogger(); + ResolverLogger logger = new ResolverLogger(); + logger.setKeepLogFileTillExit(keepLogFileTillJvmExit); + return logger; } catch (Exception e) { throw Exceptions.duck(e); } diff --git a/biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java b/biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java index 4abc24b4e7..ecca763ce6 100644 --- a/biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java +++ b/biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java @@ -98,7 +98,8 @@ public static RunResolution resolve(Project project, Processor actualProperties, Collection callbacks, ResolverLogger resolverLogger) { if (callbacks == null) callbacks = Collections.emptyList(); - ResolverLogger logger = resolverLogger == null ? ResolverLogger.newLogger(actualProperties) : resolverLogger; + ResolverLogger logger = resolverLogger == null ? ResolverLogger.newLogger(actualProperties, true) + : resolverLogger; try { try { ResolveProcess resolve = new ResolveProcess(); diff --git a/bndtools.core/src/org/bndtools/core/resolve/ResolveOperation.java b/bndtools.core/src/org/bndtools/core/resolve/ResolveOperation.java index f255978980..aa62a771c7 100644 --- a/bndtools.core/src/org/bndtools/core/resolve/ResolveOperation.java +++ b/bndtools.core/src/org/bndtools/core/resolve/ResolveOperation.java @@ -53,7 +53,7 @@ public void run(IProgressMonitor monitor) { Project run = model.getOwner(Project.class) .orElse(null); - logger = ResolverLogger.newLogger(run); + logger = ResolverLogger.newLogger(run, true); List operationCallbacks = new ArrayList<>(callbacks.size() + 1); operationCallbacks.addAll(callbacks); operationCallbacks.add(new ResolutionProgressCallback(monitor)); diff --git a/bndtools.core/src/org/bndtools/core/resolve/ui/ResolutionResultsWizardPage.java b/bndtools.core/src/org/bndtools/core/resolve/ui/ResolutionResultsWizardPage.java index 3a772d8bca..25be1906b7 100644 --- a/bndtools.core/src/org/bndtools/core/resolve/ui/ResolutionResultsWizardPage.java +++ b/bndtools.core/src/org/bndtools/core/resolve/ui/ResolutionResultsWizardPage.java @@ -87,7 +87,7 @@ public void setResult(ResolutionResult result) { public void recalculate() { try { result.getLogger() - .close(); + .closeAndDeleteLogfile(); ResolveOperation resolver = new ResolveOperation(model); getContainer().run(true, true, resolver); setResult(resolver.getResult()); diff --git a/bndtools.core/src/org/bndtools/core/resolve/ui/ResolutionWizard.java b/bndtools.core/src/org/bndtools/core/resolve/ui/ResolutionWizard.java index 6601a13a94..e4278a6517 100644 --- a/bndtools.core/src/org/bndtools/core/resolve/ui/ResolutionWizard.java +++ b/bndtools.core/src/org/bndtools/core/resolve/ui/ResolutionWizard.java @@ -77,7 +77,7 @@ public void dispose() { .getLogger() != null) { resultsPage.getResult() .getLogger() - .close(); + .closeAndDeleteLogfile(); } super.dispose(); } From 1db5a87ffec648548ea7e483c23151e52f299fa5 Mon Sep 17 00:00:00 2001 From: Christoph Rueger Date: Mon, 13 May 2024 21:23:09 +0200 Subject: [PATCH 6/7] add debug logging with slf4j.Logger for mvn -X allow e.g. maven (which also uses Slf4j) to see / capture resolver debug log output e.g. when running mvn -X clean install Signed-off-by: Christoph Rueger --- .../src/biz/aQute/resolve/ResolverLogger.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/biz.aQute.resolve/src/biz/aQute/resolve/ResolverLogger.java b/biz.aQute.resolve/src/biz/aQute/resolve/ResolverLogger.java index 1993549800..4e3a6b7862 100644 --- a/biz.aQute.resolve/src/biz/aQute/resolve/ResolverLogger.java +++ b/biz.aQute.resolve/src/biz/aQute/resolve/ResolverLogger.java @@ -10,6 +10,8 @@ import org.osgi.framework.ServiceReference; import org.osgi.service.log.LogService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import aQute.bnd.exceptions.Exceptions; import aQute.bnd.osgi.Constants; @@ -19,6 +21,8 @@ public class ResolverLogger implements LogService, AutoCloseable { + private static final Logger logger = LoggerFactory.getLogger(ResolverLogger.class); + public static final int DEFAULT_LEVEL = 4; public static final int LOG_ERROR = 1; @@ -56,6 +60,7 @@ public ResolverLogger(int level, PrintStream out) { printer = IO.writer(out, UTF_8); } + @Override public void log(int level, String msg, Throwable throwable) { switch (level) { @@ -68,6 +73,7 @@ public void log(int level, String msg, Throwable throwable) { printLog(msg, throwable); if (throwable != null) { throwable.printStackTrace(printer); + logger.debug("", throwable); } break; case LOG_INFO : @@ -91,10 +97,13 @@ public void log(int level, String msg, Throwable throwable) { private void printLog(String msg, Throwable throwable) { printer.print(msg); + logger.debug(msg); if (throwable != null) { printer.print(" ("); printer.print(throwable); printer.print(")"); + + logger.debug("({})", String.valueOf(throwable)); } printer.println(); } @@ -203,7 +212,7 @@ public static ResolverLogger newLogger(Processor processor, boolean keepLogFileT logger.setKeepLogFileTillExit(keepLogFileTillJvmExit); return logger; } - ResolverLogger logger = new ResolverLogger(); + ResolverLogger logger = new ResolverLogger(DEFAULT_LEVEL); logger.setKeepLogFileTillExit(keepLogFileTillJvmExit); return logger; } catch (Exception e) { From 434c0af56155e0e091bcb16552a50dfee08529c2 Mon Sep 17 00:00:00 2001 From: Christoph Rueger Date: Mon, 13 May 2024 22:08:26 +0200 Subject: [PATCH 7/7] set keepLogFileTillJvmExit=false to fix build not sure why, but since I set this to true at this place, the build fails. maybe something gets too big. We keep keepLogFileTillJvmExit=true only in the bndtools UI, where take care of cleanup ourselves. Signed-off-by: Christoph Rueger --- biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java b/biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java index ecca763ce6..b8b12eca62 100644 --- a/biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java +++ b/biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java @@ -98,7 +98,7 @@ public static RunResolution resolve(Project project, Processor actualProperties, Collection callbacks, ResolverLogger resolverLogger) { if (callbacks == null) callbacks = Collections.emptyList(); - ResolverLogger logger = resolverLogger == null ? ResolverLogger.newLogger(actualProperties, true) + ResolverLogger logger = resolverLogger == null ? ResolverLogger.newLogger(actualProperties, false) : resolverLogger; try { try {