/* * ==================================================================== * * The ObjectStyle Group Software License, Version 1.0 * * Copyright (c) 2006 The ObjectStyle Group and individual authors of the * software. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowlegement: "This product includes software * developed by the ObjectStyle Group (http://objectstyle.org/)." Alternately, * this acknowlegement may appear in the software itself, if and wherever such * third-party acknowlegements normally appear. * * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse or * promote products derived from this software without prior written permission. * For written permission, please contact andrus@objectstyle.org. * * 5. Products derived from this software may not be called "ObjectStyle" nor * may "ObjectStyle" appear in their names without prior written permission of * the ObjectStyle Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * OBJECTSTYLE GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many individuals on * behalf of the ObjectStyle Group. For more information on the ObjectStyle * Group, please see <http://objectstyle.org/>. * */ package org.objectstyle.wolips.eogenerator.core.model; import java.util.LinkedList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobManager; import org.eclipse.core.runtime.jobs.Job; import org.objectstyle.wolips.eogenerator.core.Activator; import org.objectstyle.wolips.eogenerator.core.runner.ExternalEOGeneratorRunner; import org.objectstyle.wolips.eogenerator.core.runner.VelocityEOGeneratorRunner; import org.objectstyle.wolips.preferences.Preferences; public class EOGenerateWorkspaceJob extends WorkspaceJob { private IFile _eogenFile; private List<IEOGeneratorListener> _listeners; private long _creationDate; public EOGenerateWorkspaceJob(IFile eogenFile) { super("EOGenerating " + eogenFile.getName() + " ..."); _creationDate = System.currentTimeMillis(); _eogenFile = eogenFile; _listeners = new LinkedList<IEOGeneratorListener>(); //System.out.println("EOGenerateWorkspaceJob.EOGenerateWorkspaceJob: queuing up " + this); } public long creationDate() { return _creationDate; } public void addListener(IEOGeneratorListener listener) { _listeners.add(listener); } public boolean isFile(IFile file) { return _eogenFile.equals(file); } public IStatus runInWorkspace(IProgressMonitor monitor) { for (IEOGeneratorListener listener : _listeners) { listener.eogeneratorStarted(); } try { boolean commitSuicide = false; IJobManager jobManager = Job.getJobManager(); Job[] jobs = jobManager.find(null); if (jobs != null) { for (Job job : jobs) { if (job != this && job instanceof EOGenerateWorkspaceJob && ((EOGenerateWorkspaceJob) job).isFile(_eogenFile)) { EOGenerateWorkspaceJob otherJob = (EOGenerateWorkspaceJob) job; if (otherJob.creationDate() > _creationDate) { //System.out.println("EOGenerateWorkspaceJob.runInWorkspace: commit suicide on " + this + " because of " + job); commitSuicide = true; } else { //System.out.println("EOGenerateWorkspaceJob.runInWorkspace: canceling " + job + " from " + this); job.cancel(); } } } } if (commitSuicide) { //System.out.println("EOGenerateWorkspaceJob.runInWorkspace: committing suicide"); } else { //System.out.println("EOGenerateWorkspaceJob.runInWorkspace: running " + this + " (" + _eogenFile + ")"); StringBuffer output = new StringBuffer(); boolean fileSucceeded = true; setName("EOGenerating " + _eogenFile.getName() + " ..."); try { EOGeneratorModel eogenModel = EOGeneratorModel.createModelFromFile(_eogenFile); eogenModel.setVerbose(eogenModel.isVerbose()); IEOGeneratorRunner runner; String eogeneratorPath = Preferences.getEOGeneratorPath(); if (eogeneratorPath == null || eogeneratorPath.length() == 0 || "velocity".equalsIgnoreCase(eogeneratorPath)) { runner = new VelocityEOGeneratorRunner(); } else { runner = new ExternalEOGeneratorRunner(); } boolean showResults = runner.generate(eogenModel, output, monitor); if (showResults) { fileSucceeded = false; } _eogenFile.getProject().getFolder(new Path(eogenModel.getDestination())).refreshLocal(IResource.DEPTH_INFINITE, monitor); _eogenFile.getProject().getFolder(new Path(eogenModel.getSubclassDestination())).refreshLocal(IResource.DEPTH_INFINITE, monitor); } catch (OperationCanceledException t) { //System.out.println("EOGenerateWorkspaceJob.runInWorkspace: canceled operation " + _eogenFile + ", " + this); } catch (Throwable t) { fileSucceeded = false; output.append(t.getMessage()); //System.out.println("EOGenerateWorkspaceJob.runInWorkspace: failed " + _eogenFile); Activator.getDefault().log("Failed to generate " + _eogenFile.getName() + ".", t); } String outputStr = output.toString(); if (fileSucceeded) { for (IEOGeneratorListener listener : _listeners) { listener.eogeneratorSucceeded(_eogenFile, outputStr); } } else { for (IEOGeneratorListener listener : _listeners) { listener.eogeneratorFailed(_eogenFile, outputStr); } } } //System.out.println("EOGenerateWorkspaceJob.runInWorkspace: finished " + this); } finally { for (IEOGeneratorListener listener : _listeners) { listener.eogeneratorFinished(); } } return new Status(IStatus.OK, org.objectstyle.wolips.eogenerator.core.Activator.PLUGIN_ID, IStatus.OK, "Done", null); } }