/* * 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 - 2013 Pentaho Corporation. All rights reserved. */ package org.pentaho.platform.engine.services.solution; 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 java.util.ArrayList; import java.util.List; 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$ } } } } // // // Only analyzer uses this.. is this necessary? private static final ThreadLocal threadSolutionRepositories = new ThreadLocal(); public static void setSolutionRepositoryThreadVariable( Object repository ) { SolutionReposHelper.threadSolutionRepositories.set( repository ); } public static Object getSolutionRepositoryThreadVariable() { return 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 ); } } } }