/*
* Copyright 2017 Red Hat, Inc. and/or its affiliates.
*
* 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 org.kie.workbench.common.stunner.svg.gen.codegen.impl;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.kie.workbench.common.stunner.svg.client.shape.view.SVGShapeView;
import org.kie.workbench.common.stunner.svg.gen.codegen.PrimitiveDefinitionGenerator;
import org.kie.workbench.common.stunner.svg.gen.codegen.ViewDefinitionGenerator;
import org.kie.workbench.common.stunner.svg.gen.exception.GeneratorException;
import org.kie.workbench.common.stunner.svg.gen.model.LayoutDefinition;
import org.kie.workbench.common.stunner.svg.gen.model.PrimitiveDefinition;
import org.kie.workbench.common.stunner.svg.gen.model.ViewDefinition;
import org.kie.workbench.common.stunner.svg.gen.model.ViewFactory;
import org.kie.workbench.common.stunner.svg.gen.model.ViewRefDefinition;
import org.uberfire.annotations.processors.exceptions.GenerationException;
public class SVGViewDefinitionGenerator
extends AbstractGenerator
implements ViewDefinitionGenerator<ViewDefinition<SVGShapeView>> {
private static final String CHILD_TEMPLATE = "view.addSVGChild(\"%1s\", %1s.this.%1sBasicView());";
@Override
public StringBuffer generate(final ViewFactory viewFactory,
final ViewDefinition<SVGShapeView> viewDefinition) throws GeneratorException {
StringBuffer result = null;
final String factoryName = viewFactory.getSimpleName();
final String name = viewDefinition.getName();
final double x = viewDefinition.getX();
final double y = viewDefinition.getY();
final double width = viewDefinition.getWidth();
final double height = viewDefinition.getHeight();
final PrimitiveDefinition main = viewDefinition.getMain();
final ViewDefinition.ViewBoxDefinition viewBox = viewDefinition.getViewBox();
if (null != main) {
final Map<String, Object> root = new HashMap<String, Object>();
final List<String> shapes = new LinkedList<>();
final List<String> scalableShapes = new LinkedList<>();
// Main shape and children primitives.
final PrimitiveDefinitionGenerator<PrimitiveDefinition<?>> mainGenerator = getGenerator(main);
final StringBuffer mainBuffer = mainGenerator.generate(main);
final List<PrimitiveDefinition> children = viewDefinition.getChildren();
if (null != children) {
children.stream()
.forEach(child -> {
final PrimitiveDefinitionGenerator<PrimitiveDefinition<?>> childGenerator = getGenerator(child);
try {
final StringBuffer childBuffer = childGenerator.generate(child);
if (child.isScalable()) {
scalableShapes.add(childBuffer.toString());
} else {
if (null != child.getLayoutDefinition() &&
!child.getLayoutDefinition().equals(LayoutDefinition.NONE)) {
childBuffer.append(", LayoutContainer.Layout.").append(child.getLayoutDefinition().name().toUpperCase());
}
shapes.add(childBuffer.toString());
}
} catch (GeneratorException e) {
throw new RuntimeException(e);
}
});
}
// SVG View children.
final List<String> rawChildren = new LinkedList<>();
final List<ViewRefDefinition> svgViewRefs = viewDefinition.getSVGViewRefs();
svgViewRefs.forEach(viewRef -> {
final String parent = viewRef.getParent();
final String svgName = viewRef.getViewName();
final String viewName = getFactoryName(viewFactory,
svgName);
if (null != viewName) {
final String childRaw = formatString(CHILD_TEMPLATE,
parent,
factoryName,
viewName);
rawChildren.add(childRaw);
}
});
// Populate the context and generate using the template.
root.put("name",
name);
root.put("main",
mainBuffer.toString());
root.put("width",
formatDouble(viewDefinition.getWidth()));
root.put("height",
formatDouble(viewDefinition.getHeight()));
root.put("children",
shapes);
root.put("scalableChildren",
scalableShapes);
root.put("rawChildren",
rawChildren);
try {
result = writeTemplate(root);
} catch (final GenerationException e) {
throw new GeneratorException(e);
}
}
return result;
}
private String getFactoryName(final ViewFactory viewFactory,
final String path) {
final List<ViewDefinition<?>> viewDefinitions = viewFactory.getViewDefinitions();
final ViewDefinition<?> d = viewDefinitions.stream()
.filter(def -> def.getPath().endsWith(path))
.findFirst()
.orElse(null);
if (null != d) {
return d.getName();
}
return null;
}
@SuppressWarnings("unchecked")
private PrimitiveDefinitionGenerator<PrimitiveDefinition<?>> getGenerator(final PrimitiveDefinition main) {
final PrimitiveDefinitionGenerator<?>[] array = ViewGenerators.newPrimitiveDefinitionGenerators();
final List<PrimitiveDefinitionGenerator<?>> list = new LinkedList<PrimitiveDefinitionGenerator<?>>();
Collections.addAll(list,
array);
return (PrimitiveDefinitionGenerator<PrimitiveDefinition<?>>) list.stream()
.filter(generator -> generator.getDefinitionType().equals(main.getClass()))
.findFirst()
.orElse(null);
}
@Override
protected String getTemplatePath() {
return "SVGShapeView";
}
}