[ 
https://issues.apache.org/jira/browse/JAXME-93?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Tobias Hühner updated JAXME-93:
-------------------------------

    Attachment: view_Jaxme.patch

patch

> union statements as views
> -------------------------
>
>                 Key: JAXME-93
>                 URL: https://issues.apache.org/jira/browse/JAXME-93
>             Project: JaxMe
>          Issue Type: Improvement
>          Components: JaxMeJS
>            Reporter: Tobias Hühner
>         Attachments: view_Jaxme.patch
>
>
> Index: 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SelectCombinationStatementImpl.java
> ===================================================================
> --- 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SelectCombinationStatementImpl.java
>        (revision 567598)
> +++ 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SelectCombinationStatementImpl.java
>        (working copy)
> @@ -7,6 +7,7 @@
>  import org.apache.ws.jaxme.sqls.SQLFactory;
>  import org.apache.ws.jaxme.sqls.SelectCombinationStatement;
>  import org.apache.ws.jaxme.sqls.SelectStatement;
> +import org.apache.ws.jaxme.sqls.Table;
>  
>  
>  /**
> @@ -24,6 +25,17 @@
>      }
>  
>      public Iterator getSelectStatements() {
> -        return statements.iterator();
> +        if(statements.isEmpty()){
> +                     throw new IllegalStateException("No Statement 
> defined"); 
> +        }
> +     return statements.iterator();
>      }
> +    
> +     public Table createView(Table.Name pName) {
> +             return getSQLFactory().getObjectFactory().newView(this,pName);
> +     }
> +
> +     public Table createView(String pName) {
> +         return createView(pName == null ? null : new 
> TableImpl.NameImpl(pName));
> +     }
>  }
> Index: 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SelectCombinationViewImpl.java
> ===================================================================
> --- 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SelectCombinationViewImpl.java
>     (revision 0)
> +++ 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SelectCombinationViewImpl.java
>     (revision 0)
> @@ -0,0 +1,126 @@
> +package org.apache.ws.jaxme.sqls.impl;
> +
> +
> +import java.util.ArrayList;
> +import java.util.Iterator;
> +import java.util.List;
> +
> +import org.apache.ws.jaxme.sqls.Column;
> +import org.apache.ws.jaxme.sqls.ColumnReference;
> +import org.apache.ws.jaxme.sqls.DeleteStatement;
> +import org.apache.ws.jaxme.sqls.ForeignKey;
> +import org.apache.ws.jaxme.sqls.Index;
> +import org.apache.ws.jaxme.sqls.InsertStatement;
> +import org.apache.ws.jaxme.sqls.SelectCombinationStatement;
> +import org.apache.ws.jaxme.sqls.SelectStatement;
> +import org.apache.ws.jaxme.sqls.Table;
> +import org.apache.ws.jaxme.sqls.UpdateStatement;
> +import org.apache.ws.jaxme.sqls.Column.Type;
> +
> +public class SelectCombinationViewImpl extends TableImpl implements Table {
> +     private final SelectCombinationStatement statement;
> +
> +     protected SelectCombinationViewImpl(SelectCombinationStatement 
> pStatement, Name pName) {
> +             
> super((getFirstStatement(pStatement)).getTableReference().getTable().getSchema(),
> +                             pName == null ? 
> (getFirstStatement(pStatement)).getTableReference().getTable().getName() : 
> pName);
> +             statement = pStatement;
> +     }
> +
> +     private static SelectStatement 
> getFirstStatement(SelectCombinationStatement pStatement) {
> +             return (SelectStatement)pStatement.getSelectStatements().next();
> +     }
> +
> +     public final SelectCombinationStatement getSelectCombinationStatement() 
> {
> +             return statement;
> +     }
> +    private class ViewColumnImpl implements Column {
> +        private final Column.Name colName;
> +        private final Column col;
> +        private Object data;
> +        private ViewColumnImpl(ColumnReference pColumn) {
> +            col = pColumn.getColumn();
> +            Column.Name alias = pColumn.getAlias();
> +            colName = alias == null ? col.getName() : alias;
> +        }
> +        public Table getTable() { return SelectCombinationViewImpl.this; }
> +        public Name getName() { return colName; }
> +        public String getQName() { return getTable() + "." + getName(); }
> +        public Type getType() { return col.getType(); }
> +        public boolean isPrimaryKeyPart() { return false; }
> +        public void setNullable(boolean pNullable) {
> +            throw new IllegalStateException("Unable to set a view columns 
> 'Nullable' property.");
> +        }
> +        public boolean isNullable() { return col.isNullable(); }
> +        public boolean isStringColumn() { return col.isStringColumn(); }
> +        public boolean isBinaryColumn() { return col.isBinaryColumn(); }
> +        public void setCustomData(Object pData) { data = pData; }
> +        public Object getCustomData() { return data; }
> +        public boolean isVirtual() { return false; }
> +    }
> +
> +    public Iterator getColumns() {
> +        List result = new ArrayList();
> +        for (Iterator iter = 
> getFirstStatement(statement).getResultColumns();  iter.hasNext();  ) {
> +            ColumnReference col = (ColumnReference) iter.next();
> +            result.add(new ViewColumnImpl(col));
> +        }
> +        return result.iterator();
> +    }
> +
> +    public Column getColumn(Column.Name pName) {
> +        if (pName == null) {
> +            throw new NullPointerException("Column names must not be null.");
> +         }
> +        for (Iterator iter = 
> getFirstStatement(statement).getResultColumns();  iter.hasNext();  ) {
> +            ColumnReference col = (ColumnReference) iter.next();
> +            Column.Name alias = col.getAlias();
> +            if (alias == null) {
> +             alias = col.getColumn().getName();
> +            }
> +            if (alias.equals(pName)) {
> +                return new ViewColumnImpl(col);
> +            }
> +        }
> +        return null;
> +    }
> +     
> +    public Column newColumn(Column.Name pName, Type pType) {
> +        throw new IllegalStateException("A views columns cannot be 
> changed.");
> +    }
> +
> +    public Column newColumn(String pName, Type pType) {
> +        throw new IllegalStateException("A views columns cannot be 
> changed.");
> +    }
> +
> +    public Index newKey() {
> +        throw new IllegalStateException("A view cannot have keys.");
> +    }
> +    public Index newIndex() {
> +        throw new IllegalStateException("A view cannot have indexes.");
> +    }
> +    public Index newPrimaryKey() {
> +        throw new IllegalStateException("A view cannot have a primary key.");
> +    }
> +    public ForeignKey newForeignKey(Table pReferencedTable) {
> +        throw new IllegalStateException("A view cannot have foreign keys.");
> +    }
> +    public InsertStatement getInsertStatement() {
> +        throw new IllegalStateException("A view is not updateable.");
> +    }
> +    public UpdateStatement getUpdateStatement() {
> +        throw new IllegalStateException("A view is not updateable.");
> +    }
> +    public DeleteStatement getDeleteStatement() {
> +        throw new IllegalStateException("A view is not updateable.");
> +    }
> +    public Index getPrimaryKey() {
> +        throw new IllegalStateException("A view cannot have a primary key.");
> +    }
> +    public Iterator getIndexes() {
> +        throw new IllegalStateException("A view cannot have indexes.");
> +    }
> +    public Iterator getForeignKeys() {
> +        throw new IllegalStateException("A view cannot have foreign keys.");
> +    }
> +
> +}
> Index: 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/ObjectFactoryImpl.java
> ===================================================================
> --- 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/ObjectFactoryImpl.java
>     (revision 567598)
> +++ 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/ObjectFactoryImpl.java
>     (working copy)
> @@ -32,6 +32,7 @@
>  import org.apache.ws.jaxme.sqls.Table;
>  import org.apache.ws.jaxme.sqls.TableReference;
>  import org.apache.ws.jaxme.sqls.CombinedConstraint.Type;
> +import org.apache.ws.jaxme.sqls.Table.Name;
>  
>  
>  /** <p>Default implementation of the object factory.</p>
> @@ -58,6 +59,12 @@
>      public Table newView(SelectStatement pSelectStatement, Table.Name pName) 
> {
>          return new ViewImpl(pSelectStatement, pName);
>      }
> +     
> +    public Table newView(
> +                     SelectCombinationStatementImpl 
> selectCombinationStatementImpl,
> +                     Name name) {
> +             return new 
> SelectCombinationViewImpl(selectCombinationStatementImpl,name);
> +     }
>  
>      public CombinedConstraint newCombinedConstraint(ConstrainedStatement 
> pStatement, Type pType) {
>          return new CombinedConstraintImpl(pStatement, pType);
> @@ -74,4 +81,5 @@
>       public Expression createExpression(Statement pStatement, 
> org.apache.ws.jaxme.sqls.Expression.Type pType) {
>               return new ExpressionImpl(pStatement, pType);
>       }
> +
>  }
> Index: 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SQLGeneratorImpl.java
> ===================================================================
> --- 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SQLGeneratorImpl.java
>      (revision 567598)
> +++ 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/SQLGeneratorImpl.java
>      (working copy)
> @@ -592,6 +592,9 @@
>          if (t instanceof ViewImpl) {
>              ViewImpl v = (ViewImpl) t;
>              tableName = "(" + getSelectQuery(v.getViewStatement(), pData) + 
> ")";
> +        } else if (t instanceof SelectCombinationViewImpl) {
> +             SelectCombinationViewImpl view = (SelectCombinationViewImpl) t;
> +             tableName = "(" + 
> getQuery(view.getSelectCombinationStatement()) + ")";
>          } else {
>              tableName = pTable.getTable().getQName();
>          }
> @@ -1034,6 +1037,11 @@
>              checkSameStructure(first, other);
>              sb.append(' ');
>              sb.append(pSep);
> +            if(pStatement instanceof UnionStatement) {
> +             if(((UnionStatement)pStatement).isAll(other)){
> +                    sb.append(" ALL");
> +             }
> +            };
>              sb.append(" (");
>              sb.append(getQuery(other));
>              sb.append(')');
> @@ -1052,9 +1060,7 @@
>          } else if (pStatement instanceof SelectStatement) {
>              s = getSelectQuery((SelectStatement) pStatement);
>          } else if (pStatement instanceof UnionStatement) {
> -            final UnionStatement us = (UnionStatement) pStatement;
> -            final boolean all = us.isAll();
> -            s = getSelectCombinationStatement(us, all ? "UNION ALL" : 
> "UNION");
> +            s = getSelectCombinationStatement((UnionStatement) pStatement, 
> "UNION");
>          } else if (pStatement instanceof IntersectionStatement) {
>              s = getSelectCombinationStatement((IntersectionStatement) 
> pStatement, "INTERSECT");
>          } else if (pStatement instanceof MinusStatement) {
> Index: 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/UnionStatementImpl.java
> ===================================================================
> --- 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/UnionStatementImpl.java
>    (revision 567598)
> +++ 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/impl/UnionStatementImpl.java
>    (working copy)
> @@ -1,6 +1,9 @@
>  package org.apache.ws.jaxme.sqls.impl;
>  
> +import java.util.HashMap;
> +
>  import org.apache.ws.jaxme.sqls.SQLFactory;
> +import org.apache.ws.jaxme.sqls.SelectStatement;
>  import org.apache.ws.jaxme.sqls.UnionStatement;
>  
>  
> @@ -8,17 +11,28 @@
>   * Default implementation of [EMAIL PROTECTED] UnionStatement}.
>   */
>  public class UnionStatementImpl extends SelectCombinationStatementImpl 
> implements UnionStatement {
> -    private boolean all;
> -    
> +     private final HashMap all = new HashMap(); 
> +     private boolean first = true;
> +     
>      protected UnionStatementImpl(SQLFactory pFactory) {
>          super(pFactory);
>      }
>  
> -    public boolean isAll() {
> -        return all;
> -    }
> +     public void addStatement(SelectStatement statement, boolean pAll) {
> +             if(first && pAll){
> +                     throw new IllegalArgumentException(" pAll=true for 
> first Statement is not allowed");
> +             }
> +             super.addStatement(statement);
> +             all.put(statement,new Boolean(pAll));
> +             first = false;
> +     }
> +     
> +     public void addStatement(SelectStatement statement) {
> +             addStatement(statement,false);
> +     }
>  
> -    public void setAll(boolean pAll) {
> -        all = pAll;
> -    }
> +     public boolean isAll(SelectStatement statement) {
> +             return ((Boolean)all.get(statement)).booleanValue();
> +     }
> +
>  }
> Index: 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/SelectCombinationStatement.java
> ===================================================================
> --- 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/SelectCombinationStatement.java
>         (revision 567598)
> +++ 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/SelectCombinationStatement.java
>         (working copy)
> @@ -7,10 +7,9 @@
>   * Common base interface for [EMAIL PROTECTED] UnionStatement}, and
>   * [EMAIL PROTECTED] IntersectionStatement}.
>   */
> -public interface SelectCombinationStatement extends Statement {
> +public interface SelectCombinationStatement extends Statement, 
> ViewableStatement {
>      /**
> -     * Adds a select statement to the given "union", or
> -     * "intersection" statement.
> +     * Adds a select statement to the given "union", "intersection", or 
> "minus" statement.
>       */
>      void addStatement(SelectStatement pStatement);
>  
> @@ -18,4 +17,5 @@
>       * Returns an iterator over all the select statements.
>       */
>      Iterator getSelectStatements();
> +
>  }
> Index: 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/ObjectFactory.java
> ===================================================================
> --- 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/ObjectFactory.java
>      (revision 567598)
> +++ 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/ObjectFactory.java
>      (working copy)
> @@ -16,6 +16,8 @@
>  package org.apache.ws.jaxme.sqls;
>  
>  import org.apache.ws.jaxme.sqls.Expression.Type;
> +import org.apache.ws.jaxme.sqls.Table.Name;
> +import org.apache.ws.jaxme.sqls.impl.SelectCombinationStatementImpl;
>  
>  
>  /** A factory object for creating all the objects used by
> @@ -46,6 +48,16 @@
>       */
>      public Table newView(SelectStatement pSelectStatement, Table.Name pName);
>  
> +    /** Returns an instance of
> +     * [EMAIL PROTECTED] org.apache.ws.jaxme.sqls.Table}, which allows to 
> embed
> +     * the given instance of
> +     * [EMAIL PROTECTED] 
> org.apache.ws.jaxme.sqls.SelectCombinationStatement} into another
> +     * SELECT statement.
> +     */
> +    public Table newView(
> +                     SelectCombinationStatementImpl 
> selectCombinationStatementImpl,
> +                     Name name);
> +
>      /** Creates a new instance of
>       * [EMAIL PROTECTED] org.apache.ws.jaxme.sqls.Constraint} constraining
>       * the given [EMAIL PROTECTED] 
> org.apache.ws.jaxme.sqls.ConstrainedStatement}.
> @@ -64,4 +76,5 @@
>       /** Creates a new instance of [EMAIL PROTECTED] Expression}.
>        */
>       public Expression createExpression(Statement pStatement, Type sum);
> +
>  }
> Index: 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/SelectStatement.java
> ===================================================================
> --- 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/SelectStatement.java
>    (revision 567598)
> +++ 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/SelectStatement.java
>    (working copy)
> @@ -23,7 +23,7 @@
>   *
>   * @author <a href="mailto:[EMAIL PROTECTED]">Jochen Wiedmann</a>
>   */
> -public interface SelectStatement extends ConstrainedStatement {
> +public interface SelectStatement extends 
> ConstrainedStatement,ViewableStatement {
>       /** Provides a single column for an <code>ORDER BY</code>
>       * clause.
>        */
> @@ -111,14 +111,4 @@
>      */
>     public int getSkippedRows();
>  
> -   /** <p>Creates a view, which may be used to embed the statement into
> -    * a separate query.</p>
> -    */
> -   public Table createView(Table.Name pName);
> -
> -
> -   /** <p>Creates a view, which may be used to embed the statement into
> -    * a separate query.</p>
> -    */
> -   public Table createView(String pName);
>  }
> Index: 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/junit/CreateTest.java
> ===================================================================
> --- 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/junit/CreateTest.java
>   (revision 567598)
> +++ 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/junit/CreateTest.java
>   (working copy)
> @@ -458,7 +458,7 @@
>               assertEquals(expect, got);
>       }
>  
> -     /** Test for UNION and UNION ALL.
> +     /** Test for UNION.
>        */
>       public void testUnion() {
>          UnionStatement us = getSQLFactory().newUnionStatement();
> @@ -467,7 +467,23 @@
>          String got = gen.getQuery(us);
>          String expect = "(SELECT MyIndex, MyName, MyDate FROM 
> MySchema.MyTable WHERE 'MyIndex'>5) UNION (SELECT MyIndex, MyName, MyDate 
> FROM MySchema.MyTable WHERE 'MyName' LIKE 'x%')";
>          assertEquals(expect, got);
> -        us.setAll(true);
> +     }
> +     /** Test for UNION ALL.
> +      */
> +     public void testUnionAll() {
> +        UnionStatement us = getSQLFactory().newUnionStatement();
> +         Table t = getBasicTable();
> +             SelectStatement st1 = t.getSelectStatement();
> +             SelectStatement st2 = t.getSelectStatement();
> +             BooleanConstraint bc1 = st1.getWhere().createGT();
> +             bc1.addPart("MyIndex");
> +             bc1.addPart(5);
> +             BooleanConstraint bc2 = st2.getWhere().createLIKE();
> +             bc2.addPart("MyName");
> +             bc2.addPart("x%");
> +             us.addStatement(st1);
> +             us.addStatement(st2,true);
> +        SQLGenerator gen = getSQLGenerator();
>          String gotAll = gen.getQuery(us);
>          String expectAll = "(SELECT MyIndex, MyName, MyDate FROM 
> MySchema.MyTable WHERE 'MyIndex'>5) UNION ALL (SELECT MyIndex, MyName, MyDate 
> FROM MySchema.MyTable WHERE 'MyName' LIKE 'x%')";
>          assertEquals(expectAll, gotAll);
> @@ -516,4 +532,21 @@
>              // Ok
>          }
>      }
> +
> +     /** Test for UNION and UNION ALL.
> +      */
> +     public void testUnionView() {
> +        UnionStatement us = getSQLFactory().newUnionStatement();
> +         createSelectCombinationStatement(us);
> +         Table view = us.createView((String)null);
> +         // SelectStatemnt st = SELECT * FROM view ...
> +         SelectStatement st = getSQLFactory().newSelectStatement();
> +         st.setTable(view);
> +         
> +         SQLGenerator gen = getSQLGenerator();
> +        String got = gen.getQuery(st);
> +        String expect = "SELECT * FROM ((SELECT MyIndex, MyName, MyDate FROM 
> MySchema.MyTable WHERE 'MyIndex'>5) UNION (SELECT MyIndex, MyName, MyDate 
> FROM MySchema.MyTable WHERE 'MyName' LIKE 'x%'))";
> +        assertEquals(expect, got);
> +     }
> +
>  }
> Index: 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/UnionStatement.java
> ===================================================================
> --- 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/UnionStatement.java
>     (revision 567598)
> +++ 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/UnionStatement.java
>     (working copy)
> @@ -6,14 +6,15 @@
>   */
>  public interface UnionStatement extends SelectCombinationStatement {
>      /**
> +     * Adds a select statement to the given "union", "intersection", or 
> "minus" statement.
>       * Sets, whether this is a "union all" statement. By default,
>       * it isn't.
>       */
> -    void setAll(boolean pAll);
> -
> +    void addStatement(SelectStatement pStatement,boolean all);
> +    
>      /**
> -     * Returns, whether this is a "union all" statement. By default,
> -     * it isn't.
> +     * is 'union all' Statement
>       */
> -    boolean isAll();
> +    boolean isAll(SelectStatement pStatement);
> +
>  }
> Index: 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/ViewableStatement.java
> ===================================================================
> --- 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/ViewableStatement.java
>  (revision 0)
> +++ 
> D:/projekte/justus/ws-jaxme-0.5.3-SNAPSHOT/src/js/org/apache/ws/jaxme/sqls/ViewableStatement.java
>  (revision 0)
> @@ -0,0 +1,18 @@
> +package org.apache.ws.jaxme.sqls;
> +
> +/**
> + * this interface describe the potential use as view for a statement
> + */
> +public interface ViewableStatement {
> +
> +     /** <p>Creates a view, which may be used to embed the statement into
> +      * a separate query.</p>
> +      */
> +     public abstract Table createView(Table.Name pName);
> +
> +     /** <p>Creates a view, which may be used to embed the statement into
> +      * a separate query.</p>
> +      */
> +     public abstract Table createView(String pName);
> +
> +}
> \ No newline at end of file

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to