001    /**
002     *   GRANITE DATA SERVICES
003     *   Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S.
004     *
005     *   This file is part of the Granite Data Services Platform.
006     *
007     *   Granite Data Services is free software; you can redistribute it and/or
008     *   modify it under the terms of the GNU Lesser General Public
009     *   License as published by the Free Software Foundation; either
010     *   version 2.1 of the License, or (at your option) any later version.
011     *
012     *   Granite Data Services is distributed in the hope that it will be useful,
013     *   but WITHOUT ANY WARRANTY; without even the implied warranty of
014     *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
015     *   General Public License for more details.
016     *
017     *   You should have received a copy of the GNU Lesser General Public
018     *   License along with this library; if not, write to the Free Software
019     *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
020     *   USA, or see <http://www.gnu.org/licenses/>.
021     */
022    package org.granite.gravity.config;
023    
024    import java.util.ArrayList;
025    import java.util.HashMap;
026    import java.util.List;
027    import java.util.Map;
028    
029    import org.granite.config.AbstractFrameworkGraniteConfig;
030    import org.granite.config.flex.Adapter;
031    import org.granite.config.flex.Channel;
032    import org.granite.config.flex.Destination;
033    import org.granite.config.flex.EndPoint;
034    import org.granite.config.flex.Service;
035    import org.granite.config.flex.ServicesConfig;
036    import org.granite.gravity.security.GravityDestinationSecurizer;
037    import org.granite.logging.Logger;
038    import org.granite.util.XMap;
039    
040    
041    public class AbstractMessagingDestination {
042            
043        private static final Logger log = Logger.getLogger(AbstractMessagingDestination.class);
044    
045    
046        ///////////////////////////////////////////////////////////////////////////
047        // Instance fields.
048       
049        private String id = null;
050        private List<String> roles = null;
051        private String securizerClassName = null;
052        private GravityDestinationSecurizer securizer = null;
053        private boolean noLocal = false;
054        private boolean sessionSelector = false;
055        
056    
057        public String getId() {
058                    return id;
059            }
060    
061            public void setId(String id) {
062                    this.id = id;
063            }
064            
065            public List<String> getRoles() {
066                    return roles;
067            }
068            public void setRoles(List<String> roles) {
069                    this.roles = roles;
070            }
071    
072            public boolean isNoLocal() {
073                    return noLocal;
074            }
075    
076            public void setNoLocal(boolean noLocal) {
077                    this.noLocal = noLocal;
078            }
079    
080            public boolean isSessionSelector() {
081                    return sessionSelector;
082            }
083    
084            public void setSessionSelector(boolean sessionSelector) {
085                    this.sessionSelector = sessionSelector;
086            }
087            
088        public String getSecurizerClassName() {
089                    return securizerClassName;
090            }
091    
092            public void setSecurizerClassName(String securizerClassName) {
093                    this.securizerClassName = securizerClassName;
094            }
095            
096        public GravityDestinationSecurizer getSecurizer() {
097                    return securizer;
098            }
099            public void setSecurizer(GravityDestinationSecurizer securizer) {
100                    this.securizer = securizer;
101            }
102    
103            protected void init(AbstractFrameworkGraniteConfig graniteConfig) {
104            ServicesConfig servicesConfig = graniteConfig.getServicesConfig();
105            initServices(servicesConfig);
106        }
107        
108        public void initServices(ServicesConfig servicesConfig) {
109            Channel channel = servicesConfig.findChannelById("gravityamf");
110            if (channel == null) {
111                    channel = new Channel("gravityamf", "org.granite.gravity.channels.GravityChannel",
112                                    new EndPoint("http://{server.name}:{server.port}/{context.root}/gravityamf/amf", "flex.messaging.endpoints.AMFEndpoint"),
113                                    new XMap());
114                    servicesConfig.addChannel(channel);
115            }
116            
117            List<Service> services = servicesConfig.findServicesByMessageType("flex.messaging.messages.AsyncMessage");
118            Service service = null;
119            Adapter adapter = null;
120            if (services == null || services.isEmpty()) {
121                    adapter = buildAdapter();
122                    Map<String, Adapter> adapters = new HashMap<String, Adapter>();
123                    adapters.put(adapter.getId(), adapter);
124                    service = new Service("gravity-service", "flex.messaging.services.MessagingService", "flex.messaging.messages.AsyncMessage", 
125                                    adapter, adapters, new HashMap<String, Destination>());
126                    servicesConfig.addService(service);
127            }
128            else {
129                    service = services.get(0);
130                    Adapter ad = buildAdapter();
131                            adapter = service.findAdapterById(ad.getId());
132                            if (adapter == null) {
133                                    adapter = ad;
134                                    service.addAdapter(adapter);
135                            }
136            }
137            
138            service.getDestinations().put(id, buildDestination(adapter));
139            
140            log.info("Registered messaging destination %s", id);
141        }
142            
143            protected Adapter buildAdapter() {
144                    return new Adapter("simple-adapter", "org.granite.gravity.adapters.SimpleServiceAdapter", new XMap());
145            }
146            
147            protected Destination buildDestination(Adapter adapter) {
148            List<String> channelIds = new ArrayList<String>();
149            channelIds.add("gravityamf");
150            Destination destination = new Destination(id, channelIds, new XMap(), roles, adapter, null);
151            destination.getProperties().put("no-local", String.valueOf(noLocal));
152            destination.getProperties().put("session-selector", String.valueOf(sessionSelector));
153            if (getSecurizerClassName() != null)
154                    destination.getProperties().put("securizer", securizerClassName);
155            if (getSecurizer() != null)
156                    destination.setSecurizer(getSecurizer());
157            return destination;
158            }
159    }