/*
* 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.synapse.libraries.model;
import org.apache.axiom.om.OMElement;
import org.apache.synapse.SynapseArtifact;
import org.apache.synapse.SynapseConstants;
import org.apache.synapse.config.xml.MediatorFactoryFinder;
import org.apache.synapse.config.xml.XMLConfigConstants;
import org.apache.synapse.config.xml.endpoints.TemplateFactory;
import org.apache.synapse.deployers.SynapseArtifactDeploymentException;
import org.apache.synapse.endpoints.Template;
import org.apache.synapse.mediators.template.TemplateMediator;
import javax.xml.namespace.QName;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class LibraryArtifact implements SynapseArtifact{
protected String name;
protected String type;
protected String description;
String extractedPath;
ArtifactFile file;
int unresolvedDeps = 0;
Map<String, LibraryArtifact> subArtifacts;
private LibraryArtifact parent;
public LibraryArtifact(String name) {
this.name = name;
subArtifacts = new HashMap<String, LibraryArtifact>();
}
public void setupFile(String filename) {
if (filename != null && !"".equals(filename)) {
if ("synapse/template".equals(getArtifactType())) {
file = this.new TemplateArtifactFile(filename);
} else {
throw new SynapseArtifactDeploymentException("Unsupported Type for synapse lib artifact.");
}
} else {
throw new SynapseArtifactDeploymentException("Invalid file specified for lib artifact.");
}
}
private String getArtifactType() {
if (type != null) {
return type;
} else if (parent != null) {
return parent.getArtifactType();
}
return "";
}
public void addSubArtifact(LibraryArtifact artifact) {
if (artifact != null) {
subArtifacts.put(artifact.toString(), artifact);
unresolvedDeps++;
}
}
public String getName() {
return name;
}
public boolean isLeafArtifact() {
return file == null ? false : true;
}
public void loadComponentsInto(SynapseLibrary library) {
for (String artifactName : subArtifacts.keySet()) {
LibraryArtifact artifact = subArtifacts.get(artifactName);
if (artifact.isLeafArtifact()) {
delegateClassLoading(artifact, library);
//this is where actual artifact is constructed to it's ture form
Object template = artifact.file.build();
if (artifact.file instanceof TemplateArtifactFile) {
if (template instanceof TemplateMediator) {
TemplateMediator templateMediator = (TemplateMediator) template;
//make template dynamic as it is not directly available to synapse environment
templateMediator.setDynamic(true);
String templateName = templateMediator.getName();
library.addComponent(getQualifiedName(library.getPackage(),
templateName,
library.getQName().getLocalPart()),
template);
} else if (template instanceof Template) {
String templateName = ((Template) template).getName();
library.addComponent(getQualifiedName(library.getPackage(),
templateName,
library.getQName().getLocalPart()),
template);
} else if (template != null) {
library.addComponent(getQualifiedName(library.getPackage(),
artifact.getName(),
library.getQName().getLocalPart()),
template);
} else {
throw new SynapseArtifactDeploymentException("Cannot load components into " +
"Synapse Library. Component " +
"cannot be built for " + artifactName);
}
}
} else {
artifact.loadComponentsInto(library);
}
}
}
private void delegateClassLoading(LibraryArtifact artifact, SynapseLibrary library) {
Properties classLoadingProperties = new Properties();
classLoadingProperties.put(SynapseConstants.SYNAPSE_LIB_LOADER, library.getLibClassLoader());
artifact.file.setProperties(classLoadingProperties);
}
private String getQualifiedName(String aPackage, String templateName,String parentArtifact) {
return aPackage+"."+parentArtifact+ "." + templateName;
}
public void setPath(String path) {
if (!path.endsWith(File.separator)) {
path = path + File.separator;
}
this.extractedPath = path;
}
public String toString() {
return name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void setParent(LibraryArtifact parent) {
this.parent = parent;
}
public void setDescription(String description) {
this.description = description;
}
public String getDescription() {
return description; //To change body of implemented methods use File | Settings | File Templates.
}
private class TemplateArtifactFile extends ArtifactFile {
public TemplateArtifactFile(String fileXmlPath) {
super(extractedPath + fileXmlPath);
}
@Override
public Object build() {
Object templateObject = null;
OMElement element = configurationElement.getFirstChildWithName(
new QName(SynapseConstants.SYNAPSE_NAMESPACE, "sequence"));
if (element != null) {
String name = element.getAttributeValue(
new QName(XMLConfigConstants.NULL_NAMESPACE, "name"));
try {
templateObject = MediatorFactoryFinder.getInstance().
getMediator(configurationElement, properties);
} catch (Exception e) {
String msg = "Template configuration : " + name + " cannot be built" +
"for Synapse Library artifact : " + LibraryArtifact.this.name;;
// handleConfigurationError(SynapseConstants.FAIL_SAFE_MODE_TEMPLATES, msg, e);
throw new SynapseArtifactDeploymentException(msg,e);
}
return templateObject;
} else {
element = configurationElement.getFirstChildWithName(
new QName(SynapseConstants.SYNAPSE_NAMESPACE, "endpoint"));
if (element != null) {
TemplateFactory templateFactory = new TemplateFactory();
String name = element.getAttributeValue(new QName(XMLConfigConstants.NULL_NAMESPACE,
"name"));
try {
templateObject = templateFactory.createEndpointTemplate(configurationElement,
properties);
} catch (Exception e) {
String msg = "Endpoint Template: " + name + "configuration cannot be built " +
"for Synapse Library artifact : " + LibraryArtifact.this.name;
// handleConfigurationError(SynapseConstants.FAIL_SAFE_MODE_TEMPLATES, msg, e);
throw new SynapseArtifactDeploymentException(msg,e);
}
}
}
return templateObject;
}
}
public static class Dependency {
private String name;
boolean markAsResolved = false;
public Dependency(String name) {
this.name = name;
}
public String getName() {
return name;
}
public boolean resolveWith(LibraryArtifact artifact) {
return markAsResolved = name.equals(artifact.name);
}
public boolean isResolved() {
return markAsResolved;
}
}
}