/* * Copyright 2004,2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.wso2.carbon.databridge.core.internal; import org.apache.axiom.om.OMElement; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.osgi.framework.ServiceRegistration; import org.osgi.service.component.ComponentContext; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.databridge.commons.StreamDefinition; import org.wso2.carbon.databridge.commons.exception.DifferentStreamDefinitionAlreadyDefinedException; import org.wso2.carbon.databridge.commons.exception.MalformedStreamDefinitionException; import org.wso2.carbon.databridge.commons.utils.EventDefinitionConverterUtils; import org.wso2.carbon.databridge.core.DataBridge; import org.wso2.carbon.databridge.core.DataBridgeReceiverService; import org.wso2.carbon.databridge.core.DataBridgeServiceValueHolder; import org.wso2.carbon.databridge.core.DataBridgeSubscriberService; import org.wso2.carbon.databridge.core.conf.DataBridgeConfiguration; import org.wso2.carbon.databridge.core.definitionstore.AbstractStreamDefinitionStore; import org.wso2.carbon.databridge.core.exception.DataBridgeConfigurationException; import org.wso2.carbon.databridge.core.exception.StreamDefinitionStoreException; import org.wso2.carbon.databridge.core.internal.authentication.CarbonAuthenticationHandler; import org.wso2.carbon.databridge.core.internal.utils.DataBridgeConstants; import org.wso2.carbon.databridge.core.internal.utils.DataBridgeCoreBuilder; import org.wso2.carbon.identity.authentication.AuthenticationService; import org.wso2.carbon.user.api.UserStoreException; import org.wso2.carbon.user.core.service.RealmService; import org.wso2.carbon.utils.ConfigurationContextService; import org.wso2.carbon.utils.ServerConstants; import org.wso2.carbon.utils.multitenancy.MultitenantConstants; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import java.io.File; import java.util.List; /** * @scr.component name="databridge.component" immediate="true" * @scr.reference name="org.wso2.carbon.identity.authentication.internal.AuthenticationServiceComponent" * interface="org.wso2.carbon.identity.authentication.AuthenticationService" * cardinality="1..1" policy="dynamic" bind="setAuthenticationService" unbind="unsetAuthenticationService" * @scr.reference name="user.realmservice.default" interface="org.wso2.carbon.user.core.service.RealmService" * cardinality="1..1" policy="dynamic" bind="setRealmService" unbind="unsetRealmService" * @scr.reference name="stream.definitionStore.service" * interface="org.wso2.carbon.databridge.core.definitionstore.AbstractStreamDefinitionStore" cardinality="1..1" * policy="dynamic" bind="setEventStreamStoreService" unbind="unsetEventStreamStoreService" * @scr.reference name="config.context.service" * interface="org.wso2.carbon.utils.ConfigurationContextService" cardinality="0..1" * policy="dynamic" bind="setConfigurationContextService" unbind="unsetConfigurationContextService" */ public class DataBridgeDS { private static final Log log = LogFactory.getLog(DataBridgeDS.class); private AuthenticationService authenticationService; private ServiceRegistration receiverServiceRegistration; private ServiceRegistration subscriberServiceRegistration; private DataBridge databridge; private ServiceRegistration databridgeRegistration; /** * initialize the agent server here. * * @param context */ protected void activate(ComponentContext context) { try { if (databridge == null) { AbstractStreamDefinitionStore streamDefinitionStore = DataBridgeServiceValueHolder.getStreamDefinitionStore(); databridge = new DataBridge(new CarbonAuthenticationHandler(authenticationService), streamDefinitionStore, DataBridgeCoreBuilder.getDatabridgeConfigPath()); try { List<String[]> streamDefinitionStrings = DataBridgeCoreBuilder.loadStreamDefinitionXML(); for (String[] streamDefinitionString : streamDefinitionStrings) { try { StreamDefinition streamDefinition = EventDefinitionConverterUtils.convertFromJson(streamDefinitionString[1]); int tenantId = DataBridgeServiceValueHolder.getRealmService().getTenantManager().getTenantId(streamDefinitionString[0]); if (tenantId == MultitenantConstants.INVALID_TENANT_ID) { log.warn("Tenant " + streamDefinitionString[0] + " does not exist, Error in defining event stream " + streamDefinitionString[1]); continue; } try { PrivilegedCarbonContext.startTenantFlow(); PrivilegedCarbonContext privilegedCarbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext(); privilegedCarbonContext.setTenantId(tenantId); privilegedCarbonContext.setTenantDomain(streamDefinitionString[0]); streamDefinitionStore.saveStreamDefinition(streamDefinition, tenantId); } catch (DifferentStreamDefinitionAlreadyDefinedException e) { log.warn("Error redefining event stream of " + streamDefinitionString[0] + ": " + streamDefinitionString[1], e); } catch (RuntimeException e) { log.error("Error in defining event stream " + streamDefinitionString[0] + ": " + streamDefinitionString[1], e); } catch (StreamDefinitionStoreException e) { log.error("Error in defining event stream in store " + streamDefinitionString[0] + ": " + streamDefinitionString[1], e); } finally { PrivilegedCarbonContext.endTenantFlow(); } } catch (MalformedStreamDefinitionException e) { log.error("Malformed Stream Definition for " + streamDefinitionString[0] + ": " + streamDefinitionString[1], e); } catch (UserStoreException e) { log.error("Error in identifying tenant event stream " + streamDefinitionString[0] + ": " + streamDefinitionString[1], e); } } } catch (Throwable t) { log.error("Cannot load stream definitions ", t); } receiverServiceRegistration = context.getBundleContext(). registerService(DataBridgeReceiverService.class.getName(), databridge, null); subscriberServiceRegistration = context.getBundleContext(). registerService(DataBridgeSubscriberService.class.getName(), databridge, null); // databridgeRegistration = // context.getBundleContext().registerService(DataBridge.class.getName(), databridge, null); log.info("Successfully deployed Agent Server "); } } catch (RuntimeException e) { log.error("Error in starting Agent Server ", e); } } protected void deactivate(ComponentContext context) { context.getBundleContext().ungetService(receiverServiceRegistration.getReference()); context.getBundleContext().ungetService(subscriberServiceRegistration.getReference()); // databridgeRegistration.unregister(); if (log.isDebugEnabled()) { log.debug("Successfully stopped agent server"); } } protected void setAuthenticationService(AuthenticationService authenticationService) { this.authenticationService = authenticationService; } protected void unsetAuthenticationService(AuthenticationService authenticationService) { this.authenticationService = null; } protected void setRealmService(RealmService realmService) { DataBridgeServiceValueHolder.setRealmService(realmService); } protected void unsetRealmService(RealmService realmService) { DataBridgeServiceValueHolder.setRealmService(null); } protected void setEventStreamStoreService( AbstractStreamDefinitionStore abstractStreamDefinitionStore) { DataBridgeServiceValueHolder.setStreamDefinitionStore(abstractStreamDefinitionStore); } protected void unsetEventStreamStoreService( AbstractStreamDefinitionStore abstractStreamDefinitionStore) { DataBridgeServiceValueHolder.setStreamDefinitionStore(null); } protected void setConfigurationContextService(ConfigurationContextService contextService) { DataBridgeServiceValueHolder.setConfigurationContextService(contextService); } protected void unsetConfigurationContextService(ConfigurationContextService contextService) { DataBridgeServiceValueHolder.setConfigurationContextService(null); } }