/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License, version 2 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* Copyright 2006 - 2008 Pentaho Corporation. All rights reserved.
*
*/
package org.pentaho.platform.engine.services.solution;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.pentaho.platform.api.engine.ISolutionAttributeContributor;
import org.pentaho.platform.api.engine.ISolutionFile;
import org.pentaho.platform.api.engine.ISolutionFilter;
import org.pentaho.platform.api.repository.ISolutionRepository;
public class SolutionReposHelper {
public static final String TREE_NODE_NAME = "tree"; //$NON-NLS-1$
public static final String ENTRY_NODE_NAME = "entry"; //$NON-NLS-1$
public static final String TYPE_ATTR_NAME = "type"; //$NON-NLS-1$
public static final String NAME_ATTR_NAME = "name"; //$NON-NLS-1$
public static final String DIRECTORY_ATTR = "directory"; //$NON-NLS-1$
public static final String FILE_ATTR = "file"; //$NON-NLS-1$
public static final String BRANCH_NODE_NAME = "branch"; //$NON-NLS-1$
public static final String BRANCH_TEXT_NODE_NAME = "branchText"; //$NON-NLS-1$
public static final String ID_ATTR_NAME = "id"; //$NON-NLS-1$
public static final String IS_DIR_ATTR_NAME = "isDir"; //$NON-NLS-1$
public static final String LEAF_NODE_NAME = "leaf"; //$NON-NLS-1$
public static final String LEAF_TEXT_NODE_NAME = "leafText"; //$NON-NLS-1$
public static final String LINK_NODE_NAME = "link"; //$NON-NLS-1$
public static final String PATH_TEXT_NODE_NAME = "path"; //$NON-NLS-1$
public static final ISolutionFilter KEEP_ALL_FILTER = new ISolutionFilter() {
public boolean keepFile(ISolutionFile solutionFile, int actionOperation) {
return solutionFile != null;
}
};
public static final ISolutionFilter DEFAULT_FILTER = new ISolutionFilter() {
public boolean keepFile(ISolutionFile solutionFile, int actionOperation) {
return solutionFile != null && !ignoreFile(solutionFile);
}
};
public static final ISolutionAttributeContributor ADD_NOTHING_CONTRIBUTOR = new ISolutionAttributeContributor() {
public void contributeAttributes(ISolutionFile solutionFile, Element childNode) {
}
};
static List ignoreDirectories = new ArrayList();
static List ignoreFiles = new ArrayList();
static {
// all names in lower case to work correctly
SolutionReposHelper.ignoreDirectories.add("cvs"); //$NON-NLS-1$
SolutionReposHelper.ignoreDirectories.add("system"); //$NON-NLS-1$
SolutionReposHelper.ignoreDirectories.add(".svn"); //$NON-NLS-1$
SolutionReposHelper.ignoreFiles.add(".cvsignore"); //$NON-NLS-1$
}
private SolutionReposHelper() {
}
public static boolean ignoreFile(final ISolutionFile solutionFile) {
if (solutionFile.isDirectory()) {
return ignoreDirectories.contains(solutionFile.getFileName().toLowerCase());
}
return ignoreFiles.contains(solutionFile.getFileName().toLowerCase());
}
public static boolean ignoreFile(final String fileName) {
return (SolutionReposHelper.ignoreFiles.contains(fileName.toLowerCase()));
}
public static boolean ignoreDirectory(final String dirName) {
return (SolutionReposHelper.ignoreDirectories.contains(dirName.toLowerCase()));
}
public static boolean isActionSequence(final ISolutionFile solutionFile) {
String fileName = solutionFile.getFileName();
return ((fileName != null) ? fileName.toLowerCase().endsWith(".xaction") : false); //$NON-NLS-1$
}
public static Document getActionSequences(final ISolutionFile targetFile, final int actionOperation) {
return SolutionReposHelper.getActionSequences(targetFile, SolutionReposHelper.ADD_NOTHING_CONTRIBUTOR, actionOperation);
}
public static Document getActionSequences(final ISolutionFile targetFile, final ISolutionAttributeContributor contributor, final int actionOperation) {
Document document = DocumentHelper.createDocument();
Element root = document.addElement(SolutionReposHelper.TREE_NODE_NAME);
SolutionReposHelper.processSolutionTree(root, targetFile, new ISolutionFilter() {
public boolean keepFile(final ISolutionFile solutionFile, final int actOperation) {
return (solutionFile.isDirectory() || SolutionReposHelper.isActionSequence(solutionFile)) && DEFAULT_FILTER.keepFile(solutionFile, actionOperation);
}
}, contributor, actionOperation);
return (document);
}
public static Document processSolutionTree(final ISolutionFile targetFile, final int actionOperation) {
Document document = DocumentHelper.createDocument();
Element root = document.addElement(SolutionReposHelper.TREE_NODE_NAME);
SolutionReposHelper.processSolutionTree(root, targetFile, null, actionOperation);
return (document);
}
public static void processSolutionTree(final Element parentNode, final ISolutionFile targetFile, final int actionOperation) {
SolutionReposHelper.processSolutionTree(parentNode, targetFile, null, actionOperation);
}
public static void processSolutionStructure(final Element parentNode, final ISolutionFile targetFile, final int actionOperation) {
SolutionReposHelper.processSolutionStructure(parentNode, targetFile, null, actionOperation);
}
public static void processSolutionTree(final Element parentNode, final ISolutionFile targetFile, final ISolutionFilter solutionFilter, final int actionOperation) {
SolutionReposHelper.processSolutionTree(parentNode, targetFile, solutionFilter, SolutionReposHelper.ADD_NOTHING_CONTRIBUTOR, actionOperation);
}
public static void processSolutionTree(final Element parentNode, final ISolutionFile targetFile, final ISolutionFilter solutionFilter, final ISolutionAttributeContributor contributor, final int actionOperation) {
ISolutionFilter sFilter = solutionFilter == null ? DEFAULT_FILTER : solutionFilter;
if (targetFile != null) {
if (sFilter.keepFile(targetFile, actionOperation)) {
if (targetFile.isDirectory()) {
Element childNode = parentNode.addElement(SolutionReposHelper.BRANCH_NODE_NAME).addAttribute(SolutionReposHelper.ID_ATTR_NAME, targetFile.getFullPath()).addAttribute(SolutionReposHelper.IS_DIR_ATTR_NAME, "true"); //$NON-NLS-1$
contributor.contributeAttributes(targetFile, childNode);
if (targetFile.isRoot()) {
childNode.addElement(SolutionReposHelper.BRANCH_TEXT_NODE_NAME).setText("/"); //$NON-NLS-1$
} else {
childNode.addElement(SolutionReposHelper.BRANCH_TEXT_NODE_NAME).setText(targetFile.getFileName());
}
ISolutionFile files[] = targetFile.listFiles();
for (ISolutionFile file : files) {
SolutionReposHelper.processSolutionTree(childNode, file, sFilter, contributor, actionOperation);
}
} else {
Element childNode = parentNode.addElement(SolutionReposHelper.LEAF_NODE_NAME).addAttribute(SolutionReposHelper.IS_DIR_ATTR_NAME, "false"); //$NON-NLS-1$
contributor.contributeAttributes(targetFile, childNode);
childNode.addElement(SolutionReposHelper.LEAF_TEXT_NODE_NAME).setText(targetFile.getFileName());
childNode.addElement(SolutionReposHelper.PATH_TEXT_NODE_NAME).setText(targetFile.getFullPath());
childNode.addElement(SolutionReposHelper.LINK_NODE_NAME).setText("#"); //$NON-NLS-1$
}
}
}
}
private static final ThreadLocal threadSolutionRepositories = new ThreadLocal();
public static void setSolutionRepositoryThreadVariable(ISolutionRepository repository) {
SolutionReposHelper.threadSolutionRepositories.set(repository);
}
public static ISolutionRepository getSolutionRepositoryThreadVariable() {
return (ISolutionRepository) SolutionReposHelper.threadSolutionRepositories.get();
}
public static void processSolutionStructure(final Element parentNode, final ISolutionFile targetFile, final ISolutionFilter solutionFilter, final int actionOperation) {
SolutionReposHelper.processSolutionStructure(parentNode, targetFile, solutionFilter, SolutionReposHelper.ADD_NOTHING_CONTRIBUTOR, actionOperation);
}
public static void processSolutionStructure(final Element parentNode, final ISolutionFile targetFile, final ISolutionFilter solutionFilter, final ISolutionAttributeContributor contributor, final int actionOperation) {
ISolutionFilter sFilter = solutionFilter == null ? DEFAULT_FILTER : solutionFilter;
if (targetFile.isDirectory()) {
if (!SolutionReposHelper.ignoreDirectories.contains(targetFile.getFileName()) && sFilter.keepFile(targetFile, actionOperation)) {
Element childNode = parentNode.addElement(SolutionReposHelper.ENTRY_NODE_NAME).addAttribute(SolutionReposHelper.TYPE_ATTR_NAME, SolutionReposHelper.DIRECTORY_ATTR).addAttribute(SolutionReposHelper.NAME_ATTR_NAME, targetFile.getFileName());
contributor.contributeAttributes(targetFile, childNode);
ISolutionFile files[] = targetFile.listFiles();
for (ISolutionFile file : files) {
SolutionReposHelper.processSolutionStructure(childNode, file, actionOperation);
}
}
} else {
if (!SolutionReposHelper.ignoreFiles.contains(targetFile.getFileName()) && sFilter.keepFile(targetFile, actionOperation)) {
Element childNode = parentNode.addElement(SolutionReposHelper.ENTRY_NODE_NAME).addAttribute(SolutionReposHelper.TYPE_ATTR_NAME, SolutionReposHelper.FILE_ATTR).addAttribute(SolutionReposHelper.NAME_ATTR_NAME, targetFile.getFileName());
contributor.contributeAttributes(targetFile, childNode);
}
}
}
}