Upload de arquivos com o primefaces

Ola a todos tenho o seguinte problema estou tentando implementar com primefaces uma tela tela te upload de arquivos, só que quando executo passo o arquivo e clico para fazer o upload ele me retorna NullPointerException já tentei pegar o nome do arquivo com o value em uma variável mais também não resolveu se alguém puder me ajudar fico grato abaixo o código do prime faces e minha classe de upload

 <h:form class="upload" >
                            <p:fileUpload fileUploadListener="#{upload_file.handleFileUpload}" mode="advanced" dragDropSupport="false"
                                                                                 multiple="true" update="messages" sizeLimit="100000" fileLimit="100" allowTypes="/(\.|\/#_)(gif|jpe?g|png|.bat|.rar)$/"
                                                                                   />

                            <p:growl id="messages" showDetail="true" />
                        </h:form>
public class FileUploadView {

    private String arquivo;

    public String getArquivo() {
        return arquivo;
    }

    public void setArquivo(String arquivo) {
        this.arquivo = arquivo;
    }

    public void handleFileUpload(FileUploadEvent event) throws FileNotFoundException, IOException {

        try {
            ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
            HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();

            FacesContext aFacesContext = FacesContext.getCurrentInstance();
            ServletContext context = (ServletContext) aFacesContext.getExternalContext().getContext();

            String realPath = context.getRealPath("/");

           

            byte[] arquivo = event.getFile().getContents();
            
            String caminho = realPath + "/scripts/" + event.getFile().getFileName();

            try ( // esse trecho grava o arquivo no diretório
                    FileOutputStream fos = new FileOutputStream(caminho)) {
                fos.write(arquivo);
                
                FacesMessage message = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
                FacesContext.getCurrentInstance().addMessage(null, message); // mensagem pra saber se ouve sucesso
            }

        } catch (Exception ex) {
            System.out.println("Erro no upload de imagem" + ex);
        }
    

}

}

mostre o erro e a Stack Trace ( dica: ex.printStackTrace() )

mesmo com o printStackTrace só me devolve isso abaixo:

Grave: java.lang.NullPointerException
at java.io.FileOutputStream.write(FileOutputStream.java:313)
at sc.classes.FileUploadView.handleFileUpload(FileUploadView.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.sun.el.parser.AstValue.invoke(AstValue.java:289)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at org.primefaces.component.fileupload.FileUpload.broadcast(FileUpload.java:292)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:755)
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:931)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:70)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:745)

percebi que o problema esta aqui

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();

        FacesContext aFacesContext = FacesContext.getCurrentInstance();
        ServletContext context = (ServletContext) aFacesContext.getExternalContext().getContext();

        String realPath = context.getRealPath("/");

se eu removo essas linhas e passo o o diretório na minha variável caminho funciona, só que eu preciso que ele pegue o caminho dentro do meu projeto por exemplo pasta scripts que esta dentro do meu projeto sem pegar todo o caminho por exemplo C:\etc\scripts poque as ela nem sempre vai estar no C: ou algo do tipo

Consegui resolver quase todos os problemas agora só me resta um, tenho a tela abaixo:

<h:form>


Criar Pasta de Upload:  <h:inputText value="#{upload_file.pasta}"/>
<p:commandButton value=“SALVAR” class=“btnSalvar” action="#{upload_file.criarDiretorioMacro()}" onclick="#"/>


</h:form>

                    <h:form>
                        Selecionar Pasta Para Upload:&nbsp;&nbsp; 
                        <h:selectOneMenu id="para" value="#{upload_file.destino}" >

                            <f:selectItem itemLabel="selecione" itemValue=""/>
                            <f:selectItems value="#{dir_controle.selectedDs()}"  />

                        </h:selectOneMenu>
                    </h:form>
                    <h:form class="upload" >
                        <p:fileUpload fileUploadListener="#{upload_file.handleFileUpload}" mode="advanced" dragDropSupport="false"
                                      multiple="true" update="messages" sizeLimit="100000" fileLimit="100" allowTypes="/(\.|\/#_)(gif|jpe?g|png|bat|rar)$/"
                                      />

                        <p:growl id="messages" showDetail="true" />
                    </h:form>

em um form eu tenho o campo onde eu informo o nome e crio uma pasta com esse nome, no segundo form um selectedOneMenu onde lista as pastas que criei no primeiro form, agora meu problema esta no form de upload porque quando eu seleciono uma pasta no selectedOneMenu e clico em fazer upload do arquivo, ele não esta fazendo upload, a variável onde armazeno o nome da pasta esta ficando null, abaixo a minha classe que faz essas operações:

private String arquivo;
private String pasta;
private String destino;


public String getArquivo() {return arquivo;}

public void setArquivo(String arquivo) {this.arquivo = arquivo;}

public String getPasta() {return pasta;}

public void setPasta(String pasta) {this.pasta = pasta;}

public String getDestino() {return destino;}

public void setDestino(String destino) {this.destino = destino;}
   
public void criarDiretorioMacro() throws SQLException {
    DirControle dir = new DirControle();
    String directory = dir.selectedDir_CB().toString().replace("[", "").replace("]", "");
    try {
        File diretorio = new File(directory+"//"+getPasta());
        diretorio.mkdir();
    } catch (Exception ex) {
        
    }
}

public void handleFileUpload(FileUploadEvent event) throws SQLException {
    DirControle dir = new DirControle();
    String directory = dir.selectedDir_CB().toString().replace("[", "").replace("]", "");
    try {

        byte[] arquivo = event.getFile().getContents();

        String caminho = directory +"\\"+getDestino()+ "\\" + event.getFile().getFileName();

        try ( // esse trecho grava o arquivo no diretório
                FileOutputStream fos = new FileOutputStream(caminho)) {
            fos.write(arquivo);

            FacesMessage message = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
            FacesContext.getCurrentInstance().addMessage(null, message); // mensagem pra saber se ouve sucesso
        }

    } catch (Exception ex) {

        ex.printStackTrace();
        System.out.println(ex);
    }

}

}