You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2011/07/30 22:46:56 UTC

svn commit: r1152515 - in /chemistry/opencmis/trunk: chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/ chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencm...

Author: fmui
Date: Sat Jul 30 20:46:54 2011
New Revision: 1152515

URL: http://svn.apache.org/viewvc?rev=1152515&view=rev
Log:
CMIS Workbench: added "check specification compliance" button to object panel

Added:
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/ObjectComplianceCheck.java   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/ObjectComplianceTestGroup.java   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/SwingReport.java   (with props)
Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractCmisTest.java
    chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractSessionTest.java
    chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/FatalTestException.java
    chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/CoreHtmlReport.java
    chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/TextReport.java
    chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/XmlReport.java
    chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/tests/basics/RootFolderTest.java
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/TckDialog.java
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractCmisTest.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractCmisTest.java?rev=1152515&r1=1152514&r2=1152515&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractCmisTest.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractCmisTest.java Sat Jul 30 20:46:54 2011
@@ -117,7 +117,7 @@ public abstract class AbstractCmisTest i
 
             results.add(result);
             if (result.isFatal()) {
-                throw new FatalTestException();
+                throw new FatalTestException(result.getMessage());
             }
         }
     }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractSessionTest.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractSessionTest.java?rev=1152515&r1=1152514&r2=1152515&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractSessionTest.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractSessionTest.java Sat Jul 30 20:46:54 2011
@@ -144,6 +144,19 @@ public abstract class AbstractSessionTes
         return ri;
     }
 
+    // --- helpers ---
+
+    protected String[] getAllProperties(CmisObject object) {
+        String[] propertiesk = new String[object.getType().getPropertyDefinitions().size()];
+
+        int i = 0;
+        for (String propId : object.getType().getPropertyDefinitions().keySet()) {
+            propertiesk[i++] = propId;
+        }
+
+        return propertiesk;
+    }
+
     // --- handy create and delete methods ---
 
     /**
@@ -635,23 +648,25 @@ public abstract class AbstractSessionTes
     }
 
     private void checkRelationships(Session session, List<CmisTestResult> results, CmisObject object) {
+        if (object instanceof Relationship) {
+            if (object.getRelationships() != null && !object.getRelationships().isEmpty()) {
+                addResult(results, createResult(FAILURE, "A relationship has relationships!"));
+                return;
+            }
+        }
+
         if (object.getRelationships() != null) {
             for (Relationship relationship : object.getRelationships()) {
                 if (relationship == null) {
                     addResult(results, createResult(FAILURE, "A relationship in the relationship list is null!"));
+                    continue;
                 }
 
-                String[] relPropertiesToCheck = new String[relationship.getType().getPropertyDefinitions().size()];
-
-                int i = 0;
-                for (String propId : relationship.getType().getPropertyDefinitions().keySet()) {
-                    relPropertiesToCheck[i++] = propId;
-                }
-
+                CmisObject fullRelationshipObject = session.getObject(relationship, SELECT_ALL_NO_CACHE_OC);
                 addResult(
                         results,
-                        checkObject(session, session.getObject(relationship, SELECT_ALL_NO_CACHE_OC),
-                                relPropertiesToCheck, "Relationship check: " + relationship.getId()));
+                        checkObject(session, fullRelationshipObject, getAllProperties(fullRelationshipObject),
+                                "Relationship check: " + fullRelationshipObject.getId()));
             }
         }
     }
@@ -742,6 +757,13 @@ public abstract class AbstractSessionTes
 
                 addResult(results, checkObject(session, version, properties, "Version check: " + version.getId()));
 
+                // check first entry
+                if (i == 0) {
+                    f = createResult(FAILURE,
+                            "First version history entry is not the latest version! Id: " + version.getId());
+                    addResult(results, assertIsTrue(version.isLatestVersion(), null, f));
+                }
+
                 // check version id
                 f = createResult(FAILURE, "Version series id does not match! Id: " + version.getId());
                 addResult(results, assertEquals(versionSeriesId, version.getVersionSeriesId(), null, f));
@@ -787,6 +809,18 @@ public abstract class AbstractSessionTes
                     addResult(results, assertIsFalse(version.isLatestMajorVersion(), null, f));
                 }
 
+                // check checked out
+                boolean checkedOut = Boolean.TRUE.equals(doc.isVersionSeriesCheckedOut());
+                if (checkedOut) {
+                    f = createResult(FAILURE, "Version series is marked as checked out but the PWC id is not set! Id: "
+                            + version.getId());
+                    addResult(results, assertStringNotEmpty(doc.getVersionSeriesCheckedOutId(), null, f));
+                } else {
+                    f = createResult(FAILURE, "Version series is not marked as checked out but the PWC id is set! Id: "
+                            + version.getId());
+                    addResult(results, assertNull(doc.getVersionSeriesCheckedOutId(), null, f));
+                }
+
                 // found origin object?
                 if (version.getId().equals(object.getId())) {
                     found = true;
@@ -1672,7 +1706,7 @@ public abstract class AbstractSessionTes
 
             results.add(result);
             if (result.isFatal()) {
-                throw new FatalTestException();
+                throw new FatalTestException(result.getMessage());
             }
         }
     }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/FatalTestException.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/FatalTestException.java?rev=1152515&r1=1152514&r2=1152515&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/FatalTestException.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/FatalTestException.java Sat Jul 30 20:46:54 2011
@@ -19,7 +19,7 @@
 package org.apache.chemistry.opencmis.tck.impl;
 
 /**
- * This exception will be thrown if a result is fatal and the test has to
+ * This exception will be thrown if a result is fatal and the test has to be
  * stopped.
  */
 public class FatalTestException extends RuntimeException {
@@ -28,4 +28,8 @@ public class FatalTestException extends 
     public FatalTestException() {
         super();
     }
+
+    public FatalTestException(String msg) {
+        super(msg);
+    }
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/CoreHtmlReport.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/CoreHtmlReport.java?rev=1152515&r1=1152514&r2=1152515&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/CoreHtmlReport.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/CoreHtmlReport.java Sat Jul 30 20:46:54 2011
@@ -19,6 +19,8 @@
 package org.apache.chemistry.opencmis.tck.report;
 
 import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.io.Writer;
 import java.util.Date;
 import java.util.List;
@@ -26,6 +28,7 @@ import java.util.Map;
 import java.util.TreeMap;
 
 import org.apache.chemistry.opencmis.commons.SessionParameter;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisBaseException;
 import org.apache.chemistry.opencmis.tck.CmisTest;
 import org.apache.chemistry.opencmis.tck.CmisTestGroup;
 import org.apache.chemistry.opencmis.tck.CmisTestResult;
@@ -54,7 +57,7 @@ public class CoreHtmlReport extends Abst
                     value = "*****";
                 }
 
-                writer.write("<tr><td>" + p.getKey() + "</td><td>" + value + "</td></tr>\n");
+                writer.write("<tr><td>" + escape(p.getKey()) + "</td><td>" + escape(value) + "</td></tr>\n");
             }
             writer.write("</table>\n");
         }
@@ -82,7 +85,7 @@ public class CoreHtmlReport extends Abst
     }
 
     private void printGroupResults(CmisTestGroup group, Writer writer) throws IOException {
-        writer.write("\n<h3>" + group.getName() + "</h3>\n");
+        writer.write("\n<h3>" + escape(group.getName()) + "</h3>\n");
 
         if (group.getTests() != null) {
             for (CmisTest test : group.getTests()) {
@@ -92,7 +95,7 @@ public class CoreHtmlReport extends Abst
     }
 
     private void printTestResults(CmisTest test, Writer writer) throws IOException {
-        writer.write("\n<h4>" + test.getName() + " (" + test.getTime() + " ms)</h4>\n");
+        writer.write("\n<h4>" + escape(test.getName()) + " (" + test.getTime() + " ms)</h4>\n");
 
         if (test.getResults() != null) {
             for (CmisTestResult result : test.getResults()) {
@@ -106,28 +109,64 @@ public class CoreHtmlReport extends Abst
     private void printResult(CmisTestResult result, Writer writer) throws IOException {
         writer.write("<div class=\"tckResult" + result.getStatus().name() + "\">\n");
 
-        writer.write("<b>" + result.getStatus() + "</b>: " + result.getMessage());
+        writer.write("<b>" + result.getStatus() + "</b>: " + escape(result.getMessage()));
 
         if ((result.getStackTrace() != null) && (result.getStackTrace().length > 0)) {
-            writer.write(" (" + result.getStackTrace()[0].getFileName() + ":"
+            writer.write(" (" + escape(result.getStackTrace()[0].getFileName()) + ":"
                     + result.getStackTrace()[0].getLineNumber() + ")");
+        }
+
+        writer.write("<br/>\n");
 
-            if (result.getStatus() == CmisTestResultStatus.UNEXPECTED_EXCEPTION) {
-                writer.write("\n<!--\n");
-                for (StackTraceElement ste : result.getStackTrace()) {
-                    writer.write(ste.getFileName() + ":" + ste.getLineNumber() + " (");
-                    writer.write(ste.getClassName() + "." + ste.getMethodName() + "())\n");
+        if (result.getStatus() == CmisTestResultStatus.UNEXPECTED_EXCEPTION && result.getException() != null) {
+            final Writer sw = new StringWriter();
+            final PrintWriter pw = new PrintWriter(sw);
+            result.getException().printStackTrace(pw);
+
+            writer.write("\n<!--\nStacktrace:\n\n" + escape(sw.toString()) + "-->\n");
+
+            if (result.getException() instanceof CmisBaseException) {
+                CmisBaseException cbe = (CmisBaseException) result.getException();
+                if (cbe.getErrorContent() != null) {
+                    writer.write("\n<!--\nError Content:\n\n" + escape(cbe.getErrorContent()) + "-->\n");
                 }
-                writer.write("-->\n");
             }
         }
 
-        writer.write("<br/>\n");
-
         for (CmisTestResult child : result.getChildren()) {
             printResult(child, writer);
         }
 
         writer.write("</div>\n");
     }
+
+    protected String escape(String s) {
+        if (s == null) {
+            return "";
+        }
+
+        StringBuilder sb = new StringBuilder();
+
+        for (int i = 0; i < s.length(); i++) {
+            char c = s.charAt(i);
+            switch (c) {
+            case '\"':
+                sb.append("&quot;");
+                break;
+            case '&':
+                sb.append("&amp;");
+                break;
+            case '<':
+                sb.append("&lt;");
+                break;
+            case '>':
+                sb.append("&lt;");
+                break;
+            default:
+                sb.append(c);
+            }
+        }
+
+        return sb.toString();
+    }
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/TextReport.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/TextReport.java?rev=1152515&r1=1152514&r2=1152515&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/TextReport.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/TextReport.java Sat Jul 30 20:46:54 2011
@@ -19,15 +19,18 @@
 package org.apache.chemistry.opencmis.tck.report;
 
 import java.io.IOException;
+import java.io.PrintWriter;
 import java.io.Writer;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 
+import org.apache.chemistry.opencmis.commons.exceptions.CmisBaseException;
 import org.apache.chemistry.opencmis.tck.CmisTest;
 import org.apache.chemistry.opencmis.tck.CmisTestGroup;
 import org.apache.chemistry.opencmis.tck.CmisTestResult;
+import org.apache.chemistry.opencmis.tck.CmisTestResultStatus;
 
 /**
  * Text Report.
@@ -97,6 +100,19 @@ public class TextReport extends Abstract
 
         writer.write("\n");
 
+        if (result.getStatus() == CmisTestResultStatus.UNEXPECTED_EXCEPTION && result.getException() != null) {
+            writer.write("\nStacktrace:\n\n");
+            result.getException().printStackTrace(new PrintWriter(writer));
+
+            if (result.getException() instanceof CmisBaseException) {
+                CmisBaseException cbe = (CmisBaseException) result.getException();
+                if (cbe.getErrorContent() != null) {
+                    writer.write("\nError Content:\n\n");
+                    writer.write(cbe.getErrorContent());
+                }
+            }
+        }
+
         if (result.getException() != null) {
             printIntend(level, writer);
             writer.write("Exception: " + result.getException().getMessage() + "\n");

Modified: chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/XmlReport.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/XmlReport.java?rev=1152515&r1=1152514&r2=1152515&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/XmlReport.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/report/XmlReport.java Sat Jul 30 20:46:54 2011
@@ -68,7 +68,9 @@ public class XmlReport extends AbstractC
             for (Map.Entry<String, String> p : (new TreeMap<String, String>(parameters)).entrySet()) {
                 xml.writeStartElement(TAG_PARAMETER);
                 xml.writeAttribute(ATTR_KEY, p.getKey());
-                xml.writeAttribute(ATTR_VALUE, p.getValue());
+                if (p.getValue() != null) {
+                    xml.writeAttribute(ATTR_VALUE, p.getValue());
+                }
                 xml.writeEndElement();
             }
 

Modified: chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/tests/basics/RootFolderTest.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/tests/basics/RootFolderTest.java?rev=1152515&r1=1152514&r2=1152515&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/tests/basics/RootFolderTest.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/tests/basics/RootFolderTest.java Sat Jul 30 20:46:54 2011
@@ -63,14 +63,7 @@ public class RootFolderTest extends Abst
             return;
         }
 
-        String[] propertiesToCheck = new String[rootFolder.getType().getPropertyDefinitions().size()];
-
-        int i = 0;
-        for (String propId : rootFolder.getType().getPropertyDefinitions().keySet()) {
-            propertiesToCheck[i++] = propId;
-        }
-
-        addResult(checkObject(session, rootFolder, propertiesToCheck, "Root folder object spec compliance"));
+        addResult(checkObject(session, rootFolder, getAllProperties(rootFolder), "Root folder object spec compliance"));
 
         // folder and path
         failure = createResult(FAILURE,

Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/TckDialog.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/TckDialog.java?rev=1152515&r1=1152514&r2=1152515&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/TckDialog.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/TckDialog.java Sat Jul 30 20:46:54 2011
@@ -20,12 +20,11 @@ package org.apache.chemistry.opencmis.wo
 
 import java.awt.BorderLayout;
 import java.awt.Component;
-import java.awt.Desktop;
 import java.awt.Dimension;
 import java.awt.Frame;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.io.File;
+import java.io.Writer;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -47,8 +46,8 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.tck.CmisTest;
 import org.apache.chemistry.opencmis.tck.CmisTestGroup;
 import org.apache.chemistry.opencmis.tck.CmisTestProgressMonitor;
-import org.apache.chemistry.opencmis.tck.report.HtmlReport;
 import org.apache.chemistry.opencmis.tck.runner.AbstractRunner;
+import org.apache.chemistry.opencmis.workbench.checks.SwingReport;
 import org.apache.chemistry.opencmis.workbench.model.ClientModel;
 
 /**
@@ -291,21 +290,8 @@ public class TckDialog {
         @Override
         public void done() {
             try {
-                // create report
-                File tempReportFile = File.createTempFile("cmistck", ".html");
-                tempReportFile.deleteOnExit();
-
-                HtmlReport report = new HtmlReport();
-                report.createReport(runner.getParameters(), runner.getGroups(), tempReportFile);
-
-                // show report
-                Desktop desktop = Desktop.getDesktop();
-                if (!desktop.isSupported(Desktop.Action.OPEN)) {
-                    JOptionPane.showMessageDialog(owner, "Report: " + tempReportFile.getAbsolutePath(), "Report",
-                            JOptionPane.INFORMATION_MESSAGE);
-                } else {
-                    desktop.open(tempReportFile);
-                }
+                SwingReport report = new SwingReport(null, 700, 500);
+                report.createReport(runner.getParameters(), runner.getGroups(), (Writer) null);
             } catch (Exception e) {
                 JOptionPane.showMessageDialog(owner, "Error: " + e.getMessage(), "Report Error",
                         JOptionPane.ERROR_MESSAGE);

Added: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/ObjectComplianceCheck.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/ObjectComplianceCheck.java?rev=1152515&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/ObjectComplianceCheck.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/ObjectComplianceCheck.java Sat Jul 30 20:46:54 2011
@@ -0,0 +1,65 @@
+/*
+ * 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.chemistry.opencmis.workbench.checks;
+
+import java.util.Map;
+
+import org.apache.chemistry.opencmis.client.api.CmisObject;
+import org.apache.chemistry.opencmis.client.api.Document;
+import org.apache.chemistry.opencmis.client.api.Folder;
+import org.apache.chemistry.opencmis.client.api.Session;
+import org.apache.chemistry.opencmis.tck.CmisTestResultStatus;
+import org.apache.chemistry.opencmis.tck.impl.AbstractSessionTest;
+
+/**
+ * This class checks an object for CMIS specification compliance.
+ */
+public class ObjectComplianceCheck extends AbstractSessionTest {
+
+    private String objectId;
+
+    public ObjectComplianceCheck(String objectId) throws Exception {
+        this.objectId = objectId;
+    }
+
+    @Override
+    public void init(Map<String, String> parameters) {
+        super.init(parameters);
+        setName("Object Compliance Check");
+    }
+
+    @Override
+    public void run(Session session) throws Exception {
+        CmisObject object = session.getObject(objectId);
+        String[] propertiesToCheck = getAllProperties(object);
+
+        addResult(checkObject(session, object, propertiesToCheck, "Object check: " + object.getId()));
+
+        if (object instanceof Document) {
+            addResult(checkVersionHistory(session, object, propertiesToCheck,
+                    "Version history check: " + object.getId()));
+        } else if (object instanceof Folder) {
+            addResult(checkChildren(session, (Folder) object, "Folder children check: " + object.getId()));
+        }
+
+        if (getResults().isEmpty()) {
+            addResult(createResult(CmisTestResultStatus.OK, "Object seems to be compliant! Id: " + object.getId()));
+        }
+    }
+}

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/ObjectComplianceCheck.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/ObjectComplianceTestGroup.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/ObjectComplianceTestGroup.java?rev=1152515&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/ObjectComplianceTestGroup.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/ObjectComplianceTestGroup.java Sat Jul 30 20:46:54 2011
@@ -0,0 +1,42 @@
+/*
+ * 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.chemistry.opencmis.workbench.checks;
+
+import java.util.Map;
+
+import org.apache.chemistry.opencmis.tck.impl.AbstractCmisTestGroup;
+
+public class ObjectComplianceTestGroup extends AbstractCmisTestGroup {
+
+    private String objectId;
+
+    public ObjectComplianceTestGroup(Map<String, String> parameters, String objectId) throws Exception {
+        this.objectId = objectId;
+        init(parameters);
+    }
+
+    @Override
+    public void init(Map<String, String> parameters) throws Exception {
+        super.init(parameters);
+
+        setName("Object Compliance Test Group");
+
+        addTest(new ObjectComplianceCheck(objectId));
+    }
+}

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/ObjectComplianceTestGroup.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/SwingReport.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/SwingReport.java?rev=1152515&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/SwingReport.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/SwingReport.java Sat Jul 30 20:46:54 2011
@@ -0,0 +1,273 @@
+/*
+ * 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.chemistry.opencmis.workbench.checks;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Desktop;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.Writer;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTree;
+import javax.swing.SwingConstants;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeCellRenderer;
+
+import org.apache.chemistry.opencmis.tck.CmisTest;
+import org.apache.chemistry.opencmis.tck.CmisTestGroup;
+import org.apache.chemistry.opencmis.tck.CmisTestReport;
+import org.apache.chemistry.opencmis.tck.CmisTestResult;
+import org.apache.chemistry.opencmis.tck.report.AbstractCmisTestReport;
+import org.apache.chemistry.opencmis.tck.report.HtmlReport;
+import org.apache.chemistry.opencmis.tck.report.TextReport;
+import org.apache.chemistry.opencmis.tck.report.XmlReport;
+
+/**
+ * Swing Report.
+ */
+public class SwingReport extends AbstractCmisTestReport {
+
+    private static final Icon GROUP_ICON = new ColorIcon(Color.GRAY);
+    private static final Icon TEST_ICON = new ColorIcon(Color.BLUE);
+    private static final Icon STATUS_OK_ICON = new ColorIcon(Color.GREEN);
+    private static final Icon STATUS_WARNING_ICON = new ColorIcon(Color.YELLOW);
+    private static final Icon STATUS_FAILURE_ICON = new ColorIcon(Color.RED);
+    private static final Icon OTHER_ICON = new ColorIcon(Color.LIGHT_GRAY);
+
+    private final Frame owner;
+    private final int width;
+    private final int height;
+    private Map<String, String> parameters;
+    private List<CmisTestGroup> groups;
+
+    public SwingReport(Frame owner, int width, int height) {
+        this.owner = owner;
+        this.width = width;
+        this.height = height;
+    }
+
+    @Override
+    public void createReport(Map<String, String> parameters, List<CmisTestGroup> groups, Writer writer)
+            throws Exception {
+        this.parameters = parameters;
+        this.groups = groups;
+        new SwingReportDialog();
+    }
+
+    /**
+     * Report dialog.
+     */
+    private class SwingReportDialog extends JDialog {
+
+        private static final long serialVersionUID = 1L;
+
+        public SwingReportDialog() {
+            super(owner, "Test Report");
+            createGUI();
+        }
+
+        private void createGUI() {
+            setPreferredSize(new Dimension(width, height));
+            setMinimumSize(new Dimension(width, height));
+
+            setLayout(new BorderLayout());
+
+            DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Groups");
+
+            for (CmisTestGroup group : groups) {
+                DefaultMutableTreeNode groupNode = new DefaultMutableTreeNode(group);
+                rootNode.add(groupNode);
+                for (CmisTest test : group.getTests()) {
+                    DefaultMutableTreeNode testNode = new DefaultMutableTreeNode(test);
+                    groupNode.add(testNode);
+                    populateResultBranch(testNode, test.getResults());
+                }
+            }
+
+            JTree groupTree = new JTree(rootNode);
+            groupTree.setRootVisible(false);
+            groupTree.setCellRenderer(new ReportTreeCellRenderer());
+
+            for (int i = 0; i < groupTree.getRowCount(); i++) {
+                groupTree.expandRow(i);
+            }
+
+            add(new JScrollPane(groupTree), BorderLayout.CENTER);
+
+            final JPanel reportPanel = new JPanel();
+            reportPanel.add(new JLabel("Open report as "));
+            final JComboBox reportType = new JComboBox(new Object[] { "HTML", "Text", "XML" });
+            reportPanel.add(reportType);
+            final JButton reportButton = new JButton("go");
+            reportPanel.add(reportButton);
+
+            reportButton.addActionListener(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    try {
+                        // create report
+                        File tempReportFile = null;
+                        CmisTestReport report = null;
+
+                        switch (reportType.getSelectedIndex()) {
+                        case 0:
+                            tempReportFile = File.createTempFile("cmistck", ".html");
+                            report = new HtmlReport();
+                            break;
+                        case 1:
+                            tempReportFile = File.createTempFile("cmistck", ".txt");
+                            report = new TextReport();
+                            break;
+                        case 2:
+                            tempReportFile = File.createTempFile("cmistck", ".xml");
+                            report = new XmlReport();
+                            break;
+                        }
+
+                        tempReportFile.deleteOnExit();
+                        report.createReport(parameters, groups, tempReportFile);
+
+                        // show report
+                        Desktop desktop = Desktop.getDesktop();
+                        if (!desktop.isSupported(Desktop.Action.OPEN)) {
+                            JOptionPane.showMessageDialog(owner, "Report: " + tempReportFile.getAbsolutePath(),
+                                    "Report", JOptionPane.INFORMATION_MESSAGE);
+                        } else {
+                            desktop.open(tempReportFile);
+                        }
+                    } catch (Exception e) {
+                        JOptionPane.showMessageDialog(owner, "Error: " + e.getMessage(), "Report Error",
+                                JOptionPane.ERROR_MESSAGE);
+                    }
+                }
+            });
+
+            add(reportPanel, BorderLayout.PAGE_END);
+
+            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+            pack();
+            setLocationRelativeTo(null);
+            setVisible(true);
+        }
+
+        private void populateResultBranch(DefaultMutableTreeNode parent, List<CmisTestResult> results) {
+            if (results == null) {
+                return;
+            }
+
+            for (CmisTestResult result : results) {
+                DefaultMutableTreeNode resultNode = new DefaultMutableTreeNode(result);
+                parent.add(resultNode);
+                populateResultBranch(resultNode, result.getChildren());
+            }
+        }
+
+        private class ReportTreeCellRenderer extends DefaultTreeCellRenderer {
+
+            private static final long serialVersionUID = 1L;
+
+            public ReportTreeCellRenderer() {
+            }
+
+            public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
+                    boolean leaf, int row, boolean hasFocus) {
+                super.getTreeCellRendererComponent(tree, "", sel, expanded, leaf, row, hasFocus);
+
+                DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
+
+                if (node.getUserObject() instanceof CmisTestGroup) {
+                    setText(((CmisTestGroup) node.getUserObject()).getName());
+                    setIcon(GROUP_ICON);
+                } else if (node.getUserObject() instanceof CmisTest) {
+                    setText(((CmisTest) node.getUserObject()).getName());
+                    setIcon(TEST_ICON);
+                } else if (node.getUserObject() instanceof CmisTestResult) {
+                    CmisTestResult result = (CmisTestResult) node.getUserObject();
+
+                    String text = "<html><b>" + result.getStatus() + ": " + result.getMessage() + "</b>";
+                    if ((result.getStackTrace() != null) && (result.getStackTrace().length > 0)) {
+                        text += " (" + result.getStackTrace()[0].getFileName() + ":"
+                                + result.getStackTrace()[0].getLineNumber() + ")";
+                    }
+                    setText(text);
+
+                    switch (result.getStatus()) {
+                    case OK:
+                        setIcon(STATUS_OK_ICON);
+                        break;
+                    case WARNING:
+                        setIcon(STATUS_WARNING_ICON);
+                        break;
+                    case FAILURE:
+                    case UNEXPECTED_EXCEPTION:
+                        setIcon(STATUS_FAILURE_ICON);
+                        break;
+                    default:
+                        setIcon(OTHER_ICON);
+                    }
+                } else {
+                    setText(value.toString());
+                    setIcon(OTHER_ICON);
+                }
+
+                setVerticalTextPosition(SwingConstants.TOP);
+
+                return this;
+            }
+        }
+    }
+
+    private static class ColorIcon implements Icon {
+
+        private final Color color;
+
+        public ColorIcon(Color color) {
+            this.color = color;
+        }
+
+        public void paintIcon(Component c, Graphics g, int x, int y) {
+            g.setColor(color);
+            g.fillRect(0, 0, getIconWidth(), getIconHeight());
+        }
+
+        public int getIconWidth() {
+            return 8;
+        }
+
+        public int getIconHeight() {
+            return 18;
+        }
+    }
+}

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/checks/SwingReport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java?rev=1152515&r1=1152514&r2=1152515&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java Sat Jul 30 20:46:54 2011
@@ -28,9 +28,12 @@ import java.awt.event.ActionListener;
 import java.io.File;
 import java.io.IOException;
 import java.io.Writer;
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.script.ScriptEngineFactory;
@@ -49,7 +52,10 @@ import org.apache.chemistry.opencmis.cli
 import org.apache.chemistry.opencmis.client.api.Folder;
 import org.apache.chemistry.opencmis.client.api.Session;
 import org.apache.chemistry.opencmis.client.bindings.spi.atompub.LinkAccess;
+import org.apache.chemistry.opencmis.tck.CmisTestGroup;
 import org.apache.chemistry.opencmis.workbench.ClientHelper;
+import org.apache.chemistry.opencmis.workbench.checks.ObjectComplianceTestGroup;
+import org.apache.chemistry.opencmis.workbench.checks.SwingReport;
 import org.apache.chemistry.opencmis.workbench.model.ClientModel;
 import org.apache.chemistry.opencmis.workbench.model.ClientModelEvent;
 import org.apache.chemistry.opencmis.workbench.model.ObjectListener;
@@ -70,7 +76,9 @@ public class ObjectPanel extends InfoPan
     private JTextField contentUrlField;
     private InfoList paths;
     private InfoList allowableActionsList;
+    private JPanel buttonPanel;
     private JButton refreshButton;
+    private JButton checkButton;
     private JPanel scriptPanel;
     private JButton scriptOpenButton;
     private JButton scriptRunButton;
@@ -106,6 +114,7 @@ public class ObjectPanel extends InfoPan
             contentUrlField.setText("");
             allowableActionsList.removeAll();
             refreshButton.setEnabled(false);
+            checkButton.setEnabled(false);
             scriptPanel.setVisible(false);
         } else {
             try {
@@ -176,6 +185,7 @@ public class ObjectPanel extends InfoPan
                 }
 
                 refreshButton.setEnabled(true);
+                checkButton.setEnabled(true);
 
                 if (object instanceof Document) {
                     String name = object.getName().toLowerCase();
@@ -207,21 +217,30 @@ public class ObjectPanel extends InfoPan
         pwcField = addId("PWC:");
         contentUrlField = addLink("Content URL:");
         allowableActionsList = addComponent("Allowable Actions:", new InfoList());
-        refreshButton = addComponent("", new JButton("Refresh"));
+
+        buttonPanel = addComponent("", new JPanel(new BorderLayout()));
+        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
+        buttonPanel.setOpaque(false);
+
+        refreshButton = new JButton("Refresh");
         refreshButton.setEnabled(false);
+        buttonPanel.add(refreshButton);
+        checkButton = new JButton("Check specification compliance");
+        checkButton.setEnabled(false);
+        buttonPanel.add(checkButton);
 
         scriptPanel = addComponent("", new JPanel(new BorderLayout()));
         scriptPanel.setOpaque(false);
         scriptPanel.setVisible(false);
 
-        JPanel buttonPanel = new JPanel();
-        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
-        buttonPanel.setOpaque(false);
-        scriptPanel.add(buttonPanel, BorderLayout.PAGE_START);
+        JPanel scriptButtonPanel = new JPanel();
+        scriptButtonPanel.setLayout(new BoxLayout(scriptButtonPanel, BoxLayout.LINE_AXIS));
+        scriptButtonPanel.setOpaque(false);
+        scriptPanel.add(scriptButtonPanel, BorderLayout.PAGE_START);
         scriptOpenButton = new JButton("Open Script");
-        buttonPanel.add(scriptOpenButton);
+        scriptButtonPanel.add(scriptOpenButton);
         scriptRunButton = new JButton("Run Script");
-        buttonPanel.add(scriptRunButton);
+        scriptButtonPanel.add(scriptRunButton);
 
         scriptOutput = new JTextArea(null, 1, 80);
         scriptOutput.setEditable(false);
@@ -243,6 +262,30 @@ public class ObjectPanel extends InfoPan
             }
         });
 
+        checkButton.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                try {
+                    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+
+                    Map<String, String> parameters = new HashMap<String, String>(getClientModel().getClientSession()
+                            .getSessionParameters());
+                    String objectId = getClientModel().getCurrentObject().getId();
+
+                    ObjectComplianceTestGroup octg = new ObjectComplianceTestGroup(parameters, objectId);
+                    octg.run();
+
+                    List<CmisTestGroup> groups = new ArrayList<CmisTestGroup>();
+                    groups.add(octg);
+                    SwingReport report = new SwingReport(null, 700, 500);
+                    report.createReport(parameters, groups, (Writer) null);
+                } catch (Exception ex) {
+                    ClientHelper.showError(null, ex);
+                } finally {
+                    setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+                }
+            }
+        });
+
         scriptOpenButton.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
                 try {