/******************************************************************************* * Copyright 2012 Pearson Education * * 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.semantictools.context.renderer.impl; import java.io.IOException; import java.util.List; import org.semantictools.context.renderer.ContextRenderer; import org.semantictools.context.renderer.DiagramGenerator; import org.semantictools.context.renderer.StreamFactory; import org.semantictools.context.renderer.model.CreateDiagramRequest; import org.semantictools.context.renderer.model.DiagramSpec; import org.semantictools.context.renderer.model.JsonContext; import org.semantictools.context.renderer.model.Modifier; import org.semantictools.context.renderer.model.Node; import org.semantictools.context.renderer.model.TreeNode; public class DiagramGeneratorImpl implements DiagramGenerator { private StreamFactory streamFactory; public DiagramGeneratorImpl(StreamFactory streamFactory) { this.streamFactory = streamFactory; } @Override public void generateNotationDiagram(CreateDiagramRequest request) throws IOException { DiagramSpec spec = createDiagramSpec(request); ContextRenderer renderer = new ContextRenderer(streamFactory); renderer.renderGraphicalNotationFigure(spec); } @Override public void generateDiagram(CreateDiagramRequest request) throws IOException { DiagramSpec spec = createDiagramSpec(request); ContextRenderer renderer = new ContextRenderer(streamFactory); renderer.render(spec); } private DiagramSpec createDiagramSpec(CreateDiagramRequest request) { JsonContext context = request.getContext(); NodeGenerator generator = new NodeGenerator(context); Node rootNode = generator.createTree(null, request.getRoot()); DiagramSpec spec = new DiagramSpec(); spec.setImagePath(request.getImagePath()); spec.setRoot(rootNode); return spec; } class NodeGenerator { JsonContext context; NodeGenerator(JsonContext context) { this.context = context; } Node createTree(Node parent, TreeNode source) { Node peer = new Node(); peer.setNameText(source.getLocalName()); peer.setTypeText(source.getTypeName()); peer.setBranchStyle(source.getBranchStyle()); setModifier(peer, source); setObjectPresentation(peer, source); if (parent != null) { parent.add(peer); } List<TreeNode> kids = source.getChildren(); if (kids != null) { for (TreeNode child : kids) { createTree(peer, child); } } return peer; } private void setObjectPresentation(Node sink, TreeNode source) { switch (source.getObjectPresentation()) { case SIMPLE_NAME : sink.applyNameRef(); break; case URI_REFERENCE : sink.applyIriRef(); break; case MIXED_VALUE : sink.applyMixedValue(); break; case EXPANDED_VALUE : sink.applyExpandedValue(); break; } } private void setModifier(Node sink, TreeNode source) { int min = source.getMinCardinality(); int max = source.getMaxCardinality(); Modifier modifier = (min==0 && max==1) ? Modifier.OPTIONAL : (max<0 || max>1) ? Modifier.REPEATABLE : Modifier.NONE; sink.setModifier(modifier); } } }