PageRenderTime 44ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/src/com/atlassian/uwc/hierarchies/DokuwikiHierarchy.java

https://bitbucket.org/dodok1/uwc
Java | 221 lines | 198 code | 15 blank | 8 comment | 53 complexity | 7a2a731d1362f31604ba774a5320fd67 MD5 | raw file
  1. package com.atlassian.uwc.hierarchies;
  2. import java.io.File;
  3. import java.util.Collection;
  4. import java.util.Iterator;
  5. import java.util.Properties;
  6. import java.util.Set;
  7. import java.util.Vector;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;
  10. import com.atlassian.uwc.converters.dokuwiki.HierarchyTitleConverter;
  11. import com.atlassian.uwc.converters.tikiwiki.RegexUtil;
  12. import com.atlassian.uwc.filters.NoSvnFilter;
  13. import com.atlassian.uwc.ui.Page;
  14. public class DokuwikiHierarchy extends FilepathHierarchy {
  15. public HierarchyNode buildHierarchy(Collection<Page> pages) {
  16. //run the filepath hierarchy first -
  17. HierarchyNode node = super.buildHierarchy(pages);
  18. //move spacekeys
  19. node = handleSpacekeyBranch(node);
  20. //handle start pages
  21. node = handleStartPages(node, true);
  22. String spacekey = getProperties().getProperty("spacekey", "");
  23. Vector<String> candidates = getCollisionsCandidates(spacekey);
  24. //fix collisions
  25. node = fixCollisions(node, candidates);
  26. //fix titles
  27. node = fixTitles(node);
  28. //attach images
  29. String attdirRaw = getProperties().getProperty("attachmentdirectory", "");
  30. Vector<File> attdirs = getAttDirs(attdirRaw);
  31. if (attdirs.isEmpty()) return node;
  32. node = attachAllImages(node, attdirs, true);
  33. return node;
  34. }
  35. private HierarchyNode handleSpacekeyBranch(HierarchyNode node) {
  36. String spacekey = getProperties().getProperty("spacekey");
  37. if (spacekey != null && !"".equals(spacekey)) {
  38. Set<HierarchyNode> top = node.getChildren();
  39. for (Iterator iter = top.iterator(); iter.hasNext();) {
  40. HierarchyNode topnode = (HierarchyNode) iter.next();
  41. if (topnode.getName().toLowerCase().equals(spacekey.toLowerCase())) {
  42. //topnode children should be top level
  43. Set<HierarchyNode> children = topnode.getChildren();
  44. iter.remove(); //Only allowed way to remove from an iterator.
  45. topnode.setParent(null); //since we have to use iter.remove instead of node.removeChild(topnode)
  46. for (HierarchyNode child : children) {
  47. node.addChild(child);
  48. }
  49. break;
  50. }
  51. }
  52. }
  53. return node;
  54. }
  55. private HierarchyNode handleStartPages(HierarchyNode node, boolean top) {
  56. Set<HierarchyNode> children = node.getChildren();
  57. for (Iterator iter = children.iterator(); iter.hasNext();) {
  58. HierarchyNode child = (HierarchyNode) iter.next();
  59. String name = child.getName();
  60. if (name.toLowerCase().equals("start") && !top) {
  61. Page page = child.getPage();
  62. if (page == null) continue; //mid level start directories
  63. iter.remove(); //only allowed way to remove from an iterator
  64. child.setParent(null); //since we have to use iter.remove instead of node.removeChild(child)
  65. if (node.getPage() == null) node.setPage(page);
  66. else log.warn("parent already had page object");
  67. log.debug("Moving start page to parent. Changing start page name: " + node.getName());
  68. node.getPage().setName(node.getName());
  69. }
  70. child = handleStartPages(child, false);
  71. }
  72. return node;
  73. }
  74. private HierarchyNode fixCollisions(HierarchyNode node, Vector<String> collisions) {
  75. if (collisions.isEmpty()) return node;
  76. Set<HierarchyNode> children = node.getChildren();
  77. for (Iterator iter = children.iterator(); iter.hasNext();) {
  78. HierarchyNode child = (HierarchyNode) iter.next();
  79. for (String name : collisions) {
  80. String eqname = equalize(name);
  81. String childname = equalize(child.getName());
  82. if (childname.equals(eqname)) {
  83. log.debug("Fixing collisions? " + eqname + " vs. " + childname);
  84. String parent = child.getParent().getName();
  85. log.debug("parent = " + parent);
  86. if (parent == null) continue;
  87. String newname = parent + " " + child.getName();
  88. log.debug("newname = " +newname);
  89. child.setName(newname);
  90. if (child.getPage() != null) child.getPage().setName(newname);
  91. }
  92. }
  93. child = fixCollisions(child, collisions);
  94. }
  95. return node;
  96. }
  97. protected Vector<String> getCollisionsCandidates(String spacekey) {
  98. Properties props = getProperties();
  99. Vector<String> candidates = new Vector<String>();
  100. for (Iterator iter = props.keySet().iterator();iter.hasNext();) {
  101. String key = (String) iter.next();
  102. if (key.toLowerCase().startsWith("collision-titles-"+spacekey.toLowerCase())) {
  103. String namesraw = props.getProperty(key, "");
  104. if ("".equals(namesraw)) continue;
  105. String[] names = namesraw.split(",");
  106. for (String name : names) {
  107. name = name.trim();
  108. candidates.add(name);
  109. }
  110. }
  111. }
  112. return candidates;
  113. }
  114. private HierarchyNode attachAllImages(HierarchyNode node, Vector<File> attdirs, boolean top) {
  115. Set<HierarchyNode> children = node.getChildren();
  116. for (Iterator iter = children.iterator(); iter.hasNext();) {
  117. HierarchyNode child = (HierarchyNode) iter.next();
  118. if (child.getPage() == null) child.setPage(createPage(child.getName()));
  119. for (File attdir : attdirs) {
  120. if (top && equalize(child.getName()).equals(equalize(attdir.getName()))) {
  121. doAttach(child, attdir);
  122. Vector<File> thisfile = new Vector<File>();
  123. thisfile.add(attdir);
  124. attachAllImages(child, thisfile, false);
  125. }
  126. File[] files = attdir.listFiles(getSvnFilter());
  127. for (File file : files) {
  128. if (top && file.isFile() && child.getName().equals("Start")) {
  129. log.debug("Attaching: " + file.getName() + " to " + child.getName());
  130. child.getPage().addAttachment(file);
  131. }
  132. if (file.isFile()) continue;
  133. String filename = equalize(file.getName());
  134. String childname = equalize(child.getName());
  135. Vector<File> thisfile = new Vector<File>();
  136. thisfile.add(file);
  137. if (filename.equals(childname)) {
  138. doAttach(child, file);
  139. attachAllImages(child, thisfile, false);
  140. }
  141. else if (childname.equals(attdir.getName()))
  142. attachAllImages(child, thisfile, false);
  143. }
  144. }
  145. }
  146. return node;
  147. }
  148. private void doAttach(HierarchyNode child, File file) {
  149. File[] attachments = file.listFiles(getSvnFilter());
  150. for (File att : attachments) {
  151. if (att.isFile()) {
  152. log.debug("Attaching: " + att.getName() + " to " + child.getName());
  153. child.getPage().addAttachment(att);
  154. }
  155. }
  156. }
  157. private String equalize(String name) {
  158. name = name.toLowerCase();
  159. name = name.replaceAll("_", " ");
  160. return name;
  161. }
  162. private Page createPage(String name) {
  163. Page page = new Page(null);
  164. page.setName(name);
  165. page.setOriginalText("");
  166. page.setConvertedText("");
  167. page.setPath(name);
  168. return page;
  169. }
  170. NoSvnFilter svnfilter = new NoSvnFilter();
  171. private NoSvnFilter getSvnFilter() {
  172. if (this.svnfilter == null)
  173. this.svnfilter = new NoSvnFilter();
  174. return this.svnfilter;
  175. }
  176. private Vector<File> getAttDirs(String attdirRaw) {
  177. String[] dirs = attdirRaw.split("::");
  178. Vector<File> atts = new Vector<File>();
  179. for (String dir : dirs) {
  180. dir = dir.trim();
  181. if ("".equals(dir)) continue;
  182. File file = new File(dir);
  183. if (!file.exists() || !file.isDirectory())
  184. log.error("Attachment Directory does not exist or is not a directory: " + dir);
  185. else
  186. atts.add(file);
  187. }
  188. return atts;
  189. }
  190. HierarchyTitleConverter titleConverter = new HierarchyTitleConverter();
  191. //nodes without pages probably will need this
  192. private HierarchyNode fixTitles(HierarchyNode node) {
  193. Set<HierarchyNode> children = node.getChildren();
  194. for (Iterator iter = children.iterator(); iter.hasNext();) {
  195. HierarchyNode child = (HierarchyNode) iter.next();
  196. if (child.getPage() == null)
  197. child.setName(titleConverter.fixTitle(child.getName()));
  198. else {
  199. titleConverter.convert(child.getPage());
  200. child.setName(child.getPage().getName());
  201. }
  202. child = fixTitles(child);
  203. }
  204. return node;
  205. }
  206. }