Muestra de política de WSDL

La política de validación WS-I WSDL comprueba que el WSDL se ajuste a las facetas WS-I. Las políticas invocadas por PolicyGovernor son similares a esta política. Uno de los requisitos de WS-I es tener nombres y enlaces correctos para el nombre de argumento de la operación. En este ejemplo, la política garantiza que "XX" se muestra delante de <wsdl:input name="XXgoodname"....
Para obtener instrucciones sobre cómo crear políticas personalizadas, consulte Desarrollar políticas personalizadas.
package com.ibm.ram.extension.demo.policy;

import java.io.*;
import java.util.Locale;

import org.eclipse.core.runtime.NullProgressMonitor;

import com.ibm.ram.client.*;
import com.ibm.ram.common.data.Artifact;
import com.ibm.ram.extension.ConfigurationDetails;
import com.ibm.ram.extension.PolicyGovernor;
import com.ibm.ram.policy.*;
public class WSIPolicy extends AssetPolicy {
	
		private MyGovernor fGovernor;
	
		private static String WSDL_MATCH0 = "<wsdl:input";
		private static String WSDL_MATCH1 = "<wsdl:message";
		private static String WSDL_MATCH2 = "name=\"";
		private static String WSDL_MATCH3 = "XX";

		public WSIPolicy(MyGovernor governor) {
				fGovernor = governor;
	}

El método siguiente devuelve un identificador exclusivo para esta política.

public String getID() {
		return "WSDL_000001";
}

El método siguiente devuelve el nombre que se mostrará al usuario:

public String getName(Locale locale) {
		return "Interoperable Web Services (WS-I)";
}
public String getDescription(Locale locale) {
		return "Ensuring Interoperable Web Services - DEMO";
}

El método siguiente devuelve el administrador de la política:

public PolicyGovernor getPolicyGovernor() {
		return fGovernor;
}

Puede utilizar el código siguiente para especificar la lógica que describe contra qué validar los activos cuando utilice esta política personalizada:

public Result test() {
El objeto resultante devuelve el estado global de la prueba de conformidad de política y utiliza la sintaxis siguiente:
Result status = new Result(this)

Puede utilizar el método GetRAMAsset de contexto de política y después las API de cliente para obtener acceso a todas las partes de un activo. El objeto de artefactos es una lista de todos los artefactos del activo:

				RAMAsset asset = this.getPolicyContext().getRAMAsset();
				RAMFolderArtifact folderArtifact = (RAMFolderArtifact)asset.getArtifactsRoot();
				Artifact[] artifacts = folderArtifact.computeArtifactsAsFlatList(new NullProgressMonitor());

El código siguiente valida los artefactos:

		if (artifacts != null) { 
	validateArtifacts(status, artifacts); 
}		
Si no hay ningún artefacto que contenga errores, defina un mensaje de conformidad global:
if(status.getReturnCode() != ResultDetail.ERROR){
		status.setMessage("Se cumplen las normas de WS-I");
}
Si los artefactos contienen errores, muestre un mensaje de error:
else{
						status.setMessage("<font color=\"red\">No cumple las normas de WS-I</font>
Para conocer más, consulte <a href=\"www.google.com\">corporate standard
guidelines handbook.</a>");
		}

				return status;
	}
		private void validateWSDL(Result status, InputStream is, Artifact artifact) {
						BufferedReader reader = null;
		try {
						if (is!=null) {
								int lineNo = 0;
								reader = new BufferedReader(new InputStreamReader(is));
								String line;
								StringBuffer message = new StringBuffer();
								while ((line = reader.readLine())!=null) {
					lineNo++;
										int idx = 0;
										while (idx>=0 && idx<line.length()) {
												int ori = idx;
												idx = line.indexOf(WSDL_MATCH0, idx);
												if (idx<0) {
														idx = line.indexOf(WSDL_MATCH1, ori);
						}
													if (idx>=0) {
														idx = line.indexOf(WSDL_MATCH2, idx);
							
														if (idx>=0) {
																idx+=WSDL_MATCH2.length();
																if (idx+WSDL_MATCH3.length()<line.length()) {
																		if (line.substring(idx, idx+WSDL_MATCH3.length()).equalsIgnoreCase(WSDL_MATCH3)) {
										
																				message.append("<a href=\"http://www.ws-i.org/Profiles/BasicProfile-1.0-2004-04-16.html\">All WSDLs must WS-I Compliant </a>: ");
																				message.append (artifact.getName());
																				message.append ("["+lineNo+"]");
										
																				status.addDetail(new ArtifactResultDetail(
													artifact, 
													ResultDetail.ERROR,
																										message.toString()));										
									}									
								}
																idx+=WSDL_MATCH3.length();
							}
						}
					}
					
				}
			}
		} 
				catch (Throwable e) {}
		finally {
						if (reader!=null) {
				try {
												reader.close();
				} catch (IOException e) {}
			}
		}			
	}
El código siguiente ejecuta una prueba de validación en todos los artefactos del activo. Valida un artefacto asegurándose de que el nombre de archivo termina en wsdl:
/**
	 	 * Ejecuta la validación en todos los artefactos del activo
	 */
		private void validateArtifacts(Result status, Artifact[] artifacts) {
				for (int i = 0; i < artifacts.length; i++) {
						Artifact artifact = artifacts[i];

						// Validar un artefacto XML. Asegúrese de que el nombre de archivo termine en XML
						if (artifact.getName() != null
										&& artifact.getName().endsWith(".wsdl")) {
								InputStream is = null;
								BufferedReader reader = null;
				try {
										if (artifact instanceof RAMArtifact) {
					    					    // Utilizar artifactAccessor para leer el contenido de un artefacto
												is = ((RAMArtifact)artifact).downloadContents();
												if (is != null) {
														validateWSDL(status, is, artifact);
						}
					}
				} catch (Throwable e) {
										//print out any exception
					e.printStackTrace();
								} finally {

El código siguiente cierra la corriente de datos de entrada:

					try {
												if (reader != null)
														reader.close();
												if (is != null)
														is.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
	
		public ConfigurationDetails[] getConfigurationDetails(Locale locale) {
		return null;
	}
}

Comentarios