// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.mdm.repository.ui.starting.helper;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.ui.internal.intro.impl.model.IntroContentProvider;
import org.eclipse.ui.internal.intro.impl.model.loader.ContentProviderManager;
import org.eclipse.ui.internal.intro.impl.model.loader.IntroContentParser;
import org.eclipse.ui.internal.intro.impl.model.util.ModelUtil;
import org.eclipse.ui.intro.config.IIntroContentProviderSite;
import org.eclipse.ui.intro.config.IIntroXHTMLContentProvider;
import org.osgi.framework.Bundle;
import org.talend.mdm.repository.i18n.MessagesE;
import org.talend.mdm.repository.plugin.RepositoryPlugin;
import org.talend.mdm.repository.ui.starting.MDMStartingConstants;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class MDMStartingHelper {
private static Logger log = Logger.getLogger(MDMStartingHelper.class);
private static MDMStartingHelper helper = null;
private Bundle bundle;
private MDMStartingHelper() {
}
public static MDMStartingHelper getHelper() {
if (helper == null) {
helper = new MDMStartingHelper();
}
return helper;
}
public String getHtmlContent() throws IOException {
String externalFileName = getExternalFileName();
String htmlContent = resolveHtmlContent(externalFileName);
return htmlContent;
}
private String getExternalFileName() throws IOException {
String htmlResource = "resources/welcomepage/mdm-welcomepage.html";//$NON-NLS-1$
bundle = getRepositoryBundle();
URL entry = bundle.getEntry(htmlResource);
if (entry != null) {
URL fileURL = FileLocator.toFileURL(entry);
String externalFormFileUrl = fileURL.toExternalForm();
String prefix = "file:/";//$NON-NLS-1$
String fileProtocol = "file:///";//$NON-NLS-1$
if (externalFormFileUrl.startsWith(prefix)) {
if (!externalFormFileUrl.startsWith(fileProtocol)) {
externalFormFileUrl = fileProtocol + externalFormFileUrl.substring(prefix.length());
}
}
return externalFormFileUrl;
}
return null;
}
private Bundle getRepositoryBundle() {
if (bundle == null) {
bundle = RepositoryPlugin.getDefault().getBundle();
}
return bundle;
}
@SuppressWarnings("restriction")
private String resolveHtmlContent(String externalFileName) {
if (externalFileName == null) {
return "";//$NON-NLS-1$
}
String content = "";//$NON-NLS-1$
IntroContentParser parser = new IntroContentParser(externalFileName);
Document dom = parser.getDocument();
if (dom != null) {
resolveInternationalization(dom);
resolveImagePath(dom);
resolveDynamicContent(dom, null);
content = IntroContentParser.convertToString(dom);
}
return content;
}
private void resolveInternationalization(Document dom) {
NodeList internationals = dom.getElementsByTagNameNS("*", //$NON-NLS-1$
MDMStartingConstants.KEY_INTERNATIONAL);
Node[] nodes = getArray(internationals);
for (int i = 0; i < nodes.length; i++) {
Element internationalElement = (Element) nodes[i];
String nodeName = MessagesE.getString(internationalElement.getAttribute(MDMStartingConstants.ATT_ID));
internationalElement.getParentNode().replaceChild(dom.createTextNode(nodeName), internationalElement);
}
}
private void resolveImagePath(Document dom) {
String imagePath = getImagePath();
NodeList elements = dom.getElementsByTagNameNS("*", "img");//$NON-NLS-1$//$NON-NLS-2$
Node[] nodes = getArray(elements);
for (int i = 0; i < nodes.length; i++) {
Element element = (Element) nodes[i];
if (element != null) {
element.setAttribute("src", "file:///" + imagePath);//$NON-NLS-1$//$NON-NLS-2$
break;
}
}
}
private String getImagePath() {
File file = null;
try {
File bundleFile = FileLocator.getBundleFile(getRepositoryBundle());
String resourceFolder = "icons/server_export.png";//$NON-NLS-1$
file = new File(bundleFile, resourceFolder);
} catch (IOException e) {
log.error("resolve bundle file error.", e);//$NON-NLS-1$
}
return file.getAbsolutePath();
}
public static Node[] getArray(NodeList nodeList) {
Node nodes[] = new Node[nodeList.getLength()];
for (int i = 0; i < nodeList.getLength(); i++) {
nodes[i] = nodeList.item(i);
}
return nodes;
}
@SuppressWarnings("restriction")
private Document resolveDynamicContent(Document dom, IIntroContentProviderSite site) {
// get all content provider elements in DOM.
NodeList contentProviders = dom.getElementsByTagNameNS("*", //$NON-NLS-1$
IntroContentProvider.TAG_CONTENT_PROVIDER);
// get the array version of the nodelist to work around DOM api design.
Node[] nodes = getArray(contentProviders);
for (int i = 0; i < nodes.length; i++) {
Element contentProviderElement = (Element) nodes[i];
IntroContentProvider provider = new IntroContentProvider(contentProviderElement, getRepositoryBundle());
// If we've already loaded the content provider for this element,
// retrieve it, otherwise load the class.
IIntroXHTMLContentProvider providerClass = (IIntroXHTMLContentProvider) ContentProviderManager.getInst()
.getContentProvider(provider);
if (providerClass == null) {
// content provider never created before, create it.
providerClass = (IIntroXHTMLContentProvider) ContentProviderManager.getInst().createContentProvider(provider,
site);
}
if (providerClass != null) {
// create a div with the same id as the contentProvider, pass it
// as the parent to create the specialized content, and then
// replace the contentProvider element with this div.
Properties att = new Properties();
att.setProperty("id", provider.getId()); //$NON-NLS-1$
Element contentDiv = ModelUtil.createElement(dom, ModelUtil.TAG_DIV, att);
providerClass.createContent(provider.getId(), contentDiv);
if (contentDiv.getChildNodes().getLength() != 0) {
if (MDMStartingConstants.OPTION_NAME.equals(provider.getId())
|| MDMStartingConstants.PRODUCT_NAME.equals(provider.getId())) {
contentProviderElement.getParentNode().replaceChild(contentDiv.getFirstChild(), contentProviderElement);
} else {
contentProviderElement.getParentNode().replaceChild(contentDiv, contentProviderElement);
}
}
} else {
// we couldn't load the content provider, so add any alternate
// text content if there is any.
// INTRO: do it. 3.0 intro content style uses text element as
// alt text. We can load XHTML content here.
}
}
return dom;
}
}