/* See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* Esri Inc. 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 com.esri.gpt.control.georss;
import com.esri.gpt.catalog.search.ResourceLink;
import com.esri.gpt.catalog.search.ResourceLinks;
import com.esri.gpt.framework.jsf.MessageBroker;
import com.esri.gpt.framework.util.Val;
import java.io.PrintWriter;
/**
* HTML snippet writer.
*/
public class RecordSnippetWriter {
// class variables =============================================================
/** clip text length (255) */
private static final int CLIP_TEXT_LENGTH = 512;
/** snippet style class */
private static final String SNIPPET_STYLE_CLASS = "snippet";
/** title style class */
private static final String TITLE_STYLE_CLASS = "title";
/** abstract style class */
private static final String ABSTRACT_STYLE_CLASS = "abstract";
/** links style class */
private static final String LINKS_STYLE_CLASS = "links";
/** thumbnail style class */
private static final String THUMBNAIL_STYLE_CLASS = "thumbnail";
// instance variables ==========================================================
/** Message broker */
private MessageBroker _messageBroker;
/** print writer */
private final PrintWriter _writer;
/** allows to show title. Default: <code>false</code>. */
private boolean _showTitle = false;
/** allows to show content type icon. Default: <code>false</code>. */
private boolean _showIcon = false;
/** allows to show description. Default: <code>true</code>. */
private boolean _showDescription = true;
/** allows to show links. Default: <code>true</code>. */
private boolean _showLinks = true;
/** text clipping. Default: <code>false</code>. */
private boolean _clipText = false;
/** links target */
private Target _target = Target.blank;
// constructors ================================================================
/**
* Creates instance of the writer.
* @param messageBroker message broker
* @param writer underlying print writer
*/
public RecordSnippetWriter(MessageBroker messageBroker, PrintWriter writer) {
_messageBroker = messageBroker;
if (_messageBroker == null) {
throw new IllegalArgumentException("A MessageBroker is required.");
}
_writer = writer;
}
// properties ==================================================================
private MessageBroker getMessageBroker(){
return this._messageBroker;
}
/**
* Checks if showing title allowed.
* @return <code>true</code> if showing title allowed
*/
public boolean getShowTitle() {
return _showTitle;
}
/**
* Sets showing title flag.
* @param showTitle <code>true</code> to show title
*/
public void setShowTitle(boolean showTitle) {
_showTitle = showTitle;
}
/**
* Checks if showing icon allowed.
* @return <code>true</code> if showing icon allowed
*/
public boolean getShowIcon() {
return _showIcon;
}
/**
* Sets showing icon flag.
* @param showIcon <code>true</code> to show icon
*/
public void setShowIcon(boolean showIcon) {
_showIcon = showIcon;
}
/**
* Checks if showing description allowed.
* @return <code>true</code> if showing description allowed
*/
public boolean getShowDescription() {
return _showDescription;
}
/**
* Sets showing description flag.
* @param showDescription <code>true</code> to show description
*/
public void setShowDescription(boolean showDescription) {
_showDescription = showDescription;
}
/**
* Checks if showing links allowed.
* @return <code>true</code> if showing links allowed
*/
public boolean getShowLinks() {
return _showLinks;
}
/**
* Sets showing links flag.
* @param showLinks <code>true</code> to show links
*/
public void setShowLinks(boolean showLinks) {
_showLinks = showLinks;
}
/**
* Checks if text shoud be clipped.
* @return <code>true</code> if text shoud be clipped
*/
public boolean getClipText() {
return _clipText;
}
/**
* Sets clipping text flag.
* @param clipText <code>true</code> to clip text
*/
public void setClipText(boolean clipText) {
_clipText = clipText;
}
/**
* Gets links target.
* @return links target
*/
public Target getTarget() {
return _target;
}
/**
* Sets links target.
* @param target links target
*/
public void setTarget(Target target) {
_target = target;
}
// methods =====================================================================
/**
* Writes HTML snippet with metadata description.
* @param record record to write as snippet
*/
public void write(IFeedRecord record) {
// write
if (_writer != null) {
_writer.println("<div class=\"" + SNIPPET_STYLE_CLASS + "\">");
// title
if (getShowTitle()) {
writeTitle(record);
}
// abstract
if (getShowDescription()) {
writeAbstract(record);
}
// links
if (getShowLinks()) {
writeLinks(record);
}
_writer.println("</div>");
_writer.flush();
}
}
/**
* Writes title section.
* @param record record
*/
private void writeTitle(IFeedRecord record) {
String sUuid = Val.chkStr(record.getUuid());
String sTitle = Val.chkStr(record.getTitle());
String sNodeId = Val.escapeXmlForBrowser(sUuid);
_writer.println("<div id=\""+sNodeId+"\" class=\"" + TITLE_STYLE_CLASS + "\">");
// content type icon
ResourceLink icon = record.getResourceLinks().getIcon();
if (icon != null) {
String sUrl = Val.chkStr(icon.getUrl());
if ((sUrl.length() > 0) && getShowIcon()) {
_writer.print("<img src=\"");
_writer.print(Val.escapeXmlForBrowser(sUrl));
_writer.print("\" alt=\"");
_writer.print(Val.escapeXmlForBrowser(icon.getLabel()));
_writer.print("\" title=\"");
_writer.print(Val.escapeXmlForBrowser(icon.getLabel()));
_writer.print("\"/>");
}
}
// title (or uuid if no title)
sTitle = sTitle.length() > 0 ? sTitle : sUuid;
_writer.println(Val.escapeXmlForBrowser(sTitle));
_writer.println("</div>");
}
/**
* Writes abstract section.
* @param record record
*/
private void writeAbstract(IFeedRecord record) {
String sAbstract = Val.chkStr(record.getAbstract());
if (sAbstract.length() > 0) {
sAbstract = !getClipText()
? sAbstract : sAbstract.length() > CLIP_TEXT_LENGTH
? sAbstract.substring(0, CLIP_TEXT_LENGTH) + "..."
: sAbstract;
String divStyle = "overflow: auto;";
_writer.println("<div class=\""+ABSTRACT_STYLE_CLASS+"\" style=\""+divStyle+"\" >");
String url = Val.chkStr(record.getResourceLinks().getThumbnail().getUrl());
if (url.length() > 0) {
url = Val.escapeXml(url);
String imgStyle = "float:right; margin-left:0.5em; width:64px; height:64px; border:1px solid #000000;";
//imgStyle = "border:1px solid #000000;";
_writer.println("<img class=\""+THUMBNAIL_STYLE_CLASS+"\" "+
" alt=\""+ this.getMessageBroker().retrieveMessage("catalog.rest.thumbNail")+ "\" " +
" src=\""+ url+"\" style=\""+imgStyle+"\"/>");
}
_writer.println(Val.escapeXmlForBrowser(sAbstract));
_writer.println("</div>");
}
}
/**
* Writes links section.
* @param record record
*/
private void writeLinks(IFeedRecord record) {
_writer.println("<div class=\"" + LINKS_STYLE_CLASS + "\">");
ResourceLinks links = record.getResourceLinks();
writeLinks(links);
_writer.println("</div>");
}
/**
* Write links.
*
* @param links the links
*/
public void writeLinks(ResourceLinks links) {
if(links == null) {
return;
}
for (ResourceLink link: links) {
writeLink(link.getUrl(),link.getLabel());
}
}
/**
* Writes link.
* @param url link URL
* @param text link text
*/
private void writeLink(String url, String text) {
url = Val.chkStr(url);
text = Val.chkStr(text);
if (url.length() > 0) {
if(url.startsWith("javascript:")) {
_writer.print("<A href=\"javascript:void(0)\" onclick=\"");
} else {
_writer.print("<A HREF=\"");
}
_writer.print(Val.escapeXmlForBrowser(url));
_writer.print("\" target=\"" + _target.toHtmlValue() + "\">");
//_writer.print(">");
_writer.print(Val.escapeXmlForBrowser(text));
_writer.println("</A>");
}
}
// enums =======================================================================
/** links target */
public enum Target {
/** blank */
blank,
/** parent */
parent,
/** self */
self,
/** top */
top;
/**
* Checks value of the string.
* @param value value
* @return corresponding target or {@link Target#blank} if value is invalid
*/
public static Target checkValueOf(String value) {
value = Val.chkStr(value);
for (Target t: values()) {
if (t.name().equalsIgnoreCase(value)) {
return t;
}
}
return blank;
}
/**
* Returns HTML value of the target.
* @return HTML value of the target
*/
public String toHtmlValue() {
return "_" + name();
}
}
}