/** * 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.adminui.endpoint; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.opencastproject.util.data.Tuple.tuple; import org.opencastproject.assetmanager.api.AssetManager; import org.opencastproject.assetmanager.api.Snapshot; import org.opencastproject.assetmanager.impl.AbstractAssetManager; import org.opencastproject.assetmanager.impl.HttpAssetProvider; import org.opencastproject.assetmanager.impl.persistence.Database; import org.opencastproject.assetmanager.impl.storage.AssetStore; import org.opencastproject.assetmanager.impl.storage.AssetStoreException; import org.opencastproject.assetmanager.impl.storage.DeletionSelector; import org.opencastproject.assetmanager.impl.storage.Source; import org.opencastproject.assetmanager.impl.storage.StoragePath; import org.opencastproject.mediapackage.MediaPackage; import org.opencastproject.mediapackage.MediaPackageBuilderFactory; import org.opencastproject.mediapackage.MediaPackageElements; import org.opencastproject.mediapackage.attachment.AttachmentImpl; import org.opencastproject.mediapackage.identifier.IdImpl; import org.opencastproject.security.api.DefaultOrganization; import org.opencastproject.util.IoSupport; import org.opencastproject.util.NotFoundException; import org.opencastproject.util.UrlSupport; import org.opencastproject.util.data.Option; import org.opencastproject.util.persistencefn.PersistenceEnv; import org.opencastproject.util.persistencefn.PersistenceEnvs; import org.opencastproject.util.persistencefn.PersistenceUtil; import org.opencastproject.workflow.api.WorkflowDatabaseException; import org.opencastproject.workflow.api.WorkflowDefinition; import org.opencastproject.workflow.api.WorkflowDefinitionImpl; import org.opencastproject.workflow.api.WorkflowInstanceImpl; import org.opencastproject.workflow.api.WorkflowService; import org.opencastproject.workspace.api.Workspace; import com.entwinemedia.fn.data.Opt; import org.apache.commons.io.FileUtils; import org.junit.Ignore; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.util.Arrays; import java.util.Map; import javax.persistence.EntityManagerFactory; import javax.ws.rs.Path; @Path("/") @Ignore public class TestTasksEndpoint extends TasksEndpoint { private final File baseDir = new File(new File(IoSupport.getSystemTmpDir()), "tasksendpointtest"); public TestTasksEndpoint() throws Exception { WorkflowDefinition wfD = new WorkflowDefinitionImpl(); wfD.setTitle("Full"); wfD.setId("full"); wfD.addTag("ng-archive"); WorkflowDefinitionImpl wfD2 = new WorkflowDefinitionImpl(); wfD2.setTitle("Full HTML5"); wfD2.setId("full-html5"); wfD2.setDescription("Test description"); wfD2.setConfigurationPanel("<h2>Test</h2>"); wfD2.addTag("ng-archive"); WorkflowDefinitionImpl wfD3 = new WorkflowDefinitionImpl(); wfD3.setTitle("Hidden"); wfD3.setId("hidden"); WorkflowInstanceImpl wI1 = new WorkflowInstanceImpl(); wI1.setTitle(wfD.getTitle()); wI1.setTemplate(wfD.getId()); wI1.setId(5); WorkflowInstanceImpl wI2 = new WorkflowInstanceImpl(); wI2.setTitle(wfD2.getTitle()); wI2.setTemplate(wfD2.getId()); wI2.setId(10); Workspace workspace = createNiceMock(Workspace.class); expect(workspace.get(anyObject(URI.class))) .andReturn(new File(getClass().getResource("/processing-properties.xml").toURI())).anyTimes(); WorkflowService workflowService = createNiceMock(WorkflowService.class); expect(workflowService.listAvailableWorkflowDefinitions()).andReturn(Arrays.asList(wfD, wfD2, wfD3)).anyTimes(); expect(workflowService.getWorkflowDefinitionById("full")).andReturn(wfD).anyTimes(); expect(workflowService.getWorkflowDefinitionById("exception")).andThrow(new WorkflowDatabaseException()).anyTimes(); expect(workflowService.start(anyObject(WorkflowDefinition.class), anyObject(MediaPackage.class), anyObject(Map.class))).andReturn(wI1); expect(workflowService.start(anyObject(WorkflowDefinition.class), anyObject(MediaPackage.class), anyObject(Map.class))).andReturn(wI2); replay(workspace, workflowService); AssetManager assetManager = mkAssetManager(workspace); MediaPackage mp1 = MediaPackageBuilderFactory.newInstance().newMediaPackageBuilder().createNew(new IdImpl("id1")); AttachmentImpl attachment = new AttachmentImpl(); attachment.setFlavor(MediaPackageElements.PROCESSING_PROPERTIES); mp1.add(attachment); MediaPackage mp2 = MediaPackageBuilderFactory.newInstance().newMediaPackageBuilder().createNew(new IdImpl("id2")); assetManager.takeSnapshot(AssetManager.DEFAULT_OWNER, mp1); assetManager.takeSnapshot(AssetManager.DEFAULT_OWNER, mp2); this.setWorkflowService(workflowService); this.setAssetManager(assetManager); this.setWorkspace(workspace); this.activate(null); } AssetManager mkAssetManager(final Workspace workspace) throws Exception { final PersistenceEnv penv = PersistenceEnvs.mk(mkEntityManagerFactory("org.opencastproject.assetmanager.impl")); final Database db = new Database(penv); return new AbstractAssetManager() { @Override public HttpAssetProvider getHttpAssetProvider() { // identity provider return new HttpAssetProvider() { @Override public Snapshot prepareForDelivery(Snapshot snapshot) { return snapshot; } }; } @Override public Database getDb() { return db; } @Override protected Workspace getWorkspace() { return workspace; } @Override public AssetStore getAssetStore() { return mkAssetStore(workspace); } @Override protected String getCurrentOrgId() { return DefaultOrganization.DEFAULT_ORGANIZATION_ID; } }; } AssetStore mkAssetStore(final Workspace workspace) { return new AssetStore() { @Override public Option<Long> getUsedSpace() { return Option.none(); } @Override public Option<Long> getUsableSpace() { return Option.none(); } @Override public Option<Long> getTotalSpace() { return Option.none(); } @Override public void put(StoragePath path, Source source) throws AssetStoreException { File destFile = new File(baseDir, UrlSupport.concat(path.getMediaPackageId(), path.getMediaPackageElementId(), path.getVersion().toString())); try { FileUtils.copyFile(workspace.get(source.getUri()), destFile); } catch (IOException e) { throw new RuntimeException(e); } catch (NotFoundException e) { throw new RuntimeException(e); } } @Override public Opt<InputStream> get(StoragePath path) throws AssetStoreException { File file = new File(baseDir, UrlSupport.concat(path.getMediaPackageId(), path.getMediaPackageElementId(), path.getVersion().toString())); InputStream inputStream; try { inputStream = new ByteArrayInputStream(FileUtils.readFileToByteArray(file)); return Opt.some(inputStream); } catch (IOException e) { throw new RuntimeException(e); } } @Override public boolean delete(DeletionSelector sel) throws AssetStoreException { return false; } @Override public boolean copy(StoragePath from, StoragePath to) throws AssetStoreException { File file = new File(baseDir, UrlSupport.concat(from.getMediaPackageId(), from.getMediaPackageElementId(), from.getVersion().toString())); File destFile = new File(baseDir, UrlSupport.concat(to.getMediaPackageId(), to.getMediaPackageElementId(), to.getVersion().toString())); try { FileUtils.copyFile(file, destFile); return true; } catch (IOException e) { throw new RuntimeException(e); } } @Override public boolean contains(StoragePath path) throws AssetStoreException { return false; } }; } static EntityManagerFactory mkEntityManagerFactory(String persistenceUnit) { if ("mysql".equals(System.getProperty("useDatabase"))) { return mkMySqlEntityManagerFactory(persistenceUnit); } else { return mkH2EntityManagerFactory(persistenceUnit); } } static EntityManagerFactory mkH2EntityManagerFactory(String persistenceUnit) { return PersistenceUtil.mkTestEntityManagerFactory(persistenceUnit, true); } static EntityManagerFactory mkMySqlEntityManagerFactory(String persistenceUnit) { return PersistenceUtil.mkEntityManagerFactory(persistenceUnit, "MySQL", "com.mysql.jdbc.Driver", "jdbc:mysql://localhost/test_scheduler", "matterhorn", "matterhorn", org.opencastproject.util.data.Collections.map(tuple("eclipselink.ddl-generation", "drop-and-create-tables"), tuple("eclipselink.ddl-generation.output-mode", "database"), tuple("eclipselink.logging.level.sql", "FINE"), tuple("eclipselink.logging.parameters", "true")), PersistenceUtil.mkTestPersistenceProvider()); } }