/*
* Copyright (c) 2007-2009, Osmorc Development Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice, this list
* of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this
* list of conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
* * Neither the name of 'Osmorc Development Team' nor the names of its contributors may be
* used to endorse or promote products derived from this software without specific
* prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.osmorc.impl;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.roots.libraries.Library;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.osmorc.BundleManager;
import org.osmorc.frameworkintegration.FrameworkInstanceDefinition;
import org.osmorc.frameworkintegration.FrameworkIntegrator;
import org.osmorc.frameworkintegration.FrameworkIntegratorRegistry;
import org.osmorc.manifest.BundleManifest;
import org.osmorc.manifest.ManifestHolder;
import org.osmorc.manifest.ManifestHolderRegistry;
import org.osmorc.settings.ApplicationSettings;
import org.osmorc.settings.ProjectSettings;
import java.util.Collections;
import java.util.List;
/**
* @author Robert F. Beeger (robert@beeger.net)
*/
public class BundleManagerImpl implements BundleManager {
private final ModuleManager myModuleManager;
private final ManifestHolderRegistry myManifestHolderRegistry;
private final FrameworkIntegratorRegistry myFrameworkIntegratorRegistry;
private final ProjectSettings myProjectSettings;
private final ApplicationSettings myApplicationSettings;
private long myHighestBundleId = 0;
private String _currentFrameworkInstanceName;
public BundleManagerImpl(ModuleManager moduleManager, ManifestHolderRegistry manifestHolderRegistry,
FrameworkIntegratorRegistry frameworkIntegratorRegistry,
ProjectSettings projectSettings, ApplicationSettings applicationSettings) {
this.myModuleManager = moduleManager;
this.myManifestHolderRegistry = manifestHolderRegistry;
this.myFrameworkIntegratorRegistry = frameworkIntegratorRegistry;
this.myProjectSettings = projectSettings;
this.myApplicationSettings = applicationSettings;
}
@Nullable
private Object findBundle(String bundleSymbolicName) {
Module[] modules = myModuleManager.getModules();
for (Module module : modules) {
BundleManifest bundleManifest = getBundleManifest(module);
if (bundleManifest != null && bundleSymbolicName.equals(bundleManifest.getBundleSymbolicName())) {
return module;
}
}
List<Library> libraries = getFrameworkInstanceLibraries();
for (Library library : libraries) {
BundleManifest bundleManifest = getBundleManifest(library);
if (bundleManifest != null && bundleSymbolicName.equals(bundleManifest.getBundleSymbolicName())) {
return library;
}
}
return null;
}
@Nullable
public BundleManifest getBundleManifest(String bundleSymbolicName) {
Object bundle = findBundle(bundleSymbolicName);
if (bundle != null) {
return getBundleManifest(bundle);
}
return null;
}
public BundleManifest getBundleManifest(@NotNull Object bundle) {
return getManifestHolder(bundle).getBundleManifest();
}
public void addOrUpdateBundle(@NotNull Object bundle) {
createInitialState();
addOrUpdateBundleInternal(bundle);
}
private void addOrUpdateBundleInternal(Object bundle) {
BundleManifest bundleManifest = getBundleManifest(bundle);
if (bundleManifest != null) {
ManifestHolder manifestHolder = getManifestHolder(bundle);
if (manifestHolder.getBundleID() == -1) {
manifestHolder.setBundleID(++myHighestBundleId);
}
}
}
public boolean reloadFrameworkInstanceLibraries(boolean onlyIfFrameworkInstanceSelectionChanged) {
String frameworkInstanceName = myProjectSettings.getFrameworkInstanceName();
if (!onlyIfFrameworkInstanceSelectionChanged ||
(frameworkInstanceName != null && !frameworkInstanceName.equals(_currentFrameworkInstanceName))) {
myManifestHolderRegistry.clearLibraryManifestHolders();
loadFrameworkInstanceLibraryBundles();
return true;
}
return false;
}
private synchronized void createInitialState() {
if (myManifestHolderRegistry.isEmpty()) {
Module[] modules = myModuleManager.getModules();
for (Module module : modules) {
addOrUpdateBundleInternal(module);
}
loadFrameworkInstanceLibraryBundles();
}
}
private void loadFrameworkInstanceLibraryBundles() {
_currentFrameworkInstanceName = myProjectSettings.getFrameworkInstanceName();
if (_currentFrameworkInstanceName != null) {
List<Library> libraries = getFrameworkInstanceLibraries();
for (Library library : libraries) {
addOrUpdateBundleInternal(library);
}
}
}
private List<Library> getFrameworkInstanceLibraries() {
FrameworkInstanceDefinition frameworkInstanceDefinition =
myApplicationSettings.getFrameworkInstance(myProjectSettings.getFrameworkInstanceName());
List<Library> libraries = null;
if (frameworkInstanceDefinition != null) {
FrameworkIntegrator frameworkIntegrator =
myFrameworkIntegratorRegistry.findIntegratorByInstanceDefinition(frameworkInstanceDefinition);
libraries = frameworkIntegrator.getFrameworkInstanceManager().getLibraries(frameworkInstanceDefinition);
}
if (libraries == null) {
libraries = Collections.emptyList();
}
return libraries;
}
protected ManifestHolder getManifestHolder(Object bundle) {
return myManifestHolderRegistry.getManifestHolder(bundle);
}
}