package org.exoplatform.wiki.resolver;
import org.exoplatform.portal.config.model.PortalConfig;
import org.exoplatform.portal.mop.user.UserNode;
import org.exoplatform.portal.pom.config.Utils;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.wiki.service.WikiPageParams;
public class URLResolver extends Resolver{
private OrganizationService orgSerivce ;
public URLResolver(OrganizationService orgSerivce) throws Exception {
this.orgSerivce = orgSerivce ;
}
public WikiPageParams extractPageParams(String requestURL, UserNode portalUserNode) throws Exception {
WikiPageParams params = new WikiPageParams() ;
String wikiPageName;
if (portalUserNode == null) {
wikiPageName = "wiki";
} else {
wikiPageName = portalUserNode.getURI();
}
String uri = extractURI(requestURL, wikiPageName) ;
if (uri == null) return params ;
if(uri.indexOf("/") > 0) {
String[] array = uri.split("/") ;
if(array[0].equals(PortalConfig.USER_TYPE)) {
params.setType(PortalConfig.USER_TYPE) ;
if(array.length >= 3) {
params.setOwner(array[1]);
params.setPageId(array[2]);
}else if(array.length == 2) {
params.setOwner(array[1]);
params.setPageId(WikiPageParams.WIKI_HOME);
}
}else if(array[0].equals(PortalConfig.GROUP_TYPE)) {
params.setType(PortalConfig.GROUP_TYPE) ;
String groupId = uri.substring(uri.indexOf("/")) ;
if(orgSerivce.getGroupHandler().findGroupById(groupId) != null) {
params.setOwner(groupId) ;
params.setPageId(WikiPageParams.WIKI_HOME) ;
}else {
if(groupId.substring(1).indexOf("/") > 0) {
String pageId = groupId.substring(groupId.lastIndexOf("/")+ 1) ;
String owner = groupId.substring(0, groupId.lastIndexOf("/")) ;
params.setOwner(owner) ;
if(pageId != null && pageId.length() > 0) params.setPageId(pageId) ;
else params.setPageId(WikiPageParams.WIKI_HOME) ;
}else {
params.setOwner(groupId) ;
params.setPageId(WikiPageParams.WIKI_HOME) ;
}
}
} else if(array[0].equals(PortalConfig.PORTAL_TYPE)) {
params.setType(PortalConfig.PORTAL_TYPE) ;
params.setOwner(extractPortalOwner(requestURL, wikiPageName)) ;
params.setPageId(array[1]) ;
}
}else{
if (portalUserNode != null && portalUserNode.getPageRef() != null
&& !portalUserNode.getPageRef().startsWith(PortalConfig.PORTAL_TYPE)) {
String[] components = Utils.split("::", portalUserNode.getPageRef());
params.setType(components[0]);
params.setOwner(components[1]);
} else {
params.setType(PortalConfig.PORTAL_TYPE);
params.setOwner(extractPortalOwner(requestURL, wikiPageName));
}
if (uri.length() > 0)
params.setPageId(uri);
else
params.setPageId(WikiPageParams.WIKI_HOME);
}
params.setPageId(TitleResolver.getId(params.getPageId(), true));
return params;
}
private String extractURI(String url, String wikiPageName) throws Exception{
String uri = null;
String sign1 = "/" + wikiPageName + "/";
String sign2 = "/" + wikiPageName;
if(url.indexOf(sign1) < 0){
if(url.indexOf(sign2) > 0) {
uri = url.substring(url.indexOf(sign2) + sign2.length()) ;
}
} else{
uri = url.substring(url.indexOf(sign1) + sign1.length()) ;
}
if(uri != null && uri.length() > 0 && (uri.lastIndexOf("/") + 1) == uri.length())
uri = uri.substring(0, uri.lastIndexOf("/")) ;
return uri ;
}
private String extractPortalOwner(String url, String wikiPageName) throws Exception{
String sign = "/" + wikiPageName;
if(url.indexOf(sign) > 0){
String temp = url.substring(0, url.indexOf(sign)) ;
return temp.substring(temp.lastIndexOf("/") + 1) ;
}
return null ;
}
}