/*
* Copyright (C) 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.sites.liberation.export;
import static com.google.sites.liberation.util.EntryUtils.getXhtmlContent;
import static com.google.sites.liberation.util.EntryUtils.setContent;
import com.google.gdata.data.sites.BaseContentEntry;
import com.google.gdata.data.sites.BasePageEntry;
import java.net.URL;
/**
* Converts the absolute links in a page's content to relative links.
*
* @author bsimon@google.com (Benjamin Simon)
* @author rafael.camargo.sp@gmail.com (Rafael Camargo)
*/
final class AbsoluteLinkConverterImpl implements AbsoluteLinkConverter {
@Override
public void convertLinks(BaseContentEntry<?> entry, EntryStore entryStore,
URL siteUrl, boolean isRevision) {
convertLinks(entry, entryStore, siteUrl, isRevision, "href=\"", "\"");
convertLinks(entry, entryStore, siteUrl, isRevision, "href='", "'");
}
private void convertLinks(BaseContentEntry<?> entry, EntryStore entryStore,
URL siteUrl, boolean isRevision, String prefix, String suffix) {
String content = getXhtmlContent(entry);
String url = siteUrl.toExternalForm();
String siteRoot = getSiteRoot(entry, entryStore);
if (isRevision) {
siteRoot += "../";
}
int index = content.indexOf(prefix + url);
while (index != -1) {
int startIndex = index + prefix.length();
int endIndex = content.indexOf(suffix, startIndex + 1);
String beforeLink = content.substring(0, startIndex);
String link = "";
int beginIndex = startIndex + url.length() + 1;
if(beginIndex < endIndex){
link = content.substring(beginIndex, endIndex);
}
String afterLink = content.substring(endIndex);
content = beforeLink + siteRoot + link + "/index.html" + afterLink;
index = content.indexOf(prefix + url);
}
setContent(entry, content);
}
private String getSiteRoot(BaseContentEntry<?> entry, EntryStore entryStore) {
BasePageEntry<?> parent = entryStore.getParent(entry.getId());
if (parent == null) {
return "../";
}
return getSiteRoot(parent, entryStore) + "../";
}
}