/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.impl.wadl.inference.schema.particles;
import com.eviware.soapui.impl.wadl.inference.schema.Context;
import com.eviware.soapui.impl.wadl.inference.schema.Particle;
import com.eviware.soapui.impl.wadl.inference.schema.Schema;
import com.eviware.soapui.impl.wadl.inference.schema.Settings;
import com.eviware.soapui.impl.wadl.inference.schema.Type;
import com.eviware.soapui.inferredSchema.MapEntryConfig;
import com.eviware.soapui.inferredSchema.ReferenceParticleConfig;
import org.apache.xmlbeans.XmlException;
import javax.xml.namespace.QName;
import java.util.HashMap;
import java.util.Map;
/**
* A ReferenceParticle is a reference to a particle in another namespace. It may
* be either an xs:element or an xs:attribute.
*
* @author Dain Nilsson
*/
public class ReferenceParticle implements Particle {
private Schema schema;
private Particle reference;
private QName referenceQName;
private Map<String, String> attributes;
public ReferenceParticle(Schema schema, Particle reference) {
this.schema = schema;
this.reference = reference;
referenceQName = reference.getName();
attributes = new HashMap<String, String>();
}
public ReferenceParticle(ReferenceParticleConfig xml, Schema schema) {
this.schema = schema;
referenceQName = xml.getReference();
attributes = new HashMap<String, String>();
for (MapEntryConfig entry : xml.getAttributeList()) {
attributes.put(entry.getKey(), entry.getValue());
}
}
public ReferenceParticleConfig save() {
ReferenceParticleConfig xml = ReferenceParticleConfig.Factory.newInstance();
xml.setReference(referenceQName);
for (Map.Entry<String, String> entry : attributes.entrySet()) {
MapEntryConfig mapEntry = xml.addNewAttribute();
mapEntry.setKey(entry.getKey());
mapEntry.setValue(entry.getValue());
}
return xml;
}
private Particle getReference() {
if (reference == null) {
reference = schema.getSystem().getSchemaForNamespace(referenceQName.getNamespaceURI())
.getParticle(referenceQName.getLocalPart());
}
return reference;
}
public QName getName() {
return referenceQName;
}
public String getAttribute(String key) {
String value = attributes.get(key);
if ((key.equals("minOccurs") || key.equals("maxOccurs")) && value == null) {
value = "1";
}
return value;
}
public void setAttribute(String key, String value) {
attributes.put(key, value);
}
public Type getType() {
return null;
}
public void setType(Type type) {
}
public void validate(Context context) throws XmlException {
context.pushPath();
getReference().validate(context);
context.popPath();
}
@Override
public String toString() {
StringBuilder s = new StringBuilder("<" + schema.getPrefixForNamespace(Settings.xsdns) + ":"
+ getReference().getPType() + " ref=\"" + schema.getPrefixForNamespace(referenceQName.getNamespaceURI())
+ ":" + referenceQName.getLocalPart() + "\"");
for (Map.Entry<String, String> entry : attributes.entrySet()) {
s.append(" " + entry.getKey() + "=\"" + entry.getValue() + "\"");
}
s.append("/>");
return s.toString();
}
public Particle.ParticleType getPType() {
return getReference().getPType();
}
}