// BridgeDb, // An abstraction layer for identifier mapping services, both local and online. // Copyright 2006-2009 BridgeDb developers // // 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.bridgedb.webservice.picr; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.bridgedb.AbstractIDMapperCapabilities; import org.bridgedb.AttributeMapper; import org.bridgedb.BridgeDb; import org.bridgedb.DataSource; import org.bridgedb.IDMapper; import org.bridgedb.IDMapperCapabilities; import org.bridgedb.IDMapperException; import org.bridgedb.impl.InternalUtils; import org.bridgedb.webservice.IDMapperWebservice; import org.bridgedb.Xref; import uk.ac.ebi.demo.picr.business.PICRClient; import uk.ac.ebi.demo.picr.soap.CrossReference; import uk.ac.ebi.demo.picr.soap.UPEntry; public final class IDMapperPicr extends IDMapperWebservice implements AttributeMapper { static { BridgeDb.register ("idmapper-picr", new Driver()); } private boolean onlyActive; private final Set<DataSource> supportedDatabases = new HashSet<DataSource>(); private final Object[] supportedDbObjects; private final PICRClient client; /** * * @param onlyActive using only active mappings if true */ public IDMapperPicr(boolean onlyActive) { client = new PICRClient(); List<String> databases = client.loadDatabases(); for (String s : databases) { supportedDatabases.add(DataSource.getByFullName(s)); } supportedDbObjects = databases.toArray(); this.onlyActive = onlyActive; } /** * * @return true if using only active mappings; false otherwise */ public boolean getOnlyActive() { return onlyActive; } /** * * @param onlyActive using only active mappings if true */ public void setOnlyActive(boolean onlyActive) { this.onlyActive = onlyActive; } private static class Driver implements org.bridgedb.Driver { private Driver() { } // prevent outside instantiation public IDMapper connect(String location) throws IDMapperException { Map<String, String> args = InternalUtils.parseLocation(location, "only-active"); boolean isOnlyActive = true; if (args.containsKey("only-active")) { isOnlyActive = Boolean.parseBoolean(args.get("only-active")); } return new IDMapperPicr(isOnlyActive); } } private boolean closed = false; public void close() throws IDMapperException { closed = true; } public Set<Xref> freeSearch(String text, int limit) throws IDMapperException { throw new UnsupportedOperationException(); } private class PICRCapabilities extends AbstractIDMapperCapabilities { public PICRCapabilities() { super (supportedDatabases, false, null); } } private PICRCapabilities picrCapabilities = new PICRCapabilities(); public IDMapperCapabilities getCapabilities() { return picrCapabilities; } public boolean isConnected() { return !closed; } /** * @{inheritDocs} */ public Map<Xref, Set<Xref>> mapID(Collection<Xref> srcXrefs, DataSource... tgtDataSources) throws IDMapperException { return InternalUtils.mapMultiFromSingle(this, srcXrefs, tgtDataSources); } /** * @{inheritDocs} */ public Set<Xref> mapID(Xref srcXref, DataSource... tgtDataSources) throws IDMapperException { Object[] databases; if (tgtDataSources.length == 0) databases = supportedDbObjects; else databases = objectsFromDataSources(tgtDataSources); Set<Xref> result = new HashSet<Xref>(); if (databases.length == 0) return result; if (!supportedDatabases.contains(srcXref.getDataSource())) return result; List<CrossReference> refs = new ArrayList<CrossReference>(); List<UPEntry> entries = client.performAccessionMapping(srcXref.getId(), databases); for (UPEntry entry : entries) { refs.addAll (entry.getIdenticalCrossReferences()); refs.addAll (entry.getLogicalCrossReferences()); } for (CrossReference ref : refs) { // in onlyActive mode, check if it is deleted first if (!(onlyActive && ref.isDeleted())) { Xref xref = new Xref (ref.getAccession(), DataSource.getByFullName(ref.getDatabaseName())); result.add (xref); } } return result; } /** * Only returns supported databases. Resulting array may be shorter than input. */ private Object[] objectsFromDataSources (DataSource... ds) { List<Object> databases = new ArrayList<Object>(ds.length); for (DataSource tgt : ds) { if (supportedDatabases.contains(tgt)) databases.add(tgt.getFullName()); } return databases.toArray(); } public boolean xrefExists(Xref xref) throws IDMapperException { if (!supportedDatabases.contains(xref.getDataSource())) return false; List<UPEntry> result = client.performAccessionMapping( xref.getId(), objectsFromDataSources(xref.getDataSource())); return result.size() > 0; } /** * * @return false */ public boolean isFreeAttributeSearchSupported() { return false; } public Map<Xref, String> freeAttributeSearch(String query, String attrType, int limit) throws IDMapperException { throw new UnsupportedOperationException(); } public Set<String> getAttributes(Xref ref, String attrType) throws IDMapperException { Set<String> result = new HashSet<String>(); if (!supportedDatabases.contains(ref.getDataSource())) return result; List<UPEntry> entries = client.performAccessionMapping(ref.getId(), supportedDbObjects); for (UPEntry entry : entries) { if ("CRC64".equals (attrType)) { result.add (entry.getCRC64()); } else if ("Sequence".equals (attrType)) { result.add (entry.getSequence()); } else if ("UPI".equals (attrType)) { result.add (entry.getUPI()); } else if ("Timestamp".equals (attrType)) { result.add ("" + entry.getTimestamp()); } } return result; } private static final Set<String> SUPPORTED_ATTRIBUTES = new HashSet<String>(Arrays.asList( new String[] {"CRC64", "Sequence", "UPI", "Timestamp"} )); public Set<String> getAttributeSet() throws IDMapperException { return SUPPORTED_ATTRIBUTES; } public Map<String, Set<String>> getAttributes(Xref ref) throws IDMapperException { Map<String, Set<String>> result = new HashMap<String, Set<String>>(); if (!supportedDatabases.contains(ref.getDataSource())) return result; List<UPEntry> entries = client.performAccessionMapping(ref.getId(), supportedDbObjects); for (UPEntry entry : entries) { InternalUtils.multiMapPut (result, "CRC64", entry.getCRC64()); InternalUtils.multiMapPut (result, "Sequence", entry.getSequence()); InternalUtils.multiMapPut (result, "UPI", entry.getUPI()); InternalUtils.multiMapPut (result, "Timestamp", "" + entry.getTimestamp()); } return result; } @Override public Map<Xref, Set<String>> freeAttributeSearchEx(String query, String attrType, int limit) throws IDMapperException { throw new UnsupportedOperationException(); } }