/*
* IronJacamar, a Java EE Connector Architecture implementation
* Copyright 2014, Red Hat Inc, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the Eclipse Public License 1.0 as
* published by the Free Software Foundation.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse
* Public License for more details.
*
* You should have received a copy of the Eclipse Public License
* along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.ironjacamar.common.metadata.spec;
import org.ironjacamar.common.CommonBundle;
import org.ironjacamar.common.api.metadata.CopyUtil;
import org.ironjacamar.common.api.metadata.MergeUtil;
import org.ironjacamar.common.api.metadata.spec.AuthenticationMechanism;
import org.ironjacamar.common.api.metadata.spec.ConfigProperty;
import org.ironjacamar.common.api.metadata.spec.ConnectionDefinition;
import org.ironjacamar.common.api.metadata.spec.Connector;
import org.ironjacamar.common.api.metadata.spec.Connector.Version;
import org.ironjacamar.common.api.metadata.spec.Icon;
import org.ironjacamar.common.api.metadata.spec.LicenseType;
import org.ironjacamar.common.api.metadata.spec.LocalizedXsdString;
import org.ironjacamar.common.api.metadata.spec.MergeableMetadata;
import org.ironjacamar.common.api.metadata.spec.ResourceAdapter;
import org.ironjacamar.common.api.metadata.spec.SecurityPermission;
import org.ironjacamar.common.api.metadata.spec.XsdString;
import org.ironjacamar.common.api.validator.ValidateException;
import org.ironjacamar.common.metadata.common.AbstractMetadata;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.jboss.logging.Messages;
/**
* Implementation of Connector
*
* @author <a href="mailto:stefano.maestri@ironjacamar.org">Stefano Maestri</a>
* @author <a href="mailto:jesper.pedersen@ironjacamar.org">Jesper Pedersen</a>
*/
public class ConnectorImpl extends AbstractMetadata implements Connector
{
/** The serial version uid */
private static final long serialVersionUID = 1L;
/** The bundle */
private static CommonBundle bundle = Messages.getBundle(CommonBundle.class);
private Version version;
private XsdString moduleName;
private List<XsdString> requiredWorkContexts;
private boolean metadataComplete;
private XsdString resourceadapterVersion;
private XsdString vendorName;
private XsdString eisType;
private LicenseType license;
private ResourceAdapter resourceadapter;
private String id;
private List<LocalizedXsdString> description;
private List<LocalizedXsdString> displayName;
private List<Icon> icon;
/**
* Constructor
* @param version The version
* @param moduleName name of the module
* @param vendorName vendor name
* @param eisType eis type
* @param resourceadapterVersion version number for the RA
* @param license license information
* @param resourceadapter full qualified name of the resource adapter
* @param requiredWorkContexts list od work context required
* @param metadataComplete not mandatory boolean value
* @param description descriptions of this connector
* @param displayNames name to display for this connecotro
* @param icons icon representing this connectore
* @param id XML ID
*/
public ConnectorImpl(Version version, XsdString moduleName, XsdString vendorName, XsdString eisType,
XsdString resourceadapterVersion,
LicenseType license, ResourceAdapter resourceadapter, List<XsdString> requiredWorkContexts,
boolean metadataComplete, List<LocalizedXsdString> description,
List<LocalizedXsdString> displayNames, List<Icon> icons, String id)
{
super(null);
this.version = version;
this.moduleName = moduleName;
if (!XsdString.isNull(this.moduleName))
this.moduleName.setTag(XML.ELEMENT_MODULE_NAME);
if (requiredWorkContexts != null)
{
this.requiredWorkContexts = new ArrayList<XsdString>(requiredWorkContexts);
for (XsdString wc: this.requiredWorkContexts)
wc.setTag(XML.ELEMENT_REQUIRED_WORK_CONTEXT);
}
else
{
this.requiredWorkContexts = new ArrayList<XsdString>(0);
}
this.metadataComplete = metadataComplete;
this.resourceadapterVersion = resourceadapterVersion;
if (!XsdString.isNull(this.resourceadapterVersion))
{
if (version == Version.V_10)
{
this.resourceadapterVersion.setTag(XML.ELEMENT_VERSION);
}
else
{
this.resourceadapterVersion.setTag(XML.ELEMENT_RESOURCEADAPTER_VERSION);
}
}
this.vendorName = vendorName;
if (!XsdString.isNull(this.vendorName))
this.vendorName.setTag(XML.ELEMENT_VENDOR_NAME);
this.eisType = eisType;
if (!XsdString.isNull(this.eisType))
this.eisType.setTag(XML.ELEMENT_EIS_TYPE);
this.license = license;
this.resourceadapter = resourceadapter;
this.id = id;
if (description != null)
{
this.description = new ArrayList<LocalizedXsdString>(description);
for (LocalizedXsdString d: this.description)
d.setTag(XML.ELEMENT_DESCRIPTION);
}
else
{
this.description = new ArrayList<LocalizedXsdString>(0);
}
if (displayNames != null)
{
this.displayName = new ArrayList<LocalizedXsdString>(displayNames);
for (LocalizedXsdString d: this.displayName)
d.setTag(XML.ELEMENT_DISPLAY_NAME);
}
else
{
this.displayName = new ArrayList<LocalizedXsdString>(0);
}
if (icons != null)
{
this.icon = new ArrayList<Icon>(icons);
}
else
{
this.icon = new ArrayList<Icon>(0);
}
}
/**
* {@inheritDoc}
*/
public XsdString getVendorName()
{
return vendorName;
}
/**
* {@inheritDoc}
*/
public XsdString getEisType()
{
return eisType;
}
/**
* {@inheritDoc}
*/
public LicenseType getLicense()
{
return license;
}
/**
* {@inheritDoc}
*/
public ResourceAdapter getResourceadapter()
{
return resourceadapter;
}
/**
* {@inheritDoc}
*/
public List<LocalizedXsdString> getDescriptions()
{
return Collections.unmodifiableList(description);
}
/**
* {@inheritDoc}
*/
public List<LocalizedXsdString> getDisplayNames()
{
return Collections.unmodifiableList(displayName);
}
/**
* {@inheritDoc}
*/
public List<Icon> getIcons()
{
return Collections.unmodifiableList(icon);
}
/**
* {@inheritDoc}
*/
public String getId()
{
return id;
}
/**
* {@inheritDoc}
*/
public XsdString getResourceadapterVersion()
{
return resourceadapterVersion;
}
/**
* {@inheritDoc}
*/
public List<String> getRequiredWorkContexts()
{
List<String> result = new ArrayList<String>(requiredWorkContexts.size());
for (XsdString wc : requiredWorkContexts)
result.add(wc.getValue());
return Collections.unmodifiableList(result);
}
/**
* {@inheritDoc}
*/
public String getModuleName()
{
if (XsdString.isNull(moduleName))
return null;
return moduleName.getValue();
}
/**
* {@inheritDoc}
*/
public boolean isMetadataComplete()
{
return metadataComplete;
}
/**
* {@inheritDoc}
*/
public Version getVersion()
{
return version;
}
/**
* {@inheritDoc}
*/
public Connector merge(MergeableMetadata<?> inputMd) throws Exception
{
if (inputMd instanceof ConnectorImpl)
{
ConnectorImpl input = (ConnectorImpl) inputMd;
XsdString newResourceadapterVersion = XsdString.isNull(this.resourceadapterVersion)
? input.resourceadapterVersion
: this.resourceadapterVersion;
XsdString newEisType = XsdString.isNull(this.eisType) ? input.eisType : this.eisType;
List<XsdString> newRequiredWorkContexts = MergeUtil.mergeList(this.requiredWorkContexts,
input.requiredWorkContexts);
XsdString newModuleName = this.moduleName == null ? input.moduleName : this.moduleName;
List<Icon> newIcons = MergeUtil.mergeList(this.icon, input.icon);
boolean newMetadataComplete = this.metadataComplete || input.metadataComplete;
LicenseType newLicense = this.license == null ? input.license : this.license.merge(input.license);
List<LocalizedXsdString> newDescriptions = MergeUtil.mergeList(this.description, input.description);
List<LocalizedXsdString> newDisplayNames = MergeUtil.mergeList(this.displayName, input.displayName);
XsdString newVendorName = XsdString.isNull(this.vendorName) ? input.vendorName : this.vendorName;;
ResourceAdapter newResourceadapter = this.resourceadapter == null
? (ResourceAdapter) input.resourceadapter
: ((ResourceAdapter) this.resourceadapter).merge((ResourceAdapter) input.resourceadapter);
return new ConnectorImpl(version, newModuleName, newVendorName, newEisType, newResourceadapterVersion,
newLicense, newResourceadapter, newRequiredWorkContexts, newMetadataComplete,
newDescriptions, newDisplayNames, newIcons, null);
}
return this;
}
/**
* {@inheritDoc}
*/
public Connector copy()
{
XsdString newResourceadapterVersion = CopyUtil.clone(this.resourceadapterVersion);
XsdString newEisType = XsdString.isNull(this.eisType) ? null : (XsdString) this.eisType.copy();
List<XsdString> newRequiredWorkContexts = CopyUtil.cloneList(this.requiredWorkContexts);
XsdString newModuleName = CopyUtil.clone(this.moduleName);
List<Icon> newIcons = CopyUtil.cloneList(this.icon);
boolean newMetadataComplete = this.metadataComplete;
LicenseType newLicense = CopyUtil.clone(this.license);
List<LocalizedXsdString> newDescriptions = CopyUtil.cloneList(this.description);
List<LocalizedXsdString> newDisplayNames = CopyUtil.cloneList(this.displayName);
XsdString newVendorName = CopyUtil.clone(this.vendorName);
ResourceAdapter newResourceadapter = CopyUtil.clone((ResourceAdapter) this.resourceadapter);
return new ConnectorImpl(version, newModuleName, newVendorName, newEisType, newResourceadapterVersion,
newLicense, newResourceadapter, newRequiredWorkContexts, newMetadataComplete,
newDescriptions, newDisplayNames, newIcons, CopyUtil.cloneString(id));
}
/**
* {@inheritDoc}
*/
public void validate() throws ValidateException
{
ResourceAdapter ra = this.getResourceadapter();
if (ra == null)
throw new ValidateException(bundle.noMetadataForResourceAdapter());
ra.validate();
}
/**
* {@inheritDoc}
*/
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((eisType == null) ? 0 : eisType.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((license == null) ? 0 : license.hashCode());
result = prime * result + ((resourceadapter == null) ? 0 : resourceadapter.hashCode());
result = prime * result + ((vendorName == null) ? 0 : vendorName.hashCode());
result = prime * result + ((description == null) ? 0 : description.hashCode());
result = prime * result + ((displayName == null) ? 0 : displayName.hashCode());
result = prime * result + ((resourceadapterVersion == null) ? 0 : resourceadapterVersion.hashCode());
result = prime * result + (metadataComplete ? 1231 : 1237);
result = prime * result + ((moduleName == null) ? 0 : moduleName.hashCode());
result = prime * result + ((requiredWorkContexts == null) ? 0 : requiredWorkContexts.hashCode());
return result;
}
/**
* {@inheritDoc}
*/
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof ConnectorImpl))
return false;
ConnectorImpl other = (ConnectorImpl) obj;
if (eisType == null)
{
if (other.eisType != null)
return false;
}
else if (!eisType.equals(other.eisType))
return false;
if (id == null)
{
if (other.id != null)
return false;
}
else if (!id.equals(other.id))
return false;
if (license == null)
{
if (other.license != null)
return false;
}
else if (!license.equals(other.license))
return false;
if (resourceadapter == null)
{
if (other.resourceadapter != null)
return false;
}
else if (!resourceadapter.equals(other.resourceadapter))
return false;
if (vendorName == null)
{
if (other.vendorName != null)
return false;
}
else if (!vendorName.equals(other.vendorName))
return false;
if (description == null)
{
if (other.description != null)
return false;
}
else if (!description.equals(other.description))
return false;
if (displayName == null)
{
if (other.displayName != null)
return false;
}
else if (!displayName.equals(other.displayName))
return false;
if (resourceadapterVersion == null)
{
if (other.resourceadapterVersion != null)
return false;
}
else if (!resourceadapterVersion.equals(other.resourceadapterVersion))
return false;
if (metadataComplete != other.metadataComplete)
return false;
if (moduleName == null)
{
if (other.moduleName != null)
return false;
}
else if (!moduleName.equals(other.moduleName))
return false;
if (requiredWorkContexts == null)
{
if (other.requiredWorkContexts != null)
return false;
}
else if (!requiredWorkContexts.equals(other.requiredWorkContexts))
return false;
return true;
}
/**
* {@inheritDoc}
*/
public String toString()
{
StringBuilder sb = new StringBuilder(1024);
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
// For V_10, we just hack everything here
if (version == Version.V_10)
{
sb.append("<").append("connector");
if (id != null)
sb.append(" id=\"" + id + "\"");
sb.append(">");
for (LocalizedXsdString l : displayName)
{
sb.append(l);
}
for (LocalizedXsdString l : description)
{
sb.append(l);
}
for (Icon i : icon)
{
sb.append(i);
}
if (!XsdString.isNull(vendorName))
sb.append(vendorName);
sb.append("<").append(XML.ELEMENT_SPEC_VERSION).append(">");
sb.append("1.0");
sb.append("</").append(XML.ELEMENT_SPEC_VERSION).append(">");
if (!XsdString.isNull(eisType))
sb.append(eisType);
if (!XsdString.isNull(resourceadapterVersion))
sb.append(resourceadapterVersion);
if (license != null)
sb.append(license);
sb.append("<").append(XML.ELEMENT_RESOURCEADAPTER);
if (resourceadapter.getId() != null)
sb.append(" id=\"" + resourceadapter.getId() + "\"");
sb.append(">");
ConnectionDefinition cd = resourceadapter.getOutboundResourceadapter().getConnectionDefinitions().get(0);
sb.append(cd.getManagedConnectionFactoryClass());
sb.append(cd.getConnectionFactoryInterface());
sb.append(cd.getConnectionFactoryImplClass());
sb.append(cd.getConnectionInterface());
sb.append(cd.getConnectionImplClass());
sb.append(cd.getConnectionImplClass());
sb.append("<").append(XML.ELEMENT_TRANSACTION_SUPPORT);
if (resourceadapter.getOutboundResourceadapter().getTransactionSupportId() != null)
sb.append(" id=\"" + resourceadapter.getOutboundResourceadapter().getTransactionSupportId() + "\"");
sb.append(">");
sb.append(resourceadapter.getOutboundResourceadapter().getTransactionSupport());
sb.append("</").append(XML.ELEMENT_TRANSACTION_SUPPORT).append(">");
for (ConfigProperty cp : cd.getConfigProperties())
{
sb.append(cp);
}
for (AuthenticationMechanism am : resourceadapter.getOutboundResourceadapter().getAuthenticationMechanisms())
{
sb.append(am);
}
sb.append("<").append(XML.ELEMENT_REAUTHENTICATION_SUPPORT);
if (resourceadapter.getOutboundResourceadapter().getReauthenticationSupportId() != null)
sb.append(" id=\"" + resourceadapter.getOutboundResourceadapter().getReauthenticationSupportId() + "\"");
sb.append(">");
sb.append(resourceadapter.getOutboundResourceadapter().getReauthenticationSupport());
sb.append("</").append(XML.ELEMENT_REAUTHENTICATION_SUPPORT).append(">");
for (SecurityPermission sp : resourceadapter.getSecurityPermissions())
{
sb.append(sp);
}
sb.append("</").append(XML.ELEMENT_RESOURCEADAPTER).append(">");
}
else
{
sb.append("<").append("connector");
sb.append(" " + XML.ATTRIBUTE_VERSION + "=\"" + version + "\"");
if (version == Version.V_16 || version == Version.V_17)
sb.append(" " + XML.ATTRIBUTE_METADATA_COMPLETE + "=\"" + metadataComplete + "\"");
if (id != null)
sb.append(" id=\"" + id + "\"");
sb.append(">");
if (!XsdString.isNull(moduleName))
sb.append(moduleName);
for (LocalizedXsdString l : description)
{
sb.append(l);
}
for (LocalizedXsdString l : displayName)
{
sb.append(l);
}
for (Icon i : icon)
{
sb.append(i);
}
if (!XsdString.isNull(vendorName))
sb.append(vendorName);
if (!XsdString.isNull(eisType))
sb.append(eisType);
if (!XsdString.isNull(resourceadapterVersion))
sb.append(resourceadapterVersion);
if (license != null)
sb.append(license);
sb.append(resourceadapter);
if (requiredWorkContexts != null)
{
for (XsdString rwc : requiredWorkContexts)
sb.append(rwc);
}
}
sb.append("</").append("connector").append(">");
return sb.toString();
}
}