/*
* 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.support.resolver;
import com.eviware.soapui.impl.wsdl.AbstractWsdlModelItem;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.UISupport;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class ResolveContext<T extends AbstractWsdlModelItem<?>> {
private List<PathToResolve> pathsToResolve = new ArrayList<PathToResolve>();
private final T modelItem;
public ResolveContext(T modelItem) {
this.modelItem = modelItem;
}
public T getModelItem() {
return modelItem;
}
public PathToResolve addPathToResolve(AbstractWsdlModelItem<?> owner, String description, String path) {
PathToResolve pathToResolve = new PathToResolve(owner, description, path);
pathsToResolve.add(pathToResolve);
return pathToResolve;
}
public PathToResolve addPathToResolve(AbstractWsdlModelItem<?> owner, String description, String path,
Resolver resolver) {
PathToResolve pathToResolve = new PathToResolve(owner, description, path);
pathToResolve.addResolvers(resolver);
pathsToResolve.add(pathToResolve);
return pathToResolve;
}
public class PathToResolve {
private final AbstractWsdlModelItem<?> owner;
private final String description;
private List<Resolver> resolvers = new ArrayList<Resolver>();
private final String path;
private Resolver resolver;
private boolean resolved;
public PathToResolve(AbstractWsdlModelItem<?> owner, String description, String path) {
this.owner = owner;
this.description = description;
this.path = path;
}
public void addResolvers(Resolver... resolvers) {
for (Resolver res : resolvers) {
this.resolvers.add(res);
}
}
public AbstractWsdlModelItem<?> getOwner() {
return owner;
}
public String getDescription() {
return description;
}
public Resolver getResolver() {
return resolver;
}
public String getPath() {
return path;
}
public boolean resolve() {
if (resolver != null) {
resolved = resolver.resolve();
return resolved;
}
return false;
}
public void setResolver(Object resolveOrDefaultAction) {
this.resolver = (Resolver) resolveOrDefaultAction;
}
public ArrayList<Resolver> getResolvers() {
return (ArrayList<Resolver>) resolvers;
}
public boolean isResolved() {
return resolved;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + getOuterType().hashCode();
result = prime * result + ((description == null) ? 0 : description.hashCode());
result = prime * result + ((owner == null) ? 0 : owner.hashCode());
result = prime * result + ((path == null) ? 0 : path.hashCode());
return result;
}
@SuppressWarnings("unchecked")
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
PathToResolve other = (PathToResolve) obj;
if (!getOuterType().equals(other.getOuterType())) {
return false;
}
if (description == null) {
if (other.description != null) {
return false;
}
} else if (!description.equals(other.description)) {
return false;
}
if (owner == null) {
if (other.owner != null) {
return false;
}
} else if (!owner.equals(other.owner)) {
return false;
}
if (path == null) {
if (other.path != null) {
return false;
}
} else if (!path.equals(other.path)) {
return false;
}
return true;
}
@SuppressWarnings("rawtypes")
private ResolveContext getOuterType() {
return ResolveContext.this;
}
public void setSolved(boolean solved) {
this.resolved = solved;
}
public boolean update() {
for (Resolver resolver : resolvers) {
if (resolver.isResolved()) {
return true;
}
}
return false;
}
}
public interface Resolver {
public boolean resolve();
public boolean isResolved();
public String getResolvedPath();
public Object getDescription();
}
public boolean isEmpty() {
return pathsToResolve.isEmpty();
}
public List<PathToResolve> getPathsToResolve() {
return pathsToResolve;
}
public int getUnresolvedCount() {
int resultCnt = 0;
for (PathToResolve ptr : pathsToResolve) {
if (ptr.getResolver() == null || !ptr.getResolver().isResolved()) {
resultCnt++;
}
}
return resultCnt;
}
public int apply() {
int resultCnt = 0;
for (PathToResolve ptr : pathsToResolve) {
if (ptr.resolve()) {
resultCnt++;
}
}
return resultCnt;
}
public abstract static class FileResolver implements Resolver {
private String title;
private String extension;
private String fileType;
private String current;
private File result;
private boolean resolved;
public FileResolver(String title, String extension, String fileType, String current) {
super();
this.title = title;
this.extension = extension;
this.fileType = fileType;
this.current = current;
}
public boolean isResolved() {
return resolved;
}
public String getResolvedPath() {
return result == null ? null : result.getAbsolutePath();
}
public abstract boolean apply(File newFile);
public boolean resolve() {
result = UISupport.getFileDialogs().open(this, title, extension, fileType, current);
if (result != null) {
resolved = apply(result);
}
return resolved;
}
public Object getDescription() {
return title;
}
@Override
public String toString() {
return (String) getDescription();
}
}
public abstract static class DirectoryResolver implements Resolver {
private String title;
private String current;
private File result;
private boolean resolved;
public DirectoryResolver(String title, String current) {
super();
this.title = title;
this.current = current;
}
public boolean isResolved() {
return resolved;
}
public String getResolvedPath() {
return result == null ? null : result.getAbsolutePath();
}
public abstract boolean apply(File newFile);
public boolean resolve() {
result = UISupport.getFileDialogs().openDirectory(this, title,
StringUtils.isNullOrEmpty(current) ? null : new File(current));
if (result != null) {
resolved = apply(result);
}
return resolved;
}
public Object getDescription() {
return title;
}
public String toString() {
return (String) getDescription();
}
}
public boolean hasThisModelItem(AbstractWsdlModelItem<?> modelItem, String description, String pathName) {
// if removed path is changed and turned to null. that is ok.
if (pathName == null) {
return true;
}
PathToResolve pathToCheck = new PathToResolve(modelItem, description, pathName);
for (PathToResolve path : pathsToResolve) {
if (path.equals(pathToCheck)) {
return true;
}
}
return false;
}
public PathToResolve getPath(AbstractWsdlModelItem<?> modelItem, String description, String pathName) {
PathToResolve pathToCheck = new PathToResolve(modelItem, description, pathName);
for (PathToResolve path : pathsToResolve) {
if (path.equals(pathToCheck)) {
return path;
}
}
return null;
}
}