Logo Search packages:      
Sourcecode: jaxe version File versions  Download package

String jaxe::SchemaW3C::expressionReguliere ( final Element  sparent,
final int  niveau,
final boolean  modechoice,
final boolean  modevisu,
final boolean  modepasnul,
final int  imodepasnul,
final boolean  modevalid,
final boolean[]  annulable 
) [inline, private]

Expression régulière correspondant au schéma pour un élément parent donné problème 1: l'utilisateur entre les données au fur et à mesure, tout doit donc être facultatif problème 2: jakarta-regexp et les possessive quantifiers n'acceptent pas des expressions comme (a?|b?)? on fait donc des transformations: (a+|b)c -> (a*|b?)?c? (a?|b?)* -> (a|b)* (a?b?c?)* -> (a|b|c)* (modechoice=true) ((a?b*c*)|d?)? -> (((ab*c*)|(b+c*)|(b*c+))|d)? (modepasnul=true) ((a|b)*|c)* -> (a|b|c)*

Parameters:
sparent Element parent dont on cherche l'expression régulière pour le contenu
niveau Niveau d'appel (doit être égal à 1 quand l'appel n'est pas récursif)
modechoice Utilisation d'un choice au lieu d'une sequence pour éviter les doubles annulations
modevisu True si on cherche une expression régulière à afficher pour l'utilisateur
modepasnul Eviter les expressions vides
imodepasnul position d'évaluation, utilisée avec modepasnul
modevalid Pour obtenir une validation stricte au lieu de chercher si une insertion est possible
annulable Tableau de taille 1 dans lequel on renvoie true si une chaîne vide matche

Definition at line 1027 of file SchemaW3C.java.

References chercherPremier(), enfants(), expressionReguliere(), localValue(), prefixeString(), and substExpr().

                                                                                                             {
        //System.out.println("expressionReguliere " + sparent.getNodeName() + " " + niveau +
        //    " modechoice=" + modechoice + " modevisu=" + modevisu + " modepasnul=" +
        //    modepasnul + " " + imodepasnul + " " + modevalid);
        annulable[0] = false;
        final StringBuilder builder = new StringBuilder();
        final String nombalise = sparent.getLocalName();
        if (niveau == 1 && nombalise.equals("element") && !"".equals(sparent.getAttribute("type"))) {
            final String type = sparent.getAttribute("type");
            final String stype = localValue(type);
            final String tns = sparent.lookupNamespaceURI(prefixeString(type));
            final Element ct = chercherPremier(TypeObjetSchema.COMPLEXTYPE, stype, tns);
            if (ct != null)
                builder.append(expressionReguliere(ct, 2, modechoice, modevisu, modepasnul, 0, modevalid, annulable));
        } else if (niveau == 1 && nombalise.equals("element") && !"".equals(sparent.getAttribute("substitutionGroup")) &&
                enfants(sparent, "simpleType").size() == 0 && enfants(sparent, "complexType").size() == 0) {
            final String substitutionGroup = sparent.getAttribute("substitutionGroup");
            final String tns = sparent.lookupNamespaceURI(prefixeString(substitutionGroup));
            final Element refel = chercherPremier(TypeObjetSchema.ELEMENT, localValue(substitutionGroup), tns);
            if (refel != null)
                builder.append(expressionReguliere(refel, 1, modechoice, modevisu, modepasnul, 0, modevalid, annulable));
        } else if (nombalise.equals("group") && !"".equals(sparent.getAttribute("ref"))) {
            final String ref = sparent.getAttribute("ref");
            final String sref = localValue(ref);
            final String tns = sparent.lookupNamespaceURI(prefixeString(ref));
            final String min = sparent.getAttribute("minOccurs");
            final String max = sparent.getAttribute("maxOccurs");
            final Element gr = chercherPremier(TypeObjetSchema.GROUP, sref, tns);
            if (gr != null) {
                boolean nouveaumodechoice = !modevisu && !modepasnul;
                if (!modechoice && nouveaumodechoice && ("".equals(max) || "1".equals(max)))
                    nouveaumodechoice = false;
                final boolean nouveaumodepasnul = ( modepasnul ||
                    (!modevisu && !nouveaumodechoice && "0".equals(min)) );
                builder.append(expressionReguliere(gr, 2, nouveaumodechoice, modevisu, nouveaumodepasnul, 0, modevalid, annulable));
                if ("0".equals(min))
                    annulable[0] = true;
            }
            if ("0".equals(min) && !modechoice && !modepasnul) {
                builder.insert(0, "(");
                if ("".equals(max) || "1".equals(max))
                    builder.append(")?");
                else
                    builder.append(")*");
                if (!modevisu)
                    builder.append("+");
            } else {
                if (!"".equals(max) && !"1".equals(max)) {
                    builder.insert(0, "(");
                    builder.append(")+");
                    if (!modevisu)
                        builder.append("+");
                }
            }
        } else if (nombalise.equals("group") && !"".equals(sparent.getAttribute("name"))) {
            Node item = sparent.getFirstChild();
            final boolean[] annulable2 = new boolean[1];
            annulable[0] = true;
            while (item != null) {
                if (item instanceof Element) {
                    final Element sousb = (Element)item;
                    final String r = expressionReguliere(sousb, 2, modechoice, modevisu, modepasnul, 0, modevalid, annulable2);
                    annulable[0] = annulable[0] && annulable2[0];
                    if (r != null && !"".equals(r)) {
                        builder.append(r);
                        break;
                    }
                }
                item = item.getNextSibling();
            }
        } else if (nombalise.equals("choice") ||
            (!(modevisu || modevalid) && nombalise.equals("sequence") &&
                !"".equals(sparent.getAttribute("maxOccurs")) &&
                !"1".equals(sparent.getAttribute("maxOccurs")))) {
            final String min = sparent.getAttribute("minOccurs");
            final String max = sparent.getAttribute("maxOccurs");
            final boolean max1 = ("".equals(max) || "1".equals(max));
            final boolean nouveaumodechoice = !modevisu && !modepasnul &&
                (!max1 || modechoice) && (max1 || !modevalid);
            final boolean nouveaumodepasnul = ( modepasnul ||
                (!modevisu && !nouveaumodechoice && nombalise.equals("choice") && "0".equals(min)) ||
                (!modevisu && !max1 && modevalid));
            annulable[0] = "0".equals(min);
            final boolean[] annulable2 = new boolean[1];
            Node item = sparent.getFirstChild();
            while (item != null) {
                if (item instanceof Element) {
                    final Element sousb = (Element)item;
                    final String r = expressionReguliere(sousb, 2, nouveaumodechoice, modevisu, nouveaumodepasnul, 0, modevalid, annulable2);
                    annulable[0] = annulable[0] || annulable2[0];
                    if (r != null && !"".equals(r)) {
                        if (builder.length() > 0) {
                            builder.append("|");
                        }
                        builder.append(r);
                    }
                }
                item = item.getNextSibling();
            }
            if (!modechoice && builder.length() > 0) {
                builder.insert(0, "(");
                if (("0".equals(min) || ((nouveaumodepasnul || nouveaumodechoice) && annulable[0])) && !modepasnul) {
                    if ("".equals(max) || "1".equals(max))
                        builder.append(")?");
                    else
                        builder.append(")*");
                    if (!modevisu)
                        builder.append("+");
                } else {
                    if ("".equals(max) || "1".equals(max))
                        builder.append(")");
                    else {
                        builder.append(")+");
                        if (!modevisu)
                            builder.append("+");
                    }
                }
            }
        } else if (nombalise.equals("sequence")) {
            final NodeList lsousb = sparent.getChildNodes();
            if (modepasnul) {
                final boolean[] annulable2 = new boolean[1];
                annulable[0] = true;
                for (int i=imodepasnul; i<lsousb.getLength(); i++) {
                    final Node item = lsousb.item(i);
                    if (item instanceof Element) {
                        final Element sousb = (Element)item;
                        final String r = expressionReguliere(sousb, 2, modechoice, modevisu, false, 0, modevalid, annulable2);
                        annulable[0] = annulable[0] && annulable2[0];
                        builder.append(r);
                    }
                }
                if (annulable[0]) {
                    builder.delete(0, builder.length());
                    for (int i=imodepasnul; i<lsousb.getLength(); i++) {
                        final Node item = lsousb.item(i);
                        if (item instanceof Element) {
                            final Element sousb = (Element)item;
                            final String r1 = expressionReguliere(sousb, 2, modechoice, modevisu, true, 0, modevalid, annulable2);
                            final String r2 = expressionReguliere(sousb, 2, modechoice, modevisu, false, 0, modevalid, annulable2);
                            String r3 = null;
                            String r4 = null;
                            for (int i2=i+1; i2<lsousb.getLength(); i2++) {
                                final Node item2 = lsousb.item(i2);
                                if (item2 instanceof Element) {
                                    final Element sousb2 = (Element)item2;
                                    r3 = expressionReguliere(sparent, 2, modechoice, modevisu, true, i2, modevalid, annulable2);
                                    r4 = expressionReguliere(sparent, 2, modechoice, modevisu, false, i2, modevalid, annulable2);
                                    break;
                                }
                            }
                            if (r3 != null && !"".equals(r3))
                                builder.append("(").append(r1).append(r4).append("|").append(r2).append(r3).append(")");
                            else
                                builder.append(r1);
                            break;
                        }
                    }
                }
            } else {
                annulable[0] = true;
                final boolean[] annulable2 = new boolean[1];
                for (int i=imodepasnul; i<lsousb.getLength(); i++) {
                    final Node item = lsousb.item(i);
                    if (item instanceof Element) {
                        final Element sousb = (Element)item;
                        final String r = expressionReguliere(sousb, 2, modechoice, modevisu, false, 0, modevalid, annulable2);
                        if (modechoice) {
                            if (builder.length() > 0)
                                builder.append("|");
                            builder.append(r);
                        } else {
                            if (!(modevisu || modevalid) && r != null && !annulable2[0] && !"".equals(r)) {
                                annulable2[0] = true;
                                if (r.endsWith(")")) {
                                    builder.append(r);
                                    builder.append("?");
                                } else {
                                    builder.append("(");
                                    builder.append(r);
                                    builder.append(")?");
                                }
                                if (!modevisu)
                                    builder.append("+");
                            } else {
                                if (builder.length() > 0 && modevisu)
                                    builder.append(", ");
                                builder.append(r);
                            }
                        }
                        annulable[0] = annulable[0] && annulable2[0];
                    }
                }
            }
            final String min = sparent.getAttribute("minOccurs");
            if ("0".equals(min))
                annulable[0] = true;
            if (modevisu || modevalid) {
                final String max = sparent.getAttribute("maxOccurs");
                if ("0".equals(min)) {
                    builder.insert(0, "(");
                    if ("".equals(max) || "1".equals(max))
                        builder.append(")?");
                    else
                        builder.append(")*");
                    if (!modevisu)
                        builder.append("+");
                } else {
                    if (!"".equals(max) && !"1".equals(max)) {
                        builder.insert(0, "(");
                        builder.append(")+");
                        if (!modevisu)
                            builder.append("+");
                    }
                }
            }
        } else if (nombalise.equals("complexType") || nombalise.equals("complexContent")) {
            Node item = sparent.getFirstChild();
            while (item != null) {
                if (item instanceof Element) {
                    final Element sousb = (Element)item;
                    final String r = expressionReguliere(sousb, 2, modechoice, modevisu, modepasnul, 0, modevalid, annulable);
                    if (r != null && !"".equals(r)) {
                        builder.append(r);
                    }
                }
                item = item.getNextSibling();
            }
        } else if (nombalise.equals("element") && niveau == 2) {
            final String sname = sparent.getAttribute("name");
            if (!"".equals(sname))
                builder.append(substExpr(sparent, sname, modevisu, modechoice));
            else if (!"".equals(sparent.getAttribute("ref"))) {
                final String ref = sparent.getAttribute("ref");
                final String sref = localValue(ref);
                final String tns = sparent.lookupNamespaceURI(prefixeString(ref));
                final Element refel = chercherPremier(TypeObjetSchema.ELEMENT, sref, tns);
                if (refel != null)
                    builder.append(substExpr(refel, sref, modevisu, modechoice));
                else
                    LOG.error(
                            "expressionReguliere(Element, int, boolean, boolean, boolean, int, boolean) - référence non trouvée: "
                                    + sref);
            }
            if (builder.length() > 0) {
                final String min = sparent.getAttribute("minOccurs");
                final String max = sparent.getAttribute("maxOccurs");
                annulable[0] = "0".equals(min);
                if ("0".equals(min) && !modechoice && !modepasnul) {
                    if (!modevisu) {
                        builder.insert(0, "(");
                        builder.append(")");
                    }
                    if ("".equals(max) || "1".equals(max))
                        builder.append("?");
                    else
                        builder.append("*");
                    if (!modevisu)
                        builder.append("+");
                } else {
                    if (!"".equals(max) && !"1".equals(max)) {
                        if (!modevisu) {
                            builder.insert(0, "(");
                            builder.append(")");
                        }
                        builder.append("+");
                        if (!modevisu)
                            builder.append("+");
                    }
                }
            }
        } else if (nombalise.equals("any")) {
            // impossible de sélectionner des espaces de noms particuliers => on autorise tout
            final String min = sparent.getAttribute("minOccurs");
            final String max = sparent.getAttribute("maxOccurs");
            if (!"".equals(max) && !"1".equals(max)) {
                if ("0".equals(min))
                    builder.append(".*");
                else
                    builder.append(".+");
            } else {
                if (!modevisu)
                    builder.append("[^,]+,");
                else
                    builder.append(".+");
            }
            annulable[0] = "0".equals(min);
        } else if (nombalise.equals("all")) {
            // impossible de faire une expression régulière correspondante => on autorise (a|b|...|z)+
            final boolean nouveaumodechoice = !modevisu && !modepasnul;
            annulable[0] = true;
            final boolean[] annulable2 = new boolean[1];
            Node item = sparent.getFirstChild();
            while (item != null) {
                if (item instanceof Element) {
                    final Element sousb = (Element)item;
                    final String r = expressionReguliere(sousb, 2, nouveaumodechoice, modevisu, modepasnul, 0, modevalid, annulable2);
                    annulable[0] = annulable[0] && annulable2[0];
                    if (r != null && !"".equals(r)) {
                        if (builder.length() > 0) {
                            builder.append("|");
                        }
                        builder.append(r);
                    }
                }
                item = item.getNextSibling();
            }
            builder.insert(0, "(");
            builder.append(")+");
            if (!modevisu)
                builder.append("+");
            
        } else {
            final boolean[] annulable2 = new boolean[1];
            annulable[0] = true;
            if (nombalise.equals("extension") && !"".equals(sparent.getAttribute("base"))) {
                final String base = sparent.getAttribute("base");
                final String tns = sparent.lookupNamespaceURI(prefixeString(base));
                final String sbase = localValue(base);
                final Element ct = chercherPremier(TypeObjetSchema.COMPLEXTYPE, sbase, tns);
                if (ct != null) {
                    builder.append(expressionReguliere(ct, 2, modechoice, modevisu, modepasnul, 0, modevalid, annulable2));
                    annulable[0] = annulable[0] && annulable2[0];
                }
            }
            String regexp2 = null;
            Node item = sparent.getFirstChild();
            while (item != null) {
                if (item instanceof Element) {
                    final Element sousb = (Element)item;
                    if (!"annotation".equals(sousb.getLocalName())) {
                        regexp2 = expressionReguliere(sousb, 2, modechoice, modevisu, modepasnul, 0, modevalid, annulable2);
                        annulable[0] = annulable[0] && annulable2[0];
                        break;
                    }
                }
                item = item.getNextSibling();
            }
            if (regexp2 != null && !"".equals(regexp2)) {
                if (builder.length() > 0 && modevisu) {
                    builder.append(", ");
                }
                builder.append(regexp2);
            }
        }
//        System.out.println("-> " + builder.toString());
        return(builder.toString());
    }


Generated by  Doxygen 1.6.0   Back to index