Github user spmallette commented on a diff in the pull request:

    https://github.com/apache/tinkerpop/pull/893#discussion_r205939944
  
    --- Diff: 
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/IoStep.java
 ---
    @@ -0,0 +1,254 @@
    +/*
    + * 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.tinkerpop.gremlin.process.traversal.step.sideEffect;
    +
    +import org.apache.tinkerpop.gremlin.process.traversal.IO;
    +import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
    +import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
    +import org.apache.tinkerpop.gremlin.process.traversal.step.ReadWriting;
    +import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
    +import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
    +import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.EmptyTraverser;
    +import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
    +import org.apache.tinkerpop.gremlin.structure.Graph;
    +import org.apache.tinkerpop.gremlin.structure.io.GraphReader;
    +import org.apache.tinkerpop.gremlin.structure.io.GraphWriter;
    +import org.apache.tinkerpop.gremlin.structure.io.IoRegistry;
    +import org.apache.tinkerpop.gremlin.structure.io.graphml.GraphMLReader;
    +import org.apache.tinkerpop.gremlin.structure.io.graphml.GraphMLWriter;
    +import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
    +import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONReader;
    +import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONWriter;
    +import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoMapper;
    +import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoReader;
    +import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoWriter;
    +import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
    +
    +import java.io.File;
    +import java.io.FileInputStream;
    +import java.io.FileOutputStream;
    +import java.io.IOException;
    +import java.io.InputStream;
    +import java.io.OutputStream;
    +import java.lang.reflect.Method;
    +import java.util.Collections;
    +import java.util.List;
    +import java.util.stream.Collectors;
    +
    +/**
    + * Handles read and write operations into the {@link Graph}.
    + *
    + * @author Stephen Mallette (http://stephen.genoprime.com)
    + */
    +public class IoStep<S> extends AbstractStep<S,S> implements ReadWriting {
    +
    +    private Parameters parameters = new Parameters();
    +    private boolean first = true;
    +    private String file;
    +    private Mode mode = Mode.UNSET;
    +
    +    public IoStep(final Traversal.Admin traversal, final String file) {
    +        super(traversal);
    +
    +        if (null == file || file.isEmpty())
    +            throw new IllegalArgumentException("file cannot be null or 
empty");
    +
    +        this.file = file;
    +    }
    +
    +    @Override
    +    public void setMode(final Mode mode) {
    +        this.mode = mode;
    +    }
    +
    +    @Override
    +    public Mode getMode() {
    +        return mode;
    +    }
    +
    +    @Override
    +    public String getFile() {
    +        return file;
    +    }
    +
    +    @Override
    +    public Parameters getParameters() {
    +        return this.parameters;
    +    }
    +
    +    @Override
    +    public void configure(final Object... keyValues) {
    +        this.parameters.set(null, keyValues);
    +    }
    +
    +    @Override
    +    protected Traverser.Admin<S> processNextStart() {
    +        if (mode == Mode.UNSET) throw new IllegalStateException("IO mode 
was not set to read() or write()");
    +        if (!this.first) throw FastNoSuchElementException.instance();
    +
    +        this.first = false;
    +        final File file = new File(this.file);
    +
    +        if (mode == Mode.READING) {
    +            if (!file.exists()) throw new IllegalStateException(this.file 
+ " does not exist");
    +            return read(file);
    +        } else if (mode == Mode.WRITING) {
    +            return write(file);
    +        } else {
    +            throw new IllegalStateException("Invalid ReadWriting.Mode 
configured in IoStep: " + mode.name());
    +        }
    +    }
    +
    +    private Traverser.Admin<S> write(final File file) {
    +        try (final OutputStream stream = new FileOutputStream(file)) {
    +            final Graph graph = (Graph) this.traversal.getGraph().get();
    +            constructWriter().writeGraph(stream, graph);
    +
    +            return EmptyTraverser.instance();
    +        } catch (IOException ioe) {
    +            throw new IllegalStateException(String.format("Could not write 
file %s from graph", this.file), ioe);
    +        }
    +    }
    +
    +    private Traverser.Admin<S> read(final File file) {
    +        try (final InputStream stream = new FileInputStream(file)) {
    --- End diff --
    
    I did do that at first and then i changed it because writing to such any 
`OutputStream` didn't seem trivial and I didn't want two different things going 
on there, but I'm having second thoughts now. It would be easier for GLVs to 
deal with URLs as they are dealing with remote sources.....I will think on that 
and look again on Monday.


---

Reply via email to