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.