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    }