You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by st...@apache.org on 2013/09/27 14:13:10 UTC

svn commit: r1526863 - in /sling/branches/tooling-ide-vlt/tooling/ide: eclipse-core/META-INF/ eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ eclipse-ui/ eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/

Author: stefanegli
Date: Fri Sep 27 12:13:10 2013
New Revision: 1526863

URL: http://svn.apache.org/r1526863
Log:
SLING-3130 : show bundle state (active, installed) next to synchronization state in wst servers view

Added:
    sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/BundleStateHelper.java   (with props)
    sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ServerModuleDecorator.java   (with props)
Modified:
    sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/META-INF/MANIFEST.MF
    sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java
    sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java
    sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/plugin.xml

Modified: sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/META-INF/MANIFEST.MF?rev=1526863&r1=1526862&r2=1526863&view=diff
==============================================================================
--- sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/META-INF/MANIFEST.MF (original)
+++ sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/META-INF/MANIFEST.MF Fri Sep 27 12:13:10 2013
@@ -14,6 +14,7 @@ Bundle-ClassPath: .
 Import-Package: org.apache.commons.httpclient;version="3.1.0",
  org.apache.commons.httpclient.auth;version="3.1.0",
  org.apache.commons.httpclient.methods;version="3.1.0",
+ org.apache.commons.httpclient.params;version="3.1.0",
  org.apache.sling.ide.artifacts,
  org.apache.sling.ide.filter,
  org.apache.sling.ide.osgi,
@@ -37,6 +38,7 @@ Import-Package: org.apache.commons.httpc
  org.eclipse.wst.server.core,
  org.eclipse.wst.server.core.model,
  org.eclipse.wst.server.core.util,
+ org.json,
  org.osgi.service.component;version="1.1.0"
 Export-Package: org.apache.sling.ide.eclipse.core,
  org.apache.sling.ide.eclipse.core.internal

Added: sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/BundleStateHelper.java
URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/BundleStateHelper.java?rev=1526863&view=auto
==============================================================================
--- sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/BundleStateHelper.java (added)
+++ sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/BundleStateHelper.java Fri Sep 27 12:13:10 2013
@@ -0,0 +1,149 @@
+/*
+ * 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.core.internal;
+
+import java.util.jar.Manifest;
+
+import org.apache.commons.httpclient.Credentials;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.commons.httpclient.auth.AuthScope;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.sling.ide.eclipse.core.ISlingLaunchpadServer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.wst.server.core.IServer;
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+public class BundleStateHelper {
+
+	private static final QualifiedName STATE_KEY = new QualifiedName("org.apache.sling.ide.eclipse.core.internal.bundlestatehelper", "state");
+	private static final Object EMPTY_STATE = new Object();
+	
+	public static void resetBundleState(IServer server, IProject project) {
+		try {
+			project.setSessionProperty(STATE_KEY, null);
+		} catch (CoreException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	public static Object getBundleState(IServer server, IProject project) {
+		if (project==null) {
+			return null;
+		}
+		Object state;
+		try {
+			state = project.getSessionProperty(STATE_KEY);
+		} catch (CoreException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			return null;
+		}
+		if (state!=null) {
+			if (state==EMPTY_STATE) {
+				return null;
+			} else {
+				return state;
+			}
+		}
+        try {
+        	if (server==null) {
+        		return null;
+        	}
+			state = doRecalcDecorationState(server, project);
+			project.setSessionProperty(STATE_KEY, state);
+			if (state==EMPTY_STATE) {
+				return null;
+			} else {
+				return String.valueOf(state);
+			}
+		} catch (CoreException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+	
+	private static Object doRecalcDecorationState(IServer server, IProject project) {
+        try {
+        	if (!ProjectHelper.isBundleProject(project)) {
+        		return EMPTY_STATE;
+        	}
+        	IJavaProject javaProject = ProjectHelper.asJavaProject(project);
+            String hostname = server.getHost();
+            int launchpadPort = server.getAttribute(ISlingLaunchpadServer.PROP_PORT, 8080);
+            if (project.exists() && !javaProject.exists()) {
+            	// then it's not a java project..
+            	return EMPTY_STATE;
+            }
+			IPath outputLocation = javaProject.getOutputLocation();
+			outputLocation = outputLocation.removeFirstSegments(1);
+			IPath manifestFilePath = outputLocation.append("META-INF/MANIFEST.MF");
+			IFile manifestFile = project.getFile(manifestFilePath);
+			String bundlename;
+			if (manifestFile.exists()) {
+				Manifest manifest = new Manifest(manifestFile.getContents());
+				bundlename = manifest.getMainAttributes().getValue("Bundle-SymbolicName");
+			} else {
+				String groupId = ProjectHelper.getMavenProperty(project, "groupId");
+				String artifactId = ProjectHelper.getMavenProperty(project, "artifactId");
+				if (groupId==null || groupId.isEmpty()) {
+					bundlename = artifactId;
+				} else {
+					bundlename = groupId + "." + artifactId;
+				}
+			}
+			String username = server.getAttribute(ISlingLaunchpadServer.PROP_USERNAME, "admin");
+			String password = server.getAttribute(ISlingLaunchpadServer.PROP_PASSWORD, "admin");
+			GetMethod method = new GetMethod("http://"+hostname+":"+launchpadPort+"/system/console/bundles/"+bundlename+".json");
+			int resultCode = getHttpClient(username, password).executeMethod(method);
+			if (resultCode!=HttpStatus.SC_OK) {
+				return " ["+resultCode+"]";
+			}
+            String responseBodyAsString = method.getResponseBodyAsString(16*1024); // relevant data is in first 1k anyway
+			JSONObject result = new JSONObject(responseBodyAsString);
+            JSONArray dataArray = (JSONArray) result.get("data");
+            JSONObject firstElement = (JSONObject) dataArray.get(0);
+            return " ["+firstElement.get("state")+"]";
+		} catch (Exception e) {
+			e.printStackTrace();
+			return e.getMessage();
+		}
+	}
+
+    private static HttpClient getHttpClient(String user, String password) {
+        final HttpClient client = new HttpClient();
+        client.getHttpConnectionManager().getParams().setConnectionTimeout(
+            5000);
+
+        // authentication stuff
+        client.getParams().setAuthenticationPreemptive(true);
+        Credentials defaultcreds = new UsernamePasswordCredentials(user,
+            password);
+        client.getState().setCredentials(AuthScope.ANY, defaultcreds);
+
+        return client;
+    }
+
+}

Propchange: sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/BundleStateHelper.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java
URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java?rev=1526863&r1=1526862&r2=1526863&view=diff
==============================================================================
--- sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java (original)
+++ sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java Fri Sep 27 12:13:10 2013
@@ -110,7 +110,7 @@ public class ProjectHelper {
 		return facetedProject.hasProjectFacet(facet);
 	}
 	
-	static IJavaProject asJavaProject(IProject project) {
+	public static IJavaProject asJavaProject(IProject project) {
 		return JavaCore.create(project);
 	}
 	

Modified: sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java
URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java?rev=1526863&r1=1526862&r2=1526863&view=diff
==============================================================================
--- sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java (original)
+++ sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java Fri Sep 27 12:13:10 2013
@@ -217,6 +217,7 @@ public class SlingLaunchpadBehaviour ext
                     // otherwise, for run and profile modes we explicitly publish the bundle module
                     // TODO: make this configurable as part of the server config
             		publishBundleModule(module, monitor);
+					BundleStateHelper.resetBundleState(getServer(), module[0].getProject());
             	}
             } else if (ProjectHelper.isContentProject(module[0].getProject())) {
                 if ((kind == IServer.PUBLISH_AUTO || kind == IServer.PUBLISH_INCREMENTAL) && deltaKind == ServerBehaviourDelegate.NO_CHANGE) {
@@ -226,6 +227,7 @@ public class SlingLaunchpadBehaviour ext
                 }
                 try {
                     publishContentModule(kind, deltaKind, module, monitor);
+					BundleStateHelper.resetBundleState(getServer(), module[0].getProject());
                 } catch (SerializationException e) {
                     throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Serialization error for "
                             + trace.toString(), e));

Modified: sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/plugin.xml
URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/plugin.xml?rev=1526863&r1=1526862&r2=1526863&view=diff
==============================================================================
--- sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/plugin.xml (original)
+++ sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/plugin.xml Fri Sep 27 12:13:10 2013
@@ -469,6 +469,20 @@
             </and>
          </enablement>
       </decorator>
+      <decorator
+            adaptable="true"
+            class="org.apache.sling.ide.eclipse.ui.internal.ServerModuleDecorator"
+            id="org.apache.sling.ide.eclipse-ui.serverModuleDecorator"
+            label="ServerModule Decorator"
+            lightweight="true"
+            location="BOTTOM_LEFT"
+            state="true">
+         <enablement>
+           <objectClass
+                 name="org.eclipse.wst.server.ui.IServerModule">
+           </objectClass>
+         </enablement>
+      </decorator>
    </extension>
    <extension
          point="org.eclipse.ui.navigator.linkHelper">

Added: sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ServerModuleDecorator.java
URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ServerModuleDecorator.java?rev=1526863&view=auto
==============================================================================
--- sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ServerModuleDecorator.java (added)
+++ sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ServerModuleDecorator.java Fri Sep 27 12:13:10 2013
@@ -0,0 +1,40 @@
+/*
+ * 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.ui.internal;
+
+import org.apache.sling.ide.eclipse.core.internal.BundleStateHelper;
+import org.eclipse.jface.viewers.BaseLabelProvider;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.ILightweightLabelDecorator;
+import org.eclipse.wst.server.ui.IServerModule;
+
+public class ServerModuleDecorator extends BaseLabelProvider implements ILightweightLabelDecorator {
+
+	@Override
+	public void decorate(Object element, IDecoration decoration) {
+		if (!(element instanceof IServerModule)) {
+			return;
+		}
+		IServerModule serverModule = (IServerModule)element;
+		Object state = BundleStateHelper.getBundleState(serverModule.getServer(), serverModule.getModule()[0].getProject());
+		if (state==null) {
+			return;
+		}
+		decoration.addSuffix(String.valueOf(state));
+	}
+
+}

Propchange: sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ServerModuleDecorator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain