[ https://issues.apache.org/jira/browse/FELIX-6037?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Carsten Ziegeler reassigned FELIX-6037: --------------------------------------- Assignee: Carsten Ziegeler > Commons FileUpload 1.4 + Apache Felix Bundle WebConsole > ------------------------------------------------------- > > Key: FELIX-6037 > URL: https://issues.apache.org/jira/browse/FELIX-6037 > Project: Felix > Issue Type: Improvement > Components: Web Console > Affects Versions: webconsole-4.3.8 > Reporter: Dan Klco > Assignee: Carsten Ziegeler > Priority: Major > Fix For: webconsole-4.3.14 > > > When using Commons Fileupload with the Apache Felix Bundle webconsole, I've > found an error when uploading SNAPSHOT bundles to the webconsole. The process > fails with the following exception: > 23.01.2019 06:56:29.098 *ERROR* [qtp24255790-48] org.apache.felix.http.jetty > Problem accessing uploaded bundle file: > org.apache.sling.cms.ui-0.11.3-SNAPSHOT.jar > (org.apache.commons.io.FileExistsException: Destination > '/var/folders/lk/m1djs7v96_b9xfy_7_xhn33h0000gq/T/install8148467763631161526.tmp' > already exists) > org.apache.commons.io.FileExistsException: Destination > '/var/folders/lk/m1djs7v96_b9xfy_7_xhn33h0000gq/T/install8148467763631161526.tmp' > already exists > at org.apache.commons.io.FileUtils.moveFile(FileUtils.java:3001) > [org.apache.commons.io:2.6.0] > at > org.apache.commons.fileupload.disk.DiskFileItem.write(DiskFileItem.java:405) > [org.apache.commons.commons-fileupload:1.4.0] > at > org.apache.felix.webconsole.internal.core.BundlesServlet.installBundles(BundlesServlet.java:1553) > [org.apache.felix.webconsole:4.3.8] > at > org.apache.felix.webconsole.internal.core.BundlesServlet.doPost(BundlesServlet.java:330) > [org.apache.felix.webconsole:4.3.8] > at javax.servlet.http.HttpServlet.service(HttpServlet.java:644) > [org.apache.felix.http.servlet-api:1.1.2] > at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) > [org.apache.felix.http.servlet-api:1.1.2] > at > org.apache.felix.webconsole.internal.servlet.OsgiManager.service(OsgiManager.java:563) > [org.apache.felix.webconsole:4.3.8] > at > org.apache.felix.webconsole.internal.servlet.OsgiManager$3.run(OsgiManager.java:465) > [org.apache.felix.webconsole:4.3.8] > at java.security.AccessController.doPrivileged(Native Method) > at > org.apache.felix.webconsole.internal.servlet.OsgiManager.service(OsgiManager.java:461) > [org.apache.felix.webconsole:4.3.8] > at > org.apache.felix.http.base.internal.handler.ServletHandler.handle(ServletHandler.java:120) > [org.apache.felix.http.jetty:4.0.6] > at > org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:86) > [org.apache.felix.http.jetty:4.0.6] > at org.apache.sling.i18n.impl.I18NFilter.doFilter(I18NFilter.java:131) > [org.apache.sling.i18n:2.5.14] > at > org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) > [org.apache.felix.http.jetty:4.0.6] > at > org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:81) > [org.apache.felix.http.jetty:4.0.6] > at > org.apache.felix.http.base.internal.dispatch.Dispatcher$1.doFilter(Dispatcher.java:146) > [org.apache.felix.http.jetty:4.0.6] > at > org.apache.felix.http.base.internal.whiteboard.WhiteboardManager$2.doFilter(WhiteboardManager.java:1014) > [org.apache.felix.http.jetty:4.0.6] > at > org.apache.felix.http.sslfilter.internal.SslFilter.doFilter(SslFilter.java:97) > [org.apache.felix.http.sslfilter:1.2.6] > at > org.apache.felix.http.base.internal.handler.PreprocessorHandler.handle(PreprocessorHandler.java:133) > [org.apache.felix.http.jetty:4.0.6] > at > org.apache.felix.http.base.internal.whiteboard.WhiteboardManager$2.doFilter(WhiteboardManager.java:1020) > [org.apache.felix.http.jetty:4.0.6] > at > org.apache.felix.http.base.internal.whiteboard.WhiteboardManager.invokePreprocessors(WhiteboardManager.java:1024) > [org.apache.felix.http.jetty:4.0.6] > at > org.apache.felix.http.base.internal.dispatch.Dispatcher.dispatch(Dispatcher.java:91) > [org.apache.felix.http.jetty:4.0.6] > at > org.apache.felix.http.base.internal.dispatch.DispatcherServlet.service(DispatcherServlet.java:49) > [org.apache.felix.http.jetty:4.0.6] > at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) > [org.apache.felix.http.servlet-api:1.1.2] > at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865) > [org.apache.felix.http.jetty:4.0.6] > at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:535) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1340) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203) > [org.apache.felix.http.jetty:4.0.6] > at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1242) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:220) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) > [org.apache.felix.http.jetty:4.0.6] > at org.eclipse.jetty.server.Server.handle(Server.java:503) > [org.apache.felix.http.jetty:4.0.6] > at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305) > [org.apache.felix.http.jetty:4.0.6] > at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) > [org.apache.felix.http.jetty:4.0.6] > at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:132) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765) > [org.apache.felix.http.jetty:4.0.6] > at > org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683) > [org.apache.felix.http.jetty:4.0.6] > at java.lang.Thread.run(Thread.java:748) > Rolling back to 1.3.3 resolves the issue. I'm thinking that it may make sense > to add some sort of random prefix to avoid this issue, but frankly I'm not > familar enough with the codebase to be sure. The problem appears to be below: > File tmpFile = null; > try > { > // copy the data to a file for better processing > tmpFile = File.createTempFile( "install", ".tmp" ); > bundleItem.write( tmpFile ); > } > Where the tmpFile conflicts with a pre-existing file (assumedly created by > commons fileupload) I'm confused why the process of creating the temporary > file is necessary in the first place as I can't imagine why you couldn't work > with the InputStream directly, but again, I don't know the codebase or why > certain decisions were made. > There are two ways I could see resolving this: > * Add a random string (UUID, etc) into the tmp file name when creating it > * Replace the tmp file with direct input stream usage > I'm happy to contribute a fix, I just also don't want to muck things up :) -- This message was sent by Atlassian JIRA (v7.6.14#76016)