/*
* (C) Copyright 2013 Nuxeo SA (http://nuxeo.com/) and others.
*
* 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.
*
* Contributors:
* Arnaud Kervern
*/
package org.nuxeo.ecm.platform.ws;
import java.io.IOException;
import java.time.Instant;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.xml.ws.Endpoint;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.ecm.platform.api.ws.WSEndpointDescriptor;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.model.ComponentContext;
import org.nuxeo.runtime.model.ComponentInstance;
import org.nuxeo.runtime.model.DefaultComponent;
/**
* @author <a href="mailto:ak@nuxeo.com">Arnaud Kervern</a>
* @since 5.7.3
*/
public class WSEndpointManagerImpl extends DefaultComponent implements WSEndpointManager {
public static final String ENDPOINT_EP = "endpoint";
private static final Log log = LogFactory.getLog(WSEndpointManagerImpl.class);
private static final int APPLICATION_STARTED_ORDER = 1500;
protected WSEndpointRegistry regitry = new WSEndpointRegistry();
protected Map<String, Endpoint> endpoints = new HashMap<>();
@Override
public void registerContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
if (ENDPOINT_EP.equals(extensionPoint)) {
regitry.addContribution((WSEndpointDescriptor) contribution);
} else {
log.info("Unknown extension point: " + extensionPoint);
}
}
@Override
public void unregisterContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
if (ENDPOINT_EP.equals(extensionPoint)) {
WSEndpointDescriptor descriptor = (WSEndpointDescriptor) contribution;
stopIfExists(descriptor.name);
regitry.removeContribution(descriptor);
}
}
@Override
public void applicationStarted(ComponentContext context) {
if (Framework.isTestModeSet()) {
return;
}
publishEndpoints();
}
@Override
public void applicationStopped(ComponentContext context, Instant deadline) {
for (Endpoint ep : endpoints.values()) {
ep.stop();
}
endpoints.clear();
}
@Override
public void publishEndpoints() {
for (WSEndpointDescriptor desc : regitry.getContributions()) {
try {
stopIfExists(desc.name);
Endpoint ep = desc.toEndpoint();
ep.publish(desc.address);
desc.configurePostPublishing(ep);
if (ep.isPublished()) {
endpoints.put(desc.name, ep);
} else {
log.warn("Endpoint publishing is failing: " + desc.name);
}
} catch (IOException | IllegalAccessException | InstantiationException e) {
log.warn("Unable to register endpoint: " + desc.name, e);
}
}
}
@Override
public Collection<WSEndpointDescriptor> getDescriptors() {
return regitry.getContributions();
}
protected void stopIfExists(String name) {
// Stop endpoint publishing
Endpoint ep = endpoints.get(name);
if (ep != null) {
ep.stop();
endpoints.remove(name);
}
}
@Override
public int getApplicationStartedOrder() {
return APPLICATION_STARTED_ORDER;
}
}