Author: jm
Date: 2012-06-05 10:08:52 -0700 (Tue, 05 Jun 2012)
New Revision: 29458

Added:
   
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/util/session/CyTableSessionStateSerializer.java
   core3/impl/trunk/io-impl/impl/src/main/protobuf/
   core3/impl/trunk/io-impl/impl/src/main/protobuf/CyTableSessionState.proto
Modified:
   core3/impl/trunk/io-impl/impl/pom.xml
   
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/read/session/Cy3SessionReaderImpl.java
   
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/util/session/SessionUtil.java
   
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/util/session/VirtualColumnSerializer.java
   
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/session/SessionWriterImpl.java
Log:
Fixes #1057: Deprecated cytable.metadata in favour of a JSON-based 
schema-backed format that's future proof.  io-impl can still read sessions that 
use cytable.metadata for now.

Modified: core3/impl/trunk/io-impl/impl/pom.xml
===================================================================
--- core3/impl/trunk/io-impl/impl/pom.xml       2012-06-05 16:58:10 UTC (rev 
29457)
+++ core3/impl/trunk/io-impl/impl/pom.xml       2012-06-05 17:08:52 UTC (rev 
29458)
@@ -85,6 +85,51 @@
                                        </execution>
                                </executions>
                        </plugin>
+            <plugin>
+                <groupId>com.dyuproject.protostuff</groupId>
+                <artifactId>protostuff-maven-plugin</artifactId>
+                <version>1.0.7</version>
+                <configuration>
+                    <protoModules>
+                        <protoModule>
+                            
<source>src/main/protobuf/CyTableSessionState.proto</source>
+                            
<outputDir>target/generated-sources/proto</outputDir>
+                            <output>java_bean</output>
+                            <encoding>UTF-8</encoding>
+                            <options>
+                               <property>
+                                       <name>separate_schema</name>
+                               </property>
+                               <property>
+                                       <name>generate_field_map</name>
+                               </property>
+                            </options>
+                        </protoModule>
+                    </protoModules>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>generate-sources</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>compile</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
                </plugins>
        </build>
+       
+       <dependencies>
+        <dependency>
+            <groupId>cytoscape-temp</groupId>
+            <artifactId>protostuff-core-json-osgi</artifactId>
+            <version>1.0.7</version>
+        </dependency>
+        <dependency>
+            <groupId>org.codehaus.jackson</groupId>
+            <artifactId>jackson-core-lgpl</artifactId>
+            <version>1.9.7</version>
+        </dependency>
+    </dependencies>
 </project>

Modified: 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/read/session/Cy3SessionReaderImpl.java
===================================================================
--- 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/read/session/Cy3SessionReaderImpl.java
        2012-06-05 16:58:10 UTC (rev 29457)
+++ 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/read/session/Cy3SessionReaderImpl.java
        2012-06-05 17:08:52 UTC (rev 29458)
@@ -30,6 +30,7 @@
 
 import static org.cytoscape.io.internal.util.session.SessionUtil.APPS_FOLDER;
 import static 
org.cytoscape.io.internal.util.session.SessionUtil.CYTABLE_METADATA_FILE;
+import static 
org.cytoscape.io.internal.util.session.SessionUtil.CYTABLE_STATE_FILE;
 import static 
org.cytoscape.io.internal.util.session.SessionUtil.NETWORKS_FOLDER;
 import static 
org.cytoscape.io.internal.util.session.SessionUtil.NETWORK_VIEWS_FOLDER;
 import static 
org.cytoscape.io.internal.util.session.SessionUtil.PROPERTIES_FOLDER;
@@ -59,10 +60,13 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.cytoscape.io.internal.model.CyTableSessionState;
+import org.cytoscape.io.internal.model.CyTableSessionState.VirtualColumn;
 import org.cytoscape.io.internal.read.datatable.CSVCyReaderFactory;
 import 
org.cytoscape.io.internal.read.session.CyTableMetadataImpl.CyTableMetadataBuilder;
 import org.cytoscape.io.internal.read.xgmml.XGMMLNetworkViewReader;
 import org.cytoscape.io.internal.util.ReadCache;
+import org.cytoscape.io.internal.util.session.CyTableSessionStateSerializer;
 import org.cytoscape.io.internal.util.session.SessionUtil;
 import org.cytoscape.io.internal.util.session.VirtualColumnSerializer;
 import org.cytoscape.io.read.CyNetworkReader;
@@ -95,6 +99,7 @@
  * @see org.cytoscape.io.internal.read.session.Cy2SessionReaderImpl
  * @see org.cytoscape.io.internal.write.session.SessionWriterImpl
  */
+@SuppressWarnings("deprecation")
 public class Cy3SessionReaderImpl extends AbstractSessionReader {
        
        private static final String TEMP_DIR = "java.io.tmpdir";
@@ -120,7 +125,7 @@
        private Map<String, CyTable> filenameTableMap;
        private Map<CyTableMetadataBuilder, String> builderFilenameMap;
 
-       private List<VirtualColumnSerializer> virtualColumns;
+       private List<VirtualColumn> virtualColumns;
        private boolean networksExtracted;
 
 
@@ -176,7 +181,11 @@
                        } else if (entryName.endsWith(TABLE_EXT)) {
                                extractTable(is, entryName);
                        } else if (entryName.endsWith(CYTABLE_METADATA_FILE)) {
-                               extractCyTableMetadata(is, entryName);
+                               // This provides support for sessions made 
using M4 and
+                               // earlier.  We should remove it eventually.
+                               extractLegacyCyTableMetadata(is, entryName);
+                       } else if (entryName.endsWith(CYTABLE_STATE_FILE)) {
+                               extractCyTableSessionState(is, entryName);
                        } else if (!entryName.endsWith(VERSION_EXT)) {
                                logger.warn("Unknown entry found in session zip 
file!\n" + entryName);
                        }
@@ -223,14 +232,29 @@
                objectMap.put(CyEdge.class, cache.getEdgeByIdMap());
        }
        
-       private void extractCyTableMetadata(InputStream tmpIs, String 
entryName) throws IOException {
+       private void extractCyTableSessionState(InputStream is, String 
entryName) throws IOException {
+               CyTableSessionStateSerializer serializer = new 
CyTableSessionStateSerializer();
+               CyTableSessionState state = serializer.parse(is);
+               virtualColumns = state.getVirtualColumnsList();
+       }
+
+       @Deprecated
+       private void extractLegacyCyTableMetadata(InputStream tmpIs, String 
entryName) throws IOException {
                BufferedReader reader = new BufferedReader(new 
InputStreamReader(tmpIs, "UTF-8"));
-               virtualColumns = new ArrayList<VirtualColumnSerializer>();
+               virtualColumns = new ArrayList<VirtualColumn>();
                
                try {
                        String line = reader.readLine();
                        while (line != null) {
-                               virtualColumns.add(new 
VirtualColumnSerializer(line));
+                               VirtualColumnSerializer serializer = new 
VirtualColumnSerializer(line);
+                               virtualColumns.add(new VirtualColumn(
+                                       serializer.getName(),
+                                       serializer.getSourceColumn(),
+                                       serializer.getSourceTable(),
+                                       serializer.getSourceJoinKey(),
+                                       serializer.getTargetTable(),
+                                       serializer.getTargetJoinKey(),
+                                       serializer.isImmutable()));
                                line = reader.readLine();
                        }
                } finally {
@@ -436,7 +460,7 @@
                        return;
                }
                
-               for (VirtualColumnSerializer columnData : virtualColumns) {
+               for (VirtualColumn columnData : virtualColumns) {
                        CyTable targetTable = 
filenameTableMap.get(columnData.getTargetTable());
                        
                        if (targetTable.getColumn(columnData.getName()) == 
null) {
@@ -445,7 +469,7 @@
                                                                                
         columnData.getSourceColumn(),
                                                                                
         sourceTable,
                                                                                
         columnData.getTargetJoinKey(),
-                                                                               
         columnData.isImmutable());
+                                                                               
         columnData.getIsImmutable());
                        }
                }
        }

Added: 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/util/session/CyTableSessionStateSerializer.java
===================================================================
--- 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/util/session/CyTableSessionStateSerializer.java
                               (rev 0)
+++ 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/util/session/CyTableSessionStateSerializer.java
       2012-06-05 17:08:52 UTC (rev 29458)
@@ -0,0 +1,83 @@
+package org.cytoscape.io.internal.util.session;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.codehaus.jackson.JsonGenerator;
+import org.cytoscape.io.internal.model.CyTableSessionState;
+import org.cytoscape.io.internal.model.CyTableSessionState.VirtualColumn;
+import org.cytoscape.model.CyColumn;
+import org.cytoscape.model.CyTable;
+import org.cytoscape.model.CyTableMetadata;
+import org.cytoscape.model.VirtualColumnInfo;
+import org.cytoscape.session.CySession;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.dyuproject.protostuff.JsonIOUtil;
+
+public class CyTableSessionStateSerializer {
+       private static final Logger logger = 
LoggerFactory.getLogger(CyTableSessionStateSerializer.class);
+
+       public void serialize(OutputStream stream, Map<Long, String> 
tableFilenamesBySUID, CySession session) throws IOException {
+               CyTableSessionState model = buildModel(stream, 
tableFilenamesBySUID, session);
+               JsonGenerator generator = JsonIOUtil.newJsonGenerator(stream, 
new byte[1024*100]);
+               generator.useDefaultPrettyPrinter();
+               
+               try {
+                       JsonIOUtil.writeTo(generator, model, 
CyTableSessionState.getSchema(), false);
+               } finally {
+                       generator.flush();
+               }
+       }
+
+       public CyTableSessionState parse(InputStream stream) throws IOException 
{
+               CyTableSessionState model = new CyTableSessionState();
+               JsonIOUtil.mergeFrom(stream, model, 
CyTableSessionState.getSchema(), false);
+               return model;
+       }
+       
+       CyTableSessionState buildModel(OutputStream stream, Map<Long, String> 
tableFilenamesBySUID, CySession session) {
+               List<VirtualColumn> virtualColumns = new 
ArrayList<VirtualColumn>();
+               for (CyTableMetadata metadata : session.getTables()) {
+                       CyTable table = metadata.getTable();
+                       String targetTable = 
tableFilenamesBySUID.get(table.getSUID());
+                       
+                       if (targetTable == null) {
+                               continue;
+                       }
+                       
+                       for (CyColumn column : table.getColumns()) {
+                               VirtualColumnInfo info = 
column.getVirtualColumnInfo();
+                               
+                               if (!info.isVirtual()) {
+                                       continue;
+                               }
+                               
+                               String sourceTable = 
tableFilenamesBySUID.get(info.getSourceTable().getSUID());
+                               
+                               if (sourceTable == null) {
+                                       logger.warn("Cannot serialize virtual 
column \"" + column.getName() + "\" of \"" + targetTable
+                                                       + "\" because the 
source table is null.");
+                                       continue;
+                               }
+                               
+                               virtualColumns.add(new 
VirtualColumn(column.getName(),
+                                                                  
info.getSourceColumn(),
+                                                                  sourceTable,
+                                                                  
info.getSourceJoinKey(),
+                                                                  targetTable,
+                                                                  
info.getTargetJoinKey(),
+                                                                  
info.isImmutable()));
+                       }
+               }
+               
+               CyTableSessionState state = new CyTableSessionState();
+               state.setVirtualColumnsList(virtualColumns);
+               return state;
+       }
+}

Modified: 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/util/session/SessionUtil.java
===================================================================
--- 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/util/session/SessionUtil.java
 2012-06-05 16:58:10 UTC (rev 29457)
+++ 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/util/session/SessionUtil.java
 2012-06-05 17:08:52 UTC (rev 29458)
@@ -54,10 +54,16 @@
        
        public static final String BOOKMARKS_FILE = "session_bookmarks.xml";
        public static final String CYSESSION_FILE = "cysession.xml";
-       public static final String CYTABLE_METADATA_FILE = "cytable.metadata";
        public static final String VIZMAP_PROPS_FILE = "vizmap.props";
        public static final String VIZMAP_XML_FILE = "vizmap.xml";
+       public static final String CYTABLE_STATE_FILE = "cytables.json";
        
+       @Deprecated
+       /**
+        * Replaced by CYTABLE_STATE_FILE.
+        */
+       public static final String CYTABLE_METADATA_FILE = "cytable.metadata";
+       
        public static final String PROPERTIES_EXT = ".props";
        public static final String TABLE_EXT = ".cytable";
        public static final String VERSION_EXT = ".version";

Modified: 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/util/session/VirtualColumnSerializer.java
===================================================================
--- 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/util/session/VirtualColumnSerializer.java
     2012-06-05 16:58:10 UTC (rev 29457)
+++ 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/util/session/VirtualColumnSerializer.java
     2012-06-05 17:08:52 UTC (rev 29458)
@@ -2,7 +2,7 @@
 
 import java.io.PrintWriter;
 
-
+@Deprecated
 public class VirtualColumnSerializer {
        String name;
        String sourceTable;

Modified: 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/session/SessionWriterImpl.java
===================================================================
--- 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/session/SessionWriterImpl.java
  2012-06-05 16:58:10 UTC (rev 29457)
+++ 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/session/SessionWriterImpl.java
  2012-06-05 17:08:52 UTC (rev 29458)
@@ -37,7 +37,7 @@
 import static org.cytoscape.io.internal.util.session.SessionUtil.APPS_FOLDER;
 import static 
org.cytoscape.io.internal.util.session.SessionUtil.BOOKMARKS_FILE;
 import static org.cytoscape.io.internal.util.session.SessionUtil.CYS_VERSION;
-import static 
org.cytoscape.io.internal.util.session.SessionUtil.CYTABLE_METADATA_FILE;
+import static 
org.cytoscape.io.internal.util.session.SessionUtil.CYTABLE_STATE_FILE;
 import static 
org.cytoscape.io.internal.util.session.SessionUtil.NETWORKS_FOLDER;
 import static 
org.cytoscape.io.internal.util.session.SessionUtil.NETWORK_VIEWS_FOLDER;
 import static 
org.cytoscape.io.internal.util.session.SessionUtil.PROPERTIES_EXT;
@@ -49,8 +49,6 @@
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -64,20 +62,18 @@
 import java.util.zip.ZipOutputStream;
 
 import org.cytoscape.io.CyFileFilter;
+import org.cytoscape.io.internal.util.session.CyTableSessionStateSerializer;
 import org.cytoscape.io.internal.util.session.SessionUtil;
-import org.cytoscape.io.internal.util.session.VirtualColumnSerializer;
 import org.cytoscape.io.internal.write.xgmml.XGMMLWriter;
 import org.cytoscape.io.write.CyNetworkViewWriterManager;
 import org.cytoscape.io.write.CyPropertyWriterManager;
 import org.cytoscape.io.write.CyTableWriterManager;
 import org.cytoscape.io.write.CyWriter;
 import org.cytoscape.io.write.VizmapWriterManager;
-import org.cytoscape.model.CyColumn;
 import org.cytoscape.model.CyNetwork;
 import org.cytoscape.model.CyTable;
 import org.cytoscape.model.CyTable.SavePolicy;
 import org.cytoscape.model.CyTableMetadata;
-import org.cytoscape.model.VirtualColumnInfo;
 import org.cytoscape.model.subnetwork.CyRootNetwork;
 import org.cytoscape.model.subnetwork.CyRootNetworkManager;
 import org.cytoscape.property.CyProperty;
@@ -201,46 +197,12 @@
        }
        
        private void zipVirtualColumns() throws IOException {
-               zos.putNextEntry(new ZipEntry(sessionDir + TABLES_FOLDER + 
CYTABLE_METADATA_FILE));
-               PrintWriter writer = new PrintWriter(new 
OutputStreamWriter(zos, "UTF-8"));
+               zos.putNextEntry(new ZipEntry(sessionDir + TABLES_FOLDER + 
CYTABLE_STATE_FILE));
                
+               CyTableSessionStateSerializer serializer = new 
CyTableSessionStateSerializer();
                try {
-                       for (CyTableMetadata metadata : session.getTables()) {
-                               CyTable table = metadata.getTable();
-                               String targetTable = 
tableFilenamesBySUID.get(table.getSUID());
-                               
-                               if (targetTable == null) {
-                                       continue;
-                               }
-                               
-                               for (CyColumn column : table.getColumns()) {
-                                       VirtualColumnInfo info = 
column.getVirtualColumnInfo();
-                                       
-                                       if (!info.isVirtual()) {
-                                               continue;
-                                       }
-                                       
-                                       String sourceTable = 
tableFilenamesBySUID.get(info.getSourceTable().getSUID());
-                                       
-                                       if (sourceTable == null) {
-                                               logger.warn("Cannot serialize 
virtual column \"" + column.getName() + "\" of \"" + targetTable
-                                                               + "\" because 
the source table is null.");
-                                               continue;
-                                       }
-                                       
-                                       VirtualColumnSerializer serializer = 
new VirtualColumnSerializer(
-                                               column.getName(),
-                                               sourceTable,
-                                               targetTable,
-                                               info.getSourceColumn(),
-                                               info.getSourceJoinKey(),
-                                               info.getTargetJoinKey(),
-                                               info.isImmutable());
-                                       serializer.serialize(writer);
-                               }
-                       }
+                       serializer.serialize(zos, tableFilenamesBySUID, 
session);
                } finally {
-                       writer.flush();
                        zos.closeEntry();
                }
        }

Added: core3/impl/trunk/io-impl/impl/src/main/protobuf/CyTableSessionState.proto
===================================================================
--- core3/impl/trunk/io-impl/impl/src/main/protobuf/CyTableSessionState.proto   
                        (rev 0)
+++ core3/impl/trunk/io-impl/impl/src/main/protobuf/CyTableSessionState.proto   
2012-06-05 17:08:52 UTC (rev 29458)
@@ -0,0 +1,18 @@
+package org.cytoscape.io.internal.model;
+
+option optimize_for = LITE_RUNTIME;
+option java_package = "org.cytoscape.io.internal.model";
+
+message CyTableSessionState {
+       message VirtualColumn {
+               required string name = 1;
+               required string sourceColumn = 2;
+               required string sourceTable = 3;
+               required string sourceJoinKey = 4;
+               required string targetTable = 5;
+               required string targetJoinKey = 6;
+               required bool isImmutable = 7;
+       }
+       
+       repeated VirtualColumn virtualColumns = 1;
+}

-- 
You received this message because you are subscribed to the Google Groups 
"cytoscape-cvs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/cytoscape-cvs?hl=en.

Reply via email to