blob: 5264e4f1c34f51825092aa58eb4ef233072ae983 [file] [log] [blame]
/*
* Copyright (c) 2006, 2007 Borland Software Corporation
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Artem Tikhomirov (Borland) - initial API and implementation
*/
package org.eclipse.gmf.internal.graphdef.codegen.ui;
import java.io.IOException;
import java.util.ArrayList;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ContentHandler;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.gmf.gmfgraph.Canvas;
import org.eclipse.gmf.gmfgraph.FigureGallery;
import org.eclipse.gmf.gmfgraph.GMFGraphPackage;
import org.eclipse.gmf.graphdef.codegen.StandaloneGenerator.Processor;
import org.eclipse.gmf.internal.graphdef.codegen.CanvasProcessor;
import org.eclipse.gmf.internal.graphdef.codegen.GalleryMirrorProcessor;
import org.eclipse.gmf.internal.graphdef.codegen.GalleryProcessor;
/**
* @author artem
*/
class ConverterOutcome {
private final ConverterOptions myOptions;
private Processor myProcessor;
private final Resource[] myInput;
public ConverterOutcome(ConverterOptions options, Resource[] input) {
myOptions = options;
myInput = input;
}
public IStatus checkInputAgainstOptions() {
if (myOptions.needMirroredCanvas) {
Canvas[] c = findCanvases(myInput);
if (c.length == 0) {
return newError("Need canvas instance", null);
} else if (c.length > 1) {
return newError("Need exactly one canvas instance", null);
}
} else if (myOptions.needMirroredGalleries) {
FigureGallery[] figures = findFigures(myInput);
if (figures.length == 0) {
return newError("Need at least one figure gallery", null);
}
}
return Status.OK_STATUS;
}
public Processor getProcessor() {
if (myProcessor == null) {
myProcessor = createProcessor();
}
return myProcessor;
}
private Processor createProcessor() {
if (myOptions.needMirroredCanvas) {
return new CanvasProcessor(inputAsCanvas());
} else if (myOptions.needMirroredGalleries) {
return new GalleryMirrorProcessor(inputAsGalleries());
} else {
return new GalleryProcessor(inputAsGalleries());
}
}
private FigureGallery[] inputAsGalleries() {
return findFigures(myInput);
}
private Canvas inputAsCanvas() {
return findCanvases(myInput)[0];
}
public IStatus createResources(ResourceSet rs, URI galleryResourceURI, URI mirroredCanvasURI) {
assert rs != null && galleryResourceURI != null && mirroredCanvasURI != null;
Resource canvasResource = null;
Resource galleryResource = null;
if (myOptions.needMirroredCanvas) {
// need mirroredCanvas enforces mirrored galleries.
// the only difference with galleries in this case is where to put them - either
// separate resource or not.
Canvas mirror = ((CanvasProcessor) getProcessor()).getOutcome();
canvasResource = rs.createResource(mirroredCanvasURI, ContentHandler.UNSPECIFIED_CONTENT_TYPE);
canvasResource.getContents().add(mirror);
if (myOptions.needMirroredGalleries && myOptions.separateMirrorFiles) {
// sic! - respect separate mirror files only if explicitly asked to mirror galleries
// because separateMirrorFiles could be true when value for galleryOutputPath not set
galleryResource = rs.createResource(galleryResourceURI, ContentHandler.UNSPECIFIED_CONTENT_TYPE);
// XXX make sure we support containments in different resources
galleryResource.getContents().addAll(mirror.getFigures());
}
} else if (myOptions.needMirroredGalleries) {
galleryResource = rs.createResource(galleryResourceURI, ContentHandler.UNSPECIFIED_CONTENT_TYPE);
GalleryMirrorProcessor processor = (GalleryMirrorProcessor) getProcessor();
galleryResource.getContents().add(processor.convertFigureGallery());
}
try {
if (galleryResource != null) {
galleryResource.save(null);
}
if (canvasResource != null) {
canvasResource.save(null);
}
} catch (IOException ex) {
return newError(ex.getMessage(), ex);
}
return Status.OK_STATUS;
}
private static Status newError(String message, Exception ex) {
return new Status(IStatus.ERROR, "org.eclipse.gmf.graphdef.codegen.ui", 0, message, ex);
}
private static FigureGallery[] findFigures(Resource[] resources) {
ArrayList<FigureGallery> rv = new ArrayList<FigureGallery>();
for (int i = 0; i < resources.length; i++) {
for(TreeIterator<EObject> it = resources[i].getAllContents(); it.hasNext();) {
EObject next = it.next();
// FigureGallery could be either top element or as a child of canvas
if (next.eClass().getClassifierID() == GMFGraphPackage.FIGURE_GALLERY) {
rv.add((FigureGallery) next);
it.prune();
} else if (next.eClass().getClassifierID() != GMFGraphPackage.CANVAS) {
it.prune();
}
}
}
return rv.toArray(new FigureGallery[rv.size()]);
}
private static Canvas[] findCanvases(Resource[] resources) {
ArrayList<Canvas> rv = new ArrayList<Canvas>();
for (int i = 0; i < resources.length; i++) {
for(EObject next : resources[i].getContents()) {
if (next.eClass().getClassifierID() == GMFGraphPackage.CANVAS) {
rv.add((Canvas) next);
}
}
}
return rv.toArray(new Canvas[rv.size()]);
}
}