001: /*
002: * Copyright 2006 Pentaho Corporation. All rights reserved.
003: * This software was developed by Pentaho Corporation and is provided under the terms
004: * of the Mozilla Public License, Version 1.1, or any later version. You may not use
005: * this file except in compliance with the license. If you need a copy of the license,
006: * please go to http://www.mozilla.org/MPL/MPL-1.1.txt. The Original Code is the Pentaho
007: * BI Platform. The Initial Developer is Pentaho Corporation.
008: *
009: * Software distributed under the Mozilla Public License is distributed on an "AS IS"
010: * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. Please refer to
011: * the license for the specific language governing your rights and limitations.
012: */
013: package org.pentaho.core.solution;
014:
015: import java.util.ArrayList;
016: import java.util.List;
017:
018: import org.dom4j.Document;
019: import org.dom4j.DocumentHelper;
020: import org.dom4j.Element;
021:
022: public class SolutionReposUtil {
023:
024: public static final String TREE_NODE_NAME = "tree"; //$NON-NLS-1$
025:
026: public static final String ENTRY_NODE_NAME = "entry"; //$NON-NLS-1$
027:
028: public static final String TYPE_ATTR_NAME = "type"; //$NON-NLS-1$
029:
030: public static final String NAME_ATTR_NAME = "name"; //$NON-NLS-1$
031:
032: public static final String DIRECTORY_ATTR = "directory"; //$NON-NLS-1$
033:
034: public static final String FILE_ATTR = "file"; //$NON-NLS-1$
035:
036: public static final String BRANCH_NODE_NAME = "branch"; //$NON-NLS-1$
037:
038: public static final String BRANCH_TEXT_NODE_NAME = "branchText"; //$NON-NLS-1$
039:
040: public static final String ID_ATTR_NAME = "id"; //$NON-NLS-1$
041:
042: public static final String IS_DIR_ATTR_NAME = "isDir"; //$NON-NLS-1$
043:
044: public static final String LEAF_NODE_NAME = "leaf"; //$NON-NLS-1$
045:
046: public static final String LEAF_TEXT_NODE_NAME = "leafText"; //$NON-NLS-1$
047:
048: public static final String LINK_NODE_NAME = "link"; //$NON-NLS-1$
049:
050: public static final String PATH_TEXT_NODE_NAME = "path"; //$NON-NLS-1$
051:
052: public static ISolutionFilter KEEP_ALL_FILTER = new ISolutionFilter() {
053: public boolean keepFile(ISolutionFile solutionFile,
054: int actionOperation) {
055: return true;
056: }
057: };
058:
059: public static ISolutionAttributeContributor ADD_NOTHING_CONTRIBUTOR = new ISolutionAttributeContributor() {
060: public void contributeAttributes(ISolutionFile solutionFile,
061: Element childNode) {
062:
063: }
064: };
065:
066: static List ignoreDirectories = new ArrayList();
067:
068: static List ignoreFiles = new ArrayList();
069:
070: static {
071: ignoreDirectories.add("CVS"); //$NON-NLS-1$
072: ignoreDirectories.add("system"); //$NON-NLS-1$
073: ignoreDirectories.add(".svn"); //$NON-NLS-1$
074:
075: ignoreFiles.add(".cvsignore"); //$NON-NLS-1$
076: }
077:
078: private SolutionReposUtil() {
079: }
080:
081: public static boolean ignoreFile(String fileName) {
082: /*
083: * Iterator iter = ignoreFiles.iterator(); while (iter.hasNext()) { if
084: * (fileName.toLowerCase().endsWith(iter.next().toString())) { return
085: * true; } } return false;
086: */
087: return (ignoreFiles.contains(fileName));
088: }
089:
090: public static boolean ignoreDirectory(String dirName) {
091: return (ignoreDirectories.contains(dirName));
092: }
093:
094: public static boolean isActionSequence(ISolutionFile solutionFile) {
095: String fileName = solutionFile.getFileName();
096: return ((fileName != null) ? fileName.toLowerCase().endsWith(
097: ".xaction") : false); //$NON-NLS-1$
098: }
099:
100: public static Document getActionSequences(ISolutionFile targetFile,
101: int actionOperation) {
102: return getActionSequences(targetFile, ADD_NOTHING_CONTRIBUTOR,
103: actionOperation);
104: }
105:
106: public static Document getActionSequences(ISolutionFile targetFile,
107: ISolutionAttributeContributor contributor,
108: int actionOperation) {
109: Document document = DocumentHelper.createDocument();
110: Element root = document.addElement(TREE_NODE_NAME);
111: processSolutionTree(root, targetFile, new ISolutionFilter() {
112: public boolean keepFile(ISolutionFile solutionFile,
113: int actOperation) {
114: return (solutionFile.isDirectory() || isActionSequence(solutionFile));
115: }
116: }, contributor, actionOperation);
117: return (document);
118: }
119:
120: public static Document processSolutionTree(
121: ISolutionFile targetFile, int actionOperation) {
122: Document document = DocumentHelper.createDocument();
123: Element root = document.addElement(TREE_NODE_NAME);
124: processSolutionTree(root, targetFile, KEEP_ALL_FILTER,
125: actionOperation);
126: return (document);
127: }
128:
129: public static void processSolutionTree(Element parentNode,
130: ISolutionFile targetFile, int actionOperation) {
131: processSolutionTree(parentNode, targetFile, KEEP_ALL_FILTER,
132: actionOperation);
133: }
134:
135: public static void processSolutionStructure(Element parentNode,
136: ISolutionFile targetFile, int actionOperation) {
137: processSolutionStructure(parentNode, targetFile,
138: KEEP_ALL_FILTER, actionOperation);
139: }
140:
141: public static void processSolutionTree(Element parentNode,
142: ISolutionFile targetFile, ISolutionFilter solutionFilter,
143: int actionOperation) {
144: processSolutionTree(parentNode, targetFile, solutionFilter,
145: ADD_NOTHING_CONTRIBUTOR, actionOperation);
146: }
147:
148: private static void processSolutionTree(Element parentNode,
149: ISolutionFile targetFile, ISolutionFilter solutionFilter,
150: ISolutionAttributeContributor contributor,
151: int actionOperation) {
152: processSolutionTree(parentNode, targetFile, solutionFilter,
153: contributor, ignoreDirectories, ignoreFiles,
154: actionOperation);
155: }
156:
157: private static boolean isIgnore(List ignoreList, String filename) {
158: return (null != ignoreList) && (ignoreList.contains(filename));
159: }
160:
161: public static void processSolutionTree(Element parentNode,
162: ISolutionFile targetFile, ISolutionFilter solutionFilter,
163: ISolutionAttributeContributor contributor,
164: List ignoreDirsList, List ignoreFilesList,
165: int actionOperation) {
166: if (targetFile != null) {
167: if (targetFile.isDirectory()) {
168: if (!SolutionReposUtil.isIgnore(ignoreDirsList,
169: targetFile.getFileName())
170: && solutionFilter.keepFile(targetFile,
171: actionOperation)) {
172: Element childNode = parentNode.addElement(
173: BRANCH_NODE_NAME).addAttribute(
174: ID_ATTR_NAME, targetFile.getFullPath())
175: .addAttribute(IS_DIR_ATTR_NAME, "true"); //$NON-NLS-1$
176: contributor.contributeAttributes(targetFile,
177: childNode);
178: if (targetFile.isRoot()) {
179: childNode.addElement(BRANCH_TEXT_NODE_NAME)
180: .setText("/"); //$NON-NLS-1$
181: } else {
182: childNode.addElement(BRANCH_TEXT_NODE_NAME)
183: .setText(targetFile.getFileName());
184: }
185: ISolutionFile files[] = targetFile.listFiles();
186: for (int i = 0; i < files.length; i++) {
187: ISolutionFile file = files[i];
188: processSolutionTree(childNode, file,
189: solutionFilter, contributor,
190: ignoreDirsList, ignoreFilesList,
191: actionOperation);
192: }
193: }
194: } else {
195: if (!SolutionReposUtil.isIgnore(ignoreFilesList,
196: targetFile.getFileName())
197: && solutionFilter.keepFile(targetFile,
198: actionOperation)) {
199: Element childNode = parentNode.addElement(
200: LEAF_NODE_NAME).addAttribute(
201: IS_DIR_ATTR_NAME, "false"); //$NON-NLS-1$
202: contributor.contributeAttributes(targetFile,
203: childNode);
204: childNode.addElement(LEAF_TEXT_NODE_NAME).setText(
205: targetFile.getFileName());
206: childNode.addElement(PATH_TEXT_NODE_NAME).setText(
207: targetFile.getFullPath());
208: childNode.addElement(LINK_NODE_NAME).setText("#"); //$NON-NLS-1$
209: }
210: }
211: }
212: }
213:
214: public static void processSolutionStructure(Element parentNode,
215: ISolutionFile targetFile, ISolutionFilter solutionFilter,
216: int actionOperation) {
217: processSolutionStructure(parentNode, targetFile,
218: solutionFilter, ADD_NOTHING_CONTRIBUTOR,
219: actionOperation);
220: }
221:
222: public static void processSolutionStructure(Element parentNode,
223: ISolutionFile targetFile, ISolutionFilter solutionFilter,
224: ISolutionAttributeContributor contributor,
225: int actionOperation) {
226: if (targetFile.isDirectory()) {
227: if (!ignoreDirectories.contains(targetFile.getFileName())
228: && solutionFilter.keepFile(targetFile,
229: actionOperation)) {
230: Element childNode = parentNode.addElement(
231: ENTRY_NODE_NAME).addAttribute(TYPE_ATTR_NAME,
232: DIRECTORY_ATTR).addAttribute(NAME_ATTR_NAME,
233: targetFile.getFileName());
234: contributor.contributeAttributes(targetFile, childNode);
235: ISolutionFile files[] = targetFile.listFiles();
236: for (int i = 0; i < files.length; i++) {
237: ISolutionFile file = files[i];
238: processSolutionStructure(childNode, file,
239: actionOperation);
240: }
241: }
242: } else {
243: if (!ignoreFiles.contains(targetFile.getFileName())
244: && solutionFilter.keepFile(targetFile,
245: actionOperation)) {
246: Element childNode = parentNode.addElement(
247: ENTRY_NODE_NAME).addAttribute(TYPE_ATTR_NAME,
248: FILE_ATTR).addAttribute(NAME_ATTR_NAME,
249: targetFile.getFileName());
250: contributor.contributeAttributes(targetFile, childNode);
251: }
252: }
253: }
254:
255: public interface ISolutionFilter {
256: boolean keepFile(ISolutionFile solutionFile, int actionOperation);
257: }
258:
259: public interface ISolutionAttributeContributor {
260: void contributeAttributes(ISolutionFile solutionFile,
261: Element childNode);
262: }
263:
264: }
|