EditorLock.java

/*
 * Licensed to The Apereo Foundation under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 *
 *
 * The Apereo Foundation licenses this file to you under the Educational
 * Community 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://opensource.org/licenses/ecl2.txt
 *
 * 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.opencastproject.editor;

import org.opencastproject.editor.api.EditorServiceException;
import org.opencastproject.editor.api.ErrorStatus;
import org.opencastproject.editor.api.LockData;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

import java.util.concurrent.TimeUnit;

public class EditorLock {

  private static LoadingCache <String,LockData> lockedPackages;

  public EditorLock(int timeout) {
    lockedPackages = CacheBuilder.newBuilder().expireAfterWrite(timeout, TimeUnit.SECONDS).build(
      new CacheLoader<String, LockData>() {
        // NB, this is not used but the abstract class needs a concrete implementaton
        @Override
        public LockData load(String mediapackageId) throws Exception {
          return lockedPackages.getIfPresent(mediapackageId);
        }
      });
  }

  public void lock(String mediaPackage, LockData lockRequest) throws EditorServiceException {
    LockData lockData = lockedPackages.getIfPresent(mediaPackage);

    if (null != lockData) {
      if (lockRequest.getUUID().equals(lockData.getUUID())) {
        lockedPackages.refresh(mediaPackage);
      } else {
        String lockMessage = lockData.toString();
        throw new EditorServiceException(lockMessage,ErrorStatus.MEDIAPACKAGE_LOCKED);
      }
    } else {
      lockedPackages.put(mediaPackage, lockRequest);
    }
  }

  public void unlock(String mediaPackage, LockData lockRequest) throws EditorServiceException {
    LockData lockData = lockedPackages.getIfPresent(mediaPackage);

    if (null != lockData) {
      if (lockRequest.getUUID().equals(lockData.getUUID())) {
        lockedPackages.invalidate(mediaPackage);
      } else {
        String lockMessage = "MediaPackage " + mediaPackage + lockData.toString();
        throw new EditorServiceException(lockMessage,ErrorStatus.MEDIAPACKAGE_LOCKED);
      }
    }
  }

  public boolean isLocked(String mediaPackage) {
    return (null != getLockData(mediaPackage));
  }

  public LockData getLockData(String mediaPackage) {
    return lockedPackages.getIfPresent(mediaPackage);
  }
}