// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the CPL Common Public License version 1.0.
package fitnesse.wiki;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class SymbolicPage extends BaseWikiPage {
private static final long serialVersionUID = 1L;
public static final String PROPERTY_NAME = "SymbolicLinks";
private WikiPage realPage;
public SymbolicPage(String name, WikiPage realPage, WikiPage parent) {
super(name, parent);
this.realPage = realPage;
}
public WikiPage getRealPage() {
return realPage;
}
public WikiPage addChildPage(String name) {
return realPage.addChildPage(name);
}
public boolean hasChildPage(String name) {
return realPage.hasChildPage(name);
}
protected WikiPage getNormalChildPage(String name) {
WikiPage childPage = realPage.getChildPage(name);
if (childPage != null && !(childPage instanceof SymbolicPage))
childPage = new SymbolicPage(name, childPage, this);
return childPage;
}
@Override
protected WikiPage createInternalSymbolicPage(String linkPath, String linkName) {
WikiPagePath path = PathParser.parse(linkPath);
WikiPage start = (path.isRelativePath()) ? getRealPage().getParent() : getRealPage();
WikiPage page = getPageCrawler().getPage(start, path);
if (page != null)
page = new SymbolicPage(linkName, page, this);
return page;
}
public void removeChildPage(String name) {
realPage.removeChildPage(name);
}
public List<WikiPage> getNormalChildren() {
List<?> children = realPage.getChildren();
List<WikiPage> symChildren = new LinkedList<WikiPage>();
//...Intentionally exclude symbolic links on symbolic pages
// to prevent infinite cyclic symbolic references.
//TODO: -AcD- we need a better cyclic infinite recursion algorithm here.
for (Iterator<?> iterator = children.iterator(); iterator.hasNext();) {
WikiPage child = (WikiPage) iterator.next();
symChildren.add(new SymbolicPage(child.getName(), child, this));
}
return symChildren;
}
public PageData getData() {
PageData data = realPage.getData();
data.setWikiPage(this);
return data;
}
public ReadOnlyPageData readOnlyData() { return getData(); }
public PageData getDataVersion(String versionName) {
PageData data = realPage.getDataVersion(versionName);
data.setWikiPage(this);
return data;
}
public VersionInfo commit(PageData data) {
return realPage.commit(data);
}
//TODO Delete these method alone with ProxyPage when the time is right.
public boolean hasExtension(String extensionName) {
return realPage.hasExtension(extensionName);
}
public Extension getExtension(String extensionName) {
return realPage.getExtension(extensionName);
}
}