001 /*
002 GRANITE DATA SERVICES
003 Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004
005 This file is part of Granite Data Services.
006
007 Granite Data Services is free software; you can redistribute it and/or modify
008 it under the terms of the GNU Library General Public License as published by
009 the Free Software Foundation; either version 2 of the License, or (at your
010 option) any later version.
011
012 Granite Data Services is distributed in the hope that it will be useful, but
013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015 for more details.
016
017 You should have received a copy of the GNU Library General Public License
018 along with this library; if not, see <http://www.gnu.org/licenses/>.
019 */
020
021 package org.granite.osgi;
022
023 import java.util.Dictionary;
024 import java.util.Hashtable;
025
026 import org.granite.config.api.Configuration;
027 import org.granite.config.api.internal.ConfigurationImpl;
028 import org.granite.logging.Logger;
029 import org.granite.osgi.adaptor.AMFServiceAdaptor;
030 import org.granite.osgi.constants.OSGIConstants;
031 import org.granite.osgi.metadata.ManifestMetadataParser;
032 import org.osgi.framework.BundleActivator;
033 import org.osgi.framework.BundleContext;
034 import org.osgi.framework.ServiceReference;
035 import org.osgi.framework.ServiceRegistration;
036 import org.osgi.service.http.HttpService;
037 import org.osgi.util.tracker.ServiceTracker;
038
039 /**
040 * @author <a href="mailto:gembin@gmail.com">gembin@gmail.com</a>
041 * @since 1.1.0
042 */
043 public class Activator implements BundleActivator {
044
045 private static final Logger log=Logger.getLogger(Activator.class);
046 private static final String DEFAULT_CONTEXT_PATH="/WebContent";
047 static ServiceTracker configurationTracker;
048
049 String contextPath;
050 ServiceRegistration configRegistration;
051 ServiceTracker httpServiceTracker;
052 ManifestMetadataParser metaParser;
053
054 /*
055 * (non-Javadoc)
056 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
057 */
058 public void start(BundleContext context) throws Exception {
059 contextPath=(String) context.getBundle().getHeaders().get(OSGIConstants.GDS_CONTEXT);
060 contextPath=(contextPath==null?DEFAULT_CONTEXT_PATH:contextPath);
061 if(!contextPath.startsWith("/")){
062 contextPath="/"+contextPath;
063 }
064 Configuration cfg=new ConfigurationImpl();
065 //provide a service for other bundle to override the config files
066 configRegistration=context.registerService(Configuration.class.getName(),cfg, null);
067 configurationTracker=new ServiceTracker(context,Configuration.class.getName(),null);
068 configurationTracker.open();
069 //set default config files
070 setupDefaultConfigurations(cfg);
071
072 //track the AMFServiceAdaptor
073 httpServiceTracker=new HttpServiceTracker(context);
074 httpServiceTracker.open();
075 //begin to parse Metadata for all bundle in the OSGi Container
076 metaParser=new ManifestMetadataParser(context);
077 metaParser.start();
078 }
079 /**
080 *
081 * @param cfg
082 */
083 private void setupDefaultConfigurations(Configuration cfg){
084 cfg.setFlexServicesConfig(OSGIConstants.DEFAULT_FLEX_CONFIG);
085 cfg.setGraniteConfig(OSGIConstants.DEFAULT_GRANITEDS_CONFIG);
086 }
087 /**
088 * @return Configuration
089 */
090 public static Configuration getConfigurationService(){
091 return (Configuration) configurationTracker.getService();
092 }
093 /**
094 * Register AMFServiceAdaptor
095 * HttpService Tracker
096 */
097 private class HttpServiceTracker extends ServiceTracker {
098 String amfServicServleteAlias=contextPath+"/graniteamf/amf";
099 public HttpServiceTracker(BundleContext context) {
100 super(context, HttpService.class.getName(), null);
101 }
102 /*
103 * (non-Javadoc)
104 * @see org.osgi.util.tracker.ServiceTracker#addingService(org.osgi.framework.ServiceReference)
105 */
106 @Override
107 public Object addingService(ServiceReference reference) {
108 final HttpService httpService = (HttpService) context.getService(reference);
109 try {
110 Dictionary<String, Object> initparams = new Hashtable<String, Object>();
111 initparams.put("servlet-name", "AMFServiceServlet");
112 httpService.registerServlet(amfServicServleteAlias,new AMFServiceAdaptor(context), initparams, httpService.createDefaultHttpContext());
113 } catch (Exception e) {
114 log.error(e, "Could not add service");
115 }
116 return httpService;
117 }
118 /*
119 * (non-Javadoc)
120 * @see org.osgi.util.tracker.ServiceTracker#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
121 */
122 @Override
123 public void removedService(ServiceReference reference, Object service) {
124 final HttpService httpService = (HttpService) service;
125 httpService.unregister(amfServicServleteAlias);
126 super.removedService(reference, service);
127 }
128 }
129 /*
130 * (non-Javadoc)
131 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
132 */
133 public void stop(BundleContext context) throws Exception {
134 if(configRegistration!=null){
135 configRegistration.unregister();
136 configRegistration=null;
137 }
138 if(configurationTracker!=null){
139 configurationTracker.close();
140 configurationTracker=null;
141 }
142 if(httpServiceTracker!=null){
143 httpServiceTracker.close();
144 httpServiceTracker=null;
145 }
146 if(metaParser!=null){
147 metaParser.stop();
148 metaParser=null;
149 }
150 }
151 }