From 4c8a79984a1b6b31d2ede25adc882068edbe5dda Mon Sep 17 00:00:00 2001 From: Mae Isabelle Turiana Date: Mon, 15 Feb 2016 21:34:43 +0800 Subject: [PATCH 1/3] Simplified display of flow directories by using abn_tree and using a class that models the required tree data of the plugin used. --- .../hub/factory/DirectoryModelFactory.java | 89 ---- .../hub/factory/DomainModelFactory.java | 158 +++--- .../hub/factory/FlowModelFactory.java | 135 ++--- .../hub/factory/TreeDataFactory.java | 61 +++ .../marklogic/hub/model/DirectoryModel.java | 57 -- .../com/marklogic/hub/model/FlowModel.java | 57 +- .../com/marklogic/hub/model/TreeData.java | 58 +++ .../java/com/marklogic/hub/util/FileUtil.java | 127 +++-- .../WEB-INF/static/app/quickStartApp.js | 1 + .../webapp/WEB-INF/static/css/quick-start.css | 13 + .../src/main/webapp/WEB-INF/static/index.html | 2 + .../static/lib/abn_tree/css/abn_tree.css | 121 +++++ .../lib/abn_tree/js/abn_tree_directive.js | 492 ++++++++++++++++++ .../main/webapp/WEB-INF/static/top/flows.html | 22 +- .../WEB-INF/static/top/modal/domainModal.html | 75 ++- .../WEB-INF/static/top/modal/flowModal.html | 71 ++- .../WEB-INF/static/top/topController.js | 24 +- 17 files changed, 1072 insertions(+), 491 deletions(-) delete mode 100644 quick-start/src/main/java/com/marklogic/hub/factory/DirectoryModelFactory.java create mode 100644 quick-start/src/main/java/com/marklogic/hub/factory/TreeDataFactory.java delete mode 100644 quick-start/src/main/java/com/marklogic/hub/model/DirectoryModel.java create mode 100644 quick-start/src/main/java/com/marklogic/hub/model/TreeData.java create mode 100644 quick-start/src/main/webapp/WEB-INF/static/lib/abn_tree/css/abn_tree.css create mode 100644 quick-start/src/main/webapp/WEB-INF/static/lib/abn_tree/js/abn_tree_directive.js diff --git a/quick-start/src/main/java/com/marklogic/hub/factory/DirectoryModelFactory.java b/quick-start/src/main/java/com/marklogic/hub/factory/DirectoryModelFactory.java deleted file mode 100644 index 56d3d8aad4..0000000000 --- a/quick-start/src/main/java/com/marklogic/hub/factory/DirectoryModelFactory.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.marklogic.hub.factory; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import com.marklogic.hub.model.DirectoryModel; -import com.marklogic.hub.util.FileUtil; - -public class DirectoryModelFactory { - - private DirectoryModel directoryModel; - - public DirectoryModelFactory(String parentDirPath, String directoryName) { - directoryModel = new DirectoryModel(parentDirPath, directoryName); - } - - public void addEmptyDirectories(String parentDirPath, - String... directoryNames) { - for (String directoryName : directoryNames) { - this.addEmptyDirectory(parentDirPath, directoryName, directoryModel); - } - } - - private DirectoryModel addEmptyDirectory(String parentDirPath, - String directoryName, DirectoryModel parentDirectory) { - DirectoryModel directory = new DirectoryModel(parentDirPath, - directoryName); - parentDirectory.getDirectories().add(directory); - return directory; - } - - public void addDirectory(String parentDirPath, String directoryName, - String... childDirectoryNames) { - DirectoryModel directory = this.addEmptyDirectory(parentDirPath, - directoryName, directoryModel); - String newDirecoryPath = parentDirPath + File.separator + directoryName; - for (String childDirectoryName : childDirectoryNames) { - this.addEmptyDirectory(newDirecoryPath, childDirectoryName, - directory); - } - } - - public DirectoryModel listFilesAndDirectories() { - if (directoryModel.getFiles().isEmpty()) { - directoryModel.setFiles(FileUtil.listDirectFiles(directoryModel - .getParentDirPath())); - } - if (directoryModel.getDirectories().isEmpty()) { - directoryModel.setDirectories(this.getDirectoryModels( - directoryModel, false)); - } - return directoryModel; - } - - public List listDirectories() { - if (directoryModel.getDirectories().isEmpty()) { - directoryModel.setDirectories(this.getDirectoryModels( - directoryModel, true)); - } - return directoryModel.getDirectories(); - } - - private List getDirectoryModels( - DirectoryModel currentDirectoryModel, boolean folderOnly) { - List directories = new ArrayList<>(); - String parentDirPath = currentDirectoryModel.getParentDirPath() - + File.separator + currentDirectoryModel.getDirectoryName(); - List folders = FileUtil.listDirectFolders(parentDirPath); - for (String folder : folders) { - DirectoryModel childDirectoryModel = new DirectoryModel( - parentDirPath, folder); - directories.add(childDirectoryModel); - childDirectoryModel.setDirectories(this.getDirectoryModels( - childDirectoryModel, folderOnly)); - if (!folderOnly) { - childDirectoryModel.setFiles(FileUtil - .listDirectFiles(childDirectoryModel.getParentDirPath() - + File.separator - + childDirectoryModel.getDirectoryName())); - } - } - return directories; - } - - public void saveDirectories() { - FileUtil.createDirectories(directoryModel); - } -} diff --git a/quick-start/src/main/java/com/marklogic/hub/factory/DomainModelFactory.java b/quick-start/src/main/java/com/marklogic/hub/factory/DomainModelFactory.java index f2ea7c08cb..fcaf2f0d97 100644 --- a/quick-start/src/main/java/com/marklogic/hub/factory/DomainModelFactory.java +++ b/quick-start/src/main/java/com/marklogic/hub/factory/DomainModelFactory.java @@ -14,84 +14,84 @@ public class DomainModelFactory { - private Map domainsInServer = new LinkedHashMap<>(); - - public DomainModelFactory() { - // use this when creating a new domain in the client - } - - public DomainModelFactory(List domains) { - // use this when comparing domains in the client and server - if (domains != null) { - for (Domain domain : domains) { - domainsInServer.put(domain.getName(), domain); - } - } - } - - public DomainModel createNewDomain(String userPluginDir, String domainName, - String inputFlowName, String conformFlowName) { - DomainModel domainModel = new DomainModel(); - domainModel.setDomainName(domainName); - domainModel.setInputFlows(new ArrayList<>()); - domainModel.setConformFlows(new ArrayList<>()); - FileUtil.createFolderIfNecessary(userPluginDir + File.separator - + FileUtil.DOMAINS_FOLDER, domainName); - - FlowModelFactory flowModelFactory = new FlowModelFactory(domainName); - String domainDirPath = userPluginDir + File.separator - + FileUtil.DOMAINS_FOLDER + File.separator + domainName; - FlowModel inputFlow = flowModelFactory.createNewFlow(domainDirPath - + File.separator + FlowType.INPUT, inputFlowName, - FlowType.INPUT); - FlowModel conformFlow = flowModelFactory.createNewFlow(domainDirPath - + File.separator + FlowType.CONFORM, conformFlowName, - FlowType.CONFORM); - - domainModel.getInputFlows().add(inputFlow); - domainModel.getConformFlows().add(conformFlow); - - return domainModel; - } - - public DomainModel createDomain(String domainName, String domainFilePath) { - DomainModel domainModel = new DomainModel(); - domainModel.setDomainName(domainName); - domainModel.setSynched(this.domainsInServer.containsKey(domainName)); - - FlowModelFactory flowModelFactory = new FlowModelFactory( - this.domainsInServer.get(domainName), domainName); - domainModel.setInputFlows(this.getInputFlows(flowModelFactory, - domainFilePath)); - domainModel.setConformFlows(this.getConformFlows(flowModelFactory, - domainFilePath)); - - return domainModel; - } - - private List getInputFlows(FlowModelFactory flowModelFactory, - String domainFilePath) { - return this.getFlows(flowModelFactory, domainFilePath, FlowType.INPUT); - } - - private List getConformFlows(FlowModelFactory flowModelFactory, - String domainFilePath) { - return this - .getFlows(flowModelFactory, domainFilePath, FlowType.CONFORM); - } - - private List getFlows(FlowModelFactory flowModelFactory, - String domainFilePath, FlowType flowType) { - List flows = new ArrayList<>(); - String flowsFilePath = domainFilePath + File.separator - + flowType.getName(); - List flowNames = FileUtil.listDirectFolders(flowsFilePath); - for (String flowName : flowNames) { - FlowModel flowModel = flowModelFactory.createFlow(flowsFilePath, - flowName, flowType); - flows.add(flowModel); - } - return flows; - } + private Map domainsInServer = new LinkedHashMap<>(); + + public DomainModelFactory() { + // use this when creating a new domain in the client + } + + public DomainModelFactory(List domains) { + // use this when comparing domains in the client and server + if (domains != null) { + for (Domain domain : domains) { + domainsInServer.put(domain.getName(), domain); + } + } + } + + public DomainModel createNewDomain(String userPluginDir, String domainName, + String inputFlowName, String conformFlowName) { + DomainModel domainModel = new DomainModel(); + domainModel.setDomainName(domainName); + domainModel.setInputFlows(new ArrayList<>()); + domainModel.setConformFlows(new ArrayList<>()); + FileUtil.createFolderIfNecessary(userPluginDir + File.separator + + FileUtil.DOMAINS_FOLDER, domainName); + + FlowModelFactory flowModelFactory = new FlowModelFactory(domainName); + String domainDirPath = userPluginDir + File.separator + + FileUtil.DOMAINS_FOLDER + File.separator + domainName; + FlowModel inputFlow = flowModelFactory.createNewFlow(domainDirPath + + File.separator + FlowType.INPUT, inputFlowName, + FlowType.INPUT); + FlowModel conformFlow = flowModelFactory.createNewFlow(domainDirPath + + File.separator + FlowType.CONFORM, conformFlowName, + FlowType.CONFORM); + + domainModel.getInputFlows().add(inputFlow); + domainModel.getConformFlows().add(conformFlow); + + return domainModel; + } + + public DomainModel createDomain(String domainName, String domainFilePath) { + DomainModel domainModel = new DomainModel(); + domainModel.setDomainName(domainName); + domainModel.setSynched(this.domainsInServer.containsKey(domainName)); + + FlowModelFactory flowModelFactory = new FlowModelFactory( + this.domainsInServer.get(domainName), domainName); + domainModel.setInputFlows(this.getInputFlows(flowModelFactory, + domainFilePath)); + domainModel.setConformFlows(this.getConformFlows(flowModelFactory, + domainFilePath)); + + return domainModel; + } + + private List getInputFlows(FlowModelFactory flowModelFactory, + String domainFilePath) { + return this.getFlows(flowModelFactory, domainFilePath, FlowType.INPUT); + } + + private List getConformFlows(FlowModelFactory flowModelFactory, + String domainFilePath) { + return this + .getFlows(flowModelFactory, domainFilePath, FlowType.CONFORM); + } + + private List getFlows(FlowModelFactory flowModelFactory, + String domainFilePath, FlowType flowType) { + List flows = new ArrayList<>(); + String flowsFilePath = domainFilePath + File.separator + + flowType.getName(); + List flowNames = FileUtil.listDirectFolders(flowsFilePath); + for (String flowName : flowNames) { + FlowModel flowModel = flowModelFactory.createFlow(flowsFilePath, + flowName, flowType); + flows.add(flowModel); + } + return flows; + } } diff --git a/quick-start/src/main/java/com/marklogic/hub/factory/FlowModelFactory.java b/quick-start/src/main/java/com/marklogic/hub/factory/FlowModelFactory.java index 19c2c119d4..51b4e585a6 100644 --- a/quick-start/src/main/java/com/marklogic/hub/factory/FlowModelFactory.java +++ b/quick-start/src/main/java/com/marklogic/hub/factory/FlowModelFactory.java @@ -1,5 +1,6 @@ package com.marklogic.hub.factory; +import java.io.File; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -12,75 +13,77 @@ public class FlowModelFactory { - private Map flowsInServer = new LinkedHashMap<>(); - private String domainName; + private Map flowsInServer = new LinkedHashMap<>(); + private String domainName; - public FlowModelFactory(String domainName) { - // use this when creating a new domain in the client - this.domainName = domainName; - } + public FlowModelFactory(String domainName) { + // use this when creating a new domain in the client + this.domainName = domainName; + } - public FlowModelFactory(Domain domain, String domainName) { - // use this when comparing flows in the client and server - this.domainName = domainName; - if (domain != null) { - List flows = domain.getFlows(); - if (flows != null) { - for (Flow flow : flows) { - flowsInServer.put(flow.getName(), flow); - } - } - } - } + public FlowModelFactory(Domain domain, String domainName) { + // use this when comparing flows in the client and server + this.domainName = domainName; + if (domain != null) { + List flows = domain.getFlows(); + if (flows != null) { + for (Flow flow : flows) { + flowsInServer.put(flow.getName(), flow); + } + } + } + } - public FlowModel createNewFlow(String parentDirPath, String flowName, - FlowType flowType) { - FlowModel flowModel = new FlowModel(); - flowModel.setDomainName(domainName); - flowModel.setFlowName(flowName); - flowModel.setSynched(false); - this.createEmptyFlowDirectories(parentDirPath, flowName, flowType); - DirectoryModelFactory directoryModelFactory = new DirectoryModelFactory( - parentDirPath, flowName); - flowModel.setDirectory(directoryModelFactory.listFilesAndDirectories()); - return flowModel; - } + public FlowModel createNewFlow(String parentDirPath, String flowName, + FlowType flowType) { + FlowModel flowModel = new FlowModel(); + flowModel.setDomainName(domainName); + flowModel.setFlowName(flowName); + flowModel.setSynched(false); + this.createEmptyFlowDirectories(parentDirPath, flowName, flowType); + String absolutePath = parentDirPath + File.separator + flowName; + TreeDataFactory treeDataFactory = new TreeDataFactory(absolutePath, + flowName); + flowModel.setTreeData(treeDataFactory.listFilesAndDirectories()); + return flowModel; + } - private void createEmptyFlowDirectories(String parentDirPath, - String flowName, FlowType flowType) { - String newFlowPath = FileUtil.createFolderIfNecessary(parentDirPath, - flowName); - // create empty plugin directories - DirectoryModelFactory directoryModelFactory = new DirectoryModelFactory( - parentDirPath, flowName); - directoryModelFactory.addEmptyDirectories(newFlowPath, new String[] { - "content", "headers", "triples", "validations" }); - if (flowType == FlowType.CONFORM) { - directoryModelFactory.addEmptyDirectories(newFlowPath, - new String[] { "custom-flow", "collector", "writer" }); - directoryModelFactory.addDirectory(newFlowPath, "egress", - new String[] { "document-transforms", "search-options", - "REST-extensions" }); - } - directoryModelFactory.saveDirectories(); - } + private void createEmptyFlowDirectories(String parentDirPath, + String flowName, FlowType flowType) { + String newFlowPath = FileUtil.createFolderIfNecessary(parentDirPath, + flowName); + // create empty plugin directories + TreeDataFactory treeDataFactory = new TreeDataFactory(newFlowPath, + flowName); + treeDataFactory.addEmptyDirectories(newFlowPath, new String[] { + "content", "headers", "triples", "validations" }); + if (flowType == FlowType.CONFORM) { + treeDataFactory.addEmptyDirectories(newFlowPath, new String[] { + "custom-flow", "collector", "writer" }); + treeDataFactory.addDirectory(newFlowPath, "egress", + new String[] { "document-transforms", "search-options", + "REST-extensions" }); + } + treeDataFactory.saveDirectories(); + } - public FlowModel createFlow(String flowsFilePath, String flowName, - FlowType flowType) { - FlowModel flowModel = new FlowModel(); - flowModel.setDomainName(domainName); - flowModel.setFlowName(flowName); - DirectoryModelFactory directoryModelFactory = new DirectoryModelFactory( - flowsFilePath, flowName); - flowModel.setDirectory(directoryModelFactory.listFilesAndDirectories()); - Flow flow = this.flowsInServer.get(flowName); - boolean synched = false; - // TODO: confirm the value of the collector's type - if (flow != null && flow.getCollector() != null - && flowType.getType().equals(flow.getCollector().getType())) { - synched = true; - } - flowModel.setSynched(synched); - return flowModel; - } + public FlowModel createFlow(String parentDirPath, String flowName, + FlowType flowType) { + FlowModel flowModel = new FlowModel(); + flowModel.setDomainName(domainName); + flowModel.setFlowName(flowName); + String absolutePath = parentDirPath + File.separator + flowName; + TreeDataFactory treeDataFactory = new TreeDataFactory(absolutePath, + flowName); + flowModel.setTreeData(treeDataFactory.listFilesAndDirectories()); + Flow flow = this.flowsInServer.get(flowName); + boolean synched = false; + // TODO: confirm the value of the collector's type + if (flow != null && flow.getCollector() != null + && flowType.getType().equals(flow.getCollector().getType())) { + synched = true; + } + flowModel.setSynched(synched); + return flowModel; + } } diff --git a/quick-start/src/main/java/com/marklogic/hub/factory/TreeDataFactory.java b/quick-start/src/main/java/com/marklogic/hub/factory/TreeDataFactory.java new file mode 100644 index 0000000000..8b5ac8e1d8 --- /dev/null +++ b/quick-start/src/main/java/com/marklogic/hub/factory/TreeDataFactory.java @@ -0,0 +1,61 @@ +package com.marklogic.hub.factory; + +import java.io.File; +import java.util.List; + +import com.marklogic.hub.model.TreeData; +import com.marklogic.hub.util.FileUtil; + +public class TreeDataFactory { + + private TreeData treeData; + + public TreeDataFactory(String absolutePath, String label) { + treeData = new TreeData(absolutePath, label); + } + + public void addEmptyDirectories(String parentDirPath, String... labels) { + for (String label : labels) { + this.addEmptyDirectory(parentDirPath, label, treeData); + } + } + + private TreeData addEmptyDirectory(String parentDirPath, String label, + TreeData parentTreeData) { + TreeData treeData = new TreeData(parentDirPath, label); + parentTreeData.getChildren().add(treeData); + return treeData; + } + + public void addDirectory(String parentDirPath, String label, + String... childLabels) { + TreeData childTreeData = this.addEmptyDirectory(parentDirPath, label, + treeData); + String newDirecoryPath = parentDirPath + File.separator + label; + for (String childLabel : childLabels) { + this.addEmptyDirectory(newDirecoryPath, childLabel, childTreeData); + } + } + + public TreeData listFilesAndDirectories() { + if (treeData.getChildren().isEmpty()) { + treeData.setChildren(this.getChildren(treeData)); + } + return treeData; + } + + private List getChildren(TreeData treeData) { + List children = FileUtil.listDirectFilesAndFolders(treeData + .getData().get(TreeData.KEY_ABSOLUTE_PATH)); + for (TreeData childTreeData : children) { + if (childTreeData.isNoLeaf()) { + childTreeData.setChildren(this.getChildren(childTreeData)); + } + } + return children; + } + + public void saveDirectories() { + FileUtil.createDirectories(treeData); + } +} diff --git a/quick-start/src/main/java/com/marklogic/hub/model/DirectoryModel.java b/quick-start/src/main/java/com/marklogic/hub/model/DirectoryModel.java deleted file mode 100644 index 6016c82e11..0000000000 --- a/quick-start/src/main/java/com/marklogic/hub/model/DirectoryModel.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.marklogic.hub.model; - -import java.util.ArrayList; -import java.util.List; - -public class DirectoryModel { - - private String parentDirPath; - private String directoryName; - private List directories = new ArrayList<>(); - private List files = new ArrayList<>(); - - public DirectoryModel() { - - } - - public DirectoryModel(String parentDirPath, String directoryName) { - this.parentDirPath = parentDirPath; - this.directoryName = directoryName; - } - - public String getDirectoryName() { - return directoryName; - } - - public void setDirectoryName(String directoryName) { - this.directoryName = directoryName; - } - - public List getDirectories() { - return directories; - } - - public void setDirectories(List directories) { - this.directories = directories; - } - - public List getFiles() { - return files; - } - - public void setFiles(List files) { - this.files = files; - } - - public String getParentDirPath() { - return parentDirPath; - } - - public void setParentDirPath(String parentDirPath) { - this.parentDirPath = parentDirPath; - } - - public String toString() { - return directoryName; - } -} diff --git a/quick-start/src/main/java/com/marklogic/hub/model/FlowModel.java b/quick-start/src/main/java/com/marklogic/hub/model/FlowModel.java index 8a5b2f0424..d540434067 100644 --- a/quick-start/src/main/java/com/marklogic/hub/model/FlowModel.java +++ b/quick-start/src/main/java/com/marklogic/hub/model/FlowModel.java @@ -1,44 +1,43 @@ package com.marklogic.hub.model; - public class FlowModel { - private String domainName; - private String flowName; - private boolean isSynched; - private DirectoryModel directory; + private String domainName; + private String flowName; + private boolean isSynched; + private TreeData treeData; - public String getDomainName() { - return domainName; - } + public String getDomainName() { + return domainName; + } - public void setDomainName(String domainName) { - this.domainName = domainName; + public void setDomainName(String domainName) { + this.domainName = domainName; - } + } - public String getFlowName() { - return flowName; - } + public String getFlowName() { + return flowName; + } - public void setFlowName(String flowName) { - this.flowName = flowName; - } + public void setFlowName(String flowName) { + this.flowName = flowName; + } - public boolean isSynched() { - return isSynched; - } + public boolean isSynched() { + return isSynched; + } - public void setSynched(boolean isSynched) { - this.isSynched = isSynched; - } + public void setSynched(boolean isSynched) { + this.isSynched = isSynched; + } - public DirectoryModel getDirectory() { - return directory; - } + public TreeData getTreeData() { + return treeData; + } - public void setDirectory(DirectoryModel directory) { - this.directory = directory; - } + public void setTreeData(TreeData treeData) { + this.treeData = treeData; + } } diff --git a/quick-start/src/main/java/com/marklogic/hub/model/TreeData.java b/quick-start/src/main/java/com/marklogic/hub/model/TreeData.java new file mode 100644 index 0000000000..606998ce6e --- /dev/null +++ b/quick-start/src/main/java/com/marklogic/hub/model/TreeData.java @@ -0,0 +1,58 @@ +package com.marklogic.hub.model; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TreeData { + + public static final String KEY_ABSOLUTE_PATH = "absolutePath"; + + private Map data = new HashMap<>(); + private String label; + private List children = new ArrayList<>(); + private boolean noLeaf; + + public TreeData() { + + } + + public TreeData(String absolutePath, String label) { + data.put(KEY_ABSOLUTE_PATH, absolutePath); + this.label = label; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public boolean isNoLeaf() { + return noLeaf; + } + + public void setNoLeaf(boolean noLeaf) { + this.noLeaf = noLeaf; + } + + public Map getData() { + return data; + } + + public void setData(Map data) { + this.data = data; + } + +} diff --git a/quick-start/src/main/java/com/marklogic/hub/util/FileUtil.java b/quick-start/src/main/java/com/marklogic/hub/util/FileUtil.java index c588cf6ca5..2ac59b5f3b 100644 --- a/quick-start/src/main/java/com/marklogic/hub/util/FileUtil.java +++ b/quick-start/src/main/java/com/marklogic/hub/util/FileUtil.java @@ -7,67 +7,84 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.marklogic.hub.model.DirectoryModel; +import com.marklogic.hub.model.TreeData; public class FileUtil { - private static final Logger LOGGER = LoggerFactory - .getLogger(FileUtil.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(FileUtil.class); - public static final String DOMAINS_FOLDER = "domains"; + public static final String DOMAINS_FOLDER = "domains"; - public static List listDirectFolders(String path) { - List folders = new ArrayList<>(); - File rootDirectory = new File(path); - if (rootDirectory.exists() && rootDirectory.isDirectory()) { - File[] files = rootDirectory.listFiles(); - for (File file : files) { - if (file.isDirectory() && !file.isHidden()) { - folders.add(file.getName()); - } - } - } - return folders; - } + public static List listDirectFolders(String path) { + List folders = new ArrayList<>(); + File rootDirectory = new File(path); + if (rootDirectory.exists() && rootDirectory.isDirectory()) { + File[] files = rootDirectory.listFiles(); + for (File file : files) { + if (file.isDirectory() && !file.isHidden()) { + folders.add(file.getName()); + } + } + } + return folders; + } - public static List listDirectFiles(String path) { - List filenames = new ArrayList<>(); - File rootDirectory = new File(path); - if (rootDirectory.exists() && rootDirectory.isDirectory()) { - File[] files = rootDirectory.listFiles(); - for (File file : files) { - if (!file.isDirectory() && !file.isHidden()) { - filenames.add(file.getName()); - } - } - } - return filenames; - } + public static List listDirectFiles(String path) { + List filenames = new ArrayList<>(); + File rootDirectory = new File(path); + if (rootDirectory.exists() && rootDirectory.isDirectory()) { + File[] files = rootDirectory.listFiles(); + for (File file : files) { + if (!file.isDirectory() && !file.isHidden()) { + filenames.add(file.getName()); + } + } + } + return filenames; + } - public static String createFolderIfNecessary(String path, String folderName) { - File rootDirectory = new File(path); - if (!rootDirectory.exists()) { - LOGGER.debug("New folder is created at " - + rootDirectory.getAbsolutePath()); - rootDirectory.mkdir(); - } - if (rootDirectory.exists() && rootDirectory.isDirectory()) { - File folder = new File(rootDirectory.getAbsolutePath() - + File.separator + folderName); - if (!folder.exists()) { - folder.mkdir(); - LOGGER.debug("New folder is created at " - + folder.getAbsolutePath()); - } - } - return path + File.separator + folderName; - } + public static List listDirectFilesAndFolders(String path) { + List treeDataList = new ArrayList<>(); + File rootDirectory = new File(path); + if (rootDirectory.exists() && rootDirectory.isDirectory()) { + File[] files = rootDirectory.listFiles(); + for (File file : files) { + if (!file.isHidden()) { + TreeData treeData = new TreeData(file.getAbsolutePath(), + file.getName()); + treeData.setNoLeaf(file.isDirectory()); + treeDataList.add(treeData); + } + } + } + return treeDataList; + } - public static void createDirectories(DirectoryModel directoryModel) { - FileUtil.createFolderIfNecessary(directoryModel.getParentDirPath(), - directoryModel.getDirectoryName()); - for (DirectoryModel childDirectory : directoryModel.getDirectories()) { - FileUtil.createDirectories(childDirectory); - } - } + public static String createFolderIfNecessary(String path, String folderName) { + File rootDirectory = new File(path); + if (!rootDirectory.exists()) { + LOGGER.debug("New folder is created at " + + rootDirectory.getAbsolutePath()); + rootDirectory.mkdir(); + } + if (rootDirectory.exists() && rootDirectory.isDirectory()) { + File folder = new File(rootDirectory.getAbsolutePath() + + File.separator + folderName); + if (!folder.exists()) { + folder.mkdir(); + LOGGER.debug("New folder is created at " + + folder.getAbsolutePath()); + } + } + return path + File.separator + folderName; + } + + public static void createDirectories(TreeData treeData) { + File file = new File(treeData.getData().get(TreeData.KEY_ABSOLUTE_PATH)); + FileUtil.createFolderIfNecessary(file.getParent(), treeData.getLabel()); + for (TreeData childTreeData : treeData.getChildren()) { + FileUtil.createDirectories(childTreeData); + } + } } diff --git a/quick-start/src/main/webapp/WEB-INF/static/app/quickStartApp.js b/quick-start/src/main/webapp/WEB-INF/static/app/quickStartApp.js index ca96d989ed..96b5718eb8 100644 --- a/quick-start/src/main/webapp/WEB-INF/static/app/quickStartApp.js +++ b/quick-start/src/main/webapp/WEB-INF/static/app/quickStartApp.js @@ -4,6 +4,7 @@ var dependencies = [ ,'dhib.quickstart.controller.top' ,'dhib.quickstart.directives.header' ,'dhib.quickstart.directives.footer' + ,'angularBootstrapNavTree' ]; var module = angular.module('quickStartApp', dependencies); diff --git a/quick-start/src/main/webapp/WEB-INF/static/css/quick-start.css b/quick-start/src/main/webapp/WEB-INF/static/css/quick-start.css index 410cfd8d14..e83ba69251 100644 --- a/quick-start/src/main/webapp/WEB-INF/static/css/quick-start.css +++ b/quick-start/src/main/webapp/WEB-INF/static/css/quick-start.css @@ -184,4 +184,17 @@ li.folder, li.file { display: -webkit-flex; display: -ms-flexbox; display: flex; +} + +ul.abn-tree { + padding-left: 30px; +} + +ul.abn-tree li.abn-tree-row a { + color: #2a2d2b; + font-size: 18px; +} + +ul.nav.abn-tree i { + font-size: 18px; } \ No newline at end of file diff --git a/quick-start/src/main/webapp/WEB-INF/static/index.html b/quick-start/src/main/webapp/WEB-INF/static/index.html index 8a47094292..57381e363f 100644 --- a/quick-start/src/main/webapp/WEB-INF/static/index.html +++ b/quick-start/src/main/webapp/WEB-INF/static/index.html @@ -18,6 +18,7 @@ + @@ -32,6 +33,7 @@ + diff --git a/quick-start/src/main/webapp/WEB-INF/static/lib/abn_tree/css/abn_tree.css b/quick-start/src/main/webapp/WEB-INF/static/lib/abn_tree/css/abn_tree.css new file mode 100644 index 0000000000..48864e9f3a --- /dev/null +++ b/quick-start/src/main/webapp/WEB-INF/static/lib/abn_tree/css/abn_tree.css @@ -0,0 +1,121 @@ +/* + abn-tree.css + + style for the angular-bootstrap-nav-tree + for both Bootstrap 2 and Bootstrap 3 + +*/ + + + +/* ------------------------------------------ +AngularJS Animations... + +The first selector is for Angular 1.1.5 +The second selector is for Angular 1.2.0 + +*/ +.abn-tree-animate-enter, +li.abn-tree-row.ng-enter { + transition: 200ms linear all; + position: relative; + display: block; + opacity: 0; + max-height:0px; +} +.abn-tree-animate-enter.abn-tree-animate-enter-active, +li.abn-tree-row.ng-enter-active{ + opacity: 1; + max-height:30px; +} + +.abn-tree-animate-leave, +li.abn-tree-row.ng-leave { + transition: 200ms linear all; + position: relative; + display: block; + height:30px; + max-height: 30px; + opacity: 1; +} +.abn-tree-animate-leave.abn-tree-animate-leave-active, +li.abn-tree-row.ng-leave-active { + height: 0px; + max-height:0px; + opacity: 0; +} + + +/* +------------------------------------------ +Angular 1.2.0 Animation +*/ + + +.abn-tree-animate.ng-enter{ + +} +.abn-tree-animate.ng-enter{ + +} + + + + +/* + end animation stuff +----------------------------------------- + begin normal css stuff +*/ +ul.abn-tree li.abn-tree-row { + padding: 0px; + margin:0px; +} + +ul.abn-tree li.abn-tree-row a { + padding: 3px 10px; +} + +ul.abn-tree i.indented { + padding: 2px; +} + +.abn-tree { + cursor: pointer; +} +ul.nav.abn-tree .level-1 .indented { + position: relative; + left: 0px; +} +ul.nav.abn-tree .level-2 .indented { + position: relative; + left: 20px; +} +ul.nav.abn-tree .level-3 .indented { + position: relative; + left: 40px; +} +ul.nav.abn-tree .level-4 .indented { + position: relative; + left: 60px; +} +ul.nav.abn-tree .level-5 .indented { + position: relative; + left: 80px; +} +ul.nav.abn-tree .level-6 .indented { + position: relative; + left: 100px; +} +ul.nav.nav-list.abn-tree .level-7 .indented { + position: relative; + left: 120px; +} +ul.nav.nav-list.abn-tree .level-8 .indented { + position: relative; + left: 140px; +} +ul.nav.nav-list.abn-tree .level-9 .indented { + position: relative; + left: 160px; +} diff --git a/quick-start/src/main/webapp/WEB-INF/static/lib/abn_tree/js/abn_tree_directive.js b/quick-start/src/main/webapp/WEB-INF/static/lib/abn_tree/js/abn_tree_directive.js new file mode 100644 index 0000000000..f309995334 --- /dev/null +++ b/quick-start/src/main/webapp/WEB-INF/static/lib/abn_tree/js/abn_tree_directive.js @@ -0,0 +1,492 @@ +(function() { + var module, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + module = angular.module('angularBootstrapNavTree', []); + + module.directive('abnTree', [ + '$timeout', function($timeout) { + return { + restrict: 'E', + template: "", + replace: true, + scope: { + treeData: '=', + onSelect: '&', + initialSelection: '@', + treeControl: '=' + }, + link: function(scope, element, attrs) { + var error, expand_all_parents, expand_level, for_all_ancestors, for_each_branch, get_parent, n, on_treeData_change, select_branch, selected_branch, tree; + error = function(s) { + console.log('ERROR:' + s); + debugger; + return void 0; + }; + if (attrs.iconExpand == null) { + attrs.iconExpand = 'icon-plus glyphicon glyphicon-plus fa fa-plus'; + } + if (attrs.iconCollapse == null) { + attrs.iconCollapse = 'icon-minus glyphicon glyphicon-minus fa fa-minus'; + } + if (attrs.iconLeaf == null) { + attrs.iconLeaf = 'icon-file glyphicon glyphicon-file fa fa-file'; + } + if (attrs.expandLevel == null) { + attrs.expandLevel = '3'; + } + expand_level = parseInt(attrs.expandLevel, 10); + if (!scope.treeData) { + alert('no treeData defined for the tree!'); + return; + } + if (scope.treeData.length == null) { + if (treeData.label != null) { + scope.treeData = [treeData]; + } else { + alert('treeData should be an array of root branches'); + return; + } + } + for_each_branch = function(f) { + var do_f, root_branch, _i, _len, _ref, _results; + do_f = function(branch, level) { + var child, _i, _len, _ref, _results; + f(branch, level); + if (branch.children != null) { + _ref = branch.children; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + _results.push(do_f(child, level + 1)); + } + return _results; + } + }; + _ref = scope.treeData; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + root_branch = _ref[_i]; + _results.push(do_f(root_branch, 1)); + } + return _results; + }; + selected_branch = null; + select_branch = function(branch) { + if (!branch) { + if (selected_branch != null) { + selected_branch.selected = false; + } + selected_branch = null; + return; + } + if (branch !== selected_branch) { + if (selected_branch != null) { + selected_branch.selected = false; + } + branch.selected = true; + selected_branch = branch; + expand_all_parents(branch); + if (branch.onSelect != null) { + return $timeout(function() { + return branch.onSelect(branch); + }); + } else { + if (scope.onSelect != null) { + return $timeout(function() { + return scope.onSelect({ + branch: branch + }); + }); + } + } + } + }; + scope.user_clicks_branch = function(branch) { + if (branch !== selected_branch) { + return select_branch(branch); + } + }; + get_parent = function(child) { + var parent; + parent = void 0; + if (child.parent_uid) { + for_each_branch(function(b) { + if (b.uid === child.parent_uid) { + return parent = b; + } + }); + } + return parent; + }; + for_all_ancestors = function(child, fn) { + var parent; + parent = get_parent(child); + if (parent != null) { + fn(parent); + return for_all_ancestors(parent, fn); + } + }; + expand_all_parents = function(child) { + return for_all_ancestors(child, function(b) { + return b.expanded = true; + }); + }; + scope.tree_rows = []; + on_treeData_change = function() { + var add_branch_to_list, root_branch, _i, _len, _ref, _results; + for_each_branch(function(b, level) { + if (!b.uid) { + return b.uid = "" + Math.random(); + } + }); + console.log('UIDs are set.'); + for_each_branch(function(b) { + var child, _i, _len, _ref, _results; + if (angular.isArray(b.children)) { + _ref = b.children; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + _results.push(child.parent_uid = b.uid); + } + return _results; + } + }); + scope.tree_rows = []; + for_each_branch(function(branch) { + var child, f; + if (branch.children) { + if (branch.children.length > 0) { + f = function(e) { + if (typeof e === 'string') { + return { + label: e, + children: [] + }; + } else { + return e; + } + }; + return branch.children = (function() { + var _i, _len, _ref, _results; + _ref = branch.children; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + _results.push(f(child)); + } + return _results; + })(); + } + } else { + return branch.children = []; + } + }); + add_branch_to_list = function(level, branch, visible) { + var child, child_visible, tree_icon, _i, _len, _ref, _results; + if (branch.expanded == null) { + branch.expanded = false; + } + if (branch.classes == null) { + branch.classes = []; + } + if (!branch.noLeaf && (!branch.children || branch.children.length === 0)) { + tree_icon = attrs.iconLeaf; + if (__indexOf.call(branch.classes, "leaf") < 0) { + branch.classes.push("leaf"); + } + } else { + if (branch.expanded) { + tree_icon = attrs.iconCollapse; + } else { + tree_icon = attrs.iconExpand; + } + } + scope.tree_rows.push({ + level: level, + branch: branch, + label: branch.label, + classes: branch.classes, + tree_icon: tree_icon, + visible: visible + }); + if (branch.children != null) { + _ref = branch.children; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + child_visible = visible && branch.expanded; + _results.push(add_branch_to_list(level + 1, child, child_visible)); + } + return _results; + } + }; + _ref = scope.treeData; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + root_branch = _ref[_i]; + _results.push(add_branch_to_list(1, root_branch, true)); + } + return _results; + }; + scope.$watch('treeData', on_treeData_change, true); + if (attrs.initialSelection != null) { + for_each_branch(function(b) { + if (b.label === attrs.initialSelection) { + return $timeout(function() { + return select_branch(b); + }); + } + }); + } + n = scope.treeData.length; + console.log('num root branches = ' + n); + for_each_branch(function(b, level) { + b.level = level; + return b.expanded = b.level < expand_level; + }); + if (scope.treeControl != null) { + if (angular.isObject(scope.treeControl)) { + tree = scope.treeControl; + tree.expand_all = function() { + return for_each_branch(function(b, level) { + return b.expanded = true; + }); + }; + tree.collapse_all = function() { + return for_each_branch(function(b, level) { + return b.expanded = false; + }); + }; + tree.get_first_branch = function() { + n = scope.treeData.length; + if (n > 0) { + return scope.treeData[0]; + } + }; + tree.select_first_branch = function() { + var b; + b = tree.get_first_branch(); + return tree.select_branch(b); + }; + tree.get_selected_branch = function() { + return selected_branch; + }; + tree.get_parent_branch = function(b) { + return get_parent(b); + }; + tree.select_branch = function(b) { + select_branch(b); + return b; + }; + tree.get_children = function(b) { + return b.children; + }; + tree.select_parent_branch = function(b) { + var p; + if (b == null) { + b = tree.get_selected_branch(); + } + if (b != null) { + p = tree.get_parent_branch(b); + if (p != null) { + tree.select_branch(p); + return p; + } + } + }; + tree.add_branch = function(parent, new_branch) { + if (parent != null) { + parent.children.push(new_branch); + parent.expanded = true; + } else { + scope.treeData.push(new_branch); + } + return new_branch; + }; + tree.add_root_branch = function(new_branch) { + tree.add_branch(null, new_branch); + return new_branch; + }; + tree.expand_branch = function(b) { + if (b == null) { + b = tree.get_selected_branch(); + } + if (b != null) { + b.expanded = true; + return b; + } + }; + tree.collapse_branch = function(b) { + if (b == null) { + b = selected_branch; + } + if (b != null) { + b.expanded = false; + return b; + } + }; + tree.get_siblings = function(b) { + var p, siblings; + if (b == null) { + b = selected_branch; + } + if (b != null) { + p = tree.get_parent_branch(b); + if (p) { + siblings = p.children; + } else { + siblings = scope.treeData; + } + return siblings; + } + }; + tree.get_next_sibling = function(b) { + var i, siblings; + if (b == null) { + b = selected_branch; + } + if (b != null) { + siblings = tree.get_siblings(b); + n = siblings.length; + i = siblings.indexOf(b); + if (i < n) { + return siblings[i + 1]; + } + } + }; + tree.get_prev_sibling = function(b) { + var i, siblings; + if (b == null) { + b = selected_branch; + } + siblings = tree.get_siblings(b); + n = siblings.length; + i = siblings.indexOf(b); + if (i > 0) { + return siblings[i - 1]; + } + }; + tree.select_next_sibling = function(b) { + var next; + if (b == null) { + b = selected_branch; + } + if (b != null) { + next = tree.get_next_sibling(b); + if (next != null) { + return tree.select_branch(next); + } + } + }; + tree.select_prev_sibling = function(b) { + var prev; + if (b == null) { + b = selected_branch; + } + if (b != null) { + prev = tree.get_prev_sibling(b); + if (prev != null) { + return tree.select_branch(prev); + } + } + }; + tree.get_first_child = function(b) { + var _ref; + if (b == null) { + b = selected_branch; + } + if (b != null) { + if (((_ref = b.children) != null ? _ref.length : void 0) > 0) { + return b.children[0]; + } + } + }; + tree.get_closest_ancestor_next_sibling = function(b) { + var next, parent; + next = tree.get_next_sibling(b); + if (next != null) { + return next; + } else { + parent = tree.get_parent_branch(b); + return tree.get_closest_ancestor_next_sibling(parent); + } + }; + tree.get_next_branch = function(b) { + var next; + if (b == null) { + b = selected_branch; + } + if (b != null) { + next = tree.get_first_child(b); + if (next != null) { + return next; + } else { + next = tree.get_closest_ancestor_next_sibling(b); + return next; + } + } + }; + tree.select_next_branch = function(b) { + var next; + if (b == null) { + b = selected_branch; + } + if (b != null) { + next = tree.get_next_branch(b); + if (next != null) { + tree.select_branch(next); + return next; + } + } + }; + tree.last_descendant = function(b) { + var last_child; + if (b == null) { + debugger; + } + n = b.children.length; + if (n === 0) { + return b; + } else { + last_child = b.children[n - 1]; + return tree.last_descendant(last_child); + } + }; + tree.get_prev_branch = function(b) { + var parent, prev_sibling; + if (b == null) { + b = selected_branch; + } + if (b != null) { + prev_sibling = tree.get_prev_sibling(b); + if (prev_sibling != null) { + return tree.last_descendant(prev_sibling); + } else { + parent = tree.get_parent_branch(b); + return parent; + } + } + }; + return tree.select_prev_branch = function(b) { + var prev; + if (b == null) { + b = selected_branch; + } + if (b != null) { + prev = tree.get_prev_branch(b); + if (prev != null) { + tree.select_branch(prev); + return prev; + } + } + }; + } + } + } + }; + } + ]); + +}).call(this); diff --git a/quick-start/src/main/webapp/WEB-INF/static/top/flows.html b/quick-start/src/main/webapp/WEB-INF/static/top/flows.html index 98b1cdf97a..1cb3f8e41a 100644 --- a/quick-start/src/main/webapp/WEB-INF/static/top/flows.html +++ b/quick-start/src/main/webapp/WEB-INF/static/top/flows.html @@ -7,16 +7,7 @@

Run -
    -
  • -

    {{directory.directoryName}}

    -
  • -
-
    -
  • -

    {{file}}

    -
  • -
+
@@ -28,16 +19,7 @@

Run -
    -
  • -

    {{directory.directoryName}}

    -
  • -
-
    -
  • -

    {{file}}

    -
  • -
+
diff --git a/quick-start/src/main/webapp/WEB-INF/static/top/modal/domainModal.html b/quick-start/src/main/webapp/WEB-INF/static/top/modal/domainModal.html index dc74f8872f..0fcbb87fa5 100644 --- a/quick-start/src/main/webapp/WEB-INF/static/top/modal/domainModal.html +++ b/quick-start/src/main/webapp/WEB-INF/static/top/modal/domainModal.html @@ -1,44 +1,43 @@