You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2013/02/27 13:38:52 UTC

svn commit: r1450761 - in /syncope/trunk/core/src/main/java/org/apache/syncope/core: init/JobInstanceLoader.java util/ImportExport.java util/multiparent/MultiParentNodeOp.java

Author: fmartelli
Date: Wed Feb 27 12:38:51 2013
New Revision: 1450761

URL: http://svn.apache.org/r1450761
Log:
SYNCOPE-278 - fix for a mysql db export

Modified:
    syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/util/ImportExport.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/util/multiparent/MultiParentNodeOp.java

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java?rev=1450761&r1=1450760&r2=1450761&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java Wed Feb 27 12:38:51 2013
@@ -214,7 +214,7 @@ public class JobInstanceLoader {
     }
 
     @SuppressWarnings("unchecked")
-    @Transactional(readOnly = true)
+    @Transactional
     public void load() {
         // 1. jobs for SchedTasks
         Set<SchedTask> tasks = new HashSet(taskDAO.findAll(SchedTask.class));

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/util/ImportExport.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/util/ImportExport.java?rev=1450761&r1=1450760&r2=1450761&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/util/ImportExport.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/util/ImportExport.java Wed Feb 27 12:38:51 2013
@@ -21,6 +21,7 @@ package org.apache.syncope.core.util;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.lang.String;
 import java.sql.Blob;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
@@ -43,6 +44,7 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import java.util.TreeMap;
+import java.util.TreeSet;
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
 import javax.persistence.TemporalType;
@@ -93,15 +95,15 @@ public class ImportExport extends Defaul
     @Autowired
     private DataSource dataSource;
 
-    private final Set<String> tablePrefixesToBeExcluded = new HashSet<String>(
-            Arrays.asList(new String[]{"QRTZ_", "LOGGING", "REPORTEXEC", "TASKEXEC",
+    private final static Set<String> TABLE_PREFIXES_TO_BE_EXCLUDED =
+            new HashSet<String>(Arrays.asList(new String[]{"QRTZ_", "LOGGING", "REPORTEXEC", "TASKEXEC",
                 "SYNCOPEUSER", "UATTR", "UATTRVALUE", "UATTRUNIQUEVALUE", "UDERATTR", "UVIRATTR",
-                "MEMBERSHIP", "MATTR", "MATTRVALUE", "MATTRUNIQUEVALUE", "MDERATTR", "MVIRATTR"}));
+                "MEMBERSHIP", "MATTR", "MATTRVALUE", "MATTRUNIQUEVALUE", "MDERATTR", "MVIRATTR", "USERREQUEST"}));
 
-    private final Map<String, String> tablesTobeFiltered =
+    private final static Map<String, String> TABLES_TO_BE_FILTERED =
             Collections.singletonMap("TASK", "DTYPE <> 'PropagationTask'");
 
-    private final Map<String, Set<String>> columnsToBeNullified =
+    private final static Map<String, Set<String>> COLUMNS_TO_BE_NULLIFIED =
             Collections.singletonMap("SYNCOPEROLE", Collections.singleton("USEROWNER_ID"));
 
     private String[] wfInitSQLStatements;
@@ -305,6 +307,8 @@ public class ImportExport extends Defaul
     private void doExportTable(final TransformerHandler handler, final Connection conn, final String tableName,
             final String whereClause) throws SQLException, SAXException {
 
+        LOG.debug("Export table {}", tableName);
+
         AttributesImpl attrs = new AttributesImpl();
 
         PreparedStatement stmt = null;
@@ -352,8 +356,8 @@ public class ImportExport extends Defaul
 
                     // Retrieve value taking care of binary values.
                     String value = getValues(rs, columnName, columnType);
-                    if (value != null && (!columnsToBeNullified.containsKey(tableName)
-                            || !columnsToBeNullified.get(tableName).contains(columnName))) {
+                    if (value != null && (!COLUMNS_TO_BE_NULLIFIED.containsKey(tableName)
+                            || !COLUMNS_TO_BE_NULLIFIED.get(tableName).contains(columnName))) {
 
                         attrs.addAttribute("", "", columnName, "CDATA", value);
                     }
@@ -361,6 +365,8 @@ public class ImportExport extends Defaul
 
                 handler.startElement("", "", tableName, attrs);
                 handler.endElement("", "", tableName);
+
+                LOG.debug("Add record {}", attrs);
             }
         } finally {
             if (rs != null) {
@@ -448,16 +454,20 @@ public class ImportExport extends Defaul
         final List<String> sortedTableNames = new ArrayList<String>(tableNames.size());
         MultiParentNodeOp.traverseTree(roots, sortedTableNames);
 
-        Collections.reverse(sortedTableNames);
         // remove from sortedTableNames any table possibly added during lookup 
         // but matching some item in this.tablePrefixesToBeExcluded
         sortedTableNames.retainAll(tableNames);
+
+        LOG.debug("Tables after retainAll {}", sortedTableNames);
+
+        Collections.reverse(sortedTableNames);
+
         return sortedTableNames;
     }
 
     private boolean isTableAllowed(final String tableName) {
         boolean allowed = true;
-        for (String prefix : tablePrefixesToBeExcluded) {
+        for (String prefix : TABLE_PREFIXES_TO_BE_EXCLUDED) {
             if (tableName.toUpperCase().startsWith(prefix)) {
                 allowed = false;
             }
@@ -469,7 +479,7 @@ public class ImportExport extends Defaul
             throws SAXException, TransformerConfigurationException {
 
         if (StringUtils.isNotBlank(wfTablePrefix)) {
-            tablePrefixesToBeExcluded.add(wfTablePrefix);
+            TABLE_PREFIXES_TO_BE_EXCLUDED.add(wfTablePrefix);
         }
 
         StreamResult streamResult = new StreamResult(os);
@@ -493,18 +503,25 @@ public class ImportExport extends Defaul
 
             rs = meta.getTables(null, schema, null, new String[]{"TABLE"});
 
-            final Set<String> tableNames = new HashSet<String>();
+            final Set<String> tableNames = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
 
             while (rs.next()) {
                 String tableName = rs.getString("TABLE_NAME");
+                LOG.debug("Found table {}", tableName);
                 if (isTableAllowed(tableName)) {
                     tableNames.add(tableName);
                 }
             }
 
+            LOG.debug("Tables to be exported {}", tableNames);
+
             // then sort tables based on foreign keys and dump
             for (String tableName : sortByForeignKeys(conn, tableNames, schema)) {
-                doExportTable(handler, conn, tableName, tablesTobeFiltered.get(tableName.toUpperCase()));
+                try {
+                    doExportTable(handler, conn, tableName, TABLES_TO_BE_FILTERED.get(tableName.toUpperCase()));
+                } catch (Exception e) {
+                    LOG.error("Failure exporting table {}", tableName, e);
+                }
             }
         } catch (SQLException e) {
             LOG.error("While exporting database content", e);

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/util/multiparent/MultiParentNodeOp.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/util/multiparent/MultiParentNodeOp.java?rev=1450761&r1=1450760&r2=1450761&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/util/multiparent/MultiParentNodeOp.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/util/multiparent/MultiParentNodeOp.java Wed Feb 27 12:38:51 2013
@@ -18,7 +18,7 @@
  */
 package org.apache.syncope.core.util.multiparent;
 
-import java.util.List;
+import java.util.Collection;
 import java.util.Set;
 
 public class MultiParentNodeOp {
@@ -26,13 +26,13 @@ public class MultiParentNodeOp {
     private MultiParentNodeOp() {
     }
 
-    public static <T> void traverseTree(final Set<MultiParentNode<T>> roots, final List<T> objects) {
+    public static <T> void traverseTree(final Set<MultiParentNode<T>> roots, final Collection<T> objects) {
         for (MultiParentNode<T> root : roots) {
             traverseTree(root, objects);
         }
     }
 
-    public static <T> void traverseTree(final MultiParentNode<T> root, final List<T> objects) {
+    public static <T> void traverseTree(final MultiParentNode<T> root, final Collection<T> objects) {
 
         root.setExploited(true);