Exemple de stratégie WSDL

La stratégie de validation WSDL WS-I garantir que le langage WSDL est conforme aux facettes WS-I. Chaque stratégie appelée par le gouverneur de stratégies ressemble à cette stratégie. L'une des facettes de WS-I est d'imposer des noms et des liaisons corrects pour le nom d'argument de l'opération. Dans cet exemple, la stratégie garantit que "XX" apparaît devant <wsdl:input name="XXgoodname"....
Pour des instructions pour créer des stratégies personnalisées, voir Développement de stratégies personnalisées.
package com.ibm.ram.extension.demo.policy;

import java.io.*;
import java.util.List;

import com.ibm.ram.common.emf.ArtifactDetail;
import com.ibm.ram.common.emf.ArtifactDetails;
import com.ibm.ram.defaultprofile.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;
	}

La méthode suivante renvoie un ID unique pour cette stratégie :

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

La méthode suivante renvoie le nom tel qu'il sera affiché pour l'utilisateur :

public String getName() {
	return "Services Web interopérables (WS-I)";
}
public String getDescription() {
	return "Vérification de l'interopérabilité des services Web - DEMO";
}

La méthode suivante renvoie le gouverneur de la stratégie :

public PolicyGovernor getPolicyGovernor() {
	return fGovernor;
}

Vous pouvez utiliser le code suivant pour définir la logique qui décrit par rapport à quels critères contrôler la validité des actifs lorsque cette stratégie personnalisée est en vigueur :

public Result test() {
L'objet de résultat retourne le statut général du test de conformité conduit par la stratégie en utilisant la syntaxe suivante :
Statut du résultat = new Result(this)

L'accesseur de manifeste vous donne accès à toutes les parties du manifeste de l'actif. Les détails sur l'artefact donnent la liste de tous les artefacts dans l'actif :

ArtifactDetails artifactDetails = getManifestAccessor().getArtifactDetails();
if (artifactDetails != null) { 			
 List artifacts = artifactDetails.getArtifactDetails();  			

Le code suivant contrôle la validité des artefacts :

validateArtifacts(status, artifacts); 
}		

Si aucun artefact ne contient d'erreur, définissez un message de conformité général :

if(status.getReturnCode() != ResultDetail.ERROR){
	status.setMessage("Vous vous conformez aux standards WS-I");
}

Si des artefacts contiennent des erreurs, affichez un message d'erreur :

else{
			status.setMessage("<font color=\"red\">Vous ne respectez pas les
standards WS-I</font> Pour en savoir plus, consultez notre <a
href=\"www.google.com\">guide de référence des standards.</a>");
		}

		return status;
	}
	
	private void validateWSDL(Result status, InputStream is, ArtifactDetail detail) {
		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\">
                                                Tous les fichiers WSDL doivent
être conformes aux standards WS-I</a>: ");
										message.append (detail.getName());
										message.append ("["+lineNo+"]");
										
										status.addDetail(new ArtifactResultDetail(
													detail, 
													ResultDetail.ERROR,
													message.toString()));										
									}									
								}
								idx+=WSDL_MATCH3.length();
							}
						}
					}
					
				}
			}
		} 
		catch (Throwable e) {}
		finally {
			if (reader!=null) {
				try {
					reader.close();
				} catch (IOException e) {}
			}
		}			
	}

Le code suivant exécute le test de validation sur tous les artefacts contenus dans l'actif :

private void validateArtifacts(Result status, List artifacts) {
		for (int i = 0; i < artifacts.size(); i++) {
			ArtifactDetail artifactDetail = (ArtifactDetail) artifacts.get(i);

Le code suivant valide un artefact et garantit que le nom du fichier termine par wsdl :

if (artifactDetail.getName() != null
	&& artifactDetail.getName().endsWith(".wsdl")) {
			InputStream is = null;
			BufferedReader reader = null;
			try {

Le code suivant tente de valider le contenu de l'artefact :

Artifact artifact = getManifestAccessor().getArtifact(
	artifactDetail.getPath(), artifactDetail.getName());

Le code suivant utilise l'artifactAccessor pour lire le contenu d'un artefact :

is = getArtifactAccessor().getArtifactContent(artifact);
					if (is != null) {
						validateWSDL(status, is, artifactDetail);
					}
				} catch (Throwable e) {
					//imprimer l'exception s'il y en a une
					e.printStackTrace();
				} finally {

Le code suivant ferme le flux d'entrée :

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

Commentaires