package net.sourceforge.phpeclipse.wiki.editor;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.MissingResourceException;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import net.sourceforge.phpeclipse.wiki.actions.mediawiki.config.IWikipedia;
import net.sourceforge.phpeclipse.wiki.internal.ConfigurationManager;
import net.sourceforge.phpeclipse.wiki.internal.IConfigurationWorkingCopy;
import net.sourceforge.phpeclipse.wiki.sql.WikipediaDB;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.core.runtime.IAdapterManager;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.templates.ContextTypeRegistry;
import org.eclipse.jface.text.templates.persistence.TemplateStore;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IContributorResourceAdapter;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry;
import org.eclipse.ui.editors.text.templates.ContributionTemplateStore;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.views.properties.IPropertySource;
import org.osgi.framework.BundleContext;
public class WikiEditorPlugin extends AbstractUIPlugin {
private static WikiEditorPlugin fgPlugin;
public final static String AUTOMATICALLY_CREATED = "";
public final static String WP_EXTENSION = "wp";
public final static String XML_START_1 = "\n" + "\n";
public final static String XML_END = "\n";
public static final String PREFIX_LOAD = "Load ";
public static final String PREFIX_STORE = "Store ";
public static final String HTTP_QUERY = "HTTP Query";
// public static final String WIKIPEDIA_GET_TEXT = "Load WikipediaEN";
//
// public static final String WIKIPEDIA_SET_TEXT = "Store WikipediaEN";
public static final String WIKIPEDIA_SQL = "Wikipedia SQL access";
public static final String BLOG_A_WIKI = "Blog as Wiki Text";
public static final String BLOG_A_HTML = "Blog as HTML Text";
public static final String PLOG4U_DE_LOAD = PREFIX_LOAD + "Plog4UDE";
public static final String PLOG4U_DE_STORE = PREFIX_STORE + "Plog4UDE";
public static final String PLOG4U_ORG_LOAD = PREFIX_LOAD + "Plog4UORG";
public static final String PLOG4U_ORG_STORE = PREFIX_STORE + "Plog4UORG";
public static final String[] PREDEFINED_TYPES = {
HTTP_QUERY,
WIKIPEDIA_SQL,
PLOG4U_DE_LOAD,
PLOG4U_DE_STORE,
PLOG4U_ORG_LOAD,
PLOG4U_ORG_STORE,
BLOG_A_WIKI,
BLOG_A_HTML };
public static final String[] PREDEFINED_WIKIS = {
"WikibooksDE",
"WikibooksEN",
"WikinewsDE",
"WikinewsEN",
"WikipediaAR",
"WikipediaCA",
"WikipediaDE",
"WikipediaEN",
"WikipediaEO",
"WikipediaES",
"WikipediaET",
"WikipediaFI",
"WikipediaFR",
"WikipediaHE",
"WikipediaIA",
"WikipediaIT",
"WikipediaJA",
"WikipediaNL",
"WikipediaPL",
"WikipediaPT",
"WikipediaRO",
"WikipediaSL",
"WikipediaSV",
"WikipediaZH" };
public static final ArrayList CONFIGURATION_TYPES = new ArrayList();
//image paths
public static final String ICON_PATH = "icons/full/"; //$NON-NLS-1$
public final static String PLUGIN_ID = "net.sourceforge.phpeclipse.wiki";
public final static String HTML_OUTPUT_PATH = "__static_wiki_folder";
public final static String WIKI_TEXTS_BASE_PATH = "__wiki_texts_base_path";
public final static String LOCAL_TEMPLATE_FILE_NAME = "__local_template_file_name";
public final static String EXPORT_TEMPLATE_FILE_NAME = "__export_template_file_name";
public final static String LOCAL_CSS_URL = "__local_css_url";
public final static String EXPORT_CSS_URL = "__export_css_url";
public final static String PREF_STRING_CONFIGURATIONS = "__configurations4";
public final static String CONSOLE_OUTPUT = "__console_output";
public final static String HTTP_GET_THROTTLE = "http.get.throttle";
public final static String HTTP_PUT_THROTTLE = "http.put.throttle";
public final static String HTTP_TIMEOUT = "http.timeout";
public final static String HTTP_PROXYHOST = "http.proxyHost";
public final static String HTTP_PROXYPORT = "http.proxyPort";
public final static String HTTP_PROXYUSERNAME = "http.proxyUserName";
public final static String HTTP_PROXYPASSWORD = "http.proxyPassword";
/**
* A named preference that controls whether the 'wrap words' feature is enabled.
*
* Value is of type Boolean
.
*
*/
public final static String EDITOR_WRAP_WORDS = "editor.wrap.words"; //$NON-NLS-1$
public final static String CONFIG_MEMENTO = "" + ""
+ ""
+ ""
+ ""
+ "" + ""
+ ""
+ ""
+ "" + ""
+ "" + ""
+ ""
+ "";
public static WikipediaDB fWikiDB = null;
private static ConfigurationManager manager;
//
// public static final String IMG_MONITOR_ON = "monitorOn";
//
// public static final String IMG_MONITOR_OFF = "monitorOff";
/**
* Creates an image and places it in the image registry.
*
* @param id
* the identifier for the image
* @param baseURL
* the base URL for the image
*/
protected static void createImageDescriptor(WikiEditorPlugin plugin, String id, URL baseURL) {
// Delegate to the plugin instance to avoid concurrent class loading problems
plugin.privateCreateImageDescriptor(id, baseURL);
}
public static WikiEditorPlugin getDefault() {
return fgPlugin;
}
/**
* Returns the image descriptor for the given image ID. Returns null if there is no such image.
*
* @param id
* the identifier for the image to retrieve
* @return the image associated with the given ID
*/
public static ImageDescriptor getImageDescriptor(String id) {
// Delegate to the plugin instance to avoid concurrent class loading problems
return getDefault().privateGetImageDescriptor(id);
}
/**
* Convenience method to get an image descriptor for an extension
*
* @param extension
* the extension declaring the image
* @param subdirectoryAndFilename
* the path to the image
* @return the image
*/
public static ImageDescriptor getImageDescriptorFromExtension(IExtension extension, String subdirectoryAndFilename) {
IPluginDescriptor pluginDescriptor = extension.getDeclaringPluginDescriptor();
URL path = pluginDescriptor.getInstallURL();
URL fullPathString = null;
try {
fullPathString = new URL(path, subdirectoryAndFilename);
return ImageDescriptor.createFromURL(fullPathString);
} catch (MalformedURLException e) {
}
return null;
}
public static String getResourceString(String key) {
ResourceBundle bundle = WikiEditorPlugin.getDefault().getResourceBundle();
try {
return (bundle != null) ? bundle.getString(key) : key;
} catch (MissingResourceException e) {
return key;
}
}
/**
* Returns the standard display to be used. The method first checks, if the thread calling this method has an associated display.
* If so, this display is returned. Otherwise the method returns the default display.
*/
public static Display getStandardDisplay() {
Display display = Display.getCurrent();
if (display == null) {
display = Display.getDefault();
}
return display;
}
private ContributionContextTypeRegistry fContextTypeRegistry;
private ResourceBundle fResourceBundle;
private ContributionTemplateStore fTemplateStore;
private Hashtable imageDescriptors = new Hashtable(20);
public WikiEditorPlugin(IPluginDescriptor descriptor) {
super(descriptor);
initializeImages();
fgPlugin = this;
for (int i = 0; i < PREDEFINED_TYPES.length; i++) {
CONFIGURATION_TYPES.add(PREDEFINED_TYPES[i]);
}
for (int i = 0; i < PREDEFINED_WIKIS.length; i++) {
CONFIGURATION_TYPES.add(PREFIX_LOAD + PREDEFINED_WIKIS[i]);
}
for (int i = 0; i < PREDEFINED_WIKIS.length; i++) {
CONFIGURATION_TYPES.add(PREFIX_STORE + PREDEFINED_WIKIS[i]);
}
manager = ConfigurationManager.getInstance();
try {
fResourceBundle = ResourceBundle.getBundle("net.sourceforge.phpeclipse.wiki.editor.WikiEditorMessages");
} catch (MissingResourceException x) {
fResourceBundle = null;
}
}
/**
* Creates an image and places it in the image registry.
*/
protected void createImageDescriptor(String id, URL baseURL) {
URL url = null;
try {
url = new URL(baseURL, ICON_PATH + id);
} catch (MalformedURLException e) {
}
ImageDescriptor desc = ImageDescriptor.createFromURL(url);
imageDescriptors.put(id, desc);
}
public IWorkbenchPage getActivePage() {
IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow();
if (window != null)
return window.getActivePage();
return null;
}
public ContextTypeRegistry getContextTypeRegistry() {
if (fContextTypeRegistry == null) {
fContextTypeRegistry = new ContributionContextTypeRegistry();
fContextTypeRegistry.addContextType("net.sourceforge.phpeclipse.wiki.editor.templates");
}
return fContextTypeRegistry;
}
public Image getImage(String key) {
Image image = getImageRegistry().get(key);
if (image == null) {
ImageDescriptor d = getImageDescriptor(key);
image = d.createImage();
getImageRegistry().put(key, image);
}
return image;
}
public ResourceBundle getResourceBundle() {
return fResourceBundle;
}
public TemplateStore getTemplateStore() {
if (fTemplateStore == null) {
fTemplateStore = new ContributionTemplateStore(getContextTypeRegistry(), getDefault().getPreferenceStore(), "templates");
try {
fTemplateStore.load();
} catch (IOException e) {
e.printStackTrace();
}
}
return fTemplateStore;
}
private static boolean isDefined(String test) {
if (test != null && test.length() > 0) {
for (int i = 0; i < test.length(); i++) {
if (!Character.isWhitespace(test.charAt(i))) {
return false;
}
}
}
return true;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeDefaultPreferences(org.eclipse.jface.preference.IPreferenceStore)
*/
protected void initializeDefaultPreferences(IPreferenceStore store) {
store.setDefault(PREF_STRING_CONFIGURATIONS, CONFIG_MEMENTO);
store.setDefault(CONSOLE_OUTPUT, "true");
String operatingSystem = Platform.getOS();
// operatingSystem ==> maxosx, linux, solaris, win32,...
try {
InputStream is = getDefault().openStream(new Path("prefs/default_" + operatingSystem + ".properties"));
PropertyResourceBundle resourceBundle = new PropertyResourceBundle(is);
String key = EDITOR_WRAP_WORDS;
try {
String wordWrap = resourceBundle.getString(key);
Boolean b = Boolean.valueOf(wordWrap);
if (b.booleanValue()) {
store.setDefault(key, "true");
} else {
store.setDefault(key, "false");
}
} catch (Exception e) {
store.setDefault(key, "false");
}
key = HTTP_GET_THROTTLE;
try {
String timeout = resourceBundle.getString(key);
int val = Integer.parseInt(timeout);
if (val > 0) {
val *= 1000;
} else {
val = 1000;
}
store.setDefault(key, Integer.toString(val));
} catch (Exception e) {
store.setDefault(key, "1000"); // 1 second
}
key = HTTP_PUT_THROTTLE;
try {
String timeout = resourceBundle.getString(key);
int val = Integer.parseInt(timeout);
if (val > 0) {
val *= 1000;
} else {
val = 5000;
}
store.setDefault(key, Integer.toString(val));
} catch (Exception e) {
store.setDefault(key, "5000"); // 5 seconds
}
key = HTTP_TIMEOUT;
try {
String timeout = resourceBundle.getString(key);
int val = Integer.parseInt(timeout);
if (val > 0) {
val *= 1000;
} else {
val = 30000;
}
store.setDefault(key, Integer.toString(val));
} catch (Exception e) {
store.setDefault(key, "30000"); // 30 seconds timeout
}
key = HTTP_PROXYHOST;
try {
String proxyHost = resourceBundle.getString(key);
if (isDefined(proxyHost)) {
store.setDefault(key, proxyHost);
} else {
store.setDefault(key, System.getProperty(key, ""));
}
} catch (Exception e) {
store.setDefault(key, System.getProperty(key, ""));
}
key = HTTP_PROXYPORT;
try {
String proxyPort = resourceBundle.getString(key);
if (isDefined(proxyPort)) {
// check for integer parse exception:
Integer.parseInt(proxyPort);
store.setDefault(key, proxyPort);
} else {
store.setDefault(key, System.getProperty(key, "80"));
}
} catch (Exception e) {
store.setDefault(key, System.getProperty(key, "80"));
}
key = HTTP_PROXYUSERNAME;
try {
String proxyUserName = resourceBundle.getString(key);
if (isDefined(proxyUserName)) {
store.setDefault(key, proxyUserName);
} else {
store.setDefault(key, System.getProperty(key, ""));
}
} catch (Exception e) {
store.setDefault(key, System.getProperty(key, ""));
}
key = HTTP_PROXYPASSWORD;
try {
String proxyPassWord = resourceBundle.getString(key);
if (isDefined(proxyPassWord)) {
store.setDefault(key, proxyPassWord);
} else {
store.setDefault(key, System.getProperty(key, ""));
}
} catch (Exception e) {
store.setDefault(key, System.getProperty(key, ""));
}
} catch (Exception e) {
}
}
/*
* Initializes the table of images used in this plugin. The plugin is provided because this method is called before the plugin
* staic variable has been set. See the comment on the getPlugin() method for a description of why this is required.
*/
private void initializeImages() {
URL baseURL = getDescriptor().getInstallURL();
// special
createImageDescriptor("glyphs/glyph1.gif", baseURL); //$NON-NLS-1$
createImageDescriptor("glyphs/glyph2.gif", baseURL); //$NON-NLS-1$
createImageDescriptor("glyphs/glyph3.gif", baseURL); //$NON-NLS-1$
createImageDescriptor("glyphs/glyph4.gif", baseURL); //$NON-NLS-1$
createImageDescriptor("glyphs/glyph5.gif", baseURL); //$NON-NLS-1$
createImageDescriptor("glyphs/glyph6.gif", baseURL); //$NON-NLS-1$
createImageDescriptor("glyphs/glyph7.gif", baseURL); //$NON-NLS-1$
createImageDescriptor("glyphs/glyph8.gif", baseURL); //$NON-NLS-1$
}
public void log(String message) {
getDefault().getLog().log(new Status(IStatus.OK, PLUGIN_ID, IStatus.OK, message, null));
}
public void log(String message, Exception e) {
getDefault().getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, "Caught exception", e));
}
public void logAndReport(String title, String message, Exception e) {
log(message, e);
reportError(title, message);
}
private void privateCreateImageDescriptor(String id, URL baseURL) {
URL url = null;
try {
url = new URL(baseURL, ICON_PATH + id);
} catch (MalformedURLException e) {
}
ImageDescriptor desc = ImageDescriptor.createFromURL(url);
imageDescriptors.put(id, desc);
}
private ImageDescriptor privateGetImageDescriptor(String id) {
if (!imageDescriptors.containsKey(id)) {
URL baseURL = WikiEditorPlugin.getDefault().getDescriptor().getInstallURL();
createImageDescriptor(getDefault(), id, baseURL);
}
return (ImageDescriptor) imageDescriptors.get(id);
}
public void reportError(String title, String message) {
try {
// Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
MessageDialog.openError(null, title, message);
} catch (RuntimeException e) {
log(e.getLocalizedMessage(), e);
}
}
// public void startup() throws CoreException {
// super.startup();
// }
/**
* Returns the translated String found with the given key.
*
* @return java.lang.String
* @param key
* java.lang.String
*/
public static String getResource(String key) {
try {
return Platform.getResourceString(getDefault().getBundle(), key);
} catch (Exception e) {
return key;
}
}
/**
* Returns the translated String found with the given key, and formatted with the given object.
*
* @param key
* java.lang.String
* @param obj
* java.lang.Object[]
* @return java.lang.String
*/
public static String getResource(String key, Object[] obj) {
try {
return MessageFormat.format(getResource(key), obj);
} catch (Exception e) {
return key;
}
}
/**
* Returns the translated String found with the given key, and formatted with the given object.
*
* @param key
* java.lang.String
* @param s
* java.lang.String
* @return java.lang.String
*/
public static String getResource(String key, String s) {
try {
return MessageFormat.format(getResource(key), new String[] { s });
} catch (Exception e) {
return key;
}
}
/**
* Return a list of all the existing configurations.
*
* @return java.util.List
*/
public static List getConfigurations() {
return manager.getConfigurations();
}
/**
* Create a new monitor.
*
* @return working copy
*/
public static IConfigurationWorkingCopy createConfiguration() {
return manager.createConfiguration();
}
public static ArrayList getTypes() {
return CONFIGURATION_TYPES;
}
public static void addType(String type) {
CONFIGURATION_TYPES.add(type);
}
/*
* (non - Javadoc) Method declared in Plugin
*/
public void start(BundleContext context) throws Exception {
super.start(context);
}
/*
* @see org.eclipse.core.runtime.Plugin#stop
*/
public void stop(BundleContext context) throws Exception {
try {
if (fWikiDB != null) {
try {
fWikiDB.shutdown();
} catch (SQLException e) {
}
}
} finally {
super.stop(context);
}
}
public static void log(int severity, String message) {
Status status = new Status(severity, PLUGIN_ID, IStatus.OK, message, null);
log(status);
}
public static void log(IStatus status) {
getDefault().getLog().log(status);
}
public static void log(Throwable e) {
log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, "PHPeclipsePlugin.internalErrorOccurred", e)); //$NON-NLS-1$
}
/**
* Get a IWikpedia singleton instance through reflection (i.e. Method#invoke() )
*
* @param wikiLocale
* @return
* @throws NoSuchMethodException
* @throws IllegalAccessException
* @throws ClassNotFoundException
* @throws InvocationTargetException
*/
public static IWikipedia getWikiInstance(String wikiLocale) throws NoSuchMethodException, IllegalAccessException,
ClassNotFoundException, InvocationTargetException {
String className = "net.sourceforge.phpeclipse.wiki.actions.mediawiki.config." + wikiLocale;
Class cls = Class.forName(className);
Method method = cls.getMethod("getInstance", new Class[0]);
return (IWikipedia) method.invoke(null, new Object[0]);
}
/**
* Returns the workspace instance.
*/
public static IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
// test code
// public static void main(String[] args) {
// try {
// getWikiInstance("WikipediaEN");
// } catch (NoSuchMethodException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (ClassNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (InvocationTargetException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
}