/** * 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; import info.openurl.oom.ContextObject; import info.openurl.oom.OpenURLException; import info.openurl.oom.OpenURLRequest; import info.openurl.oom.OpenURLRequestProcessor; import info.openurl.oom.OpenURLResponse; import info.openurl.oom.Service; import info.openurl.oom.descriptors.ByReferenceMetadata; import info.openurl.oom.descriptors.ByValueMetadata; import info.openurl.oom.descriptors.ByValueMetadataKev; import info.openurl.oom.descriptors.ByValueMetadataXml; 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.util.Set; import org.oclc.oomRef.descriptors.ByReferenceMetadataImpl; import org.oclc.oomRef.descriptors.ByValueMetadataImpl; import org.oclc.oomRef.descriptors.ByValueMetadataKevImpl; import org.oclc.oomRef.descriptors.ByValueMetadataXmlImpl; import org.oclc.oomRef.entities.ReferentImpl; import org.oclc.oomRef.entities.ReferrerImpl; import org.oclc.oomRef.entities.ReferringEntityImpl; import org.oclc.oomRef.entities.RequesterImpl; import org.oclc.oomRef.entities.ResolverImpl; import org.oclc.oomRef.entities.ServiceTypeImpl; import org.w3c.dom.Document; /** * For the sake of simplicity, this resolver assumes that multiple * ServiceType Identifiers should be processed in sequence until one of * them returns a Response instead of null. For example, the ContextObject * could specify two services: 1) The desired service 2) A failover service * @author Jeffrey A. Young */ public class OpenURLRequestProcessorImpl implements OpenURLRequestProcessor { public URI getProcessorID() throws URISyntaxException { return new URI("info:oom/oomProcessors/OOMRef-J"); } public OpenURLResponse resolve(OpenURLRequest openURLRequest) throws OpenURLException { OpenURLResponse response = null; // Try each ContentObject until someone responds ContextObject[] contextObjects = openURLRequest.getContextObjects(); for (int i=0; response == null && i < contextObjects.length; ++i) { ContextObject contextObject = contextObjects[i]; ServiceType[] serviceTypes = contextObject.getServiceTypes(); // Try each ServiceType/Service until someone responds for (int j=0; response == null && j<serviceTypes.length; ++j) { ServiceType serviceType = serviceTypes[j]; Object[] descriptors = serviceType.getDescriptors(); // Try each Service until someone responds for (int k=0; response == null && k < descriptors.length; ++k) { Object descriptor = descriptors[k]; if (descriptor instanceof Service) { Service service = (Service) descriptor; try { response = service.resolve( // this, serviceType, contextObject, openURLRequest, this); } catch (Exception e) { throw new OpenURLException(e.getMessage(), e); } } } } } return response; } public ContextObject contextObjectFactory(Referent referent, ReferringEntity referringEntity, Requester requester, ServiceType serviceType, Resolver resolver, Referrer referrer) { ReferringEntity[] referringEntities = null; Requester[] requesters = null; ServiceType[] serviceTypes = null; Resolver[] resolvers = null; Referrer[] referrers = null; if (referringEntity != null) referringEntities = new ReferringEntity[] { referringEntity }; if (requester != null) requesters = new Requester[] { requester }; if (serviceType != null) serviceTypes = new ServiceType[] { serviceType }; if (resolver != null) resolvers = new Resolver[] { resolver }; if (referrer != null) referrers = new Referrer[] { referrer }; return contextObjectFactory(referent, referringEntities, requesters, serviceTypes, resolvers, referrers); } public ContextObject contextObjectFactory(Referent referent, ReferringEntity[] referringEntities, Requester[] requesters, ServiceType[] serviceTypes, Resolver[] resolvers, Referrer[] referrers) { return new ContextObjectImpl( referent, referringEntities, requesters, serviceTypes, resolvers, referrers); } public Referent referentFactory(Object object) { return new ReferentImpl(object); } public ServiceType serviceTypeFactory(Object object) { return new ServiceTypeImpl(object); } public Requester requesterFactory(Object object) { return new RequesterImpl(object); } public ReferringEntity referringEntityFactory(Object object) { return new ReferringEntityImpl(object); } public Referrer referrerFactory(Object object) { return new ReferrerImpl(object); } public Resolver resolverFactory(Object object) { return new ResolverImpl(object); } public ByReferenceMetadata byReferenceMetadataFactory(URI ref_fmt, URL ref) { return new ByReferenceMetadataImpl(ref_fmt, ref); } public ByValueMetadata byValueMetadataFactory(URI val_fmt, String prefix, Set entrySet) { return new ByValueMetadataImpl(val_fmt, prefix, entrySet); } public ByValueMetadataKev byValueMetadataKevFactory(URI val_fmt, String prefix, Set entrySet) { return new ByValueMetadataKevImpl(val_fmt, prefix, entrySet); } public ByValueMetadataXml byValueMetadataXmlFactory(URI val_fmt, Document xmlDoc) { return new ByValueMetadataXmlImpl(val_fmt, xmlDoc); } public OpenURLRequest openURLRequestFactory(ContextObject contextObject) { return new OpenURLRequestImpl(contextObject); } public OpenURLResponse openURLResponseFactory(int status, String redirectURL, String contentType, byte[] bytes) { return new OpenURLResponse(status, redirectURL, contentType, bytes); } }