public void CustomSIFElementEncoding()
        {
            SIF_Query q = new SIF_Query();
            q.SIF_QueryObject = new SIF_QueryObject( StudentDTD.STUDENTPERSONAL.Name );
            SIF_Conditions conditions = new SIF_Conditions( ConditionType.NONE );
            conditions.AddSIF_Condition( "Name[@Type=\"05\"]/LastName", Operators.EQ, "Cookie" );
            q.SetSIF_ConditionGroup( ConditionType.NONE, conditions );

            string xml;
            using ( StringWriter w = new StringWriter() )
            {
                SifWriter writer = new SifWriter( w );
                writer.Write( q );
                writer.Flush();
                writer.Close();
                xml = w.ToString();
            }

            Console.WriteLine( xml );
            // Mainly, just check to make sure that the single quotes didn't get encoded
            int index = xml.IndexOf( """ );
            Assert.AreEqual( -1, index, "Single quotes should not be encoded" );
        }
        public void testPersistenceWithBadState()
        {
            //create new cache for agent
            RequestCache cache = RequestCache.GetInstance(fAgent);

            //create new queryobject
            SIF_QueryObject obj = new SIF_QueryObject("");
            //create query, telling it what type of query it is(passing it queryobj)
            SIF_Query query = new SIF_Query(obj);
            //create new sif request
            SIF_Request request = new SIF_Request();
            //set query property
            request.SIF_Query = query;

            Query q = new Query(StudentDTD.STUDENTPERSONAL);

            String testStateItem = Adk.MakeGuid();
            String requestMsgId = Adk.MakeGuid();
            String testObjectType = Adk.MakeGuid();

            TestState ts = new TestState();
            ts.State = testStateItem;
            ts.setCreateErrorOnRead(true);

            q.UserData = ts;
            storeRequest(cache, request, q, requestMsgId, testObjectType);

            cache.Close();

            // Create a new instance. This one should retrieve its settings from the persistence mechanism
            cache = RequestCache.GetInstance(fAgent);

            IRequestInfo ri = cache.GetRequestInfo(requestMsgId, null);

            //if state is null, should still return ri object
            Assertion.AssertNotNull("RequestInfo was null", ri);
            Assertion.AssertEquals("MessageId", requestMsgId, ri.MessageId);
            Assertion.AssertEquals("ObjectType", testObjectType, ri.ObjectType);
            ts = (TestState) ri.UserData;
            // In order for this to be a valid test, the TestState class should have thrown
            // an exception during deserialization and should be null here.
            Assertion.AssertNull("UserData should be null", ts);
        }
        /**
           * Stores the items in the cache that will later be asserted
           * @param cache
           */
        private void storeAssertedRequests(RequestCache cache)
        {
            SIF_QueryObject obj = new SIF_QueryObject("");
            SIF_Query query = new SIF_Query(obj);
            SIF_Request request = new SIF_Request();
            request.SIF_Query = query;

            Query q;
            TestState ts;

            fMsgIds = new String[10];
            fStateObjects = new String[10];
            // Add 10 entries to the cache, interspersed with other entries that are removed
            for (int i = 0; i < 10; i++)
            {
                ts = new TestState();
                ts.State = Adk.MakeGuid();
                fStateObjects[i] = ts.State;
                q = new Query(StudentDTD.STUDENTPERSONAL);
                q.UserData = ts;

                String phantom1 = Adk.MakeGuid();
                String phantom2 = Adk.MakeGuid();
                storeRequest(cache, request, q, phantom1, "foo");
                fMsgIds[i] = Adk.MakeGuid();

                storeRequest(cache, request, q, fMsgIds[i], "Object_" + i.ToString());
                storeRequest(cache, request, q, phantom2, "bar");

                cache.GetRequestInfo(phantom1, null);
                cache.GetRequestInfo(phantom2, null);
            }
        }
        public void testWithLegacyFile()
        {
            //assertStoredRequests(fRC, true);
            // Copy the legacy requests.adk file to the agent work directory
            //FileInfo legacyFile = new FileInfo("requests.adk");

            //Assertion.Assert("Saved legacy file does [not?] exist", legacyFile.Exists);
            //FileInfo copiedFile = new FileInfo(fAgent.HomeDir + Path.DirectorySeparatorChar + "work" + Path.DirectorySeparatorChar + "requests.adk");
            //if (copiedFile.Exists)
            //{
            //   copiedFile.Delete();
            //}

            //// Copy the file
            //legacyFile.CopyTo(copiedFile.FullName, true);

            // Now open up an instance of the request cache and verify that the contents are there

            fRC = RequestCache.GetInstance(fAgent);
            SIF_QueryObject obj = new SIF_QueryObject("");
            SIF_Query query = new SIF_Query(obj);
            SIF_Request request = new SIF_Request();
            request.SIF_Query = query;

            Query q;
            TestState ts;

            fMsgIds = new String[10];
            fStateObjects = new String[10];
            // Add 10 entries to the cache
            for (int i = 0; i < 10; i++)
            {
                ts = new TestState();
                ts.State = Adk.MakeGuid();
                fStateObjects[i] = (String) ts.State;
                q = new Query(StudentDTD.STUDENTPERSONAL);
                q.UserData = ts;
                fMsgIds[i] = Adk.MakeGuid();
                storeRequest(fRC, request, q, fMsgIds[i], "Object_" + i.ToString());
            }

            Assertion.AssertEquals("Active request count", 10, fRC.ActiveRequestCount);

            // Lookup each setting,
            for (int i = 0; i < 10; i++)
            {
                IRequestInfo reqInfo = fRC.LookupRequestInfo(fMsgIds[i], null);
                Assertion.AssertEquals("Initial lookup", "Object_" + i.ToString(), reqInfo.ObjectType);
            }

            // Lookup each setting,
            for (int i = 0; i < 10; i++)
            {
                IRequestInfo reqInfo = fRC.GetRequestInfo(fMsgIds[i], null);
                Assertion.AssertEquals("Initial lookup", "Object_" + i.ToString(), reqInfo.ObjectType);
            }

            // all messages should now be removed from the queue
            Assertion.AssertEquals("Cache should be empty", 0, fRC.ActiveRequestCount);

            // Now run one of our other tests
            testPersistence();
        }
        public void testPersistenceWithRemoval()
        {
            fRC = RequestCache.GetInstance(fAgent);
            SIF_QueryObject obj = new SIF_QueryObject("");
            SIF_Query query = new SIF_Query(obj);
            SIF_Request request = new SIF_Request();

            request.SIF_Query = query;

            Query q = new Query(StudentDTD.STUDENTPERSONAL);
            String testStateItem = Adk.MakeGuid();
            TestState ts = new TestState();
            ts.State = testStateItem;
            q.UserData = ts;

            fMsgIds = new String[10];
            // Add 10 entries to the cache, interspersed with other entries that are removed
            for (int i = 0; i < 10; i++)
            {
                String phantom1 = Adk.MakeGuid();
                String phantom2 = Adk.MakeGuid();
                storeRequest(fRC, request, q, phantom1, "foo");
                fMsgIds[i] = Adk.MakeGuid();
                storeRequest(fRC, request, q, fMsgIds[i], "Object_" + i);
                storeRequest(fRC, request, q, phantom2, "bar");

                fRC.GetRequestInfo(phantom1, null);
                fRC.GetRequestInfo(phantom2, null);
            }

            // remove every other entry, close, re-open and assert that the correct entries are there
            for (int i = 0; i < 10; i += 2)
            {
                fRC.GetRequestInfo(fMsgIds[i], null);
            }

            Assertion.AssertEquals("Before closing Should have five objects", 5, fRC.ActiveRequestCount);
            fRC.Close();

            // Create a new instance. This one should retrieve its settings from the persistence mechanism
            fRC = RequestCache.GetInstance(fAgent);
            Assertion.AssertEquals("After Re-Openeing Should have five objects", 5, fRC.ActiveRequestCount);
            for (int i = 1; i < 10; i += 2)
            {
                IRequestInfo cachedInfo = fRC.GetRequestInfo(fMsgIds[i], null);
                Assertion.AssertNotNull("No cachedID returned for " + i, cachedInfo);
            }
            Assertion.AssertEquals("Should have zero objects", 0, fRC.ActiveRequestCount);
        }
        // TODO: Implement
        /*
        [Test]
        public void testReportPublishSIFExceptionAfterReportInfo()
        {
        ElementDef objType = SifDtd.SIF_REPORTOBJECT;
        ErrorMessageHandler handler = new ErrorMessageHandler( ErrorMessageHandler.BVR_SET_REPORT_INFO_THROW_EXCEPTION );
        fZone.setReportPublisher( handler, ADKFlags.PROV_NONE);

        TestProtocolHandler testProto = new TestProtocolHandler();
        testProto.open(fZone);
        MessageDispatcher testDispatcher = new MessageDispatcher( fZone );
        fZone.setDispatcher(testDispatcher);
        fZone.setProto(testProto);
        testDispatcher.dispatch( createSIF_Request( objType, ADK.makeGUID(), fZone ) );
        String msg = testProto.readMsg();
        assertNull(testProto.readMsg());
        fZone.log.info(msg);

        SIFParser parser = SIFParser.newInstance();
        SIFElement element = parser.parse(new StringReader(msg), fZone);
        assertTrue(element instanceof SIF_Response);
        SIF_Response response = (SIF_Response) element;
        assertTrue(response.getSIF_Error() != null);
        assertTrue(response.getSIF_Error().getSIF_Desc().startsWith("Blah"));
         }

        public void testReportPublishSIFExceptionAfterReportInfo() throws ADKException, IOException
         {
        ElementDef objType = SifDtd.SIF_REPORTOBJECT;
        ErrorMessageHandler handler = new ErrorMessageHandler( ErrorMessageHandler.BVR_SET_REPORT_INFO_THROW_EXCEPTION );
        fZone.setReportPublisher( handler, ADKFlags.PROV_NONE);

        TestProtocolHandler testProto = new TestProtocolHandler();
        testProto.open(fZone);
        MessageDispatcher testDispatcher = new MessageDispatcher( fZone );
        fZone.setDispatcher(testDispatcher);
        fZone.setProto(testProto);
        testDispatcher.dispatch( createSIF_Request( objType, ADK.makeGUID(), fZone ) );
        String msg = testProto.readMsg();
        assertNull(testProto.readMsg());
        fZone.log.info(msg);

        SIFParser parser = SIFParser.newInstance();
        SIFElement element = parser.parse(new StringReader(msg), fZone);
        assertTrue(element instanceof SIF_Response);
        SIF_Response response = (SIF_Response) element;
        assertTrue(response.getSIF_Error() != null);
        assertTrue(response.getSIF_Error().getSIF_Desc().startsWith("Blah"));
         }

        */
        private SIF_Request createSIF_Request(IElementDef objType)
        {
            SIF_Request request = new SIF_Request();
             request.Header.SIF_MsgId = MSG_GUID;
             request.Header.SIF_SourceId = "foo";
             request.SIF_MaxBufferSize = 32768;
             request.AddSIF_Version(new SIF_Version(Adk.SifVersion.ToString()));
             SIF_Query q = new SIF_Query();
             SIF_QueryObject sqo = new SIF_QueryObject();
             sqo.ObjectName = objType.Name;

             q.SIF_QueryObject = sqo;
             request.SIF_Query = q;

             return request;
        }
 ///<summary>Sets the value of the <c>&lt;SIF_QueryGroup&gt;</c> element.</summary>
 /// <param name="SifQuery">A SIF_Query</param>
 ///<remarks>
 /// <para>This form of <c>setSIF_QueryGroup</c> is provided as a convenience method
 /// that is functionally equivalent to the <c>SIF_QueryGroup</c></para>
 /// <para>Version: 2.5</para>
 /// <para>Since: 2.3</para>
 /// </remarks>
 public void SetSIF_QueryGroup( SIF_Query SifQuery )
 {
     RemoveChild( ReportingDTD.REPORTMANIFEST_SIF_QUERYGROUP);
     AddChild( ReportingDTD.REPORTMANIFEST_SIF_QUERYGROUP, new SIF_QueryGroup( SifQuery ) );
 }
        public void testCreateWithSIF_Query()
        {
            SIF_Query q = new SIF_Query( new SIF_QueryObject(
                                             ReportingDTD.STUDENTLOCATOR.Name ) );
            SIF_ConditionGroup scg = new SIF_ConditionGroup();
            scg.SetType( ConditionType.NONE );

            SIF_Condition sifCondition = new SIF_Condition(
                "RequestingAgencyId[@Type=\"School\"]", Operators.EQ, "2001" );
            SIF_Conditions conds = new SIF_Conditions( ConditionType.NONE );
            conds.AddChild( sifCondition );
            scg.AddSIF_Conditions( conds );
            q.SIF_ConditionGroup = scg;

            Query query = new Query( q );

            Assert.IsTrue( query.HasConditions );
            ConditionGroup[] conditions = query.Conditions;
            Assert.AreEqual( 1, conditions.Length, "One Condition Group" );
            Assert.AreEqual( GroupOperator.None, conditions[0].Operator, "None" );
            Condition condition = conditions[0].Conditions[0];
            Assert.AreEqual( "2001", condition.Value, "RequestingAgencyId" );
            Assert.AreEqual( ComparisonOperators.EQ, condition.Operators, "RequestingAgencyId" );
            Assert.AreEqual( ReportingDTD.STUDENTLOCATOR_REQUESTINGAGENCYID, condition.Field, "RequestingAgencyId" );
        }
Exemple #9
0
        /// <summary>  Constructs a Query object from a SIF_QueryObject.
        /// 
        /// This constructor is not typically called by agents but is used internally
        /// by the class framework. The other constructors can be used to safely
        /// create Query instances to request a specific SIF Data Object. Use the
        /// <c>addCondition</c> and <c>setFieldRestrictions</c> methods
        /// to further define the conditions and SIF elements specified by the query.
        /// 
        /// </summary>
        /// <param name="query">A SIF_Query object received in a SIF_Request message
        /// </param>
        /// <exception cref="AdkUnknownOperatorException">If one of the operators in the SIF_Query is
        /// unrecognized by the ADK</exception>
        /// <exception cref="AdkSchemaException">If the object or elements defined in the query or
        /// not recognized by the ADK </exception>
        public Query(SIF_Query query)
        {
            SIF_QueryObject qo = query.SIF_QueryObject;
            if (qo == null)
            {
                throw new ArgumentException("SIF_Query must have a SIF_QueryObject element");
            }

            fObjType = Adk.Dtd.LookupElementDef(qo.ObjectName);
            if (fObjType == null)
            {
                throw new AdkSchemaException
                    (qo.ObjectName +
                      " is not a recognized SIF Data Object, or the agent is not configured to support this object type");
            }
            fRoot = null;

            SIF_ConditionGroup cg = query.SIF_ConditionGroup;
            if (cg != null && cg.GetSIF_Conditionses() != null)
            {
                GroupOperator grpOp;

                try
                {
                    grpOp = Condition.ParseGroupOperator(cg.Type);
                }
                catch (AdkUnknownOperatorException)
                {
                    grpOp = GroupOperator.None;
                }

                fRoot = new ConditionGroup(grpOp);

                SIF_Conditions[] sifConds = cg.GetSIF_Conditionses();

                if (sifConds.Length == 1)
                {
                    //  There is one SIF_ConditionGroup with one SIF_Conditions,
                    //  so just add all of the conditions (no nested groups)
                    string typ = sifConds[0].Type;
                    if (typ == null)
                    {
                        throw new AdkSchemaException
                            ("SIF_Conditions/@Type is a required attribute");
                    }

                    fRoot.fOp = Condition.ParseGroupOperator(typ);
                    SIF_Condition[] clist = sifConds[0].GetSIF_Conditions();
                    PopulateConditions(query, clist, fRoot);
                }
                else
                {
                    //  There are multiple SIF_Conditions, so add each as a nested
                    //  ConditionGroup of the fRoot
                    for (int i = 0; i < sifConds.Length; i++)
                    {
                        ConditionGroup nested =
                            new ConditionGroup(Condition.ParseGroupOperator(sifConds[i].Type));
                        PopulateConditions(query, sifConds[i].GetSIF_Conditions(), nested);
                        fRoot.AddGroup(nested);
                    }
                }
            }

            SifVersion[] reqVersions = null;
            // First, try to get the version from the SIF_Request
            Element parent = query.Parent;
            if (parent != null)
            {
                if (parent is SIF_Request)
                {
                    SIF_Request request = (SIF_Request)parent;
                    SifVersion[] versions = request.parseRequestVersions(Adk.Log);
                    if (versions.Length > 0)
                    {
                        reqVersions = versions;
                    }
                }
            }

            if (reqVersions == null)
            {
                SifVersion version = query.EffectiveSIFVersion;
                if (version != null)
                {
                    reqVersions = new SifVersion[] { version };
                }
            }

            if (reqVersions == null || reqVersions.Length == 0)
            {
                throw new ArgumentException(
                    "SIF_Query is not contained in a SIF_Request that has a SIF_Version element; cannot determine version of SIF to associated with this Query object");
            }
            else
            {
                fVersions = reqVersions;
            }

            SIF_Element[] fields = query.SIF_QueryObject.GetSIF_Elements();
            if (fields != null && fields.Length > 0)
            {
                for (int i = 0; i < fields.Length; i++)
                {
                    string xPath = fields[i].TextValue;
                    if (xPath == null || xPath.Length == 0)
                    {
                        continue;
                    }
                    AddFieldRestriction(xPath);
                }
            }
        }
Exemple #10
0
 private void PopulateConditions(SIF_Query query,
                                  SIF_Condition[] clist,
                                  ConditionGroup target)
 {
     for (int i = 0; i < clist.Length; i++)
     {
         String o = clist[i].SIF_Operator;
         ComparisonOperators ops = Condition.ParseComparisionOperators(o);
         String val = clist[i].SIF_Value;
         String path = clist[i].SIF_Element;
         target.AddCondition(fObjType, path, ops, val);
     }
 }
        /**
         * Creates a SIF_Query element from the specified Adk query object using
         * the specified version of SIF
         * @param query The Query to convert to a SIF_Query
         * @param version The version of SIF to render the SIF_Query xml in
         * @param allowFieldRestrictions True if the field restrictions in the query should be rendered
         * @return a SIF_Query object
         */
        public static SIF_Query CreateSIF_Query(Query query, SifVersion version, bool allowFieldRestrictions)
        {
            SIF_QueryObject sqo = new SIF_QueryObject(query.ObjectType.Tag(version));
            SIF_Query sifQ = new SIF_Query(sqo);
            if (query.HasConditions)
            {
                sifQ.SIF_ConditionGroup = createConditionGroup(query, version);
            }

            if (allowFieldRestrictions && query.HasFieldRestrictions)
            {
                foreach( ElementRef elementRef in query.FieldRestrictionRefs )
                {
                    String path = null;
                    IElementDef field = elementRef.Field;
                    if( field != null )
                    {
                        if( !field.IsSupported( version ) )
                        {
                            continue;
                        }
                        path = field.GetSQPPath( version );
                    }
                    if( path == null )
                    {
                        path = elementRef.XPath;
                    }
                    if (path != null)
                    {
                        path = Adk.Dtd.TranslateSQP(query.ObjectType, path, version);
                        sqo.AddSIF_Element(new SIF_Element(path));
                    }
                }
            }

            return sifQ;
        }