/* MyMAM - Open Source Digital Media Asset Management.
* http://www.mymam.net
*
* Copyright 2013, MyMAM contributors as indicated by the @author tag.
*
* Licensed under the Apache 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://www.apache.org/licenses/LICENSE-2.0
*
* 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 net.mymam.server.test;
import net.mymam.data.json.FileProcessorTaskType;
import net.mymam.data.json.ReturnStatus;
import net.mymam.ejb.MediaFileEJB;
import net.mymam.entity.MediaFile;
import net.mymam.entity.User;
import net.mymam.exceptions.InvalidInputStatusChangeException;
import net.mymam.exceptions.NoSuchTaskException;
import net.mymam.exceptions.NotFoundException;
import net.mymam.exceptions.PermissionDeniedException;
import javax.naming.NamingException;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.Collection;
import java.util.Map;
/**
* Call {@link MediaFileEJB} methods as authenticated user for unit testing.
*
* @author fstab
*/
public class MediaFileEJB_AuthWrapper {
private final MediaFileEJB mediaFileEJB;
public MediaFileEJB_AuthWrapper(MediaFileEJB mediaFileEJB) {
this.mediaFileEJB = mediaFileEJB;
}
public WrappedMediaFileEJB as(String username, String password) {
return new WrappedMediaFileEJB(mediaFileEJB, username, password);
}
public static class WrappedMediaFileEJB {
private final MediaFileEJB mediaFileEJB;
private final String username;
private final String password;
private WrappedMediaFileEJB(MediaFileEJB mediaFileEJB, String username, String password) {
this.mediaFileEJB = mediaFileEJB;
this.username = username;
this.password = password;
}
public MediaFile findById(final long id) throws LoginException, PrivilegedActionException {
LoginContext loginContext = JBossLoginContextFactory.createLoginContext(username, password);
loginContext.login();
try {
return Subject.doAs(loginContext.getSubject(), new PrivilegedExceptionAction<MediaFile>() {
@Override
public MediaFile run() throws NotFoundException, PermissionDeniedException, InvalidInputStatusChangeException {
return mediaFileEJB.findById(id);
}
});
} finally {
loginContext.logout();
}
}
public MediaFile grabNextFileProcessorTask(final Class... types) throws LoginException, PrivilegedActionException {
LoginContext loginContext = JBossLoginContextFactory.createLoginContext(username, password);
loginContext.login();
try {
return Subject.doAs(loginContext.getSubject(), new PrivilegedExceptionAction<MediaFile>() {
@Override
public MediaFile run() throws NotFoundException, PermissionDeniedException, InvalidInputStatusChangeException {
return mediaFileEJB.grabNextFileProcessorTask(types);
}
});
} finally {
loginContext.logout();
}
}
public MediaFile grabNextFileProcessorTask(final Collection<Class> types) throws LoginException, PrivilegedActionException {
LoginContext loginContext = JBossLoginContextFactory.createLoginContext(username, password);
loginContext.login();
try {
return Subject.doAs(loginContext.getSubject(), new PrivilegedExceptionAction<MediaFile>() {
@Override
public MediaFile run() throws NotFoundException, PermissionDeniedException, InvalidInputStatusChangeException {
return mediaFileEJB.grabNextFileProcessorTask(types);
}
});
} finally {
loginContext.logout();
}
}
public void scheduleGenerateThumbnailsTask(final long mediaFileId, final long thumbnailOffsetMs) throws LoginException, PrivilegedActionException {
LoginContext loginContext = JBossLoginContextFactory.createLoginContext(username, password);
loginContext.login();
try {
Subject.doAs(loginContext.getSubject(), new PrivilegedExceptionAction<Void>() {
@Override
public Void run() throws NotFoundException, PermissionDeniedException, InvalidInputStatusChangeException {
mediaFileEJB.scheduleGenerateThumbnailsTask(mediaFileId, thumbnailOffsetMs);
return null;
}
});
} finally {
loginContext.logout();
}
}
public void scheduleDeleteTask(final long fileId) throws LoginException, PrivilegedActionException {
LoginContext loginContext = JBossLoginContextFactory.createLoginContext(username, password);
loginContext.login();
try {
Subject.doAs(loginContext.getSubject(), new PrivilegedExceptionAction<Void>() {
@Override
public Void run() throws NotFoundException, PermissionDeniedException, InvalidInputStatusChangeException {
mediaFileEJB.scheduleDeleteTask(fileId);
return null;
}
});
} finally {
loginContext.logout();
}
}
public void handleTaskResult(final long fileId, final FileProcessorTaskType taskType, final ReturnStatus status, final Map<String, String> resultData) throws LoginException, PrivilegedActionException {
LoginContext loginContext = JBossLoginContextFactory.createLoginContext(username, password);
loginContext.login();
try {
Subject.doAs(loginContext.getSubject(), new PrivilegedExceptionAction<Void>() {
@Override
public Void run() throws NotFoundException, PermissionDeniedException, InvalidInputStatusChangeException, NoSuchTaskException {
mediaFileEJB.handleTaskResult(fileId, taskType, status, resultData);
return null;
}
});
} finally {
loginContext.logout();
}
}
public MediaFile createNewMediaFile(final String rootDir, final String origFile) throws LoginException, NamingException, PrivilegedActionException {
LoginContext loginContext = JBossLoginContextFactory.createLoginContext(username, password);
loginContext.login();
try {
return Subject.doAs(loginContext.getSubject(), new PrivilegedExceptionAction<MediaFile>() {
@Override
public MediaFile run() {
return mediaFileEJB.createNewMediaFile(rootDir, origFile);
}
});
} finally {
loginContext.logout();
}
}
}
}