Package org.objectstyle.wolips.eogenerator.core.model

Source Code of org.objectstyle.wolips.eogenerator.core.model.EOGenerateWorkspaceJob

/*
* ====================================================================
*
* 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);
  }
}
TOP

Related Classes of org.objectstyle.wolips.eogenerator.core.model.EOGenerateWorkspaceJob

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.