/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.apache.cxf.ws.transfer.resourcefactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.ws.addressing.AttributedURIType;
import org.apache.cxf.ws.addressing.EndpointReferenceType;
import org.apache.cxf.ws.addressing.ReferenceParametersType;
import org.apache.cxf.ws.transfer.Create;
import org.apache.cxf.ws.transfer.CreateResponse;
import org.apache.cxf.ws.transfer.Representation;
import org.apache.cxf.ws.transfer.dialect.Dialect;
import org.apache.cxf.ws.transfer.resourcefactory.resolver.ResourceReference;
import org.apache.cxf.ws.transfer.resourcefactory.resolver.ResourceResolver;
import org.apache.cxf.ws.transfer.shared.TransferConstants;
import org.apache.cxf.ws.transfer.shared.faults.UnknownDialect;
import org.apache.cxf.ws.transfer.validationtransformation.ResourceTypeIdentifier;
import org.apache.cxf.ws.transfer.validationtransformation.ValidAndTransformHelper;
/**
* ResourceFactory implementation.
*/
public class ResourceFactoryImpl implements ResourceFactory {
protected ResourceResolver resourceResolver;
protected List<ResourceTypeIdentifier> resourceTypeIdentifiers;
protected Map<String, Dialect> dialects;
public ResourceFactoryImpl() {
dialects = new HashMap<>();
}
@Override
public CreateResponse create(Create body) {
if (body.getDialect() != null && !body.getDialect().isEmpty()) {
if (dialects.containsKey(body.getDialect())) {
Dialect dialect = dialects.get(body.getDialect());
Representation representation = dialect.processCreate(body);
body.setRepresentation(representation);
} else {
throw new UnknownDialect();
}
}
ValidAndTransformHelper.validationAndTransformation(
resourceTypeIdentifiers, body.getRepresentation(), null);
ResourceReference resourceReference = resourceResolver.resolve(body);
if (resourceReference.getResourceManager() != null) {
return createLocally(body, resourceReference);
} else {
return createRemotely(body, resourceReference);
}
}
public ResourceResolver getResourceResolver() {
return resourceResolver;
}
public void setResourceResolver(ResourceResolver resourceResolver) {
this.resourceResolver = resourceResolver;
}
public List<ResourceTypeIdentifier> getResourceTypeIdentifiers() {
if (resourceTypeIdentifiers == null) {
resourceTypeIdentifiers = new ArrayList<>();
}
return resourceTypeIdentifiers;
}
public void setResourceTypeIdentifiers(List<ResourceTypeIdentifier> resourceTypeIdentifiers) {
this.resourceTypeIdentifiers = resourceTypeIdentifiers;
}
/**
* Register Dialect object for URI.
* @param uri
* @param dialect
*/
public void registerDialect(String uri, Dialect dialect) {
if (dialects.containsKey(uri)) {
throw new IllegalArgumentException(String.format("URI \"%s\" is already registered", uri));
}
dialects.put(uri, dialect);
}
/**
* Unregister dialect URI.
* @param uri
*/
public void unregisterDialect(String uri) {
if (!dialects.containsKey(uri)) {
throw new IllegalArgumentException(String.format("URI \"%s\" is not registered", uri));
}
dialects.remove(uri);
}
private CreateResponse createLocally(Create body, ResourceReference ref) {
Representation representation = body.getRepresentation();
ReferenceParametersType refParams = ref.getResourceManager().create(representation);
CreateResponse response = new CreateResponse();
response.setResourceCreated(new EndpointReferenceType());
response.getResourceCreated().setAddress(new AttributedURIType());
response.getResourceCreated()
.getAddress()
.setValue(ref.getResourceURL());
response.getResourceCreated()
.setReferenceParameters(refParams);
response.setRepresentation(body.getRepresentation());
return response;
}
private CreateResponse createRemotely(Create body, ResourceReference ref) {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(ResourceFactory.class);
factory.setAddress(ref.getResourceURL()
+ TransferConstants.RESOURCE_REMOTE_SUFFIX);
ResourceFactory client = (ResourceFactory) factory.create();
CreateResponse response = client.create(body);
// Adding of endpoint address to the response.
response.getResourceCreated().setAddress(new AttributedURIType());
response.getResourceCreated().getAddress().setValue(ref.getResourceURL());
return response;
}
}