//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.persistence.util;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.core.runtime.jobs.MultiRule;
import org.eclipse.epf.uma.MethodLibrary;
/**
* Scheduling rule used to lock a library during a operation and defer the
* broadcasting of resource change event until the operation is finished.
*
* @author Phong Nguyen Le - Aug 15, 2006
* @since 1.0
*/
public class LibrarySchedulingRule implements ISchedulingRule {
private MethodLibrary library;
/**
* @param lib
*/
public LibrarySchedulingRule(MethodLibrary lib) {
this.library = lib;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.jobs.ISchedulingRule#contains(org.eclipse.core.runtime.jobs.ISchedulingRule)
*/
public boolean contains(ISchedulingRule rule) {
if (this == rule) {
return true;
}
if (rule instanceof LibrarySchedulingRule) {
return ((LibrarySchedulingRule) rule).library == library;
}
if (rule instanceof MultiRule) {
MultiRule mrule = (MultiRule) rule;
ISchedulingRule[] childRules = mrule.getChildren();
for (int i=0; i<childRules.length; i++) {
if (! (childRules[i] instanceof IResource)) {
return false;
}
}
return true;
}
// allow any IResource rule to nest within the same thread
//
return rule instanceof IResource;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.jobs.ISchedulingRule#isConflicting(org.eclipse.core.runtime.jobs.ISchedulingRule)
*/
public boolean isConflicting(ISchedulingRule rule) {
return equals(rule);
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
return this == obj
|| (obj instanceof LibrarySchedulingRule && ((LibrarySchedulingRule) obj).library == library);
}
@Override
public int hashCode() {
return library.hashCode();
}
}