/** * 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.assetmanager.impl; import org.opencastproject.assetmanager.api.Asset; import org.opencastproject.assetmanager.api.AssetManager; import org.opencastproject.assetmanager.api.Availability; import org.opencastproject.assetmanager.api.Property; import org.opencastproject.assetmanager.api.Snapshot; import org.opencastproject.assetmanager.api.Version; import org.opencastproject.assetmanager.api.query.AQueryBuilder; import org.opencastproject.assetmanager.impl.persistence.Database; import org.opencastproject.assetmanager.impl.storage.AssetStore; import org.opencastproject.mediapackage.MediaPackage; import org.opencastproject.message.broker.api.MessageReceiver; import org.opencastproject.message.broker.api.MessageSender; import org.opencastproject.security.api.AuthorizationService; import org.opencastproject.security.api.OrganizationDirectoryService; import org.opencastproject.security.api.SecurityService; import org.opencastproject.security.util.SecurityUtil; import org.opencastproject.util.persistencefn.PersistenceEnvs; import org.opencastproject.workspace.api.Workspace; import com.entwinemedia.fn.data.Opt; import org.osgi.service.component.ComponentContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.persistence.EntityManagerFactory; /** * Ties the asset manager to the OSGi environment. * <p> * Composes the core asset manager with the {@link AssetManagerWithMessaging} and {@link AssetManagerWithSecurity} * implementations. */ public class OsgiAssetManager implements AssetManager { /** Log facility */ private static final Logger logger = LoggerFactory.getLogger(OsgiAssetManager.class); private SecurityService secSvc; private AuthorizationService authSvc; private OrganizationDirectoryService orgDir; private Workspace workspace; private AssetStore assetStore; private HttpAssetProvider httpAssetProvider; private MessageSender messageSender; private MessageReceiver messageReceiver; private EntityManagerFactory emf; // collect all objects that need to be closed on service deactivation private AutoCloseable toClose; private AssetManager delegate; /** OSGi callback. */ public void activate(ComponentContext cc) { logger.info("Activating AssetManager"); final Database db = new Database(PersistenceEnvs.mk(emf)); final String systemUserName = SecurityUtil.getSystemUserName(cc); // create the core asset manager final AssetManager core = new AbstractAssetManager() { @Override public Database getDb() { return db; } @Override public HttpAssetProvider getHttpAssetProvider() { return httpAssetProvider; } @Override public AssetStore getAssetStore() { return assetStore; } @Override protected Workspace getWorkspace() { return workspace; } @Override protected String getCurrentOrgId() { return secSvc.getOrganization().getId(); } }; // compose with ActiveMQ messaging final AssetManagerWithMessaging withMessaging = new AssetManagerWithMessaging( core, messageSender, messageReceiver, authSvc, orgDir, secSvc, workspace, systemUserName); // compose with security delegate = new AssetManagerWithSecurity(withMessaging, authSvc, secSvc); // collect all objects that need to be closed toClose = new AutoCloseable() { @Override public void close() throws Exception { withMessaging.close(); } }; } /** OSGi callback. Close the database. */ public void deactivate(ComponentContext cc) throws Exception { toClose.close(); } // // AssetManager impl // @Override public Snapshot takeSnapshot(String owner, MediaPackage mp) { return delegate.takeSnapshot(owner, mp); } @Override public Opt<Asset> getAsset(Version version, String mpId, String mpeId) { return delegate.getAsset(version, mpId, mpeId); } @Override public void setAvailability(Version version, String mpId, Availability availability) { delegate.setAvailability(version, mpId, availability); } @Override public boolean setProperty(Property property) { return delegate.setProperty(property); } @Override public AQueryBuilder createQuery() { return delegate.createQuery(); } @Override public Opt<Version> toVersion(String version) { return delegate.toVersion(version); } // // OSGi depedency injection // public void setEntityManagerFactory(EntityManagerFactory emf) { this.emf = emf; } public void setSecurityService(SecurityService securityService) { this.secSvc = securityService; } public void setAuthSvc(AuthorizationService authSvc) { this.authSvc = authSvc; } public void setOrgDir(OrganizationDirectoryService orgDir) { this.orgDir = orgDir; } public void setWorkspace(Workspace workspace) { this.workspace = workspace; } public void setAssetStore(AssetStore assetStore) { this.assetStore = assetStore; } public void setHttpAssetProvider(HttpAssetProvider httpAssetProvider) { this.httpAssetProvider = httpAssetProvider; } public void setMessageSender(MessageSender messageSender) { this.messageSender = messageSender; } public void setMessageReceiver(MessageReceiver messageReceiver) { this.messageReceiver = messageReceiver; } }