/*
* 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.webservice;
import java.util.Iterator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.EList;
import org.eclipse.xsd.XSDDiagnosticSeverity;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.impl.XSDDiagnosticImpl;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.core.ModelerCore;
/**
* @since 8.0
*/
public class WebServiceXsdResource implements IInternalWebServiceXsdResource {
private final String targetNamespace;
private final String originalPath;
private IPath destinationPath;
private final Validator validator;
private final XSDSchema schema;
/**
*
* @since 4.2
*/
public WebServiceXsdResource( final XSDSchema schema, final String targetNamespace, final String originalPath ) {
this(schema,targetNamespace,originalPath,null);
}
/**
*
* @since 4.2
*/
public WebServiceXsdResource( final XSDSchema schema, final String targetNamespace, final String originalPath, final Validator validator ) {
super();
CoreArgCheck.isNotNull(schema);
this.schema = schema;
this.targetNamespace = targetNamespace;
this.originalPath = originalPath;
this.validator = validator != null ? validator : new WorkspaceValidator();
}
@Override
public XSDSchema getSchema() {
return this.schema;
}
/**
* @see org.teiid.designer.webservice.IWebServiceXsdResource#getTargetNamespace()
* @since 4.2
*/
@Override
public String getTargetNamespace() {
return this.targetNamespace;
}
/**
* @see org.teiid.designer.webservice.IWebServiceXsdResource#getOriginalPath()
* @since 4.2
*/
@Override
public String getOriginalPath() {
return this.originalPath;
}
/**
* @see org.teiid.designer.webservice.IWebServiceXsdResource#getDestinationPath()
* @since 4.2
*/
@Override
public IPath getDestinationPath() {
return this.destinationPath;
}
/**
* @see org.teiid.designer.webservice.IWebServiceXsdResource#setDestinationPath(org.eclipse.core.runtime.IPath)
* @since 4.2
*/
@Override
public void setDestinationPath( final IPath workspacePathForXsd) {
this.destinationPath = workspacePathForXsd;
}
/**
* @see org.teiid.designer.webservice.IWebServiceXsdResource#isValid()
* @since 4.2
*/
@Override
public IStatus isValid() {
IStatus stResult = null;
IStatus stSchemaStatus = null;
IStatus stValidDestination = this.validator.isValid(this.getDestinationPath());
// check to see if schema has errors
EList lstDiags = getSchema().getDiagnostics();
if( lstDiags != null
&& lstDiags.size() > 0 ) {
Iterator it = lstDiags.iterator();
while( it.hasNext() ) {
XSDDiagnosticImpl diag = (XSDDiagnosticImpl)it.next();
if ( diag.getSeverity().getValue() == XSDDiagnosticSeverity.ERROR
|| diag.getSeverity().getValue() == XSDDiagnosticSeverity.FATAL ) {
String sMessage = diag.getMessage();
// if schema has errors, create an error IStatus for it
stSchemaStatus
= new Status( IStatus.ERROR,
WebServicePlugin.PLUGIN_ID,
IWebServiceModelBuilder.UNRESOLVED_SCHEMA_IMPORT,
sMessage,
null );
}
}
}
// resolve the status objects down to one
if ( stValidDestination != null && stSchemaStatus != null ) {
IStatus[] errors = new IStatus[ 2 ];
errors[ 0 ] = stValidDestination;
errors[ 1 ] = stSchemaStatus;
stResult
= new MultiStatus( WebServicePlugin.PLUGIN_ID,
IWebServiceModelBuilder.UNRESOLVED_SCHEMA_IMPORT,
errors,
stSchemaStatus.getMessage(),
null );
}
else
if ( stValidDestination != null ) {
stResult = stValidDestination;
}
else
if ( stSchemaStatus != null ) {
stResult = stSchemaStatus;
}
return stResult;
}
/**
* @see org.teiid.designer.webservice.IWebServiceXsdResource#isValid(org.eclipse.core.runtime.IPath)
* @since 4.2
*/
@Override
public IStatus isValid(final IPath proposedDestination) {
return this.validator.isValid(proposedDestination);
}
public interface Validator {
IStatus isValid(final IPath destPath);
}
public class WorkspaceValidator implements Validator {
@Override
public IStatus isValid(final IPath destPath) {
return WebServiceXsdResource.isValidInWorkspace(destPath);
}
}
public static IStatus isValidInWorkspace(final IPath destPath) {
if ( destPath == null ) {
final String msg = WebServicePlugin.Util.getString("WebServiceXsdResource.LocationInWorkspaceRequired"); //$NON-NLS-1$
return new Status(IStatus.ERROR,WebServicePlugin.PLUGIN_ID,0,msg,null);
}
// See if an IResource already exists at that location ...
if ( destPath.segmentCount() == 0 ) {
final Object[] params = new Object[] {destPath.toString()};
final String msg = WebServicePlugin.Util.getString("WebServiceXsdResource.PathNotValid",params); //$NON-NLS-1$
return new Status(IStatus.ERROR,WebServicePlugin.PLUGIN_ID,0,msg,null);
}
// Make sure the path has at least 2 segments (at least 1 project and 1 file segment) ...
if ( destPath.segmentCount() == 1 ) {
final Object[] params = new Object[] {destPath.toString()};
final String msg = WebServicePlugin.Util.getString("WebServiceXsdResource.PathSpecifiesProject",params); //$NON-NLS-1$
return new Status(IStatus.ERROR,WebServicePlugin.PLUGIN_ID,0,msg,null);
}
// See if an IResource already exists at that location ...
IResource existing = ModelerCore.getWorkspace().getRoot().findMember(destPath, false);
if ( existing != null && existing.exists() ) {
if ( existing instanceof IFolder ) {
final Object[] params = new Object[] {destPath.toString()};
final String msg = WebServicePlugin.Util.getString("WebServiceXsdResource.PathSpecifiesFolder",params); //$NON-NLS-1$
return new Status(IStatus.ERROR,WebServicePlugin.PLUGIN_ID,0,msg,null);
} else if ( existing instanceof IFile ) {
// Check the type ...
if ( "xsd".equalsIgnoreCase(existing.getFullPath().getFileExtension()) ) { //$NON-NLS-1$
final Object[] params = new Object[] {destPath.toString()};
final String msg = WebServicePlugin.Util.getString("WebServiceXsdResource.PathSpecifiesExistingXsdWillBeOverwritten",params); //$NON-NLS-1$
return new Status(IStatus.WARNING,WebServicePlugin.PLUGIN_ID,0,msg,null);
}
final Object[] params = new Object[] {destPath.toString()};
final String msg = WebServicePlugin.Util.getString("WebServiceXsdResource.PathSpecifiesExistingNonXsd",params); //$NON-NLS-1$
return new Status(IStatus.ERROR,WebServicePlugin.PLUGIN_ID,0,msg,null);
}
}
// Check the extension ...
if ( !"xsd".equalsIgnoreCase(destPath.getFileExtension()) ) { //$NON-NLS-1$
final Object[] params = new Object[] {destPath.toString()};
final String msg = WebServicePlugin.Util.getString("WebServiceXsdResource.PathMustHaveAnXsdExtension",params); //$NON-NLS-1$
return new Status(IStatus.ERROR,WebServicePlugin.PLUGIN_ID,0,msg,null);
}
// Else it doesn't exist ...
final Object[] params = new Object[] {destPath.toString()};
final String msg = WebServicePlugin.Util.getString("WebServiceXsdResource.XsdWillBePlacedAt",params); //$NON-NLS-1$
return new Status(IStatus.OK,WebServicePlugin.PLUGIN_ID,0,msg,null);
}
}