/* Copyright (c) 2011 Danish Maritime Authority.
*
* Licensed 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 net.maritimecloud.msdl.plugins.javagen;
import static java.util.Objects.requireNonNull;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.maritimecloud.msdl.MsdlPlugin;
import net.maritimecloud.msdl.MsdlProcessor;
import net.maritimecloud.msdl.model.BroadcastMessageDeclaration;
import net.maritimecloud.msdl.model.EndpointDefinition;
import net.maritimecloud.msdl.model.EnumDeclaration;
import net.maritimecloud.msdl.model.MessageDeclaration;
import net.maritimecloud.msdl.model.MsdlFile;
import net.maritimecloud.msdl.model.Project;
import net.maritimecloud.msdl.plugins.javagen.annotation.JavaImplementation;
import org.cakeframework.internal.codegen.CodegenClass;
import org.cakeframework.internal.codegen.CodegenUtil;
/**
*
* @author Kasper Nielsen
*/
public class JavaGenPlugin extends MsdlPlugin {
Path fileHeader;
boolean implementsSerializable;
String license;
Path outputPath;
String packagePrefix;
JavaGenPlugin(Path p) {
this.outputPath = requireNonNull(p);
}
void generateSourceForFile(MsdlFile file) throws IOException {
List<CodegenClass> classes = new ArrayList<>();
// Generate enums in the file
for (EnumDeclaration ed : file.getEnums()) {
if (!ed.isAnnotationPresent(JavaImplementation.class)) {
classes.add(JavaGenEnumGenerator.generateEnum(null, ed));
}
}
// Generate ordinary messages in the file
for (MessageDeclaration md : file.getMessages()) {
if (!md.isAnnotationPresent(JavaImplementation.class)) {
classes.add(new JavaGenMessageGenerator(this, null, md).generate().c);
}
}
// Generate broadcast messages in the file
for (BroadcastMessageDeclaration bd : file.getBroadcasts()) {
if (!bd.isAnnotationPresent(JavaImplementation.class)) {
classes.add(new JavaGenBroadcastMessageGenerator(this, null, bd).generate().c);
}
}
// Generate endpoints in the file
for (EndpointDefinition ed : file.getEndpoints()) {
JavaGenEndpointGenerator g = new JavaGenEndpointGenerator(this, null, ed).generate();
classes.add(g.cClient); // add client part of endpoint
classes.add(g.cServer); // add server part of endpoint
}
for (CodegenClass cc : classes) {
if (file.getNamespace() != null) {
cc.setPackage(file.getNamespace());
}
if (license != null) {
cc.setLicense(license);
}
Path path = cc.writeSource(outputPath);
if (path != null) {
getLogger().info("Wrote " + path);
}
}
}
/**
* @return the implementsSerializable
*/
public boolean isImplementsSerializable() {
return implementsSerializable;
}
/** {@inheritDoc} */
@Override
protected void process(Project project) throws Exception {
// If user has a set a file header/license generate it first
if (fileHeader != null) {
StringBuilder sb = new StringBuilder();
for (String s : Files.readAllLines(fileHeader)) {
sb.append(s).append(CodegenUtil.LS);
}
license = sb.toString();
}
for (MsdlFile f : project) {
generateSourceForFile(f);
}
}
public JavaGenPlugin setHeader(Path path) {
this.fileHeader = path;
return this;
}
public JavaGenPlugin setImplementsSerializable(boolean implementsSerializable) {
this.implementsSerializable = implementsSerializable;
return this;
}
/**
* @param packagePrefix
* the packagePrefix to set
*/
public JavaGenPlugin setPackagePrefix(String packagePrefix) {
this.packagePrefix = packagePrefix;
return this;
}
public static JavaGenPlugin create(Path path) {
return new JavaGenPlugin(path);
}
public static JavaGenPlugin create(String path) {
return create(Paths.get(path));
}
public static void generateSingleFile(String source, String file, String destination) {
Logger lo = Logger.getLogger("msdl");
lo.setLevel(Level.FINE);
MsdlProcessor g = new MsdlProcessor();
g.setSourceDirectory(Paths.get(source));
g.addDependencyDirectory(Paths.get(source));
g.addFile(file);
g.addPlugin(JavaGenPlugin.create(destination));
g.executePlugins();
}
}