/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package nl.fontys.sofa.limo.view.project.supplychain;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.ChangeListener;
import nl.fontys.sofa.limo.view.project.SupplyProject;
import nl.fontys.sofa.limo.view.project.node.ChainNode;
import nl.fontys.sofa.limo.view.project.node.FolderFilterNode;
import nl.fontys.sofa.limo.view.project.node.MasterDataNode;
import nl.fontys.sofa.limo.view.project.node.SupplyChainNode;
import org.netbeans.spi.project.ui.support.NodeList;
import org.openide.filesystems.FileObject;
import org.openide.loaders.DataNode;
import org.openide.loaders.DataObject;
import org.openide.loaders.DataObjectNotFoundException;
import org.openide.nodes.Children;
import org.openide.nodes.FilterNode;
import org.openide.nodes.Index;
import org.openide.nodes.Index.ArrayChildren;
import org.openide.nodes.Node;
import org.openide.util.Exceptions;
/**
*
* @author nilsh
*/
public class ChainNodeList implements NodeList<Node> {
SupplyProject project;
private ChainNode chainNode;
private MasterDataNode masterDataNode;
public MasterDataNode getMasterDataNode() {
return masterDataNode;
}
public ChainNode getChainNode() {
return chainNode;
}
public ChainNodeList(SupplyProject project) {
this.project = project;
project.addChainNodeList(this);
}
public Children findMasterDataFiles(FileObject masterDataFolder) throws DataObjectNotFoundException {
Children children = new ArrayChildren();
List<Node> nodes = new ArrayList<>();
FileObject[] files = masterDataFolder.getChildren();
for (FileObject file : files) {
if (file.getExt().equals("lef")) {
DataObject find = DataObject.find(file);
nodes.add(new DataNode(find, Children.LEAF));
}
}
children.add(nodes.toArray(new Node[0]));
return children;
}
@Override
public List<Node> keys() {
FileObject chainsFolder
= project.getProjectDirectory().getFileObject("chains");
FileObject masterDataFolder
= project.getProjectDirectory().getFileObject("master_data_files");
FileObject reportDataFolder
= project.getProjectDirectory().getFileObject("reports");
List<Node> result = new ArrayList<>();
if (masterDataFolder != null) {
try {
masterDataNode = new MasterDataNode(DataObject.find(masterDataFolder), findMasterDataFiles(masterDataFolder));
// result.add(masterDataNode);
} catch (DataObjectNotFoundException ex) {
Exceptions.printStackTrace(ex);
}
}
if (chainsFolder != null) {
try {
DataObject object = DataObject.find(chainsFolder);
Node node = createChains(object);
result.add(node);
} catch (DataObjectNotFoundException ex) {
Exceptions.printStackTrace(ex);
}
}
if (reportDataFolder != null) {
/* try {
result.add(new ReportsNode(DataObject.find(reportDataFolder).getNodeDelegate(), Children.LEAF));
} catch (DataObjectNotFoundException ex) {
Exceptions.printStackTrace(ex);
}*/
}
return result;
}
@Override
public Node node(Node node) {
return new FilterNode(node);
}
@Override
public void addNotify() {
}
@Override
public void removeNotify() {
}
@Override
public void addChangeListener(ChangeListener cl) {
}
@Override
public void removeChangeListener(ChangeListener cl) {
}
private Node createChains(DataObject chainsFolder) {
Children children = createChainFolder(chainsFolder);
chainNode = new ChainNode(chainsFolder, children);
return chainNode;
}
private Children createChainFolder(DataObject obj) {
List<Node> nodes = new ArrayList<>();
obj.files().stream().forEach((file) -> {
if (file.isFolder()) {
try {
for (FileObject f : file.getChildren()) {
DataObject object = DataObject.find(f);
if (f.isFolder()) {
Children children = createChainFolder(object);
Node n = new FolderFilterNode(object.getNodeDelegate(), children);
nodes.add(n);
} else if (f.getExt().equals("lsc")) {
DataObject o = DataObject.find(f);
Node n = new SupplyChainNode(o);
nodes.add(n);
}
}
} catch (DataObjectNotFoundException ex) {
Exceptions.printStackTrace(ex);
}
} else if (file.getExt().equals("lsc")) {
try {
DataObject object = DataObject.find(file);
Node n = new SupplyChainNode(object);
nodes.add(n);
} catch (DataObjectNotFoundException ex) {
Exceptions.printStackTrace(ex);
}
}
});
Children children = new Index.ArrayChildren();
children.add(nodes.toArray(new Node[0]));
return children;
}
}