/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.extension.ui.wizards;
import java.util.ArrayList;
import java.util.List;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.extension.definition.ModelExtensionDefinition;
import org.teiid.designer.extension.definition.ModelExtensionDefinitionHeader;
/**
* EditManager to keep track of add and remove changes to the original list of MedHeaders
*/
public class MedHeadersEditManager {
private List<ModelExtensionDefinitionHeader> currentMedHeaderList;
private List<ModelExtensionDefinitionHeader> originalMedHeaderList;
private List<ModelExtensionDefinition> medsToAddList;
private List<String> namespacesToRemoveList;
private List<String> namespacesToUpdateList;
/**
* Constructor for MedHeadersEditManager.
*/
public MedHeadersEditManager( List<ModelExtensionDefinitionHeader> headerList ) {
CoreArgCheck.isNotNull(headerList, "headerList is null"); //$NON-NLS-1$
// Keep a copy of the original list and also a working list.
this.originalMedHeaderList = headerList;
this.currentMedHeaderList = new ArrayList(headerList);
this.medsToAddList = new ArrayList<ModelExtensionDefinition>();
this.namespacesToRemoveList = new ArrayList<String>();
this.namespacesToUpdateList = new ArrayList<String>();
}
public void addModelExtensionDefinition(ModelExtensionDefinition med) {
CoreArgCheck.isNotNull(med, "med is null"); //$NON-NLS-1$
// if the current MED header list does not contain a match already, then add this med
ModelExtensionDefinitionHeader medHeader = med.getHeader();
if (!this.currentMedHeaderList.contains(medHeader)) {
this.currentMedHeaderList.add(medHeader);
// Include in the 'add' list - If the original Med list does not contain this
if (!this.originalMedHeaderList.contains(medHeader)) {
this.medsToAddList.add(med);
}
}
// If the added meds prefix was on the remove list, take it off
String nsPrefix = med.getNamespacePrefix();
this.namespacesToRemoveList.remove(nsPrefix);
}
public void addModelExtensionDefinitions( List<ModelExtensionDefinition> medList ) {
CoreArgCheck.isNotNull(medList, "medList is null"); //$NON-NLS-1$
for (ModelExtensionDefinition med : medList) {
addModelExtensionDefinition(med);
}
}
public void updateModelExtensionDefinition( ModelExtensionDefinition med ) {
CoreArgCheck.isNotNull(med, "med is null"); //$NON-NLS-1$
// if the current MED header list does not contain a match already, then add this med
ModelExtensionDefinitionHeader updateMedHeader = med.getHeader();
// replace current header with this new one
for (ModelExtensionDefinitionHeader header : this.currentMedHeaderList) {
if (header.getNamespacePrefix().equals(updateMedHeader.getNamespacePrefix())) {
this.currentMedHeaderList.remove(header);
this.currentMedHeaderList.add(updateMedHeader);
break;
}
}
this.namespacesToUpdateList.add(updateMedHeader.getNamespacePrefix());
}
public void removeModelExtensionDefinition( String nsPrefix ) {
CoreArgCheck.isNotNull(nsPrefix, "Namespace Prefix is null"); //$NON-NLS-1$
// Add the namespace prefix to the remove list (if original list contains it)
if (getListIndexOfNamespace(this.originalMedHeaderList, nsPrefix) != -1) {
this.namespacesToRemoveList.add(nsPrefix);
}
// If there is a MED with a matching namespace in the Add List, remove it
int addListIndex = getListIndexOfNamespace(getHeaderList(this.medsToAddList), nsPrefix);
if (addListIndex != -1) {
this.medsToAddList.remove(addListIndex);
}
// If there is a MED with a matching namespace in the Update List, remove it
this.namespacesToUpdateList.remove(nsPrefix);
// Remove the MED with matching namespace from the current list.
int currentListIndex = getListIndexOfNamespace(this.currentMedHeaderList, nsPrefix);
if (currentListIndex != -1) {
this.currentMedHeaderList.remove(currentListIndex);
}
}
/**
* @return currentMedHeaderList
*/
public List<ModelExtensionDefinitionHeader> getCurrentHeaders() {
return currentMedHeaderList;
}
/**
* @return originalMedHeaderList
*/
public List<ModelExtensionDefinitionHeader> getOriginalHeaders() {
return originalMedHeaderList;
}
/**
* @return medsToAddList
*/
public List<ModelExtensionDefinition> getModelExtensionDefnsToAdd() {
return medsToAddList;
}
/**
* @return namespacesToRemoveList
*/
public List<String> getNamespacesToRemove() {
return namespacesToRemoveList;
}
/**
* @return namespacesToRemoveList
*/
public List<String> getNamespacesToUpdate() {
return this.namespacesToUpdateList;
}
/**
* {@inheritDoc}
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuilder text = new StringBuilder();
text.append("\nMED Headers Edit Manager: \n"); //$NON-NLS-1$
text.append("Original Headers: \n"); //$NON-NLS-1$
for (ModelExtensionDefinitionHeader header : originalMedHeaderList) {
text.append(" NSPrefix: " + header.getNamespacePrefix() + ", Version: " + header.getVersion() + '\n'); //$NON-NLS-1$ //$NON-NLS-2$
}
text.append("Current Headers: \n"); //$NON-NLS-1$
for (ModelExtensionDefinitionHeader header : currentMedHeaderList) {
text.append(" NSPrefix: " + header.getNamespacePrefix() + ", Version: " + header.getVersion() + '\n'); //$NON-NLS-1$ //$NON-NLS-2$
}
text.append("MEDs to ADD: \n"); //$NON-NLS-1$
for (ModelExtensionDefinition med : medsToAddList) {
text.append(" NSPrefix: " + med.getNamespacePrefix() + ", Version: " + med.getVersion() + '\n'); //$NON-NLS-1$ //$NON-NLS-2$
}
text.append("NsPrefixes to REMOVE: \n"); //$NON-NLS-1$
for (String nsPrefix : namespacesToRemoveList) {
text.append(" NSPrefix: " + nsPrefix + '\n'); //$NON-NLS-1$
}
text.append("NsPrefixes to UPDATE: \n"); //$NON-NLS-1$
for (String nsPrefix : this.namespacesToUpdateList) {
text.append(" NSPrefix: " + nsPrefix + '\n'); //$NON-NLS-1$
}
return text.toString();
}
private List<ModelExtensionDefinitionHeader> getHeaderList( List<ModelExtensionDefinition> medList ) {
CoreArgCheck.isNotNull(medList, "medList is null"); //$NON-NLS-1$
List<ModelExtensionDefinitionHeader> headerList = new ArrayList(medList.size());
for (ModelExtensionDefinition med : medList) {
headerList.add(med.getHeader());
}
return headerList;
}
private int getListIndexOfNamespace( List<ModelExtensionDefinitionHeader> medHeaderList,
String namespace ) {
int resultIndex = -1;
for (int i = 0; i < medHeaderList.size(); i++) {
ModelExtensionDefinitionHeader med = medHeaderList.get(i);
if (med.getNamespacePrefix().equals(namespace)) {
resultIndex = i;
break;
}
}
return resultIndex;
}
}