Дерево Icefaces + outputResource - PullRequest
       14

Дерево Icefaces + outputResource

0 голосов
/ 24 января 2012

Я реализовал дерево с outputResource в качестве «содержимого» (см. Загрузка файла из дерева IceFaces ).

Однако, когда я пытаюсь загрузить файл (у меня есть только файлы txt или csv), я получаю сообщение об ошибке HTTP 500 Status.

Древовидная структура похожа на

  Root
  |-infoFiles
  | |-A.csv
  | |-B.csv
  |-validateFiles
  | |-C.txt
  | |-D.txt

И исключение при нажатии на ресурс

java.io.FileNotFoundException: C:\SRC\dataFiles\998\validateFiles (Access denied)
    java.io.FileInputStream.open(Native Method)
    java.io.FileInputStream.<init>(FileInputStream.java:138)
    java.io.FileInputStream.<init>(FileInputStream.java:97)
    mx.gob.sagarpa.utilidades.FileResource.open(FileResource.java:39)
    com.icesoft.faces.component.outputresource.RegisteredResource.open(OutputResource.java:474)
    com.icesoft.faces.context.ResourceRegistryLocator$DynamicResourceDispatcherAdapter$DynamicResourceAdapter.open(ResourceRegistryLocator.java:117)
    org.icefaces.impl.push.DynamicResourceDispatcher$ResourceServer.respond(DynamicResourceDispatcher.java:224)
    org.icefaces.impl.push.DynamicResourceDispatcher$ResourceServer.handleResourceRequest(DynamicResourceDispatcher.java:201)
    org.icefaces.impl.push.DynamicResourceDispatcher$Mapping.handleResourceRequest(DynamicResourceDispatcher.java:370)
    org.icefaces.impl.push.DynamicResourceDispatcher.handleResourceRequest(DynamicResourceDispatcher.java:89)
    org.icefaces.application.ResourceRegistry.handleResourceRequest(ResourceRegistry.java:75)
    org.icefaces.impl.application.WindowScopeManager.handleResourceRequest(WindowScopeManager.java:165)
    javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:125)
    javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:125)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:591)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

Иногда это происходит только с csv файлами, а иногда даже с txt

Tree.xhtml

                <ice:tree id="tree"
                          value="#{treeBean.model}"
                          var="item"
                          hideRootNode="false"
                          hideNavigation="false"
                          >
                    <ice:treeNode>
                        <f:facet name="icon">
                            <ice:panelGroup style="display: inline">
                                <h:graphicImage value="#{item.userObject.icon}" />
                            </ice:panelGroup>
                        </f:facet>
                        <f:facet name="content">
                            <ice:panelGroup style="display: inline-block">
                                <ice:outputResource resource="#{item.userObject.resource}"
                                                    fileName="#{item.userObject.resource.filename}"
                                                    mimeType="#{item.userObject.resource.mimeType}"
                                                    />
                            </ice:panelGroup>
                        </f:facet>
                    </ice:treeNode>
                </ice:tree>

TreeBean.java

@ManagedBean
@ViewScoped
public class TreeBean implements Serializable {

private DefaultTreeModel model;
public final String openFolderImg = "./img/tree_folder_open.gif";
public final String closeFolderImg = "./img/tree_folder_close.gif";
public final String fileImg = "./img/tree_document.gif";
@ManagedProperty("#{userBean}")
private UserBean userBean;

@PostConstruct
public void init() {
    // create root node with its children expanded
    DefaultMutableTreeNode rootTreeNode = new DefaultMutableTreeNode();
    FileResourceUserObject rootObject = new FileResourceUserObject(rootTreeNode);
    rootObject.setText("Sistema de Rendición de Cuentas");
    rootObject.setExpanded(true);
    rootObject.setResource(new FileResource("Sistema de Rendición de Cuentas", null));
    rootObject.setBranchContractedIcon(openFolderImg);
    rootObject.setBranchExpandedIcon(closeFolderImg);
    rootTreeNode.setUserObject(rootObject);

    // model is accessed by the ice:tree component
    model = new DefaultTreeModel(rootTreeNode);
    File f = new File("./998/");
    createTree(f, rootTreeNode);
}

public DefaultTreeModel getModel() {
    return model;
}

public UserBean getUserBean() {
    return userBean;
}

public void setUserBean(UserBean userBean) {
    this.userBean = userBean;
}

private void createTree(File fileRoot, DefaultMutableTreeNode treeRoot) {
    File[] files = fileRoot.listFiles();
    DefaultMutableTreeNode branchNode;
    for (File f : files) {
        if (f.isDirectory()) {
            branchNode = new DefaultMutableTreeNode();
            FileResourceUserObject branchObject = new FileResourceUserObject(branchNode);
            branchObject.setExpanded(false);
            branchObject.setText(f.getName());
            branchObject.setResource(new FileResource(f.getName(), f.getAbsolutePath()));
            branchObject.setBranchContractedIcon(openFolderImg);
            branchObject.setBranchExpandedIcon(closeFolderImg);
            branchNode.setUserObject(branchObject);
            treeRoot.add(branchNode);
            createTree(f, branchNode);
        }
        if (f.isFile()) {
            branchNode = new DefaultMutableTreeNode();
            FileResourceUserObject branchObject = new FileResourceUserObject(branchNode);
            branchObject.setText(f.getName());
            branchObject.setResource(new FileResource(f.getName(), f.getAbsolutePath()));
            branchObject.setLeaf(true);
            branchObject.setLeafIcon(fileImg);
            branchNode.setUserObject(branchObject);
            treeRoot.add(branchNode);
        }
    }

    return;
}

}

FileResourceUserObject.java

public class FileResourceUserObject extends IceUserObject{

    private FileResource resource;

    public FileResourceUserObject(DefaultMutableTreeNode wrapper) {
        super(wrapper);
    }

    public FileResource getResource() {
        return resource;
    }

    public void setResource(FileResource resource) {
        this.resource = resource;
    }

}

FileResource.java

public class FileResource implements Resource{

    private String filename;
    private String fileAbsolutePath;
    private String mimeType;
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();

    public FileResource(String filename, String fileAbsolutePath) {
        this.filename = filename;
        this.fileAbsolutePath = fileAbsolutePath;
        this.mimeType = ec.getMimeType(filename);
    }

    @Override
    public String calculateDigest() {
        return filename;
    }

    @Override
    public InputStream open() throws IOException {
        return new FileInputStream(fileAbsolutePath);
    }

    @Override
    public Date lastModified() {
        return new Date();
    }

    @Override
    public void withOptions(Options optns) throws IOException {

    }

    public String getFileAbsolutePath() {
        return fileAbsolutePath;
    }

    public void setFileAbsolutePath(String fileAbsolutePath) {
        this.fileAbsolutePath = fileAbsolutePath;
    }

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    public String getMimeType() {
        return mimeType;
    }

}

UPDATE

Я заметил, что когда я получаю 500 Ошибка состояния , FileNotFoundException всегда указывает на один и тот же путь java.io.FileNotFoundException: C: \ SRC \ dataFiles \ 998 \ validateFiles ( Доступ запрещен) Я начинаю думать, что все мои FileResources указывают на один и тот же путь ... почему это происходит?

1 Ответ

0 голосов
/ 27 января 2012

На странице IceFaces было сообщение об ошибке, в которой говорится, что использование нескольких тегов outputResource имело странное поведение. Смотрите эту ссылку http://jira.icefaces.org/browse/ICE-3667 Я думаю, что это происходило с тем, что у меня было дерево и много тегов outputResource.

Кроме того, я также читал, что с помощью тега outputResource он создает объект во время рендеринга (или что-то в этом роде, я новичок в JSF и во всем, что с этим связано), и он потребляет память процессора, и было лучше используйте сервлет для загрузки. Смотри http://www.dantoomeysoftware.com/pencils-down/2009/09/08/dont-use-icefaces-resource-for-download-use-a-download-servlet/

Так что лучше реализовать сервлет, вы можете найти полезную информацию в http://balusc.blogspot.com/2007/07/fileservlet.html и (если вы новичок во всем этом) Пользовательский сервлет загрузки

...