/*
* 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.wsdl.support.wss;
import com.eviware.soapui.config.IncomingWssConfig;
import com.eviware.soapui.config.KeyMaterialCryptoConfig;
import com.eviware.soapui.config.OutgoingWssConfig;
import com.eviware.soapui.config.WssContainerConfig;
import com.eviware.soapui.impl.wsdl.support.ExternalDependency;
import com.eviware.soapui.impl.wsdl.support.wss.crypto.CryptoType;
import com.eviware.soapui.impl.wsdl.support.wss.crypto.KeyMaterialWssCrypto;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansion;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionsResult;
import com.eviware.soapui.support.resolver.ResolveContext;
import com.eviware.soapui.support.types.StringList;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.Security;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class DefaultWssContainer implements WssContainer {
private final ModelItem modelItem;
private List<WssCrypto> cryptos = new ArrayList<WssCrypto>();
private List<IncomingWss> incomingWssConfigs = new ArrayList<IncomingWss>();
private List<OutgoingWss> outgoingWssConfigs = new ArrayList<OutgoingWss>();
private final WssContainerConfig config;
private Set<WssContainerListener> listeners = new HashSet<WssContainerListener>();
static {
Security.addProvider(new BouncyCastleProvider());
}
public DefaultWssContainer(ModelItem modelItem, WssContainerConfig config) {
this.modelItem = modelItem;
this.config = config;
for (KeyMaterialCryptoConfig cryptoConfig : config.getCryptoList()) {
cryptos.add(new KeyMaterialWssCrypto(cryptoConfig, this));
}
for (IncomingWssConfig wssConfig : config.getIncomingList()) {
incomingWssConfigs.add(new IncomingWss(wssConfig, this));
}
for (OutgoingWssConfig wssConfig : config.getOutgoingList()) {
outgoingWssConfigs.add(new OutgoingWss(wssConfig, this));
}
}
public ModelItem getModelItem() {
return modelItem;
}
public PropertyExpansion[] getPropertyExpansions() {
PropertyExpansionsResult result = new PropertyExpansionsResult(getModelItem(), this);
for (OutgoingWss entry : outgoingWssConfigs) {
result.addAll(entry.getPropertyExpansions());
}
return result.toArray();
}
public List<WssCrypto> getCryptoList() {
return new ArrayList<WssCrypto>(cryptos);
}
public WssCrypto addCrypto(String source, String password, CryptoType type) {
KeyMaterialWssCrypto result = new KeyMaterialWssCrypto(getConfig().addNewCrypto(), this, source, password, type);
cryptos.add(result);
fireCryptoAdded(result);
return result;
}
protected void fireCryptoAdded(WssCrypto crypto) {
for (WssContainerListener listener : listeners.toArray(new WssContainerListener[listeners.size()])) {
listener.cryptoAdded(crypto);
}
}
protected void fireCryptoRemoved(WssCrypto crypto) {
for (WssContainerListener listener : listeners.toArray(new WssContainerListener[listeners.size()])) {
listener.cryptoRemoved(crypto);
}
}
public void fireWssEntryMoved(WssEntry entry, int offset) {
for (WssContainerListener listener : listeners.toArray(new WssContainerListener[listeners.size()])) {
listener.outgoingWssEntryMoved(entry, offset);
}
}
public WssContainerConfig getConfig() {
return config;
}
public int getCryptoCount() {
return cryptos.size();
}
@Override
public void removeCrypto(WssCrypto crypto) {
int index = cryptos.indexOf(crypto);
cryptos.remove(crypto);
fireCryptoRemoved(crypto);
getConfig().removeCrypto(index);
}
public List<IncomingWss> getIncomingWssList() {
return new ArrayList<IncomingWss>(incomingWssConfigs);
}
public IncomingWss addIncomingWss(String label) {
IncomingWss incomingWss = new IncomingWss(getConfig().addNewIncoming(), this);
incomingWss.setName(label);
incomingWssConfigs.add(incomingWss);
fireIncomingWssAdded(incomingWss);
return incomingWss;
}
public int getIncomingWssCount() {
return incomingWssConfigs.size();
}
public IncomingWss getIncomingWssAt(int index) {
return incomingWssConfigs.get(index);
}
public void removeIncomingWssAt(int row) {
IncomingWss incomingWss = incomingWssConfigs.remove(row);
fireIncomingWssRemoved(incomingWss);
getConfig().removeIncoming(row);
}
protected void fireIncomingWssAdded(IncomingWss incomingWss) {
for (WssContainerListener listener : listeners.toArray(new WssContainerListener[listeners.size()])) {
listener.incomingWssAdded(incomingWss);
}
}
protected void fireIncomingWssRemoved(IncomingWss incomingWss) {
for (WssContainerListener listener : listeners.toArray(new WssContainerListener[listeners.size()])) {
listener.incomingWssRemoved(incomingWss);
}
}
public List<OutgoingWss> getOutgoingWssList() {
return new ArrayList<OutgoingWss>(outgoingWssConfigs);
}
public OutgoingWss addOutgoingWss(String label) {
OutgoingWss result = new OutgoingWss(getConfig().addNewOutgoing(), this);
result.setName(label);
outgoingWssConfigs.add(result);
fireOutgoingWssAdded(result);
return result;
}
protected void fireOutgoingWssAdded(OutgoingWss result) {
for (WssContainerListener listener : listeners.toArray(new WssContainerListener[listeners.size()])) {
listener.outgoingWssAdded(result);
}
}
protected void fireOutgoingWssRemoved(OutgoingWss result) {
for (WssContainerListener listener : listeners.toArray(new WssContainerListener[listeners.size()])) {
listener.outgoingWssRemoved(result);
}
}
public int getOutgoingWssCount() {
return outgoingWssConfigs.size();
}
public OutgoingWss getOutgoingWssAt(int index) {
return outgoingWssConfigs.get(index);
}
public void removeOutgoingWssAt(int row) {
OutgoingWss outgoingWss = outgoingWssConfigs.remove(row);
fireOutgoingWssRemoved(outgoingWss);
outgoingWss.release();
getConfig().removeOutgoing(row);
}
public WssCrypto getCryptoByName(String cryptoName, boolean outgoingWSSConfig) {
for (WssCrypto crypto : cryptos) {
if (crypto.getLabel().equals(cryptoName)) {
if (outgoingWSSConfig) {
if (crypto.getType() == CryptoType.KEYSTORE) {
return crypto;
}
} else {
return crypto;
}
}
}
return null;
}
public WssCrypto getCryptoByName(String cryptoName) {
return getCryptoByName(cryptoName, false);
}
public IncomingWss getIncomingWssByName(String incomingName) {
for (IncomingWss incomingWss : incomingWssConfigs) {
if (incomingWss.getName().equals(incomingName)) {
return incomingWss;
}
}
return null;
}
public OutgoingWss getOutgoingWssByName(String outgoingName) {
for (OutgoingWss crypto : outgoingWssConfigs) {
if (crypto.getName().equals(outgoingName)) {
return crypto;
}
}
return null;
}
public void addWssContainerListener(WssContainerListener listener) {
listeners.add(listener);
}
public void removeWssContainerListener(WssContainerListener listener) {
listeners.remove(listener);
}
public void fireWssEntryAdded(WssEntry newEntry) {
for (WssContainerListener listener : listeners.toArray(new WssContainerListener[listeners.size()])) {
listener.outgoingWssEntryAdded(newEntry);
}
}
public void fireWssEntryRemoved(WssEntry entry) {
for (WssContainerListener listener : listeners.toArray(new WssContainerListener[listeners.size()])) {
listener.outgoingWssEntryRemoved(entry);
}
}
public String[] getCryptoNames() {
StringList result = new StringList();
for (WssCrypto crypto : getCryptoList()) {
result.add(crypto.getLabel());
}
return result.toStringArray();
}
public String[] getIncomingWssNames() {
StringList result = new StringList();
for (IncomingWss crypto : getIncomingWssList()) {
result.add(crypto.getName());
}
return result.toStringArray();
}
public String[] getOutgoingWssNames() {
StringList result = new StringList();
for (OutgoingWss crypto : getOutgoingWssList()) {
result.add(crypto.getName());
}
return result.toStringArray();
}
// FIXME: Why is this method empty?
public void importConfig(WssContainer wssContainer) {
}
// FIXME: Not used?
public void resetConfig(WssContainerConfig config) {
getConfig().set(config);
for (int c = 0; c < cryptos.size(); c++) {
((KeyMaterialWssCrypto) cryptos.get(c)).udpateConfig(getConfig().getCryptoArray(c));
}
for (int c = 0; c < incomingWssConfigs.size(); c++) {
incomingWssConfigs.get(c).updateConfig(getConfig().getIncomingArray(c));
}
for (int c = 0; c < outgoingWssConfigs.size(); c++) {
outgoingWssConfigs.get(c).updateConfig(getConfig().getOutgoingArray(c));
}
}
public void fireCryptoUpdated(KeyMaterialWssCrypto crypto) {
for (WssContainerListener listener : listeners.toArray(new WssContainerListener[listeners.size()])) {
listener.cryptoUpdated(crypto);
}
}
public void resolve(ResolveContext<?> context) {
for (int c = 0; c < cryptos.size(); c++) {
((KeyMaterialWssCrypto) cryptos.get(c)).resolve(context);
}
for (int c = 0; c < incomingWssConfigs.size(); c++) {
incomingWssConfigs.get(c).resolve(context);
}
for (int c = 0; c < outgoingWssConfigs.size(); c++) {
outgoingWssConfigs.get(c).resolve(context);
}
}
public void addExternalDependency(List<ExternalDependency> dependencies) {
for (int c = 0; c < cryptos.size(); c++) {
((KeyMaterialWssCrypto) cryptos.get(c)).addExternalDependency(dependencies);
}
}
// FIXME: Why is this method empty?
public void release() {
}
}