blob: 0c72ffd7405bb4f2da2602b6f71bd2b9a86f723a [file] [log] [blame]
/**
* 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.jena.sparql.core ;
import java.util.Collections ;
import java.util.LinkedList ;
import java.util.List ;
import org.apache.jena.atlas.lib.Pair ;
import org.apache.jena.graph.Node ;
/** Capture a record of quad actions */
public class DatasetChangesCapture implements DatasetChanges {
// ArrayLists have an annoying issue that they grow by copying the internal
// []-array.
// This growth is by a fixed factor of adding 50% which for an array
// with little guidance as to likely size, can lead to undesirable GC
// and copy-time issues.
// Using a LinkedList avoids this although it adds overhead for list
// entries.
private List<Pair<QuadAction, Quad>> actions ;
final private boolean captureAdd ;
final private boolean captureDelete ;
final private boolean captureNoAdd ;
final private boolean captureNoDelete ;
/** Capture quad actions, excluding no-ops */
public DatasetChangesCapture() {
this(true, true, false, false) ;
}
/**
* Capture quad actions, either including or excluding the "no ops"
*
* @param recordNoOps
* Whether to record {@link QuadAction#NO_ADD} and
* {@link QuadAction#NO_DELETE}
*/
public DatasetChangesCapture(boolean recordNoOps) {
this(true, true, recordNoOps, recordNoOps) ;
}
/** Capture quad actions, selectively by category */
public DatasetChangesCapture(boolean captureAdd, boolean captureDelete, boolean captureNoAdd, boolean captureNoDelete) {
this.captureAdd = captureAdd ;
this.captureDelete = captureDelete ;
this.captureNoAdd = captureNoAdd ;
this.captureNoDelete = captureNoDelete ;
this.actions = new LinkedList<>() ;
}
/** The actions recorded.
* Only valid until the next {@code start} call.
*/
public List<Pair<QuadAction, Quad>> getActions() {
return Collections.unmodifiableList(actions) ;
}
@Override
public void start() {
if ( actions == null )
actions = new LinkedList<>() ;
}
@Override
public void change(QuadAction qaction, Node g, Node s, Node p, Node o) {
Quad q = new Quad(g, s, p, o) ;
Pair<QuadAction, Quad> pair = Pair.create(qaction, q) ;
switch (qaction) {
case ADD :
if ( captureAdd )
actions.add(pair) ;
break ;
case DELETE :
if ( captureDelete )
actions.add(pair) ;
break ;
case NO_ADD :
if ( captureNoAdd )
actions.add(pair) ;
break ;
case NO_DELETE :
if ( captureNoDelete )
actions.add(pair) ;
break ;
}
}
@Override
public void finish() {}
@Override
public void reset() {
if ( actions != null )
actions.clear() ;
actions = null ;
}
}