com.esri.gpt.server.assertion.handler.AsnRatingHandler.java Source code

Java tutorial

Introduction

Here is the source code for com.esri.gpt.server.assertion.handler.AsnRatingHandler.java

Source

/* See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * Esri Inc. licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.esri.gpt.server.assertion.handler;

import com.esri.gpt.framework.util.Val;
import com.esri.gpt.server.assertion.components.AsnAssertionSet;
import com.esri.gpt.server.assertion.components.AsnAuthorizer;
import com.esri.gpt.server.assertion.components.AsnConstants;
import com.esri.gpt.server.assertion.components.AsnContext;
import com.esri.gpt.server.assertion.components.AsnOperation;
import com.esri.gpt.server.assertion.components.AsnProperty;
import com.esri.gpt.server.assertion.components.AsnValueType;
import com.esri.gpt.server.assertion.exception.AsnInvalidOperationException;
import com.esri.gpt.server.assertion.index.Assertion;

import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.IndexSearcher;

/**
 * Handles assertions associated with rating queries.
 */
public class AsnRatingHandler extends AsnOperationHandler {

    /** constructors ============================================================ */

    /** Default constructor */
    public AsnRatingHandler() {
    }

    /** methods ================================================================= */

    /**
     * Handles an assertion operation.
     * @param context the assertion operation context
     * @throws Exception if a processing exception occurs
     */
    public void handle(AsnContext context) throws Exception {

        // initialize
        AsnOperation operation = context.getOperation();
        AsnAuthorizer authorizer = context.getAuthorizer();
        String predicate = operation.getPredicate().getURN();

        // query ratings for a resource
        if (predicate.equals("urn:esri:geoportal:rating:query")) {
            if (!operation.getSubject().isType(AsnConstants.SUBJECT_PREFIX_RESOURCEID)) {
                throw new AsnInvalidOperationException();
            }
            authorizer.authorizeQuery(context);
            this.query(context);
        }
    }

    /**
     * Summarizes the ratings for a resource.
     * @param context the assertion operation context
     * @throws Exception if an exception occurs
     */
    private void query(AsnContext context) throws Exception {

        // initialize
        AsnOperation operation = context.getOperation();
        AsnAssertionSet asnSet = operation.getAssertionSet();
        AsnValueType vType = asnSet.getValueType();
        String subject = operation.getSubject().getURN();
        String predicate = vType.getRdfPredicate();
        String valueField = vType.getRdfValueField();
        String upValue = "urn:esri:geoportal:rating:value:up";
        String downValue = "urn:esri:geoportal:rating:value:down";

        IndexReader reader = null;
        IndexSearcher searcher = null;
        try {

            // make the reader and searcher
            reader = this.getIndexAdapter().makeIndexReader();
            searcher = new IndexSearcher(reader);

            // count up votes
            long nUp = this.getIndexAdapter().count(context, searcher, valueField, subject, predicate, upValue);

            // count down votes
            long nDown = this.getIndexAdapter().count(context, searcher, valueField, subject, predicate, downValue);

            // root property for the response
            String rootSubject = subject;
            String roorPredicate = operation.getPredicate().getURN() + "response";
            AsnProperty rootProp = new AsnProperty(rootSubject, roorPredicate, null);

            // up, down and total counts
            rootProp.getChildren().add(new AsnProperty(null, upValue + ":count", "" + nUp));
            rootProp.getChildren().add(new AsnProperty(null, downValue + ":count", "" + nDown));
            rootProp.getChildren().add(new AsnProperty(null, asnSet.getURNPrefix() + ":count", "" + (nUp + nDown)));

            // canCreate capability for the active user
            String canCreatePred = asnSet.getURNPrefix() + ":activeUser:canCreate";
            String canCreateVal = "" + context.getAuthorizer().canCreate(context, asnSet.getAuthPolicy());
            rootProp.getChildren().add(new AsnProperty(null, canCreatePred, canCreateVal));

            // user's previous rating
            Assertion previous = this.getIndexAdapter().loadPreviousUserAssertion(context, searcher);
            if (previous != null) {
                String prevSubj = Val.chkStr(previous.getSystemPart().getAssertionId());
                prevSubj = asnSet.getAssertionIdPrefix() + ":" + prevSubj;
                String predPred = asnSet.getURNPrefix() + ":activeUser:previousValue";
                String prevVal = previous.getRdfPart().getValue();
                rootProp.getChildren().add(new AsnProperty(prevSubj, predPred, prevVal));
            }

            // generate the response
            context.getOperationResponse().generateResponse(context, rootProp.getChildren());
        } finally {
            this.getIndexAdapter().closeReader(reader);
            this.getIndexAdapter().closeSearcher(searcher);
        }
    }

}