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


Reply via email to