Package org.oclc.oomRef.transports

Source Code of org.oclc.oomRef.transports.HttpOpenURLInlineTransport

/**
* Copyright 2006 OCLC Online Computer Library Center Licensed 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 org.oclc.oomRef.transports;

import info.openurl.oom.ContextObject;
import info.openurl.oom.OpenURLException;
import info.openurl.oom.OpenURLRequest;
import info.openurl.oom.OpenURLRequestProcessor;
import info.openurl.oom.Service;
import info.openurl.oom.Transport;
import info.openurl.oom.config.ClassConfig;
import info.openurl.oom.config.OpenURLConfig;
import info.openurl.oom.entities.Referent;
import info.openurl.oom.entities.Referrer;
import info.openurl.oom.entities.ReferringEntity;
import info.openurl.oom.entities.Requester;
import info.openurl.oom.entities.Resolver;
import info.openurl.oom.entities.ServiceType;

import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;

import org.oclc.oomRef.descriptors.ByReferenceMetadataImpl;
import org.oclc.oomRef.descriptors.ByValueMetadataImpl;

/**
* @author Jeffrey A. Young This class transforms HTTP requests into OpenURL ContextObjects. Override this class to
*         change the request pattern. Configure the Servlet to use your new class by adding/changing the following
*         property to the Servlet.props file: Servlet.transportClassname={packageName.className}
*/

public class HttpOpenURLInlineTransport implements Transport {

    private OpenURLConfig openURLConfig;

    // private ClassConfig classConfig;

    /**
     * Construct an HTTP OpenURL Inline Transport object
     *
     * @param openURLConfig
     * @param classConfig
     */
    public HttpOpenURLInlineTransport(OpenURLConfig openURLConfig, ClassConfig classConfig) {
        this.openURLConfig = openURLConfig;
        // this.classConfig = classConfig;
    }

    /**
     * Gets an OpenURLRequest from the supplied HttpServletRequest and processor.
     */
    public OpenURLRequest toOpenURLRequest(OpenURLRequestProcessor processor, HttpServletRequest req)
            throws OpenURLException {
        try {
            String url_ver = null;

            // url_ver=Z39.88-2004 is the only acceptable value
            String[] url_vers = req.getParameterValues("url_ver");

            if (url_vers != null) {
                for (int i = 0; url_ver == null && i < url_vers.length; ++i) {
                    if ("Z39.88-2004".equals(url_vers[i])) {
                        url_ver = url_vers[i];
                    }
                }
            }

            /*
             * url_ctx_fmt=null or info:ofi/fmt:kev:mtx:ctx are the only acceptable values
             */

            String url_ctx_fmt = "info:ofi/fmt:kev:mtx:ctx";
            String[] url_ctx_fmts = req.getParameterValues("url_ctx_fmt");
            if (url_ctx_fmts != null) {
                for (int i = 0; "info:ofi/fmt:kev:mtx:ctx".equals(url_ctx_fmt); ++i) {
                    if (url_ctx_fmts[i].length() > 0 && !url_ctx_fmts[i].equals(url_ctx_fmt)) {
                        url_ctx_fmt = url_ctx_fmts[i];
                    }
                }
            }

            if (!("Z39.88-2004".equals(url_ver) && url_ctx_fmt.equals("info:ofi/fmt:kev:mtx:ctx"))) {
                // sorry, this isn't our type of request
                return null;
            }

            Set entrySet = req.getParameterMap().entrySet();
            Iterator iter = entrySet.iterator();

            ArrayList referentDescriptors = new ArrayList();
            ArrayList requesterDescriptors = new ArrayList();
            ArrayList referringEntityDescriptors = new ArrayList();
            ArrayList referrerDescriptors = new ArrayList();
            ArrayList resolverDescriptors = new ArrayList();
            ArrayList serviceTypeDescriptors = new ArrayList();
            HashMap openURLKeys = new HashMap();
            HashMap adminKeys = new HashMap();
            HashMap foreignKeys = new HashMap();

            while (iter.hasNext()) {
                Map.Entry entry = (Entry) iter.next();
                String key = (String) entry.getKey();
                String[] values = (String[]) entry.getValue();

                if (key.startsWith("url_")) {
                    openURLKeys.put(key, values);
                } else if (key.startsWith("ctx_")) {
                    adminKeys.put(key, values);
                } else if ("rft_id".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        values[i] = URLEncoder.encode(values[i], "UTF-8");
                        referentDescriptors.add(new URI(values[i]));
                    }
                } else if ("rft_dat".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        referentDescriptors.add(values[i]);
                    }
                } else if ("rft_val_fmt".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        ByValueMetadataImpl bvm = new ByValueMetadataImpl(new URI(values[i]), "rft.", entrySet);
                        referentDescriptors.add(bvm);
                    }
                } else if ("rft_ref_fmt".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        String[] rft_refs = req.getParameterValues("rft_ref");
                        for (int j = 0; j < rft_refs.length; ++j) {
                            ByReferenceMetadataImpl brm =
                                    new ByReferenceMetadataImpl(new URI(values[i]), new URL(rft_refs[j]));
                            referentDescriptors.add(brm);
                        }
                    }
                } else if ("req_id".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        requesterDescriptors.add(new URI(values[i]));
                    }
                } else if ("req_dat".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        requesterDescriptors.add(values[i]);
                    }
                } else if ("req_val_fmt".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        ByValueMetadataImpl bvm = new ByValueMetadataImpl(new URI(values[i]), "req.", entrySet);
                        requesterDescriptors.add(bvm);
                    }
                } else if ("req_ref_fmt".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        String[] req_refs = req.getParameterValues("req_ref");
                        for (int j = 0; j < req_refs.length; ++j) {
                            ByReferenceMetadataImpl brm =
                                    new ByReferenceMetadataImpl(new URI(values[i]), new URL(req_refs[j]));
                            requesterDescriptors.add(brm);
                        }
                    }
                } else if ("rfe_id".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        referringEntityDescriptors.add(new URI(values[i]));
                    }
                } else if ("rfe_dat".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        referringEntityDescriptors.add(values[i]);
                    }
                } else if ("rfe_val_fmt".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        ByValueMetadataImpl bvm = new ByValueMetadataImpl(new URI(values[i]), "rfe.", entrySet);
                        referringEntityDescriptors.add(bvm);
                    }
                } else if ("rfe_ref_fmt".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        String[] rfe_refs = req.getParameterValues("rfe_ref");
                        for (int j = 0; j < rfe_refs.length; ++j) {
                            ByReferenceMetadataImpl brm =
                                    new ByReferenceMetadataImpl(new URI(values[i]), new URL(rfe_refs[j]));
                            referringEntityDescriptors.add(brm);
                        }
                    }
                } else if ("rfr_id".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        referrerDescriptors.add(new URI(values[i]));
                    }
                } else if ("rfr_dat".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        referrerDescriptors.add(values[i]);
                    }
                } else if ("rfr_val_fmt".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        ByValueMetadataImpl bvm = new ByValueMetadataImpl(new URI(values[i]), "rfr.", entrySet);
                        referrerDescriptors.add(bvm);
                    }
                } else if ("rfr_ref_fmt".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        String[] rfr_refs = req.getParameterValues("rfr_ref");
                        for (int j = 0; j < rfr_refs.length; ++j) {
                            ByReferenceMetadataImpl brm =
                                    new ByReferenceMetadataImpl(new URI(values[i]), new URL(rfr_refs[j]));
                            referrerDescriptors.add(brm);
                        }
                    }
                } else if ("res_id".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        resolverDescriptors.add(new URI(values[i]));
                    }
                } else if ("res_dat".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        resolverDescriptors.add(values[i]);
                    }
                } else if ("res_val_fmt".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        ByValueMetadataImpl bvm = new ByValueMetadataImpl(new URI(values[i]), "res.", entrySet);
                        resolverDescriptors.add(bvm);
                    }
                } else if ("res_ref_fmt".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        String[] res_refs = req.getParameterValues("res_ref");
                        for (int j = 0; j < res_refs.length; ++j) {
                            ByReferenceMetadataImpl brm =
                                    new ByReferenceMetadataImpl(new URI(values[i]), new URL(res_refs[j]));
                            resolverDescriptors.add(brm);
                        }
                    }
                } else if ("svc_id".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        URI uri = new URI(values[i]);

                        serviceTypeDescriptors.add(uri);

                        // Throw in the corresponding Java class while we're
                        // here
                        Service service = (Service) openURLConfig.getService(uri);
                        serviceTypeDescriptors.add(service);
                    }
                } else if ("svc_dat".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        serviceTypeDescriptors.add(values[i]);
                    }
                } else if ("svc_val_fmt".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        ByValueMetadataImpl bvm = new ByValueMetadataImpl(new URI(values[i]), "svc.", entrySet);
                        serviceTypeDescriptors.add(bvm);
                    }
                } else if ("svc_ref_fmt".equals(key)) {
                    for (int i = 0; i < values.length; ++i) {
                        String[] svc_refs = req.getParameterValues("svc_ref");
                        for (int j = 0; j < svc_refs.length; ++j) {
                            ByReferenceMetadataImpl brm =
                                    new ByReferenceMetadataImpl(new URI(values[i]), new URL(svc_refs[j]));
                            serviceTypeDescriptors.add(brm);
                        }
                    }
                } else if (key.startsWith("rft.") || key.startsWith("rfe.") || key.startsWith("req.") ||
                        key.startsWith("rfr.") || key.startsWith("res.") || key.startsWith("svc.")) {
                    // do nothing
                } else {
                    foreignKeys.put(key, values);
                }
            }

            Referent referent = processor.referentFactory(referentDescriptors.toArray());
            Requester requester = processor.requesterFactory(requesterDescriptors.toArray());
            ReferringEntity referringEntity = processor.referringEntityFactory(referringEntityDescriptors.toArray());
            Referrer referrer = processor.referrerFactory(referrerDescriptors.toArray());
            Resolver resolver = processor.resolverFactory(resolverDescriptors.toArray());
            ServiceType serviceType = processor.serviceTypeFactory(serviceTypeDescriptors.toArray());

            // Construct the ContextObject
            ContextObject contextObject =
                    processor.contextObjectFactory(referent, new ReferringEntity[] { referringEntity },
                            new Requester[] { requester }, new ServiceType[] { serviceType },
                            new Resolver[] { resolver }, new Referrer[] { referrer });
            return processor.openURLRequestFactory(contextObject);
        } catch (Exception e) {
            throw new OpenURLException(e.getMessage(), e);
        }
    }

    /**
     * Gets the transport ID.
     */
    public URI getTransportID() throws URISyntaxException {
        return new URI("info:ofi/tsp:http:openurl-inline");
    }
}
TOP

Related Classes of org.oclc.oomRef.transports.HttpOpenURLInlineTransport

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.