sling-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From romb...@apache.org
Subject svn commit: r1504903 - in /sling/whiteboard/asanso/plugins/eclipse: slingclipse-http/src/org/apache/sling/slingclipse/http/impl/ slingclipse-plugin/ slingclipse-plugin/src/org/apache/sling/slingclipse/ui/wizards/ slingclipse-wst/ slingclipse-wst/META-I...
Date Fri, 19 Jul 2013 15:03:29 GMT
Author: rombert
Date: Fri Jul 19 15:03:29 2013
New Revision: 1504903

URL: http://svn.apache.org/r1504903
Log:
SLING-2973 - [Tooling] Align Eclipse tooling to proposed structure

Make the import action based on the Sling facet rather than the nature.

Added:
    sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportContentAction.java
  (with props)
    sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizard.java
  (contents, props changed)
      - copied, changed from r1504902, sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/ui/wizards/ImportWizard.java
    sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizardPage.java
  (with props)
    sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/SelectionUtils.java
  (with props)
Removed:
    sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/ui/wizards/ImportWizard.java
    sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/ui/wizards/ImportWizardPage.java
Modified:
    sling/whiteboard/asanso/plugins/eclipse/slingclipse-http/src/org/apache/sling/slingclipse/http/impl/RepositoryImpl.java
    sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/plugin.xml
    sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/META-INF/MANIFEST.MF
    sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/plugin.xml
    sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/internal/SlingLaunchpadBehaviour.java
    sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/internal/SlingLaunchpadServer.java

Modified: sling/whiteboard/asanso/plugins/eclipse/slingclipse-http/src/org/apache/sling/slingclipse/http/impl/RepositoryImpl.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-http/src/org/apache/sling/slingclipse/http/impl/RepositoryImpl.java?rev=1504903&r1=1504902&r2=1504903&view=diff
==============================================================================
--- sling/whiteboard/asanso/plugins/eclipse/slingclipse-http/src/org/apache/sling/slingclipse/http/impl/RepositoryImpl.java
(original)
+++ sling/whiteboard/asanso/plugins/eclipse/slingclipse-http/src/org/apache/sling/slingclipse/http/impl/RepositoryImpl.java
Fri Jul 19 15:03:29 2013
@@ -18,6 +18,7 @@ package org.apache.sling.slingclipse.htt
 
 import java.io.File;
 import java.util.Map;
+
 import org.apache.commons.httpclient.Credentials;
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.UsernamePasswordCredentials;
@@ -46,7 +47,7 @@ public class RepositoryImpl extends Abst
 		return new Command<Void>() {
 			@Override
 			public Result<Void> execute() {
-				PostMethod post = new PostMethod(repositoryInfo.getUrl()+fileInfo.getRelativeLocation());
+                PostMethod post = new PostMethod(createFullPath(fileInfo.getRelativeLocation()));
 				try{
 					File f=new File(fileInfo.getLocation());
                     if (f.isFile()) {
@@ -97,7 +98,8 @@ public class RepositoryImpl extends Abst
 		return new Command<Void>() {
 			@Override
 			public Result<Void> execute() {
-				PostMethod post = new PostMethod(repositoryInfo.getUrl()+fileInfo.getRelativeLocation()+"/"+fileInfo.getName());
+                PostMethod post = new PostMethod(createFullPath(fileInfo.getRelativeLocation()
+ "/"
+                        + fileInfo.getName()));
 				try{
 					Part[] parts ={new StringPart(":operation", "delete")};
 					post.setRequestEntity(new MultipartRequestEntity(parts,post.getParams()));
@@ -126,7 +128,7 @@ public class RepositoryImpl extends Abst
 			@Override
 			public Result<String> execute() {
 				//TODO handle the response type
-				GetMethod get= new GetMethod(repositoryInfo.getUrl()+path+".1.json");
+                GetMethod get = new GetMethod(createFullPath(path + ".1.json"));
 				try{
 					httpClient.getParams().setAuthenticationPreemptive(true);
 				    Credentials defaultcreds = new UsernamePasswordCredentials(repositoryInfo.getUsername(),
repositoryInfo.getPassword());
@@ -162,7 +164,7 @@ public class RepositoryImpl extends Abst
 			@Override
 			public Result<byte[]> execute() {
 				
-				GetMethod get= new GetMethod(repositoryInfo.getUrl()+path);
+                GetMethod get = new GetMethod(createFullPath(path));
 				
 				try{
 					httpClient.getParams().setAuthenticationPreemptive(true);
@@ -190,13 +192,28 @@ public class RepositoryImpl extends Abst
 		};
 	}
 	
+    private String createFullPath(String relativePath) {
+
+        boolean repoUrlHasTrailingSlash = repositoryInfo.getUrl().endsWith("/");
+        boolean relativePathHasLeadingSlash = !relativePath.isEmpty() && relativePath.charAt(0)
== '/';
+
+        if (repoUrlHasTrailingSlash ^ relativePathHasLeadingSlash)
+            return repositoryInfo.getUrl() + relativePath;
+        if (!repoUrlHasTrailingSlash && !relativePathHasLeadingSlash)
+            return repositoryInfo.getUrl() + '/' + relativePath;
+        if (repoUrlHasTrailingSlash && relativePathHasLeadingSlash)
+            return repositoryInfo.getUrl() + relativePath.substring(1);
+
+        throw new AssertionError("unreachable");
+    }
+
 	@Override
 	public Command<String> newGetNodeContentCommand(final String path, final ResponseType
responseType) {
 		return new Command<String>() {
 			@Override
 			public Result<String> execute() {
 				//TODO handle the response type
-				GetMethod get= new GetMethod(repositoryInfo.getUrl()+path+".json");
+                GetMethod get = new GetMethod(createFullPath(path + ".json"));
 				try{
 					httpClient.getParams().setAuthenticationPreemptive(true);
 				    Credentials defaultcreds = new UsernamePasswordCredentials(repositoryInfo.getUsername(),
repositoryInfo.getPassword());
@@ -229,7 +246,7 @@ public class RepositoryImpl extends Abst
 		return new Command<Void>() {
 			@Override
 			public Result<Void> execute() {
-				PostMethod post = new PostMethod(repositoryInfo.getUrl()+fileInfo.getRelativeLocation());
+                PostMethod post = new PostMethod(createFullPath(fileInfo.getRelativeLocation()));
 				try{
 					Part[] parts = new Part[properties.size()];
 					int counter=0;

Modified: sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/plugin.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/plugin.xml?rev=1504903&r1=1504902&r2=1504903&view=diff
==============================================================================
--- sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/plugin.xml (original)
+++ sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/plugin.xml Fri Jul 19 15:03:29
2013
@@ -19,23 +19,6 @@
       </initializer>
    </extension>
    <extension
-         point="org.eclipse.ui.importWizards">
-      <category
-            id="org.apache.sling.slingclipse.ui.wizards.sampleCategory"
-            name="Sling">
-      </category>
-      <wizard
-            category="org.apache.sling.slingclipse.ui.wizards.sampleCategory"
-            class="org.apache.sling.slingclipse.ui.wizards.ImportWizard"
-            icon="src/org/apache/sling/slingclipse/images/sling-logo.png"
-            id="org.apache.sling.slingclipse.ui.wizards.ImportWizard"
-            name="Import from Sling Repository">
-         <description>
-            Import a file from the local file system into the workspace.
-         </description>
-      </wizard>
-   </extension>
-   <extension
          id="org.apache.sling.slingclipse.SlingProjectNature"
          point="org.eclipse.core.resources.natures">
       <runtime>
@@ -54,23 +37,20 @@
                class="org.apache.sling.slingclipse.internal.AddSlingNatureAction"
                id="org.apache.sling.slingclipse.enableNatureAction"
                label="Convert to Sling Project"
-               menubarPath="org.eclipse.ui.projectConfigure/additions"
                style="push">
          </action>
          <visibility>
-            <and>
-               <objectState
-                     name="open"
-                     value="true">
-               </objectState>
-               <not>
-                  <objectState
-                        name="nature"
-                        value="org.apache.sling.slingclipse.SlingProjectNature">
-                  </objectState>
-               </not>
-            </and>
+           <objectState
+                 name="open"
+                 value="true">
+           </objectState>
          </visibility>
+         <enablement>
+               <test 
+               		property="org.eclipse.wst.common.project.facet.core.projectFacet"
+               		value="sling.content">
+               </test>
+         </enablement>
       </objectContribution>
    </extension>
    <extension

Modified: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/META-INF/MANIFEST.MF?rev=1504903&r1=1504902&r2=1504903&view=diff
==============================================================================
--- sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/META-INF/MANIFEST.MF (original)
+++ sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/META-INF/MANIFEST.MF Fri Jul 19
15:03:29 2013
@@ -19,7 +19,11 @@ Import-Package: org.apache.sling.slingcl
  org.eclipse.debug.ui.sourcelookup,
  org.eclipse.jdt.debug.ui.launchConfigurations,
  org.eclipse.jdt.launching,
+ org.eclipse.jface.action,
+ org.eclipse.jface.dialogs,
  org.eclipse.jface.viewers,
+ org.eclipse.jface.window,
+ org.eclipse.jface.wizard,
  org.eclipse.jst.common.project.facet.core,
  org.eclipse.jst.server.core,
  org.eclipse.swt,
@@ -27,6 +31,7 @@ Import-Package: org.apache.sling.slingcl
  org.eclipse.swt.layout,
  org.eclipse.swt.widgets,
  org.eclipse.ui,
+ org.eclipse.ui.dialogs,
  org.eclipse.ui.forms,
  org.eclipse.ui.forms.widgets,
  org.eclipse.wst.common.project.facet.core,
@@ -34,4 +39,5 @@ Import-Package: org.apache.sling.slingcl
  org.eclipse.wst.server.core.model,
  org.eclipse.wst.server.core.util,
  org.eclipse.wst.server.ui,
- org.eclipse.wst.server.ui.editor
+ org.eclipse.wst.server.ui.editor,
+ org.json

Modified: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/plugin.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/plugin.xml?rev=1504903&r1=1504902&r2=1504903&view=diff
==============================================================================
--- sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/plugin.xml (original)
+++ sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/plugin.xml Fri Jul 19 15:03:29
2013
@@ -162,6 +162,45 @@
     <image runtime-component-type="org.apache.sling.launchpad"
        path="icons/obj16/sling.gif"/>
   </extension>
+  
+  <!-- Menu contributions -->
+     <extension
+         point="org.eclipse.ui.popupMenus">
+         <!-- All Sling contributions -->
+        <objectContribution
+            id="org.apache.sling.slingclipse.slingMenu"
+            objectClass="org.eclipse.core.resources.IProject">
+            <menu id="org.apache.sling.slingclipse.slingMenu"
+              path="additions"
+              label="Sling">
+            	<groupMarker name="sling"/>
+            </menu>
+         </objectContribution>
+         <!-- Import. 
+         	I prefer to do this outside the import wizard section since I can restrict the
destination -->
+         <objectContribution id="org.apache.sling.slingclipse.slingImport"
+         	objectClass="org.eclipse.core.resources.IProject">
+         	
+         <action
+               class="org.apache.sling.ide.eclipse.wst.ui.internal.ImportContentAction"
+               id="org.apache.sling.slingclipse.importContentAction"
+               label="Import Content..."
+               menubarPath="org.apache.sling.slingclipse.slingMenu/sling"
+               style="push">
+         </action>
+         <visibility>
+               <objectState
+                     name="open"
+                     value="true">
+               </objectState>
+         </visibility>
+         <enablement>
+				<test 
+		            property="org.eclipse.wst.common.project.facet.core.projectFacet" 
+		            value="sling.content"/>         
+         </enablement>
+		</objectContribution>
+  </extension>
    
 <!--
   <extension point="org.eclipse.debug.ui.launchConfigurationTypeImages">

Modified: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/internal/SlingLaunchpadBehaviour.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/internal/SlingLaunchpadBehaviour.java?rev=1504903&r1=1504902&r2=1504903&view=diff
==============================================================================
--- sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/internal/SlingLaunchpadBehaviour.java
(original)
+++ sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/internal/SlingLaunchpadBehaviour.java
Fri Jul 19 15:03:29 2013
@@ -191,9 +191,9 @@ public class SlingLaunchpadBehaviour ext
         super.publishModule(kind, deltaKind, module, monitor);
     }
 
-    private Repository getRepository(IProgressMonitor monitor) {
+    public static Repository getRepository(IServer server, IProgressMonitor monitor) {
 
-        SlingLaunchpadServer launchpadServer = (SlingLaunchpadServer) getServer().loadAdapter(
+        SlingLaunchpadServer launchpadServer = (SlingLaunchpadServer) server.loadAdapter(
                 SlingLaunchpadServer.class, monitor);
 
         SlingLaunchpadConfiguration configuration = launchpadServer.getConfiguration();
@@ -201,7 +201,7 @@ public class SlingLaunchpadBehaviour ext
         Repository repository = SlingclipsePlugin.getDefault().getRepository();
         try {
             // TODO configurable scheme?
-            URI uri = new URI("http", null, getServer().getHost(), configuration.getPort(),
+            URI uri = new URI("http", null, server.getHost(), configuration.getPort(),
                     configuration.getContextPath(), null, null);
             RepositoryInfo repositoryInfo = new RepositoryInfo(configuration.getUsername(),
                     configuration.getPassword(), uri.toString());
@@ -212,6 +212,11 @@ public class SlingLaunchpadBehaviour ext
         return repository;
     }
 
+    private Repository getRepository(IProgressMonitor monitor) {
+
+        return getRepository(getServer(), monitor);
+    }
+
     private void execute(Command<?> command) throws CoreException {
         if (command == null) {
             return;

Modified: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/internal/SlingLaunchpadServer.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/internal/SlingLaunchpadServer.java?rev=1504903&r1=1504902&r2=1504903&view=diff
==============================================================================
--- sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/internal/SlingLaunchpadServer.java
(original)
+++ sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/internal/SlingLaunchpadServer.java
Fri Jul 19 15:03:29 2013
@@ -25,11 +25,17 @@ import org.eclipse.wst.server.core.model
 
 public class SlingLaunchpadServer extends ServerDelegate {
 
+    public static final int PUBLISH_STATE_NEVER = 1;
+    public static final int PUBLISH_STATE_RESOURCE_CHANGE = 2;
+    public static final int PUBLISH_STATE_BUILD_EVENT = 3;
+
     public static final String PROP_PASSWORD = "launchpad.password";
     public static final String PROP_USERNAME = "launchpad.username";
     public static final String PROP_CONTEXT_PATH = "launchpad.contextPath";
     public static final String PROP_PORT = "launchpad.port";
 
+    private static final String PROP_AUTO_PUBLISH_SETTING = "auto-publish-setting";
+
     private static final String MODULE_TYPE_SLING_CONTENT = "sling.content";
 
     private SlingLaunchpadConfiguration config;
@@ -130,4 +136,14 @@ public class SlingLaunchpadServer extend
         setAttribute(PROP_PASSWORD, "admin");
     }
 
+
+    public int getPublishState() {
+        return getAttribute(PROP_AUTO_PUBLISH_SETTING, PUBLISH_STATE_NEVER);
+    }
+
+    public void setPublishState(int publishState) {
+        System.out.println("[" + Thread.currentThread().getName() + "] Set " + PROP_AUTO_PUBLISH_SETTING
+ " to "
+                + publishState);
+        setAttribute(PROP_AUTO_PUBLISH_SETTING, publishState);
+    }
 }

Added: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportContentAction.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportContentAction.java?rev=1504903&view=auto
==============================================================================
--- sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportContentAction.java
(added)
+++ sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportContentAction.java
Fri Jul 19 15:03:29 2013
@@ -0,0 +1,111 @@
+/*************************************************************************
+ *
+ * ADOBE CONFIDENTIAL
+ * __________________
+ *
+ *  Copyright 2013 Adobe Systems Incorporated
+ *  All Rights Reserved.
+ *
+ * NOTICE:  All information contained herein is, and remains
+ * the property of Adobe Systems Incorporated and its suppliers,
+ * if any.  The intellectual and technical concepts contained
+ * herein are proprietary to Adobe Systems Incorporated and its
+ * suppliers and are protected by trade secret or copyright law.
+ * Dissemination of this information or reproduction of this material
+ * is strictly forbidden unless prior written permission is obtained
+ * from Adobe Systems Incorporated.
+ **************************************************************************/
+package org.apache.sling.ide.eclipse.wst.ui.internal;
+
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.ServerUtil;
+
+/**
+ * The <tt>ImportContentAction</tt> TODO
+ *
+ */
+public class ImportContentAction implements IObjectActionDelegate, IExecutableExtension {
+
+    private ISelection selection;
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+     */
+    @Override
+    public void run(IAction action) {
+        if (!(selection instanceof IStructuredSelection)) {
+            return;
+        }
+
+        IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+
+        for (Iterator<?> it = structuredSelection.iterator(); it.hasNext();) {
+            Object selected = it.next();
+            if (selected instanceof IProject) {
+                IProject project = (IProject) selected;
+
+                IModule module = ServerUtil.getModule(project);
+
+                if (!module.getModuleType().getId().equals("sling.content")) {
+                    continue;
+                }
+
+                ImportWizard wiz = new ImportWizard();
+                wiz.init(PlatformUI.getWorkbench(), structuredSelection);
+
+                WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell(),
wiz);
+                dialog.open();
+
+            }
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
+     * org.eclipse.jface.viewers.ISelection)
+     */
+    @Override
+    public void selectionChanged(IAction action, ISelection selection) {
+        this.selection = selection;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement
+     * , java.lang.String, java.lang.Object)
+     */
+    @Override
+    public void setInitializationData(IConfigurationElement config, String propertyName,
Object data)
+            throws CoreException {
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction,
+     * org.eclipse.ui.IWorkbenchPart)
+     */
+    @Override
+    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+    }
+
+}

Propchange: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportContentAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportContentAction.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Copied: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizard.java
(from r1504902, sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/ui/wizards/ImportWizard.java)
URL: http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizard.java?p2=sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizard.java&p1=sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/ui/wizards/ImportWizard.java&r1=1504902&r2=1504903&rev=1504903&view=diff
==============================================================================
--- sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/ui/wizards/ImportWizard.java
(original)
+++ sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizard.java
Fri Jul 19 15:03:29 2013
@@ -14,24 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sling.slingclipse.ui.wizards;
+package org.apache.sling.ide.eclipse.wst.ui.internal;
 
 import java.io.ByteArrayInputStream;
-import java.lang.reflect.InvocationTargetException;
 import java.nio.charset.Charset;
 import java.util.Iterator;
 
+import org.apache.sling.ide.eclipse.wst.internal.SlingLaunchpadBehaviour;
+import org.apache.sling.ide.eclipse.wst.internal.SlingLaunchpadServer;
 import org.apache.sling.slingclipse.SlingclipsePlugin;
 import org.apache.sling.slingclipse.api.Command;
 import org.apache.sling.slingclipse.api.Repository;
 import org.apache.sling.slingclipse.api.RepositoryException;
-import org.apache.sling.slingclipse.api.RepositoryInfo;
 import org.apache.sling.slingclipse.api.ResponseType;
 import org.apache.sling.slingclipse.api.Result;
 import org.apache.sling.slingclipse.helper.SlingclipseHelper;
 import org.apache.sling.slingclipse.helper.Tracer;
-import org.apache.sling.slingclipse.images.SharedImages;
-import org.apache.sling.slingclipse.preferences.PreferencesMessages;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
@@ -39,14 +37,14 @@ import org.eclipse.core.resources.Resour
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.ui.IImportWizard;
 import org.eclipse.ui.IWorkbench;
+import org.eclipse.wst.server.core.IServer;
 import org.json.JSONException;
 import org.json.JSONML;
 import org.json.JSONObject;
@@ -58,61 +56,77 @@ import org.json.JSONObject;
 public class ImportWizard extends Wizard implements IImportWizard {
 	private ImportWizardPage mainPage;
 
+	/**
+	 * Construct a new Import Wizard container instance.
+	 */
+	public ImportWizard() {
+		super();
+	}
+
 	/*
 	 * (non-Javadoc)
 	 * 
 	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
 	 */
 	public boolean performFinish() {
-	    
-	    if ( !mainPage.isPageComplete() )
-	        return false;
-		
-		final Repository repository = SlingclipsePlugin.getDefault().getRepository();
-		RepositoryInfo repositoryInfo = new RepositoryInfo(
-				mainPage.getUsername(),
-				mainPage.getPassword(),
-				mainPage.getRepositoryUrl());
-		repository.setRepositoryInfo(repositoryInfo);
- 
-		IPath destinationPath = mainPage.getResourcePath();
-		
-		final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(destinationPath.segments()[0]);
-		final IPath projectRelativePath = destinationPath.removeFirstSegments(1);
-		final String repositoryPath = mainPage.getRepositoryPath();
 		
-        try {
-            getContainer().run(false, true, new IRunnableWithProgress() {
-
-                @Override
-                public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
-                    Tracer tracer = SlingclipsePlugin.getDefault().getTracer();
-
-                    monitor = SubMonitor.convert(monitor, "Importing from " + mainPage.getRepositoryUrl()
+ " ...",
-                            IProgressMonitor.UNKNOWN);
+		if (mainPage.isPageComplete()) {
 
-                    IPreferenceStore store = SlingclipsePlugin.getDefault().getPreferenceStore();
-                    boolean autoSync = store.getBoolean(PreferencesMessages.REPOSITORY_AUTO_SYNC.getKey());
-                    try {
-                        store.setValue(PreferencesMessages.REPOSITORY_AUTO_SYNC.getKey(),
false);
+            final IServer server = mainPage.getServer();
+	 
+			IPath destinationPath = mainPage.getResourcePath();
+			
+			final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(destinationPath.segments()[0]);
+			final IPath projectRelativePath = destinationPath.removeFirstSegments(1);
+			final String repositoryPath = mainPage.getRepositoryPath();
+			
+			Job job = new Job("Import") {
+
+				protected IStatus run(IProgressMonitor monitor) {
+
+                    Repository repository = SlingLaunchpadBehaviour.getRepository(server,
monitor);
+
+					Tracer tracer = SlingclipsePlugin.getDefault().getTracer();
+					
+					monitor.setTaskName("Loading configuration...");
+					monitor.worked(5);
+                    SlingLaunchpadServer launchpad = (SlingLaunchpadServer) server.loadAdapter(
+                            SlingLaunchpadServer.class, monitor);
+					
+                    int oldPublishState = launchpad.getPublishState();
+                    // TODO disabling publish does not work; since the publish is done async
+                    // Not sure if there is a simple workaround. Anyway, the only side effect
is that we
+                    // make too many calls after the import, functionality is not affected
+                    if (server.canPublish().isOK() && oldPublishState != SlingLaunchpadServer.PUBLISH_STATE_NEVER)
{
+                        launchpad.setPublishState(SlingLaunchpadServer.PUBLISH_STATE_NEVER);
+                    }
 
-                        // TODO: We should try to make this give 'nice' progress feedback
(aka here's what I'm
-                        // processing)
+					try {
 
-                        // TODO: check for cancellation
+						// TODO: We should try to make this give 'nice' progress feedback (aka here's what
I'm processing)
+						monitor.setTaskName("Importing...");
+						monitor.worked(10);
 
                         // we create the root node and assume this is a folder
                         createRoot(project, projectRelativePath, repositoryPath);
 
-                        crawlChildrenAndImport(repository, repositoryPath, project, projectRelativePath,
tracer);
-                    } catch (Exception e) {
-                        throw new InvocationTargetException(e);
-                    } finally {
-                        monitor.done();
-                        // restore to the original value
-                        store.setValue(PreferencesMessages.REPOSITORY_AUTO_SYNC.getKey(),
autoSync);
-                    }
-                }
+				 		crawlChildrenAndImport(repository, repositoryPath, project, projectRelativePath, tracer);
+						
+						monitor.setTaskName("Import Complete");
+						monitor.worked(100);
+					} catch ( Exception e) {
+						Status status = new Status(Status.ERROR, SlingclipsePlugin.PLUGIN_ID, "Failed importing
repository ", e);
+						SlingclipsePlugin.getDefault().getLog().log(status);
+						return status;
+					}finally{
+                        if (oldPublishState != SlingLaunchpadServer.PUBLISH_STATE_NEVER)
{
+                            launchpad.setPublishState(oldPublishState);
+                        }
+
+					}
+					
+					return Status.OK_STATUS;
+				}
 
                 private void createRoot(final IProject project, final IPath projectRelativePath,
                         final String repositoryPath) throws CoreException {
@@ -122,18 +136,14 @@ public class ImportWizard extends Wizard
                     for (int i = rootImportPath.segmentCount() - 1; i > 0; i--)
                         createFolder(project, rootImportPath.removeLastSegments(i));
                 }
-            });
-        } catch (InterruptedException e) {
-            return false;
-        } catch (InvocationTargetException e) {
-            Throwable cause = e.getCause();
-            mainPage.setErrorMessage("Import error : " + cause.getMessage()
-                    + " . Please see the error log for details.");
-            SlingclipsePlugin.getDefault().getLog()
-                    .log(new Status(Status.ERROR, SlingclipsePlugin.PLUGIN_ID, "Repository
import failed", cause));
-            return false;
-        }
-		return true;
+			};
+			job.setSystem(false);
+			job.setUser(true);
+			job.schedule();
+			return true;
+		} else {
+			return false;
+		}
 	}
 
 	/*
@@ -144,7 +154,6 @@ public class ImportWizard extends Wizard
 	 */
 	public void init(IWorkbench workbench, IStructuredSelection selection) {
 		setWindowTitle("Repositoy Import"); // NON-NLS-1
-        setDefaultPageImageDescriptor(SharedImages.SLING_LOG);
 		setNeedsProgressMonitor(true);
 		mainPage = new ImportWizardPage("Import from Repository", selection); // NON-NLS-1
 	}
@@ -174,6 +183,9 @@ public class ImportWizard extends Wizard
 	// TODO: This probably should be pushed into the service layer	
 	private void crawlChildrenAndImport(Repository repository,String path,IProject project,
IPath projectRelativePath, Tracer tracer) throws JSONException, RepositoryException, CoreException{
 
+        System.out.println("crawlChildrenAndImport(" + repository + ", " + path + ", " +
project + ", "
+                + projectRelativePath + ")");
+
         String children = executeCommand(repository.newListChildrenNodeCommand(path, ResponseType.JSON),
tracer);
 		JSONObject json = new JSONObject(children);
 		String primaryType= json.optString(Repository.JCR_PRIMARY_TYPE);
@@ -193,8 +205,8 @@ public class ImportWizard extends Wizard
 			createFile( project, projectRelativePath.append( path+"/"+SlingclipseHelper.CONTENT_XML),
contentXml.getBytes(Charset.forName("UTF-8") /* TODO is this enough? */));
 		}
  		
-		for (Iterator<String> keys = json.keys(); keys.hasNext();) {
-			String key = keys.next();
+        for (Iterator<?> keys = json.keys(); keys.hasNext();) {
+            String key = (String) keys.next();
 			JSONObject innerjson=json.optJSONObject(key);
 			if (innerjson!=null){
 				crawlChildrenAndImport(repository, path+"/"+key, project, projectRelativePath, tracer);
@@ -212,7 +224,10 @@ public class ImportWizard extends Wizard
 	}	
 	
 	private void importFile(Repository repository,String path,IProject project, IPath destinationPath,
Tracer tracer) throws JSONException, RepositoryException, CoreException{ 
-			byte [] node= executeCommand(repository.newGetNodeCommand(path), tracer); 
+
+        System.out.println("importFile: " + path + " -> " + destinationPath);
+
+        byte[] node = executeCommand(repository.newGetNodeCommand(path), tracer);
 			createFile(project, destinationPath.append(path), node );
 	}
 	

Propchange: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizard.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizard.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizardPage.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizardPage.java?rev=1504903&view=auto
==============================================================================
--- sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizardPage.java
(added)
+++ sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizardPage.java
Fri Jul 19 15:03:29 2013
@@ -0,0 +1,234 @@
+/*
+ * 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.sling.ide.eclipse.wst.ui.internal;
+
+
+import java.util.List;
+
+import org.apache.sling.slingclipse.helper.SlingclipseHelper;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.WizardResourceImportPage;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.core.ServerCore;
+
+/**
+ * Wizard page for importing content from Sling Repositories.
+ */
+public class ImportWizardPage extends WizardResourceImportPage {
+
+	private IStructuredSelection selection;
+	private Text path;
+	private ModifyListener modifyListener = new ModifyListener() {
+		@Override
+		public void modifyText(ModifyEvent event) {
+			try{
+				determinePageCompletion();
+				updateWidgetEnablements();
+			}catch(Exception e){
+				//TODO: Log or just ignore?
+			}
+		}
+	};
+    private Combo repositoryCombo;
+
+	/**
+	 * Creates an import wizard page for importing from a Sling Repository. If
+	 * the initial resource selection contains exactly one container resource
+	 * then it will be used as the default import destination. Multiple
+	 * selections are not supported, but are not disallowed.
+	 * 
+	 * @param pageName
+	 *            the name of the page
+	 * @param selection
+	 *            the current resource selection
+	 */
+	public ImportWizardPage(String pageName, IStructuredSelection selection) {
+		super(pageName, selection);
+		this.selection = selection;
+		setTitle(pageName); // NON-NLS-1
+		setDescription("Import content from a Sling Repository into the workspace"); // NON-NLS-1
+
+        setContainerFieldValue(getProject(selection).getFullPath()
+                .append(SlingclipseHelper.JCR_ROOT).toOSString());
+	}
+
+    private IProject getProject(IStructuredSelection selection) {
+        return (IProject) selection.getFirstElement();
+    }
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.dialogs.WizardResourceImportPage#allowNewContainerName()
+	 */
+	@Override
+	protected boolean allowNewContainerName() {
+		return false;
+	}
+
+	@Override
+	protected void createOptionsGroup(Composite parent) {
+
+	}
+
+    @Override
+	protected void createSourceGroup(Composite parent) {
+
+        // TODO: Currently only supports first selection
+        IResource resource = ((IResource) selection.getFirstElement());
+        String pathStr = resource.getFullPath().toPortableString();
+
+		Composite container = new Composite(parent, SWT.NONE);
+		container.setLayout(new GridLayout(2, false));
+		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
+		gridData.minimumWidth = 450;
+		container.setLayoutData(gridData);
+
+        new Label(container, SWT.NONE).setText("Repository: ");
+
+        repositoryCombo = new Combo(container, SWT.DROP_DOWN);
+        repositoryCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+        List<IServer> servers = SelectionUtils.getServersLinkedToProject(selection,
new NullProgressMonitor());
+        if (servers.size() > 1) {
+            repositoryCombo.add(""); // force selection only if there is more than one server
+        }
+        for (IServer server : servers) {
+            repositoryCombo.add(server.getId());
+        }
+
+        if (servers.size() == 1) {
+            repositoryCombo.select(0);
+        }
+
+        Label pathLabel = new Label(container, SWT.NONE);
+        pathLabel.setText("Repository Path:");
+        path = new Text(container, SWT.BORDER);
+        path.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+        path.addModifyListener(modifyListener);
+
+        if (SlingclipseHelper.isValidSlingProjectPath(pathStr)) {
+            path.setText(SlingclipseHelper.getSlingProjectPath(pathStr));
+        }
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.dialogs.WizardResourceImportPage#getFileProvider()
+	 */
+	@Override
+	protected ITreeContentProvider getFileProvider() {
+		// TODO Not sure if I need to return anything here...
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.dialogs.WizardResourceImportPage#getFolderProvider()
+	 */
+	@Override
+	protected ITreeContentProvider getFolderProvider() {
+		// TODO Not sure if I need to return anything here...
+		return null;
+	}
+
+	/**
+	 * Returns the path from which to import from the Sling Repository.
+	 * 
+	 * @return the repository path
+	 */
+	public String getRepositoryPath() {
+		return path != null ? path.getText() : null;
+	}
+
+	public void handleEvent(Event event) {
+		super.handleEvent(event);
+		determinePageCompletion();
+	}
+
+    @Override
+    public IPath getResourcePath() {
+        return super.getResourcePath();
+    }
+
+    public IServer getServer() {
+        for (IServer server : ServerCore.getServers())
+            if (server.getId().equals(repositoryCombo.getText()))
+                return server;
+
+        return null;
+    }
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.dialogs.WizardDataTransferPage#validateOptionsGroup()
+	 */
+	@Override
+	protected boolean validateOptionsGroup() {
+        if (this.repositoryCombo == null || this.repositoryCombo.getSelectionIndex() == -1)
{
+            setErrorMessage("Please select a valid index");
+			return false;
+		}
+		
+		if ( !getRepositoryPath().startsWith("/") ) {
+			setErrorMessage("The repository path needs to be absolute");
+			return false;
+		}
+		
+        IPath containerNameField = super.getResourcePath();
+        // TODO - we should force it to be JCR_ROOT for now
+        if (!containerNameField.toOSString().endsWith(SlingclipseHelper.JCR_ROOT)) {
+			setErrorMessage("Please enter a valid Sling project folder (e.g. jcr_root)");
+			return false;
+		}
+		
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.dialogs.WizardDataTransferPage#validateSourceGroup()
+	 */
+	@Override
+	protected boolean validateSourceGroup() {
+		if (getRepositoryPath() == null
+				|| getRepositoryPath().trim().length() == 0) {
+			setErrorMessage("Please enter a valid Sling Repository path");
+			return false;
+		}
+		return true;
+	}
+}

Propchange: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizardPage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/ImportWizardPage.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/SelectionUtils.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/SelectionUtils.java?rev=1504903&view=auto
==============================================================================
--- sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/SelectionUtils.java
(added)
+++ sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/SelectionUtils.java
Fri Jul 19 15:03:29 2013
@@ -0,0 +1,66 @@
+/*
+ * 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.sling.ide.eclipse.wst.ui.internal;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.core.ServerCore;
+import org.eclipse.wst.server.core.ServerUtil;
+
+public abstract class SelectionUtils {
+
+    public static List<IServer> getServersLinkedToProject(IStructuredSelection sel,
IProgressMonitor monitor) {
+
+        if (sel.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        Object first = sel.iterator().next();
+
+        if (!(first instanceof IProject)) {
+            return Collections.emptyList();
+        }
+
+        IProject project = (IProject) first;
+        List<IServer> servers = new ArrayList<IServer>();
+
+        IModule module = ServerUtil.getModule(project);
+
+        if (module == null) {
+            return Collections.emptyList();
+        }
+
+        for (IServer server : ServerCore.getServers()) {
+            if (ServerUtil.containsModule(server, module, monitor)) {
+                servers.add(server);
+            }
+        }
+
+        return servers;
+    }
+
+    private SelectionUtils() {
+
+    }
+}

Propchange: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/SelectionUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/asanso/plugins/eclipse/slingclipse-wst/src/org/apache/sling/ide/eclipse/wst/ui/internal/SelectionUtils.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL



Mime
View raw message