### Eclipse Workspace Patch 1.0 #P org.eclipse.mylyn.tasks.ui Index: src/org/eclipse/mylyn/internal/tasks/ui/ITasksUiPreferenceConstants.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITasksUiPreferenceConstants.java,v retrieving revision 1.12 diff -u -r1.12 ITasksUiPreferenceConstants.java --- src/org/eclipse/mylyn/internal/tasks/ui/ITasksUiPreferenceConstants.java 15 Jan 2010 02:02:58 -0000 1.12 +++ src/org/eclipse/mylyn/internal/tasks/ui/ITasksUiPreferenceConstants.java 7 May 2010 19:26:02 -0000 @@ -87,4 +87,8 @@ public static final String PREF_DATA_DIR = "org.eclipse.mylyn.data.dir"; //$NON-NLS-1$ public static final String DEFAULT_ATTACHMENTS_DIRECTORY = "org.eclipse.mylyn.tasks.ui.attachments.defaultDirectory"; //$NON-NLS-1$ + + public static final String SERVICE_MESSAGE_URL = "org.eclipse.mylyn.tasks.ui.servicemessage.url"; //$NON-NLS-1$; + + public static final String LAST_SERVICE_MESSAGE_ID = "org.eclipse.mylyn.tasks.ui.servicemessage.id"; } Index: src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java,v retrieving revision 1.131 diff -u -r1.131 TasksUiPlugin.java --- src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java 5 Feb 2010 01:12:35 -0000 1.131 +++ src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java 7 May 2010 19:26:02 -0000 @@ -77,6 +77,7 @@ import org.eclipse.mylyn.internal.tasks.core.externalization.IExternalizationParticipant; import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant; import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer; +import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessageManager; import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationReminder; import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotifier; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiExtensionReader; @@ -149,6 +150,8 @@ private RepositoryTemplateManager repositoryTemplateManager; + private ServiceMessageManager serviceMessageManager; + private final Set taskEditorPageFactories = new HashSet(); private final TreeSet repositoryLinkProviders = new TreeSet( @@ -605,6 +608,10 @@ // make this available early for clients that are not initialized through tasks ui but need access taskListNotificationManager = new TaskListNotificationManager(); + serviceMessageManager = new ServiceMessageManager(getPreferenceStore().getString( + ITasksUiPreferenceConstants.SERVICE_MESSAGE_URL)); + serviceMessageManager.start(); + // trigger lazy initialization new TasksUiInitializationJob().schedule(); } catch (Exception e) { @@ -727,6 +734,7 @@ // ContextCorePlugin.getDefault().getPluginPreferences().removePropertyChangeListener( // PREFERENCE_LISTENER); // } + serviceMessageManager.stop(); taskEditorBloatManager.dispose(PlatformUI.getWorkbench()); INSTANCE = null; } @@ -894,6 +902,8 @@ store.setDefault(ITasksUiPreferenceConstants.AUTO_EXPAND_TASK_LIST, true); store.setDefault(ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED, true); + + store.setDefault(ITasksUiPreferenceConstants.SERVICE_MESSAGE_URL, "http://eclipse.org/mylyn/message.xml"); //$NON-NLS-1$ } public static TaskActivityManager getTaskActivityManager() { @@ -1306,4 +1316,8 @@ } } + public ServiceMessageManager getServiceMessageManager() { + return serviceMessageManager; + } + } Index: src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java,v retrieving revision 1.338 diff -u -r1.338 TaskListView.java --- src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java 26 Apr 2010 17:37:32 -0000 1.338 +++ src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java 7 May 2010 19:26:02 -0000 @@ -86,6 +86,7 @@ import org.eclipse.mylyn.internal.tasks.ui.actions.TaskListSortAction; import org.eclipse.mylyn.internal.tasks.ui.actions.TaskListViewActionGroup; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskListChangeAdapter; +import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListServiceMessageControl; import org.eclipse.mylyn.internal.tasks.ui.util.PlatformUtil; import org.eclipse.mylyn.internal.tasks.ui.util.SortCriterion; import org.eclipse.mylyn.internal.tasks.ui.util.TaskDragSourceListener; @@ -131,6 +132,7 @@ import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Text; @@ -390,6 +392,8 @@ private CustomTaskListDecorationDrawer customDrawer; + private TaskListServiceMessageControl serviceMessageControl; + private final IPageListener PAGE_LISTENER = new IPageListener() { public void pageActivated(IWorkbenchPage page) { filteredTree.indicateActiveTaskWorkingSet(); @@ -730,6 +734,16 @@ @Override public void createPartControl(Composite parent) { + + Composite body = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(1, false); + layout.marginHeight = 0; + layout.marginWidth = 0; + layout.horizontalSpacing = 0; + layout.verticalSpacing = 0; + layout.numColumns = 1; + body.setLayout(layout); + IWorkbenchSiteProgressService progress = (IWorkbenchSiteProgressService) getSite().getAdapter( IWorkbenchSiteProgressService.class); if (progress != null) { @@ -743,7 +757,7 @@ themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager(); themeManager.addPropertyChangeListener(THEME_CHANGE_LISTENER); - filteredTree = new TaskListFilteredTree(parent, SWT.MULTI | SWT.VERTICAL | /* SWT.H_SCROLL | */SWT.V_SCROLL + filteredTree = new TaskListFilteredTree(body, SWT.MULTI | SWT.VERTICAL | /* SWT.H_SCROLL | */SWT.V_SCROLL | SWT.NO_SCROLL | SWT.FULL_SELECTION, new SubstringPatternFilter(), getViewSite().getWorkbenchWindow()); // need to do initialize tooltip early for native tooltip disablement to take effect @@ -922,6 +936,11 @@ TasksUiInternal.getTaskList().addChangeListener(TASKLIST_CHANGE_LISTENER); TasksUiPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(tasksUiPreferenceListener); + serviceMessageControl = new TaskListServiceMessageControl(body); + serviceMessageControl.setServiceMessage(TasksUiPlugin.getDefault() + .getServiceMessageManager() + .getServiceMessage()); + TasksUiPlugin.getDefault().getServiceMessageManager().addServiceMessageListener(serviceMessageControl); // Need to do this because the page, which holds the active working set is not around on creation, see bug 203179 PlatformUI.getWorkbench().getActiveWorkbenchWindow().addPageListener(PAGE_LISTENER); @@ -1263,6 +1282,7 @@ } public void goIntoCategory() { + serviceMessageControl.setHidden(true); ISelection selection = getViewer().getSelection(); if (selection instanceof StructuredSelection) { StructuredSelection structuredSelection = (StructuredSelection) selection; @@ -1280,6 +1300,7 @@ } public void goUpToRoot() { + serviceMessageControl.setHidden(false); drilledIntoCategory = null; drillDownAdapter.goBack(); IActionBars bars = getViewSite().getActionBars(); Index: src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListServiceMessageControl.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListServiceMessageControl.java diff -N src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListServiceMessageControl.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListServiceMessageControl.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,207 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.ui.notifications; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; +import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes; +import org.eclipse.mylyn.internal.provisional.commons.ui.GradientCanvas; +import org.eclipse.mylyn.internal.tasks.core.servicemessage.IServiceMessageListener; +import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessage; +import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants; +import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.forms.FormColors; +import org.eclipse.ui.forms.IFormColors; +import org.eclipse.ui.forms.events.HyperlinkAdapter; +import org.eclipse.ui.forms.events.HyperlinkEvent; +import org.eclipse.ui.forms.events.IHyperlinkListener; +import org.eclipse.ui.forms.widgets.Hyperlink; +import org.eclipse.ui.forms.widgets.ImageHyperlink; + +/** + * @author Robert Elves + */ +public class TaskListServiceMessageControl implements IServiceMessageListener { + + private ImageHyperlink imageHyperlink; + + private Hyperlink titleHyperlink; + + private Label descriptionLabel; + + private GridData headData; + + private final Composite parent; + + private GradientCanvas head; + + private ImageHyperlink closeLink; + + private ServiceMessage currentMessage; + + private boolean constructed; + + public TaskListServiceMessageControl(Composite parent) { + this.parent = parent; + createControl(parent); + } + + private void setTitleImage(Image image) { + imageHyperlink.setImage(image); + } + + private void setTitle(String title) { + titleHyperlink.setText(title); + } + + private void setDescription(String description) { + descriptionLabel.setText(description); + } + + private void addHyperlinkListener(IHyperlinkListener listener) { + titleHyperlink.addHyperlinkListener(listener); + imageHyperlink.addHyperlinkListener(listener); + } + + public Control createControl(Composite parent) { + FormColors colors = new FormColors(parent.getDisplay()); + head = new GradientCanvas(parent, SWT.NONE); + GridLayout headLayout = new GridLayout(); + headLayout.marginHeight = 0; + headLayout.marginWidth = 0; + headLayout.horizontalSpacing = 0; + headLayout.verticalSpacing = 0; + headLayout.numColumns = 1; + head.setLayout(headLayout); + headData = new GridData(SWT.FILL, SWT.TOP, true, false); + head.setLayoutData(headData); + setHidden(true); + + Color top = colors.getColor(IFormColors.H_GRADIENT_END); + Color bot = colors.getColor(IFormColors.H_GRADIENT_START); + head.setBackgroundGradient(new Color[] { bot, top }, new int[] { 100 }, true); + head.setSeparatorVisible(true); + head.setSeparatorAlignment(SWT.TOP); + + head.putColor(IFormColors.H_BOTTOM_KEYLINE1, colors.getColor(IFormColors.H_BOTTOM_KEYLINE1)); + head.putColor(IFormColors.H_BOTTOM_KEYLINE2, colors.getColor(IFormColors.H_BOTTOM_KEYLINE2)); + head.putColor(IFormColors.H_HOVER_LIGHT, colors.getColor(IFormColors.H_HOVER_LIGHT)); + head.putColor(IFormColors.H_HOVER_FULL, colors.getColor(IFormColors.H_HOVER_FULL)); + head.putColor(IFormColors.TB_TOGGLE, colors.getColor(IFormColors.TB_TOGGLE)); + head.putColor(IFormColors.TB_TOGGLE_HOVER, colors.getColor(IFormColors.TB_TOGGLE_HOVER)); + + Composite informationComp = new Composite(head, SWT.NONE); + informationComp.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));//new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL)); + informationComp.setLayout(new GridLayout(3, false)); + + imageHyperlink = new ImageHyperlink(informationComp, SWT.NONE); + + titleHyperlink = new Hyperlink(informationComp, SWT.WRAP); + setHeaderFontSizeAndStyle(titleHyperlink); + + closeLink = new ImageHyperlink(informationComp, SWT.NONE); + closeLink.setImage(CommonImages.getImage(CommonImages.NOTIFICATION_CLOSE)); + GridDataFactory.fillDefaults().align(SWT.END, SWT.BEGINNING).applyTo(closeLink); + closeLink.addHyperlinkListener(new HyperlinkAdapter() { + @Override + public void linkActivated(HyperlinkEvent e) { + closeMessage(); + + } + + }); + + new Label(informationComp, SWT.NONE); + + descriptionLabel = new Label(informationComp, SWT.WRAP); + GridDataFactory.swtDefaults().span(2, 1).applyTo(descriptionLabel); + constructed = true; + return head; + } + + private void closeMessage() { + if (currentMessage != null) { + setHidden(true); + TasksUiPlugin.getDefault().getPreferenceStore().setValue( + ITasksUiPreferenceConstants.LAST_SERVICE_MESSAGE_ID, currentMessage.getId()); + } + } + + public void setHidden(boolean hidden) { + headData.exclude = hidden; + if (constructed) { + parent.layout(true); + } + } + + // From EditorUtil + private static Font setHeaderFontSizeAndStyle(Control text) { + float sizeFactor = 1.2f; + Font initialFont = text.getFont(); + FontData[] fontData = initialFont.getFontData(); + for (FontData element : fontData) { + element.setHeight((int) (element.getHeight() * sizeFactor)); + element.setStyle(element.getStyle() | SWT.BOLD); + } + final Font textFont = new Font(text.getDisplay(), fontData); + text.setFont(textFont); + text.addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + textFont.dispose(); + } + }); + Color color = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getColorRegistry().get( + CommonThemes.COLOR_COMPLETED); + text.setForeground(color); + return textFont; + } + + public void setServiceMessage(final ServiceMessage message) { + if (message != null) { + String lastMessageId = TasksUiPlugin.getDefault().getPreferenceStore().getString( + ITasksUiPreferenceConstants.LAST_SERVICE_MESSAGE_ID); + if (!lastMessageId.equals(message.getId())) { + currentMessage = message; + Display.getDefault().asyncExec(new Runnable() { + + public void run() { + if (message != null) { + setTitle(message.getTitle()); + setDescription(message.getDescription()); + setTitleImage(Dialog.getImage(message.getImage())); + setHidden(false); + } else { + setHidden(true); + } + + } + }); + } + } + } + +} #P org.eclipse.mylyn.tasks.core Index: META-INF/MANIFEST.MF =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/META-INF/MANIFEST.MF,v retrieving revision 1.365 diff -u -r1.365 MANIFEST.MF --- META-INF/MANIFEST.MF 11 Apr 2010 19:49:55 -0000 1.365 +++ META-INF/MANIFEST.MF 7 May 2010 19:26:03 -0000 @@ -14,6 +14,7 @@ org.eclipse.mylyn.internal.tasks.core;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.internal.tasks.core.data;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.internal.tasks.core.externalization;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", + org.eclipse.mylyn.internal.tasks.core.servicemessage, org.eclipse.mylyn.internal.tasks.core.sync;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.tasks.core, org.eclipse.mylyn.tasks.core.data, Index: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageXmlHandler.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageXmlHandler.java diff -N src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageXmlHandler.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageXmlHandler.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.core.servicemessage; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +public class ServiceMessageXmlHandler extends DefaultHandler { + + private StringBuilder characters; + + private final ServiceMessage message = new ServiceMessage(); + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + characters.append(ch, start, length); + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + characters = new StringBuilder(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + + String parsedText = characters.toString(); + ServiceMessage.Element element; + try { + element = ServiceMessage.Element.valueOf(qName.trim()); + switch (element) { + case id: + message.id = parsedText; + break; + case description: + message.description = parsedText; + break; + case title: + message.title = parsedText; + break; + case url: + message.url = parsedText; + break; + case image: + message.image = parsedText; + break; + } + } catch (RuntimeException e) { + if (e instanceof IllegalArgumentException) { + // ignore unrecognized elements + return; + } + throw e; + } + } + + public ServiceMessage getMessage() { + return message; + } +} Index: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageManager.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageManager.java diff -N src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageManager.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageManager.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,172 @@ +/******************************************************************************* + * Copyright (c) 2004, 2008 Tasktop Technologies. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Tasktop EULA + * which accompanies this distribution, and is available at + * http://tasktop.com/legal + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.core.servicemessage; + +import java.io.InputStream; +import java.util.HashSet; +import java.util.Set; + +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.apache.commons.httpclient.HostConfiguration; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.GetMethod; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; +import org.eclipse.mylyn.commons.core.StatusHandler; +import org.eclipse.mylyn.commons.net.AbstractWebLocation; +import org.eclipse.mylyn.commons.net.WebLocation; +import org.eclipse.mylyn.commons.net.WebUtil; +import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants; + +// Todo: use Last-Modified and ETag headers +public class ServiceMessageManager { + + protected static final long START_DELAY = 30 * 1000; + + protected static final long RECHECK_DELAY = 2 * 60 * 60 * 1000; + + private static final String USER_AGENT = "MylynServiceMessageManager"; //$NON-NLS-1$ + +// private static final String URL = "http://tasktop.com/support/messages/dashboardMessage.php"; + private String serviceMessageUrl; + + private ServiceMessage currentMessage = null; + + private Job messageCheckJob; + + private final Set listeners = new HashSet(); + + private final HttpClient httpClient = new HttpClient(WebUtil.getConnectionManager()); + + public ServiceMessageManager(String serviceMessageUrl) { + + this.serviceMessageUrl = serviceMessageUrl; + + WebUtil.configureHttpClient(httpClient, USER_AGENT); + + } + + public void start() { + if (messageCheckJob == null) { + messageCheckJob = new Job("Checking for new Service Message") { //$NON-NLS-1$ + @Override + protected IStatus run(IProgressMonitor monitor) { + + updateServiceMessage(monitor); + + return Status.OK_STATUS; + } + + }; + messageCheckJob.setSystem(true); + messageCheckJob.addJobChangeListener(new JobChangeAdapter() { + @Override + public void done(IJobChangeEvent event) { + if (messageCheckJob != null) { + messageCheckJob.schedule(RECHECK_DELAY); + } + } + }); + } + messageCheckJob.schedule(START_DELAY); + } + + public void stop() { + if (messageCheckJob != null) { + messageCheckJob.cancel(); + messageCheckJob = null; + } + } + + public void setServiceMessageUrl(String url) { + this.serviceMessageUrl = url; + } + + public void addServiceMessageListener(IServiceMessageListener listener) { + listeners.add(listener); + } + + public void removeServiceMessageListener(IServiceMessageListener listener) { + listeners.remove(listener); + } + + private void notifyListeners(ServiceMessage message) { + for (IServiceMessageListener listener : listeners) { + listener.setServiceMessage(message); + } + } + + public ServiceMessage getServiceMessage() { + return currentMessage; + } + + /** + * Public for testing + */ + public void updateServiceMessage(IProgressMonitor monitor) { + GetMethod getMethod = null; + try { + + HostConfiguration hostConfiguration = null; + AbstractWebLocation location = null; + + location = new WebLocation(serviceMessageUrl); + hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, + new SubProgressMonitor(monitor, 1)); + + getMethod = new GetMethod(serviceMessageUrl); + + httpClient.getHttpConnectionManager().getParams().setSoTimeout(WebUtil.getConnectionTimeout()); + + int status = WebUtil.execute(httpClient, hostConfiguration, getMethod, monitor); + + if (status == HttpStatus.SC_OK) { + InputStream in = WebUtil.getResponseBodyAsStream(getMethod, monitor); + ServiceMessageXmlHandler handler = new ServiceMessageXmlHandler(); + try { + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setValidating(false); + SAXParser parser = factory.newSAXParser(); + parser.parse(in, handler); + } finally { + in.close(); + } + + ServiceMessage message = handler.getMessage(); + if (message.id != null) { + currentMessage = message; + notifyListeners(message); + } + + } else { + StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, + "Http error retrieving service message: " + HttpStatus.getStatusText(status))); //$NON-NLS-1$ + } + } catch (Exception e) { + StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, + "Http error retrieving service message.", e)); //$NON-NLS-1$ + } finally { + try { + if (getMethod != null) { + getMethod.releaseConnection(); + } + } catch (Throwable t) { + // ignore + } + } + } +} Index: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/IServiceMessageListener.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/IServiceMessageListener.java diff -N src/org/eclipse/mylyn/internal/tasks/core/servicemessage/IServiceMessageListener.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/core/servicemessage/IServiceMessageListener.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,18 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.core.servicemessage; + +public interface IServiceMessageListener { + + public void setServiceMessage(ServiceMessage message); + +} Index: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessage.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessage.java diff -N src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessage.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessage.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.core.servicemessage; + +public class ServiceMessage { + + public enum Element { + id, title, description, url, image + }; + + String id; + + String title; + + String description; + + String url; + + String image; + + public String getId() { + return id; + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public String getUrl() { + return url; + } + + public String getImage() { + return image; + } + +} #P org.eclipse.mylyn.tasks.tests Index: src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java,v retrieving revision 1.87 diff -u -r1.87 AllTasksTests.java --- src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java 4 Mar 2010 18:41:15 -0000 1.87 +++ src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java 7 May 2010 19:26:04 -0000 @@ -30,6 +30,7 @@ import org.eclipse.mylyn.tasks.tests.ui.editor.RepositoryCompletionProcessorTest; import org.eclipse.mylyn.tasks.tests.ui.editor.TaskEditorPartDescriptorTest; import org.eclipse.mylyn.tasks.tests.ui.editor.TaskUrlHyperlinkDetectorTest; +import org.eclipse.mylyn.tasks.tests.util.ServiceMessageManagerTest; /** * @author Mik Kersten @@ -102,6 +103,7 @@ suite.addTestSuite(PlanningPartTest.class); suite.addTestSuite(RepositoryCompletionProcessorTest.class); suite.addTestSuite(TaskAttributeDiffTest.class); + suite.addTestSuite(ServiceMessageManagerTest.class); // XXX long running tests, put back? //suite.addTestSuite(QueryExportImportTest.class); //suite.addTestSuite(BackgroundSaveTest.class); Index: src/org/eclipse/mylyn/tasks/tests/util/ServiceMessageManagerTest.java =================================================================== RCS file: src/org/eclipse/mylyn/tasks/tests/util/ServiceMessageManagerTest.java diff -N src/org/eclipse/mylyn/tasks/tests/util/ServiceMessageManagerTest.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/tasks/tests/util/ServiceMessageManagerTest.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.tasks.tests.util; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import junit.framework.TestCase; + +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessage; +import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessageManager; +import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessageXmlHandler; + +public class ServiceMessageManagerTest extends TestCase { + + public void testRetrievingMessage() throws Exception { + ServiceMessageManager manager = new ServiceMessageManager("http://eclipse.org/mylyn/messageTest.xml"); + manager.updateServiceMessage(new NullProgressMonitor()); + ServiceMessage message = manager.getServiceMessage(); + + assertEquals("1", message.getId()); + assertEquals("140 character description here....", message.getDescription()); + assertEquals("Mylyn 3.4 now available!", message.getTitle()); + assertEquals("http://eclipse.org/mylyn/downloads", message.getUrl()); + assertEquals("Mylyn 3.4 now available!", message.getTitle()); + assertEquals("dialog_messasge_info_image", message.getImage()); + } + + public void testParsingMessageXml() throws Exception { + String messageXml = " 1140 character description here....Mylyn 3.4 now available!http://eclipse.org/mylyn/downloadsdialog_messasge_info_image"; + InputStream is = new ByteArrayInputStream(messageXml.getBytes("UTF-8")); + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setValidating(false); + SAXParser parser = factory.newSAXParser(); + ServiceMessageXmlHandler handler = new ServiceMessageXmlHandler(); + parser.parse(is, handler); + ServiceMessage message = handler.getMessage(); + + assertEquals("1", message.getId()); + assertEquals("140 character description here....", message.getDescription()); + assertEquals("Mylyn 3.4 now available!", message.getTitle()); + assertEquals("http://eclipse.org/mylyn/downloads", message.getUrl()); + assertEquals("Mylyn 3.4 now available!", message.getTitle()); + assertEquals("dialog_messasge_info_image", message.getImage()); + } +}