/*******************************************************************************
* Copyright (c) 2006-2013, Cloudsmith Inc.
* The code, documentation and other materials contained herein have been
* licensed under the Eclipse Public License - v 1.0 by the copyright holder
* listed above, as the Initial Contributor under such license. The text of
* such license is available at www.eclipse.org.
******************************************************************************/
package org.eclipse.buckminster.core.mspec.builder;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import org.eclipse.buckminster.core.cspec.IComponentName;
import org.eclipse.buckminster.core.cspec.model.ComponentIdentifier;
import org.eclipse.buckminster.core.metadata.model.Resolution;
import org.eclipse.buckminster.core.mspec.IMaterializationNode;
import org.eclipse.buckminster.core.mspec.IMaterializationSpec;
import org.eclipse.buckminster.core.mspec.model.MaterializationSpec;
import org.eclipse.buckminster.osgi.filter.Filter;
import org.eclipse.buckminster.runtime.URLUtils;
import org.eclipse.core.runtime.Platform;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
/**
* @author Thomas Hallgren
*
*/
public class MaterializationSpecBuilder extends MaterializationDirectiveBuilder implements IMaterializationSpec {
private final List<MaterializationNodeBuilder> nodes = new ArrayList<MaterializationNodeBuilder>();
private String shortDesc;
private String name;
private String url;
private URL contextURL;
public MaterializationNodeBuilder addNodeBuilder() {
MaterializationNodeBuilder node = new MaterializationNodeBuilder();
nodes.add(node);
return node;
}
@Override
public void clear() {
super.clear();
name = null;
shortDesc = null;
url = null;
contextURL = null;
nodes.clear();
}
public MaterializationSpec createMaterializationSpec() {
return new MaterializationSpec(this);
}
@Override
@SuppressWarnings({ "unchecked", "rawtypes" })
public Object getAdapter(Class adapter) {
if (adapter.isInstance(this))
return this;
if (adapter.isAssignableFrom(MaterializationSpec.class))
return createMaterializationSpec();
return Platform.getAdapterManager().getAdapter(this, adapter);
}
@Override
public URL getContextURL() {
return contextURL;
}
@Override
public IMaterializationNode getMatchingNode(IComponentName cName) {
return getMatchingNodeBuilder(cName);
}
@Override
public IMaterializationNode getMatchingNode(Resolution res) {
return getMatchingNodeBuilder(res);
}
public MaterializationNodeBuilder getMatchingNodeBuilder(IComponentName cName) {
String cn = cName.getName();
for (MaterializationNodeBuilder aNode : nodes) {
Pattern pattern = aNode.getNamePattern();
if (pattern != null && pattern.matcher(cn).find()) {
String matchingCType = aNode.getComponentTypeID();
if (matchingCType == null || matchingCType.equals(cName.getComponentTypeID()))
return aNode;
}
}
return null;
}
public MaterializationNodeBuilder getMatchingNodeBuilder(Resolution res) {
Map<String, ? extends Object> props = null;
ComponentIdentifier ci = res.getComponentIdentifier();
for (MaterializationNodeBuilder aNode : nodes) {
Pattern pattern = aNode.getNamePattern();
if (!(pattern == null || pattern.matcher(ci.getName()).find()))
continue;
String matchingCType = aNode.getComponentTypeID();
if (!(matchingCType == null || matchingCType.equals(ci.getComponentTypeID())))
continue;
Filter filter = aNode.getFilter();
if (filter != null) {
if (props == null)
props = res.getProperties();
if (!filter.matches(props))
continue;
}
return aNode;
}
return null;
}
@Override
public String getName() {
return name;
}
public List<MaterializationNodeBuilder> getNodeBuilders() {
return nodes;
}
@Override
public List<? extends IMaterializationNode> getNodes() {
return getNodeBuilders();
}
@Override
public URL getResolvedURL() {
return URLUtils.resolveURL(contextURL, url);
}
@Override
public String getShortDesc() {
return shortDesc;
}
@Override
public String getURL() {
return url;
}
public void initFrom(IMaterializationSpec mspec) {
super.initFrom(mspec);
name = mspec.getName();
shortDesc = mspec.getShortDesc();
url = mspec.getURL();
contextURL = mspec.getContextURL();
for (IMaterializationNode node : mspec.getNodes()) {
MaterializationNodeBuilder nodeBuilder = new MaterializationNodeBuilder();
nodeBuilder.initFrom(node);
nodes.add(nodeBuilder);
}
}
public void setContextURL(URL contextURL) {
this.contextURL = contextURL;
}
public void setName(String name) {
this.name = name;
}
public void setShortDesc(String shortDesc) {
this.shortDesc = shortDesc;
}
public void setURL(String url) {
this.url = url;
}
@Override
public void toSax(ContentHandler receiver) throws SAXException {
MaterializationSpec mspec = new MaterializationSpec(this);
mspec.toSax(receiver);
}
}