blob: 25387ed13894e5191ad569d60e07a5513df2a04f [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.manifoldcf.crawler.connectors.confluence.model;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.manifoldcf.core.common.DateParser;
import org.apache.manifoldcf.crawler.connectors.confluence.model.builder.ConfluenceResourceBuilder;
import org.json.JSONException;
import org.json.JSONObject;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
/**
* <p>
* Page class
* </p>
* <p>
* Represents a Confluence Page
* </p>
*
* @author Antonio David Perez Morales <adperezmorales@gmail.com>
*/
public class Page extends ConfluenceResource{
protected static final String KEY_LINKS = "_links";
protected static final String KEY_ID = "id";
protected static final String KEY_SELF = "self";
protected static final String KEY_WEBUI = "webui";
protected static final String KEY_BASE = "base";
protected static final String KEY_CONTEXT = "context";
protected static final String KEY_KEY = "key";
protected static final String KEY_TITLE = "title";
protected static final String KEY_BODY = "body";
protected static final String KEY_VIEW = "view";
protected static final String KEY_VALUE = "value";
protected static final String KEY_SPACE = "space";
protected static final String KEY_HISTORY = "history";
protected static final String KEY_CREATED_DATE = "createdDate";
protected static final String KEY_CREATED_BY = "createdBy";
protected static final String KEY_BY = "by";
protected static final String KEY_TYPE = "type";
protected static final String KEY_DISPLAY_NAME = "displayName";
protected static final String KEY_USER_NAME = "username";
protected static final String KEY_VERSION = "version";
protected static final String KEY_WHEN = "when";
protected static final String KEY_MEDIATYPE = "mediaType";
private static final String PAGE_ID = "confluenceId";
private static final String PAGE_URL = "url";
private static final String PAGE_WEBURL = "webUrl";
private static final String PAGE_LAST_MODIFIED = "lastModified";
private static final String PAGE_CREATOR = "creator";
private static final String PAGE_CREATOR_USERNAME = "creatorUsername";
private static final String PAGE_LAST_MODIFIER = "lastModifier";
private static final String PAGE_LAST_MODIFIER_USERNAME = "lastModifierUsername";
private static final String PAGE_SIZE = "size";
private static final String PAGE_LABEL = "label";
protected String id;
protected String space;
protected String baseUrl;
protected String urlContext;
protected String url;
protected String webUrl;
protected Date createdDate;
protected Date lastModified;
protected PageType type;
protected String title;
protected int version;
protected String creator;
protected String creatorUsername;
protected String lastModifier;
protected String lastModifierUsername;
protected String mediaType = "text/html; charset=utf-8";
protected long length;
protected String content;
protected List<Label> labels = Lists.newArrayList();
@SuppressWarnings("unused")
private JSONObject delegated;
public Page() {
}
public String getContent() {
return this.content;
}
public String getId() {
return this.id;
}
public PageType getType() {
return this.type;
}
public String getMediaType() {
return this.mediaType;
}
public int getVersion() {
return this.version;
}
public String getTitle() {
return this.title;
}
public String getBaseUrl() {
return this.baseUrl;
}
public String getUrlContext() {
return this.urlContext;
}
public String getWebUrl() {
return this.webUrl;
}
public String getUrl() {
return this.url;
}
public String getSpace() {
return this.space;
}
public String getCreator() {
return this.creator;
}
public String getCreatorUsername() {
return this.creatorUsername;
}
public String getLastModifier() {
return this.lastModifier;
}
public String getLastModifierUsername() {
return this.lastModifierUsername;
}
public Date getCreatedDate() {
return this.createdDate;
}
public Date getLastModifiedDate() {
return this.lastModified;
}
public long getLength() {
return this.length;
}
public boolean hasContent() {
return this.length > 0 && this.content != null;
}
public InputStream getContentStream() {
String contentStream = content != null ? content : "";
return new ByteArrayInputStream(
contentStream.getBytes(StandardCharsets.UTF_8));
}
public List<Label> getLabels() {
return this.labels;
}
public Map<String, Object> getMetadataAsMap() {
Map<String, Object> pageMetadata = Maps.newHashMap();
pageMetadata.put(KEY_ID, this.id);
pageMetadata.put(PAGE_ID, this.id);
pageMetadata.put(KEY_TYPE, this.type.toString());
pageMetadata.put(KEY_TITLE, this.title);
pageMetadata.put(KEY_SPACE, this.space);
pageMetadata.put(PAGE_URL, this.url);
pageMetadata.put(PAGE_WEBURL, this.webUrl);
pageMetadata.put(KEY_CREATED_DATE,
DateParser.formatISO8601Date(this.createdDate));
pageMetadata.put(PAGE_LAST_MODIFIED,
DateParser.formatISO8601Date(this.lastModified));
pageMetadata.put(KEY_MEDIATYPE, this.mediaType);
pageMetadata.put(KEY_VERSION, String.valueOf(this.version));
pageMetadata.put(PAGE_CREATOR, this.creator);
pageMetadata.put(PAGE_CREATOR_USERNAME, this.creatorUsername);
pageMetadata.put(PAGE_LAST_MODIFIER, this.lastModifier);
pageMetadata
.put(PAGE_LAST_MODIFIER_USERNAME, this.lastModifierUsername);
pageMetadata.put(PAGE_SIZE, String.valueOf(this.length));
putLabelsOnMetadataMap(pageMetadata);
refineMetadata(pageMetadata);
return pageMetadata;
}
/**
* <p>Put the page labels on the metadata map</p>
* @param pageMetadata
*/
private void putLabelsOnMetadataMap(Map<String, Object> pageMetadata) {
if(this.labels == null || this.labels.isEmpty()) {
return;
}
Iterable<String> labelsString = Iterables.transform(this.labels, new Function<Label, String>() {
@Override
public String apply(Label input) {
return input.getName();
}
});
pageMetadata.put(PAGE_LABEL, Lists.newArrayList(labelsString));
}
/**
* <p>
* Used to be overwritten by child classes to add more metadata to the map
* </p>
*
* @param metadata
*/
protected void refineMetadata(Map<String, Object> metadata) {
}
public static ConfluenceResourceBuilder<? extends Page> builder() {
return new PageBuilder();
}
/**
* <p>PageBuilder internal class</p>
* <p>Used to build pages</p>
* @author Antonio David Perez Morales <adperezmorales@gmail.com>
*
*/
public static class PageBuilder implements ConfluenceResourceBuilder<Page>{
public Page fromJson(JSONObject jsonPage) {
return fromJson(jsonPage, new Page());
}
public Page fromJson(JSONObject jsonPage, Page page) {
try {
String id = jsonPage.getString(KEY_ID);
String type = jsonPage.getString(KEY_TYPE);
String title = jsonPage.getString(KEY_TITLE);
page.delegated = jsonPage;
/* Init Page fields */
page.id = id;
page.type = PageType.fromName(type);
page.title = title;
page.space = processSpace(jsonPage);
/*
* Url & WebUrl
*/
JSONObject links = (JSONObject) jsonPage.get(KEY_LINKS);
if (links != null) {
page.url = links.optString(KEY_SELF, "");
String webUrl = (String) links.optString(KEY_WEBUI, "");
page.urlContext = (String) links.optString(KEY_CONTEXT, "");
page.baseUrl = (String) links.optString(KEY_BASE, "");
page.webUrl = page.baseUrl + webUrl;
}
/*
* Created By and created Date
*/
JSONObject history = (JSONObject) jsonPage
.optJSONObject(KEY_HISTORY);
if (history != null) {
page.createdDate = DateParser.parseISO8601Date(history
.optString(KEY_CREATED_DATE, ""));
JSONObject createdBy = (JSONObject) history
.optJSONObject(KEY_CREATED_BY);
if (createdBy != null) {
page.creator = createdBy
.optString(KEY_DISPLAY_NAME, "");
page.creatorUsername = createdBy.optString(
KEY_USER_NAME, "");
}
}
/*
* Last modifier and Last modified date
*/
JSONObject version = (JSONObject) jsonPage
.optJSONObject(KEY_VERSION);
if (version != null) {
JSONObject by = version.getJSONObject(KEY_BY);
if (by != null) {
page.lastModifier = by.optString(KEY_DISPLAY_NAME);
page.lastModifierUsername = by.optString(KEY_USER_NAME,
"");
}
page.lastModified = DateParser.parseISO8601Date(version
.optString(KEY_WHEN, ""));
}
/*
* Page Content
*/
JSONObject body = (JSONObject) jsonPage.optJSONObject(KEY_BODY);
if (body != null) {
JSONObject view = (JSONObject) body.optJSONObject(KEY_VIEW);
if (view != null) {
page.content = view.optString(KEY_VALUE, null);
page.length = page.content.getBytes().length;
}
}
return page;
} catch (JSONException e) {
e.printStackTrace();
}
return new Page();
}
private static String processSpace(JSONObject page) {
/* Page */
try {
JSONObject space = (JSONObject) page.get(KEY_SPACE);
if (space != null)
return space.optString(KEY_KEY, "");
} catch (JSONException e) {
return "";
}
return "";
}
@Override
public Class<Page> getType() {
return Page.class;
}
}
}