001 /*
002 * Copyright 2009-2012 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.codehaus.griffon.runtime.core;
018
019 import griffon.core.AddonManager;
020 import griffon.core.GriffonAddon;
021 import griffon.core.GriffonAddonDescriptor;
022 import griffon.core.GriffonApplication;
023 import griffon.util.GriffonNameUtils;
024 import org.slf4j.Logger;
025 import org.slf4j.LoggerFactory;
026
027 import java.util.Collections;
028 import java.util.LinkedHashMap;
029 import java.util.Map;
030
031 /**
032 * Base implementation of the {@code AddonManager} interface.
033 *
034 * @author Andres Almiray
035 * @since 0.9.2
036 */
037 public abstract class AbstractAddonManager implements AddonManager {
038 private final GriffonApplication app;
039
040 private final Map<String, GriffonAddon> addons = new LinkedHashMap<String, GriffonAddon>();
041 private final Map<String, GriffonAddonDescriptor> addonDescriptors = new LinkedHashMap<String, GriffonAddonDescriptor>();
042 private final Object lock = new Object();
043 private boolean initialized;
044
045 private static final Logger LOG = LoggerFactory.getLogger(AbstractAddonManager.class);
046
047 public AbstractAddonManager(GriffonApplication app) {
048 this.app = app;
049 }
050
051 public GriffonApplication getApp() {
052 return app;
053 }
054
055 public Map<String, GriffonAddon> getAddons() {
056 return Collections.<String, GriffonAddon>unmodifiableMap(addons);
057 }
058
059 public Map<String, GriffonAddonDescriptor> getAddonDescriptors() {
060 return Collections.<String, GriffonAddonDescriptor>unmodifiableMap(addonDescriptors);
061 }
062
063 public GriffonAddon findAddon(String name) {
064 if (GriffonNameUtils.isBlank(name)) return null;
065 if (name.endsWith("GriffonAddon")) name = name.substring(0, name.length() - 12);
066 return addons.get(GriffonNameUtils.getPropertyName(name));
067 }
068
069 public GriffonAddonDescriptor findAddonDescriptor(String name) {
070 if (GriffonNameUtils.isBlank(name)) return null;
071 if (name.endsWith("GriffonAddon")) name = name.substring(0, name.length() - 12);
072 return addonDescriptors.get(GriffonNameUtils.getPropertyName(name));
073 }
074
075 public Map<String, GriffonAddonDescriptor> findAddonDescriptors(String prefix) {
076 if ("root".equals(prefix) || GriffonNameUtils.isBlank(prefix)) prefix = "";
077
078 Map<String, GriffonAddonDescriptor> map = new LinkedHashMap<String, GriffonAddonDescriptor>();
079 for (Map.Entry<String, GriffonAddonDescriptor> entry : addonDescriptors.entrySet()) {
080 if (prefix.equals(entry.getValue().getPrefix())) {
081 map.put(entry.getKey(), entry.getValue());
082 }
083 }
084
085 return map;
086 }
087
088 public final void registerAddon(GriffonAddonDescriptor addonDescriptor) {
089 synchronized (lock) {
090 if (!initialized) {
091 LOG.debug("Registering addon descriptor " + addonDescriptor);
092 doRegisterAddon(addonDescriptor);
093 addons.put(addonDescriptor.getPluginName(), addonDescriptor.getAddon());
094 }
095 }
096 }
097
098 public final void initialize() {
099 synchronized (lock) {
100 if (!initialized) {
101 doInitialize();
102 initialized = true;
103 }
104 }
105 }
106
107 protected abstract void doInitialize();
108
109 protected abstract void doRegisterAddon(GriffonAddonDescriptor addonDescriptor);
110
111 protected Map<String, GriffonAddonDescriptor> getAddonsInternal() {
112 return addonDescriptors;
113 }
114 }
|