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() {
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;
}
}