/*
* 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.groovy.jsr223;
import org.apache.tinkerpop.gremlin.jsr223.AbstractGremlinPlugin;
import org.apache.tinkerpop.gremlin.jsr223.Customizer;
import org.apache.tinkerpop.gremlin.jsr223.GremlinPlugin;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
/**
* A {@link GremlinPlugin} that provides access to low-level configuration options of the {@code GroovyScriptEngine}
* itself.
*
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
public class GroovyCompilerGremlinPlugin extends AbstractGremlinPlugin {
public enum Compilation {
COMPILE_STATIC,
TYPE_CHECKED,
NONE
}
private static final String NAME = "tinkerpop.groovy";
private GroovyCompilerGremlinPlugin(final Builder builder) {
super(NAME, new HashSet<>(Collections.singletonList("gremlin-groovy")), builder.asCustomizers());
}
public static Builder build() {
return new Builder();
}
public static final class Builder {
private boolean interpreterMode;
private boolean threadInterrupt;
private long timeInMillis = 0;
private Compilation compilation = Compilation.NONE;
private String extensions = null;
private int expectedCompilationTime = 5000;
private Map<String,Object> keyValues = Collections.emptyMap();
/**
* If the time it takes to compile a script exceeds the specified time then a warning is written to the logs.
* Defaults to 5000ms.
*/
public Builder expectedCompilationTime(final int timeInMillis) {
this.expectedCompilationTime = timeInMillis;
return this;
}
public Builder enableInterpreterMode(final boolean interpreterMode) {
this.interpreterMode = interpreterMode;
return this;
}
public Builder compilerConfigurationOptions(final Map<String,Object> keyValues) {
this.keyValues = keyValues;
return this;
}
public Builder enableThreadInterrupt(final boolean threadInterrupt) {
this.threadInterrupt = threadInterrupt;
return this;
}
public Builder timedInterrupt(final long timeInMillis) {
this.timeInMillis = timeInMillis;
return this;
}
public Builder compilation(final Compilation compilation) {
this.compilation = compilation;
return this;
}
public Builder compilation(final String compilation) {
return compilation(Compilation.valueOf(compilation));
}
public Builder extensions(final String extensions) {
this.extensions = extensions;
return this;
}
Customizer[] asCustomizers() {
final List<Customizer> list = new ArrayList<>();
if (interpreterMode)
list.add(new InterpreterModeGroovyCustomizer());
if (!keyValues.isEmpty())
list.add(new ConfigurationGroovyCustomizer(keyValues));
if (threadInterrupt)
list.add(new ThreadInterruptGroovyCustomizer());
if (timeInMillis > 0)
list.add(new TimedInterruptGroovyCustomizer(timeInMillis));
if (expectedCompilationTime > 0)
list.add(new CompilationOptionsCustomizer(expectedCompilationTime));
if (compilation == Compilation.COMPILE_STATIC)
list.add(new CompileStaticGroovyCustomizer(extensions));
else if (compilation == Compilation.TYPE_CHECKED)
list.add(new TypeCheckedGroovyCustomizer(extensions));
else if (compilation != Compilation.NONE)
throw new IllegalStateException("Use of unknown compilation type: " + compilation);
if (list.isEmpty()) throw new IllegalStateException("No customizer options have been selected for this plugin");
final Customizer[] customizers = new Customizer[list.size()];
list.toArray(customizers);
return customizers;
}
public GroovyCompilerGremlinPlugin create() {
return new GroovyCompilerGremlinPlugin(this);
}
}
}