From 6c857fdc4d7c28efa516839dca2abd8c75804147 Mon Sep 17 00:00:00 2001 From: prabathabey Date: Thu, 23 Jul 2015 14:35:02 +0530 Subject: [PATCH] Removing user-api-publisher-config.xml and making JAX-RS services get auto-published as APIs depending on parameters configured in web.xml of each corresponding web applications --- .../org.wso2.carbon.device.mgt.core/pom.xml | 8 +- .../device/mgt/core/api/mgt/APIConfig.java | 11 ++ .../mgt/APIRegistrationStartupObserver.java | 82 ----------- .../api/mgt/config/APIPublisherConfig.java | 110 --------------- .../APIPublisherLifecycleListener.java | 131 ++++++++++++++++++ .../DeviceManagementServiceComponent.java | 3 - 6 files changed, 149 insertions(+), 196 deletions(-) delete mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/APIRegistrationStartupObserver.java delete mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/config/APIPublisherConfig.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/lifecycle/listener/APIPublisherLifecycleListener.java diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml index 9d5069b8a99..1de4ce1c0f1 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml @@ -83,7 +83,9 @@ org.wso2.carbon.identity.oauth.stub, org.wso2.carbon.identity.oauth.stub.dto, org.wso2.carbon.ndatasource.core, - org.apache.catalina + org.apache.catalina, + org.apache.catalina.core, + javax.servlet !org.wso2.carbon.device.mgt.core.internal, @@ -212,6 +214,10 @@ org.wso2.tomcat tomcat + + org.wso2.tomcat + tomcat-servlet-api + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/APIConfig.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/APIConfig.java index 03d18c03979..61a549ced7b 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/APIConfig.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/APIConfig.java @@ -53,6 +53,7 @@ public class APIConfig { private String version; private String transports; private APIProvider provider; + private boolean isSecured; public void init() throws DeviceManagementException { try { @@ -126,4 +127,14 @@ public class APIConfig { this.transports = transports; } + @XmlElement(name = "isSecured", required = false) + public boolean isSecured() { + return isSecured; + } + + @SuppressWarnings("unused") + public void setSecured(boolean secured) { + isSecured = secured; + } + } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/APIRegistrationStartupObserver.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/APIRegistrationStartupObserver.java deleted file mode 100644 index c0c8207b8ee..00000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/APIRegistrationStartupObserver.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.device.mgt.core.api.mgt; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.apimgt.api.APIManagementException; -import org.wso2.carbon.apimgt.api.APIProvider; -import org.wso2.carbon.apimgt.api.model.API; -import org.wso2.carbon.apimgt.impl.APIManagerFactory; -import org.wso2.carbon.core.ServerStartupObserver; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; -import org.wso2.carbon.device.mgt.core.api.mgt.config.APIPublisherConfig; -import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder; -import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil; - -import java.util.List; - -/** - * This particular class corresponding to the ServerStartupObserver written for publishing the set of APIs used by - * the device management related components. - * - * Note: Using this particular approach is not a must, had there been a proper programming interface provided by the - * underlying API-Management infrastructure for manipulating the APIs. Even though, there's one, its concrete - * implementation consumes a set of OSGi declarative services for initializing some of its internal states, which - * prevents us from, simply, instantiating the APIPublisher implementation and using for device management related - * tasks. The aforesaid complication lead us to go for this alternative approach to get the same done. - */ -public class APIRegistrationStartupObserver implements ServerStartupObserver { - - private static final Log log = LogFactory.getLog(APIRegistrationStartupObserver.class); - - @Override - public void completingServerStartup() { - - } - - @Override - public void completedServerStartup() { - /* Publish all mobile device management related JAX-RS services as APIs */ - if (log.isDebugEnabled()) { - log.debug("Publishing all mobile device management related JAX-RS services as APIs"); - } - List apiConfigs = APIPublisherConfig.getInstance().getApiConfigs(); - for (APIConfig apiConfig : apiConfigs) { - try { - /* API Config is initialized at this point in order to avoid OSGi declarative services which - the APIManagerComponent depend on, are deployed and initialized before invoking methods in - APIManagerFactory */ - apiConfig.init(); - - API api = DeviceManagerUtil.getAPI(apiConfig); - DeviceManagementDataHolder.getInstance().getApiPublisherService().publishAPI(api); - } catch (Throwable e) { - /* Throwable is caught as none of the RuntimeExceptions that can potentially occur at this point - does not seem to be logged anywhere else within the framework */ - log.error("Error occurred while publishing API '" + apiConfig.getName() + "' with the context '" + - apiConfig.getContext() + "' and version '" + apiConfig.getVersion() + "'", e); - } - } - if (log.isDebugEnabled()) { - log.debug("End of publishing all mobile device management related JAX-RS services as APIs"); - } - } - -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/config/APIPublisherConfig.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/config/APIPublisherConfig.java deleted file mode 100644 index 85ada40bb1c..00000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/config/APIPublisherConfig.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.device.mgt.core.api.mgt.config; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.w3c.dom.Document; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; -import org.wso2.carbon.device.mgt.core.api.mgt.APIConfig; -import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil; -import org.wso2.carbon.utils.CarbonUtils; -import org.xml.sax.SAXException; - -import javax.xml.XMLConstants; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.validation.Schema; -import javax.xml.validation.SchemaFactory; -import java.io.File; -import java.util.List; - -/** - * This class carries all API configurations used by device management components, that need to be published within - * the underlying API-Management infrastructure. - */ -@XmlRootElement(name = "APIPublisherConfig") -public class APIPublisherConfig { - - private List apiConfigs; - private static APIPublisherConfig config; - - private static final Log log = LogFactory.getLog(APIPublisherConfig.class); - private static final String USER_DEFINED_API_CONFIG_PATH = - CarbonUtils.getEtcCarbonConfigDirPath() + File.separator + "user-api-publisher-config.xml"; - private static final String USER_DEFINED_API_CONFIG_SCHEMA_PATH = - "resources/config/schema/api-publisher-config-schema.xsd"; - - private static final Object LOCK = new Object(); - - public static APIPublisherConfig getInstance() { - if (config == null) { - synchronized (LOCK) { - try { - init(); - } catch (DeviceManagementException e) { - log.error("Error occurred while initializing API Publisher Config", e); - } - } - } - return config; - } - - @XmlElementWrapper(name = "APIs", required = true) - @XmlElement(name = "API", required = true) - public List getApiConfigs() { - return apiConfigs; - } - - @SuppressWarnings("unused") - public void setApiConfigs(List apiConfigs) { - this.apiConfigs = apiConfigs; - } - - private static void init() throws DeviceManagementException { - try { - File publisherConfig = new File(APIPublisherConfig.USER_DEFINED_API_CONFIG_PATH); - Document doc = DeviceManagerUtil.convertToDocument(publisherConfig); - - /* Un-marshaling API publisher configuration */ - JAXBContext ctx = JAXBContext.newInstance(APIPublisherConfig.class); - Unmarshaller unmarshaller = ctx.createUnmarshaller(); - //unmarshaller.setSchema(getSchema()); - config = (APIPublisherConfig) unmarshaller.unmarshal(doc); - } catch (JAXBException e) { - throw new DeviceManagementException("Error occurred while un-marshalling API Publisher Config", e); - } - } - - private static Schema getSchema() throws DeviceManagementException { - try { - File deviceManagementSchemaConfig = new File(APIPublisherConfig.USER_DEFINED_API_CONFIG_SCHEMA_PATH); - SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); - return factory.newSchema(deviceManagementSchemaConfig); - } catch (SAXException e) { - throw new DeviceManagementException("Error occurred while initializing the schema of " + - "user-api-publisher-config.xml", e); - } - } - -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/lifecycle/listener/APIPublisherLifecycleListener.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/lifecycle/listener/APIPublisherLifecycleListener.java new file mode 100644 index 00000000000..8816e20f423 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/api/mgt/lifecycle/listener/APIPublisherLifecycleListener.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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.device.mgt.core.api.mgt.lifecycle.listener; + +import org.apache.catalina.Lifecycle; +import org.apache.catalina.LifecycleEvent; +import org.apache.catalina.LifecycleListener; +import org.apache.catalina.core.StandardContext; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.apimgt.api.model.API; +import org.wso2.carbon.device.mgt.core.api.mgt.APIConfig; +import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder; +import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil; + +import javax.servlet.ServletContext; + +public class APIPublisherLifecycleListener implements LifecycleListener { + + private static final String API_CONFIG_DEFAULT_VERSION = "1.0.0"; + private static final Log log = LogFactory.getLog(APIPublisherLifecycleListener.class); + + @Override + public void lifecycleEvent(LifecycleEvent lifecycleEvent) { + if (Lifecycle.AFTER_START_EVENT.equals(lifecycleEvent.getType())) { + StandardContext context = (StandardContext) lifecycleEvent.getLifecycle(); + ServletContext servletContext = context.getServletContext(); + + String param = servletContext.getInitParameter("managed-api-enabled"); + boolean isManagedApi = (param != null && !"".equals(param)) && Boolean.parseBoolean(param); + + if (isManagedApi) { + APIConfig apiConfig = this.buildApiConfig(servletContext); + try { + apiConfig.init(); + API api = DeviceManagerUtil.getAPI(apiConfig); + DeviceManagementDataHolder.getInstance().getApiPublisherService().publishAPI(api); + } catch (Throwable e) { + /* Throwable is caught as none of the RuntimeExceptions that can potentially occur at this point + does not seem to be logged anywhere else within the framework */ + log.error("Error occurred while publishing API '" + apiConfig.getName() + "' with the context '" + + apiConfig.getContext() + "' and version '" + apiConfig.getVersion() + "'", e); + } + } + } + } + + private APIConfig buildApiConfig(ServletContext servletContext) { + APIConfig apiConfig = new APIConfig(); + + String name = servletContext.getInitParameter("managed-api-name"); + if (name == null || "".equals(name)) { + if (log.isDebugEnabled()) { + log.debug("'managed-api-name' attribute is not configured. Therefore, using the default, " + + "which is the name of the web application"); + } + name = servletContext.getServletContextName(); + } + apiConfig.setName(name); + + String version = servletContext.getInitParameter("managed-api-version"); + if (version == null || "".equals(version)) { + if (log.isDebugEnabled()) { + log.debug("'managed-api-version' attribute is not configured. Therefore, using the " + + "default, which is '1.0.0'"); + } + version = API_CONFIG_DEFAULT_VERSION; + } + apiConfig.setVersion(version); + + String context = servletContext.getInitParameter("managed-api-context"); + if (context == null || "".equals(context)) { + if (log.isDebugEnabled()) { + log.debug("'managed-api-context' attribute is not configured. Therefore, using the default, " + + "which is the original context assigned to the web application"); + } + context = servletContext.getContextPath(); + } + apiConfig.setContext(context); + + String endpoint = servletContext.getInitParameter("managed-api-endpoint"); + if (endpoint == null || "".equals(endpoint)) { + if (log.isDebugEnabled()) { + log.debug("'managed-api-endpoint' attribute is not configured"); + } + } + apiConfig.setEndpoint(endpoint); + + String owner = servletContext.getInitParameter("managed-api-owner"); + if (owner == null || "".equals(owner)) { + if (log.isDebugEnabled()) { + log.debug("'managed-api-owner' attribute is not configured"); + } + } + apiConfig.setOwner(owner); + + String isSecuredParam = servletContext.getInitParameter("managed-api-isSecured"); + boolean isSecured = + (isSecuredParam != null && !"".equals(isSecuredParam)) && Boolean.parseBoolean(isSecuredParam); + apiConfig.setSecured(isSecured); + + String transports = servletContext.getInitParameter("managed-api-transports"); + if (transports == null || "".equals(transports)) { + if (log.isDebugEnabled()) { + log.debug("'managed-api-transports' attribute is not configured. Therefore using the defaults, " + + "which are 'http' and 'https'"); + } + transports = "http,https"; + } + apiConfig.setTransports(transports); + + return apiConfig; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementServiceComponent.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementServiceComponent.java index 1aa6ea5a9af..5dde3b2f6b5 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementServiceComponent.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementServiceComponent.java @@ -35,7 +35,6 @@ import org.wso2.carbon.device.mgt.core.DeviceManagementConstants; import org.wso2.carbon.device.mgt.core.DeviceManagementPluginRepository; import org.wso2.carbon.device.mgt.core.api.mgt.APIPublisherService; import org.wso2.carbon.device.mgt.core.api.mgt.APIPublisherServiceImpl; -import org.wso2.carbon.device.mgt.core.api.mgt.APIRegistrationStartupObserver; import org.wso2.carbon.device.mgt.core.api.mgt.ApplicationManagementProviderService; import org.wso2.carbon.device.mgt.core.app.mgt.ApplicationManagerProviderServiceImpl; import org.wso2.carbon.device.mgt.core.app.mgt.config.AppManagementConfig; @@ -198,8 +197,6 @@ public class DeviceManagementServiceComponent { DeviceManagementDataHolder.getInstance().setApiPublisherService(publisher); bundleContext.registerService(APIPublisherService.class, publisher, null); - bundleContext.registerService(ServerStartupObserver.class, new APIRegistrationStartupObserver(), null); - /* Registering App Management service */ try { AppManagementConfigurationManager.getInstance().initConfig();