Merge branch 'Jalview-BH/JAL-3026-JAL-3063-JAXB' into Jalview-JS/demo
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Fri, 25 Jan 2019 15:59:56 +0000 (15:59 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Fri, 25 Jan 2019 15:59:56 +0000 (15:59 +0000)
28 files changed:
_j2sclasslist.txt
optimization/timing-java-bh.txt [new file with mode: 0644]
optimization/timing-js-chrome-bh.txt [new file with mode: 0644]
optimization/timing-js-firefox-bh.txt [new file with mode: 0644]
site-resources/jalview_bin_JalviewJS_core.html
src/jalview/analysis/AlignmentUtils.java
src/jalview/ext/ensembl/EnsemblFeatures.java
src/jalview/ext/ensembl/EnsemblInfo.java
src/jalview/ext/ensembl/EnsemblLookup.java
src/jalview/ext/ensembl/EnsemblMap.java
src/jalview/ext/ensembl/EnsemblRestClient.java
src/jalview/ext/ensembl/EnsemblSeqProxy.java
src/jalview/ext/ensembl/EnsemblSymbol.java
src/jalview/ext/ensembl/EnsemblXref.java
src/jalview/ext/paradise/Annotate3D.java
src/jalview/fts/service/pdb/PDBFTSRestClient.java
src/jalview/gui/Desktop.java
src/jalview/gui/SeqPanel.java
src/jalview/io/JSONFile.java
src/jalview/javascript/json/JSON.java [new file with mode: 0644]
src/jalview/json/binding/biojs/BioJSRepositoryPojo.java
src/jalview/urls/IdentifiersUrlProvider.java
src/jalview/util/JSONUtils.java
src/jalview/util/Platform.java
swingjs/SwingJS-site.zip
swingjs/timestamp
swingjs/ver/3.2.4/SwingJS-site.zip
swingjs/ver/3.2.4/timestamp

index 27ab6a6..5d60006 100644 (file)
@@ -1,13 +1,20 @@
 jalview/analysis/AAFrequency.js
 jalview/analysis/AlignSeq.js
+jalview/analysis/AlignmentAnnotationUtils.js
+jalview/analysis/AlignmentUtils.js
 jalview/analysis/AnnotationSorter.js
 jalview/analysis/Conservation.js
 jalview/analysis/CrossRef.js
+jalview/analysis/NJTree.js
+jalview/analysis/SeqsetUtils.js
+jalview/analysis/TreeBuilder.js
+jalview/analysis/TreeModel.js
 jalview/analysis/scoremodels/DistanceScoreModel.js
 jalview/analysis/scoremodels/FeatureDistanceModel.js
 jalview/analysis/scoremodels/PIDModel.js
 jalview/analysis/scoremodels/ScoreMatrix.js
 jalview/analysis/scoremodels/ScoreModels.js
+jalview/analysis/scoremodels/SimilarityParams.js
 jalview/analysis/scoremodels/SimilarityScoreModel.js
 jalview/api/AlignCalcManagerI.js
 jalview/api/AlignCalcWorkerI.js
@@ -25,6 +32,7 @@ jalview/api/StructureSelectionManagerProvider.js
 jalview/api/ViewStyleI.js
 jalview/api/analysis/PairwiseScoreModelI.js
 jalview/api/analysis/ScoreModelI.js
+jalview/api/analysis/SimilarityParamsI.js
 jalview/bin/ArgsParser.js
 jalview/bin/BuildDetails.js
 jalview/bin/Cache.js
@@ -36,8 +44,13 @@ jalview/datamodel/ASequenceI.js
 jalview/datamodel/Alignment.js
 jalview/datamodel/AlignmentAnnotation.js
 jalview/datamodel/AlignmentI.js
+jalview/datamodel/AlignmentView.js
 jalview/datamodel/AnnotatedCollectionI.js
 jalview/datamodel/Annotation.js
+jalview/datamodel/BinaryNode.js
+jalview/datamodel/CigarArray.js
+jalview/datamodel/CigarBase.js
+jalview/datamodel/CigarSimple.js
 jalview/datamodel/ColumnSelection.js
 jalview/datamodel/ContiguousI.js
 jalview/datamodel/DBRefSource.js
@@ -51,15 +64,18 @@ jalview/datamodel/ProfileI.js
 jalview/datamodel/Profiles.js
 jalview/datamodel/ProfilesI.js
 jalview/datamodel/Range.js
+jalview/datamodel/RangeIterator.js
 jalview/datamodel/ResidueCount.js
 jalview/datamodel/SearchResults.js
 jalview/datamodel/SearchResultsI.js
+jalview/datamodel/SeqCigar.js
 jalview/datamodel/Sequence.js
 jalview/datamodel/SequenceCollectionI.js
 jalview/datamodel/SequenceCursor.js
 jalview/datamodel/SequenceFeature.js
 jalview/datamodel/SequenceGroup.js
 jalview/datamodel/SequenceI.js
+jalview/datamodel/SequenceNode.js
 jalview/datamodel/features/FeatureLocationI.js
 jalview/datamodel/features/FeatureMatcher.js
 jalview/datamodel/features/FeatureMatcherI.js
@@ -74,7 +90,9 @@ jalview/gui/AlignViewport.js
 jalview/gui/AlignmentPanel.js
 jalview/gui/AnnotationLabels.js
 jalview/gui/AnnotationPanel.js
+jalview/gui/CalculationChooser.js
 jalview/gui/ColourMenuHelper.js
+jalview/gui/ComboBoxTooltipRenderer.js
 jalview/gui/Desktop.js
 jalview/gui/FeatureRenderer.js
 jalview/gui/IProgressIndicator.js
@@ -84,11 +102,15 @@ jalview/gui/IdwidthAdjuster.js
 jalview/gui/JalviewChangeSupport.js
 jalview/gui/JvSwingUtils.js
 jalview/gui/PaintRefresher.js
+jalview/gui/PopupMenu.js
+jalview/gui/Preferences.js
 jalview/gui/ProgressBar.js
 jalview/gui/ScalePanel.js
 jalview/gui/SeqCanvas.js
 jalview/gui/SeqPanel.js
 jalview/gui/SequenceRenderer.js
+jalview/gui/TreeCanvas.js
+jalview/gui/TreePanel.js
 jalview/gui/ViewSelectionMenu.js
 jalview/io/AlignFile.js
 jalview/io/AlignmentFileReaderI.js
@@ -114,6 +136,10 @@ jalview/javascript/log4j/spi/OptionHandler.js
 jalview/jbgui/GAlignFrame.js
 jalview/jbgui/GAlignmentPanel.js
 jalview/jbgui/GDesktop.js
+jalview/jbgui/GPreferences.js
+jalview/jbgui/GTreePanel.js
+jalview/math/Matrix.js
+jalview/math/MatrixI.js
 jalview/project/Jalview2XML.js
 jalview/renderer/AnnotationRenderer.js
 jalview/renderer/AwtRenderPanelI.js
@@ -152,7 +178,16 @@ jalview/structure/SequenceListener.js
 jalview/structure/StructureImportSettings.js
 jalview/structure/StructureSelectionManager.js
 jalview/structure/VamsasSource.js
+jalview/urls/CustomUrlProvider.js
 jalview/urls/IdOrgSettings.js
+jalview/urls/IdentifiersUrlProvider.js
+jalview/urls/UrlLinkDisplay.js
+jalview/urls/UrlLinkTableModel.js
+jalview/urls/UrlProvider.js
+jalview/urls/UrlProviderImpl.js
+jalview/urls/api/UrlProviderFactoryI.js
+jalview/urls/api/UrlProviderI.js
+jalview/urls/desktop/DesktopUrlProviderFactory.js
 jalview/util/ColorUtils.js
 jalview/util/Comparison.js
 jalview/util/DBRefUtils.js
@@ -160,6 +195,8 @@ jalview/util/Format.js
 jalview/util/MessageManager.js
 jalview/util/Platform.js
 jalview/util/QuickSort.js
+jalview/util/StringUtils.js
+jalview/util/UrlLink.js
 jalview/util/jarInputStreamProvider.js
 jalview/util/matcher/Condition.js
 jalview/util/matcher/Matcher.js
@@ -191,19 +228,67 @@ jalview/xml/binding/jalview/SequenceSet.js
 jalview/xml/binding/jalview/SequenceType.js
 jalview/xml/binding/jalview/VAMSAS.js
 jalview/xml/binding/jalview/WebServiceParameterSet.js
+java/applet/AppletContext.js
+java/applet/AppletStub.js
+java/applet/JSApplet.js
+java/awt/AWTEvent.js
+java/awt/AWTEventMulticaster.js
 java/awt/AWTKeyStroke.js
+java/awt/ActiveEvent.js
+java/awt/Adjustable.js
 java/awt/AlphaComposite.js
+java/awt/BasicStroke.js
+java/awt/BorderLayout.js
+java/awt/Color.js
+java/awt/Component.js
+java/awt/ComponentOrientation.js
 java/awt/Composite.js
+java/awt/Container.js
 java/awt/ContainerOrderFocusTraversalPolicy.js
+java/awt/Cursor.js
 java/awt/DefaultFocusTraversalPolicy.js
 java/awt/DefaultKeyboardFocusManager.js
+java/awt/Dialog.js
+java/awt/Dimension.js
+java/awt/EventDispatchThread.js
+java/awt/EventFilter.js
+java/awt/EventQueue.js
+java/awt/EventQueueItem.js
+java/awt/FlowLayout.js
 java/awt/FocusTraversalPolicy.js
+java/awt/Font.js
+java/awt/FontMetrics.js
+java/awt/GraphicsCallback.js
+java/awt/GraphicsConfiguration.js
+java/awt/GraphicsDevice.js
+java/awt/GraphicsEnvironment.js
 java/awt/GridLayout.js
 java/awt/Image.js
+java/awt/Insets.js
+java/awt/ItemSelectable.js
+java/awt/JSComponent.js
+java/awt/JSDialog.js
+java/awt/JSFrame.js
+java/awt/JSPanel.js
 java/awt/KeyEventDispatcher.js
 java/awt/KeyEventPostProcessor.js
 java/awt/KeyboardFocusManager.js
+java/awt/LayoutManager.js
+java/awt/LayoutManager2.js
+java/awt/LightweightDispatcher.js
+java/awt/Paint.js
+java/awt/Point.js
+java/awt/Queue.js
+java/awt/Rectangle.js
+java/awt/RenderingHints.js
+java/awt/SentEvent.js
+java/awt/Shape.js
+java/awt/Stroke.js
+java/awt/Toolkit.js
+java/awt/Transparency.js
 java/awt/VKCollection.js
+java/awt/Window.js
+java/awt/color/ColorSpace.js
 java/awt/datatransfer/ClipboardOwner.js
 java/awt/datatransfer/FlavorMap.js
 java/awt/datatransfer/FlavorTable.js
@@ -212,28 +297,73 @@ java/awt/dnd/DropTarget.js
 java/awt/dnd/DropTargetContext.js
 java/awt/dnd/DropTargetListener.js
 java/awt/dnd/peer/DropTargetPeer.js
+java/awt/event/AWTEventListener.js
+java/awt/event/ActionEvent.js
+java/awt/event/ActionListener.js
+java/awt/event/AdjustmentEvent.js
+java/awt/event/AdjustmentListener.js
 java/awt/event/ComponentAdapter.js
+java/awt/event/ComponentEvent.js
+java/awt/event/ComponentListener.js
 java/awt/event/ContainerEvent.js
+java/awt/event/ContainerListener.js
 java/awt/event/FocusAdapter.js
+java/awt/event/FocusEvent.js
+java/awt/event/FocusListener.js
+java/awt/event/HierarchyBoundsListener.js
+java/awt/event/HierarchyListener.js
+java/awt/event/InputEvent.js
+java/awt/event/InputMethodListener.js
+java/awt/event/InvocationEvent.js
+java/awt/event/ItemEvent.js
+java/awt/event/ItemListener.js
 java/awt/event/KeyAdapter.js
+java/awt/event/KeyEvent.js
+java/awt/event/KeyListener.js
 java/awt/event/MouseAdapter.js
+java/awt/event/MouseEvent.js
+java/awt/event/MouseListener.js
 java/awt/event/MouseMotionAdapter.js
+java/awt/event/MouseMotionListener.js
+java/awt/event/MouseWheelListener.js
+java/awt/event/TextListener.js
+java/awt/event/WindowAdapter.js
+java/awt/event/WindowEvent.js
+java/awt/event/WindowFocusListener.js
+java/awt/event/WindowListener.js
+java/awt/event/WindowStateListener.js
+java/awt/font/FontRenderContext.js
+java/awt/geom/AffineTransform.js
+java/awt/geom/Dimension2D.js
 java/awt/geom/Path2D.js
 java/awt/geom/PathIterator.js
+java/awt/geom/Point2D.js
 java/awt/geom/RectIterator.js
+java/awt/geom/Rectangle2D.js
+java/awt/geom/RectangularShape.js
 java/awt/image/BufferedImage.js
 java/awt/image/ColorModel.js
 java/awt/image/DataBuffer.js
 java/awt/image/DataBufferInt.js
 java/awt/image/DirectColorModel.js
+java/awt/image/ImageObserver.js
 java/awt/image/PackedColorModel.js
 java/awt/image/Raster.js
 java/awt/image/RenderedImage.js
 java/awt/image/SampleModel.js
 java/awt/image/SinglePixelPackedSampleModel.js
 java/awt/image/WritableRaster.js
+java/awt/peer/ComponentPeer.js
+java/awt/peer/ContainerPeer.js
+java/awt/peer/FramePeer.js
 java/awt/peer/KeyboardFocusManagerPeer.js
+java/awt/peer/LightweightPeer.js
+java/awt/peer/WindowPeer.js
 java/awt/print/Printable.js
+java/beans/ChangeListenerMap.js
+java/beans/PropertyChangeEvent.js
+java/beans/PropertyChangeListener.js
+java/beans/PropertyChangeSupport.js
 java/io/BufferedInputStream.js
 java/io/BufferedReader.js
 java/io/ByteArrayInputStream.js
@@ -241,17 +371,24 @@ java/io/Closeable.js
 java/io/File.js
 java/io/FileDescriptor.js
 java/io/FileInputStream.js
+java/io/FileReader.js
 java/io/FileSystem.js
 java/io/FilterInputStream.js
 java/io/InputStream.js
 java/io/InputStreamReader.js
 java/io/PushbackInputStream.js
 java/io/Reader.js
+java/lang/AbstractStringBuilder.js
 java/lang/AutoCloseable.js
+java/lang/Class.js
+java/lang/Enum.js
 java/lang/Iterable.js
 java/lang/Readable.js
 java/lang/Runtime.js
+java/lang/StringBuffer.js
 java/lang/StringBuilder.js
+java/lang/Thread.js
+java/lang/ThreadGroup.js
 java/lang/reflect/Constructor.js
 java/lang/reflect/Method.js
 java/math/BigDecimal.js
@@ -260,9 +397,22 @@ java/math/MathContext.js
 java/math/RoundingMode.js
 java/net/HttpURLConnection.js
 java/net/MalformedURLException.js
+java/net/URL.js
 java/net/URLConnection.js
 java/net/URLDecoder.js
 java/net/URLStreamHandler.js
+java/net/URLStreamHandlerFactory.js
+java/nio/Bits.js
+java/nio/Buffer.js
+java/nio/ByteBuffer.js
+java/nio/ByteOrder.js
+java/nio/CharBuffer.js
+java/nio/HeapByteBuffer.js
+java/nio/HeapCharBuffer.js
+java/nio/charset/Charset.js
+java/nio/charset/CharsetDecoder.js
+java/nio/charset/CoderResult.js
+java/nio/charset/CodingErrorAction.js
 java/security/AccessControlContext.js
 java/security/AccessController.js
 java/security/PrivilegedAction.js
@@ -279,22 +429,38 @@ java/text/Format.js
 java/text/MessageFormat.js
 java/text/NumberFormat.js
 java/text/SimpleDateFormat.js
+java/util/AbstractCollection.js
+java/util/AbstractList.js
+java/util/AbstractMap.js
 java/util/AbstractQueue.js
 java/util/AbstractSequentialList.js
+java/util/AbstractSet.js
 java/util/ArrayDeque.js
+java/util/ArrayList.js
+java/util/Arrays.js
 java/util/BitSet.js
 java/util/Calendar.js
 java/util/Collection.js
+java/util/Collections.js
 java/util/Comparator.js
 java/util/Deque.js
+java/util/Dictionary.js
+java/util/DualPivotQuicksort.js
 java/util/Enumeration.js
+java/util/EventListener.js
+java/util/EventObject.js
 java/util/GregorianCalendar.js
+java/util/HashMap.js
+java/util/HashSet.js
+java/util/Hashtable.js
+java/util/IdentityHashMap.js
 java/util/Iterator.js
 java/util/LinkedHashMap.js
 java/util/LinkedList.js
 java/util/List.js
 java/util/ListIterator.js
 java/util/ListResourceBundle.js
+java/util/Locale.js
 java/util/Map.js
 java/util/NavigableMap.js
 java/util/NavigableSet.js
@@ -311,6 +477,8 @@ java/util/StringTokenizer.js
 java/util/TimSort.js
 java/util/TimeZone.js
 java/util/TreeMap.js
+java/util/TreeSet.js
+java/util/Vector.js
 java/util/concurrent/AbstractExecutorService.js
 java/util/concurrent/BlockingQueue.js
 java/util/concurrent/ConcurrentHashMap.js
@@ -337,6 +505,8 @@ java/util/jar/JarEntry.js
 java/util/jar/JarInputStream.js
 java/util/logging/Level.js
 java/util/logging/Logger.js
+java/util/regex/MatchResult.js
+java/util/regex/Matcher.js
 java/util/regex/Pattern.js
 java/util/zip/CRC32.js
 java/util/zip/Inflater.js
@@ -345,38 +515,127 @@ java/util/zip/ZipConstants.js
 java/util/zip/ZipEntry.js
 java/util/zip/ZipInputStream.js
 javajs/api/GenericLineReader.js
+javajs/api/JSFunction.js
 javajs/api/JSONEncodable.js
+javajs/util/AU.js
+javajs/util/AjaxURLConnection.js
 javajs/util/AjaxURLStreamHandler.js
+javajs/util/AjaxURLStreamHandlerFactory.js
 javajs/util/Encoding.js
+javajs/util/JSThread.js
+javajs/util/Lst.js
+javajs/util/PT.js
 javajs/util/Rdr.js
 javajs/util/SB.js
 javax/swing/AbstractAction.js
+javax/swing/AbstractButton.js
+javax/swing/AbstractListModel.js
 javax/swing/Action.js
+javax/swing/ActionMap.js
+javax/swing/AncestorNotifier.js
+javax/swing/ArrayTable.js
+javax/swing/BorderFactory.js
+javax/swing/BoundedRangeModel.js
+javax/swing/BoxLayout.js
+javax/swing/ButtonGroup.js
+javax/swing/ButtonModel.js
+javax/swing/ClientPropertyKey.js
+javax/swing/ComboBoxModel.js
 javax/swing/ComponentInputMap.js
+javax/swing/DefaultBoundedRangeModel.js
+javax/swing/DefaultButtonModel.js
+javax/swing/DefaultComboBoxModel.js
 javax/swing/DefaultDesktopManager.js
+javax/swing/DefaultListCellRenderer.js
+javax/swing/DefaultSingleSelectionModel.js
 javax/swing/DesktopManager.js
 javax/swing/InputMap.js
+javax/swing/JApplet.js
+javax/swing/JButton.js
+javax/swing/JCheckBox.js
+javax/swing/JCheckBoxMenuItem.js
+javax/swing/JComboBox.js
+javax/swing/JComponent.js
 javax/swing/JDesktopPane.js
 javax/swing/JDialog.js
+javax/swing/JFrame.js
 javax/swing/JInternalFrame.js
+javax/swing/JLabel.js
+javax/swing/JLayeredPane.js
+javax/swing/JMenu.js
+javax/swing/JMenuBar.js
+javax/swing/JMenuItem.js
+javax/swing/JPanel.js
+javax/swing/JPopupMenu.js
 javax/swing/JProgressBar.js
+javax/swing/JRadioButton.js
+javax/swing/JRadioButtonMenuItem.js
+javax/swing/JRootPane.js
+javax/swing/JScrollBar.js
 javax/swing/JScrollPane.js
+javax/swing/JSeparator.js
 javax/swing/JTabbedPane.js
+javax/swing/JToggleButton.js
 javax/swing/JToolTip.js
 javax/swing/JViewport.js
+javax/swing/JWindow.js
 javax/swing/KeyStroke.js
+javax/swing/KeyboardManager.js
+javax/swing/ListCellRenderer.js
+javax/swing/ListModel.js
+javax/swing/LookAndFeel.js
+javax/swing/MenuElement.js
+javax/swing/MenuSelectionManager.js
+javax/swing/MutableComboBoxModel.js
+javax/swing/Popup.js
+javax/swing/PopupFactory.js
+javax/swing/RepaintManager.js
+javax/swing/RootPaneContainer.js
 javax/swing/ScrollPaneConstants.js
 javax/swing/ScrollPaneLayout.js
 javax/swing/Scrollable.js
+javax/swing/SingleSelectionModel.js
+javax/swing/SizeRequirements.js
+javax/swing/SwingConstants.js
+javax/swing/SwingPaintEventDispatcher.js
+javax/swing/SwingUtilities.js
 javax/swing/Timer.js
 javax/swing/ToolTipManager.js
+javax/swing/UIDefaults.js
+javax/swing/UIManager.js
 javax/swing/ViewportLayout.js
+javax/swing/WindowConstants.js
+javax/swing/border/AbstractBorder.js
+javax/swing/border/BevelBorder.js
+javax/swing/border/Border.js
+javax/swing/border/EmptyBorder.js
+javax/swing/border/EtchedBorder.js
 javax/swing/border/LineBorder.js
+javax/swing/border/TitledBorder.js
+javax/swing/event/AncestorEvent.js
+javax/swing/event/AncestorListener.js
+javax/swing/event/ChangeEvent.js
+javax/swing/event/ChangeListener.js
+javax/swing/event/EventListenerList.js
 javax/swing/event/InternalFrameAdapter.js
 javax/swing/event/InternalFrameEvent.js
 javax/swing/event/InternalFrameListener.js
+javax/swing/event/ListDataListener.js
+javax/swing/event/MenuKeyListener.js
 javax/swing/event/MenuListener.js
+javax/swing/event/TableModelListener.js
+javax/swing/plaf/ActionMapUIResource.js
+javax/swing/plaf/BorderUIResource.js
+javax/swing/plaf/ColorUIResource.js
 javax/swing/plaf/ComponentInputMapUIResource.js
+javax/swing/plaf/ComponentUI.js
+javax/swing/plaf/DimensionUIResource.js
+javax/swing/plaf/FontUIResource.js
+javax/swing/plaf/InsetsUIResource.js
+javax/swing/plaf/UIResource.js
+javax/swing/plaf/basic/BasicBorders.js
+javax/swing/table/AbstractTableModel.js
+javax/swing/table/TableModel.js
 javax/xml/bind/ContextFinder.js
 javax/xml/bind/GetPropertyAction.js
 javax/xml/bind/JAXBContext.js
@@ -395,6 +654,9 @@ javax/xml/namespace/QName.js
 javax/xml/stream/XMLInputFactory.js
 javax/xml/stream/XMLStreamReader.js
 org/apache/xerces/jaxp/datatype/XMLGregorianCalendarImpl.js
+org/json/simple/parser/JSONParser.js
+org/json/simple/parser/ParseException.js
+org/json/simple/parser/Yylex.js
 org/xml/sax/AttributeList.js
 org/xml/sax/Attributes.js
 org/xml/sax/ContentHandler.js
@@ -403,9 +665,21 @@ org/xml/sax/Parser.js
 org/xml/sax/XMLReader.js
 org/xml/sax/ext/Attributes2.js
 sun/awt/AWTAccessor.js
+sun/awt/AWTAutoShutdown.js
+sun/awt/AppContext.js
 sun/awt/CausedFocusEvent.js
+sun/awt/ComponentFactory.js
+sun/awt/EventQueueItem.js
 sun/awt/KeyboardFocusManagerPeerProvider.js
+sun/awt/MostRecentKeyValue.js
+sun/awt/MostRecentThreadAppContext.js
+sun/awt/PaintEventDispatcher.js
+sun/awt/PostEventQueue.js
+sun/awt/RequestFocusController.js
 sun/awt/SunGraphicsCallback.js
+sun/awt/SunToolkit.js
+sun/awt/WindowClosingListener.js
+sun/awt/WindowClosingSupport.js
 sun/awt/image/DataStealer.js
 sun/awt/image/IntegerComponentRaster.js
 sun/awt/image/IntegerInterleavedRaster.js
@@ -413,7 +687,15 @@ sun/awt/image/SunWritableRaster.js
 sun/font/FontDesignMetrics.js
 sun/java2d/StateTrackable.js
 sun/java2d/StateTrackableDelegate.js
+sun/nio/cs/ArrayDecoder.js
+sun/nio/cs/HistoricallyNamedCharset.js
+sun/nio/cs/StandardCharsets.js
+sun/nio/cs/ThreadLocalCoders.js
+sun/nio/cs/UTF_8.js
+sun/nio/cs/Unicode.js
 sun/swing/DefaultLookup.js
+sun/swing/SwingLazyValue.js
+sun/swing/UIAction.js
 sun/text/resources/FormatData.js
 sun/text/resources/FormatData_en.js
 sun/util/calendar/AbstractCalendar.js
@@ -424,8 +706,30 @@ sun/util/calendar/CalendarUtils.js
 sun/util/calendar/Gregorian.js
 sun/util/calendar/ZoneInfo.js
 sun/util/resources/LocaleData.js
-swingjs/JSFocusManager.js
+swingjs/JSApp.js
+swingjs/JSApplet.js
+swingjs/JSAppletThread.js
+swingjs/JSAppletViewer.js
+swingjs/JSCharSet.js
+swingjs/JSFocusPeer.js
+swingjs/JSFontMetrics.js
+swingjs/JSFrameViewer.js
+swingjs/JSGraphics2D.js
+swingjs/JSGraphicsConfiguration.js
+swingjs/JSGraphicsEnvironment.js
+swingjs/JSKeyEvent.js
+swingjs/JSMenuManager.js
+swingjs/JSMouse.js
+swingjs/JSScreenDevice.js
+swingjs/JSThreadGroup.js
+swingjs/JSToolkit.js
+swingjs/JSUtil.js
 swingjs/a2s/Dialog.js
+swingjs/api/Interface.js
+swingjs/api/js/DOMNode.js
+swingjs/api/js/HTML5CanvasContext2D.js
+swingjs/api/js/JSInterface.js
+swingjs/jquery/JQueryUI.js
 swingjs/jzlib/Adler32.js
 swingjs/jzlib/CRC32.js
 swingjs/jzlib/Checksum.js
@@ -436,16 +740,45 @@ swingjs/jzlib/Inflate.js
 swingjs/jzlib/Inflater.js
 swingjs/jzlib/InflaterInputStream.js
 swingjs/jzlib/ZStream.js
+swingjs/plaf/ButtonListener.js
+swingjs/plaf/DefaultMenuLayout.js
+swingjs/plaf/HTML5LookAndFeel.js
 swingjs/plaf/JSAppletUI.js
+swingjs/plaf/JSButtonUI.js
+swingjs/plaf/JSCheckBoxMenuItemUI.js
+swingjs/plaf/JSCheckBoxUI.js
+swingjs/plaf/JSComboBoxUI.js
+swingjs/plaf/JSComponentUI.js
 swingjs/plaf/JSDesktopIconUI.js
 swingjs/plaf/JSDesktopPaneUI.js
+swingjs/plaf/JSEventHandler.js
+swingjs/plaf/JSFrameUI.js
 swingjs/plaf/JSGraphicsUtils.js
 swingjs/plaf/JSInternalFrameUI.js
+swingjs/plaf/JSLabelUI.js
+swingjs/plaf/JSLayeredPaneUI.js
+swingjs/plaf/JSLightweightUI.js
+swingjs/plaf/JSMenuBarUI.js
+swingjs/plaf/JSMenuItemUI.js
+swingjs/plaf/JSMenuUI.js
+swingjs/plaf/JSPanelUI.js
+swingjs/plaf/JSPopupMenuSeparatorUI.js
+swingjs/plaf/JSPopupMenuUI.js
+swingjs/plaf/JSPopupUI.js
 swingjs/plaf/JSProgressBarUI.js
+swingjs/plaf/JSRadioButtonMenuItemUI.js
+swingjs/plaf/JSRadioButtonUI.js
+swingjs/plaf/JSRootPaneUI.js
+swingjs/plaf/JSScrollBarUI.js
 swingjs/plaf/JSScrollPaneUI.js
+swingjs/plaf/JSSeparatorUI.js
+swingjs/plaf/JSSliderUI.js
 swingjs/plaf/JSTabbedPaneUI.js
 swingjs/plaf/JSToolTipUI.js
 swingjs/plaf/JSViewportUI.js
+swingjs/plaf/JSWindowUI.js
+swingjs/plaf/LazyActionMap.js
+swingjs/plaf/Resizer.js
 swingjs/xml/JSJAXBClass.js
 swingjs/xml/JSJAXBContext.js
 swingjs/xml/JSJAXBContextFactory.js
@@ -455,4 +788,4 @@ swingjs/xml/JSSAXAttributes.js
 swingjs/xml/JSSAXParser.js
 swingjs/xml/JSXMLGregorianCalendarImpl.js
 swingjs/xml/JSXMLInputFactory.js
-swingjs/xml/JSXMLStreamReader.js
\ No newline at end of file
+swingjs/xml/JSXMLStreamReader.js
diff --git a/optimization/timing-java-bh.txt b/optimization/timing-java-bh.txt
new file mode 100644 (file)
index 0000000..69da3ac
--- /dev/null
@@ -0,0 +1,259 @@
+Java version: 1.8.0_191
+amd64 Windows 10 10.0
+Error reading author details: java.io.FileNotFoundException: C:\Users\hansonr\git\jalview1\classes (Access is denied)
+Error reading build details: java.io.FileNotFoundException: C:\Users\hansonr\git\jalview1\classes (Access is denied)
+Jalview Version: Test
+INFO - Getting messages for lang: en_US
+Platform: timer mark   0.0     0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/lookup/id/ENSG00000157764?content-type=application/json
+Platform: timer mark   0.618   0.618   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   0.619   0.001   EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   0.619   0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/ping?content-type=application/json
+Platform: timer mark   0.749   0.13    EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   0.749   0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   0.749   0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/rest?content-type=application/json
+Platform: timer mark   0.881   0.132   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   0.881   0.0     EnsembleRestClient.getJSON2 ...done 
+EnsemblRestClient expected ENSEMBL REST version 7.0 but found 9.0, see https://github.com/Ensembl/ensembl-rest/wiki/Change-log
+Platform: timer mark   0.885   0.004   EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/data?content-type=application/json
+Platform: timer mark   1.017   0.132   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   1.018   0.001   EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   1.018   0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   1.018   0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENSG00000157764?type=genomic&Accept=application/json&content-type=application/json&object_type=Gene
+Platform: timer mark   1.298   0.28    EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   2.225   0.927   EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   2.258   0.033   EnsembleRestClient.getJSON0 https://rest.ensembl.org/overlap/id/ENSG00000157764?content-type=application/json&object_type=Gene&feature=gene&feature=transcript&feature=exon&feature=cds&feature=variation
+Platform: timer mark   7.331   5.073   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   49.341  42.01   EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   51.216  1.875   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSG00000157764?content-type=application/json&all_levels=1
+Platform: timer mark   52.088  0.872   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   52.552  0.464   EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   52.581  0.029   EnsembleRestClient.getJSON0 https://rest.ensembl.org/lookup/id/ENSG00000157764?content-type=application/json&object_type=Gene
+Platform: timer mark   52.716  0.135   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   52.716  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   52.769  0.053   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000646891?content-type=application/json&all_levels=1
+Platform: timer mark   53.223  0.454   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   53.344  0.121   EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000646891
+Platform: timer mark   53.353  0.009   EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/ping?content-type=application/json
+Platform: timer mark   53.486  0.133   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   53.486  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   53.487  0.001   EnsemblSeqProx.fetchSeq 
+Platform: timer mark   53.487  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000646891?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark   53.68   0.193   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   53.68   0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   53.681  0.001   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000493543?content-type=application/json&all_levels=1
+Platform: timer mark   53.893  0.212   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   54.004  0.111   EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   54.152  0.148   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000496384?content-type=application/json&all_levels=1
+Platform: timer mark   54.317  0.165   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   54.318  0.001   EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000496384
+Platform: timer mark   54.318  0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   54.318  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000496384?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark   54.482  0.164   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   54.482  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   54.482  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000419060?content-type=application/json&all_levels=1
+Platform: timer mark   54.627  0.145   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   54.628  0.001   EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   54.646  0.018   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000469930?content-type=application/json&all_levels=1
+Platform: timer mark   54.821  0.175   EnsembleRestClient.getJSON1 parsing... 
+Adding protein product for ENST00000469930
+Platform: timer mark   54.821  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   54.821  0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   54.821  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000469930?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark   54.965  0.144   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   54.965  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   54.965  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000495858?content-type=application/json&all_levels=1
+Platform: timer mark   55.112  0.147   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   55.112  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   55.134  0.022   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000288602?content-type=application/json&all_levels=1
+Platform: timer mark   55.304  0.17    EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   55.304  0.0     EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000288602
+Platform: timer mark   55.304  0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   55.304  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000288602?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark   55.455  0.151   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   55.456  0.001   EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   55.456  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000288602?content-type=application/json&all_levels=1
+Platform: timer mark   55.599  0.143   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   55.599  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   55.622  0.023   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000642272?content-type=application/json&all_levels=1
+Platform: timer mark   55.758  0.136   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   55.758  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   55.758  0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   55.758  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000642272?type=protein&Accept=application/json&content-type=application/json
+Adding protein product for ENST00000642272
+Response code 400
+No protein product found for ENST00000642272
+Platform: timer mark   55.9    0.142   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   55.9    0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   55.91   0.01    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000643790?content-type=application/json&all_levels=1
+Platform: timer mark   56.292  0.382   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   56.292  0.0     EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000643790
+Platform: timer mark   56.292  0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   56.292  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000643790?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark   56.438  0.146   EnsembleRestClient.getJSON1 parsing... 
+No protein product found for ENST00000643790
+Platform: timer mark   56.438  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   56.447  0.009   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000646427?content-type=application/json&all_levels=1
+Platform: timer mark   56.816  0.369   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   56.816  0.0     EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000646427
+Platform: timer mark   56.816  0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   56.816  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000646427?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark   56.956  0.14    EnsembleRestClient.getJSON1 parsing... 
+No protein product found for ENST00000646427
+Platform: timer mark   56.956  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   56.965  0.009   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000642808?content-type=application/json&all_levels=1
+Platform: timer mark   57.343  0.378   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   57.344  0.001   EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000642808
+Platform: timer mark   57.344  0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   57.344  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000642808?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark   57.483  0.139   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   57.483  0.0     EnsembleRestClient.getJSON2 ...done 
+No protein product found for ENST00000642808
+Platform: timer mark   57.491  0.008   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000643356?content-type=application/json&all_levels=1
+Platform: timer mark   57.873  0.382   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   57.873  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   57.873  0.0     EnsemblSeqProx.fetchSeq 
+Adding protein product for ENST00000643356
+Platform: timer mark   57.873  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000643356?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark   58.018  0.145   EnsembleRestClient.getJSON1 parsing... No protein product found for ENST00000643356
+
+Platform: timer mark   58.018  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   58.034  0.016   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000497784?content-type=application/json&all_levels=1
+Platform: timer mark   58.413  0.379   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   58.413  0.0     EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000497784
+Platform: timer mark   58.413  0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   58.414  0.001   EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000497784?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark   58.599  0.185   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   58.599  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   58.6    0.001   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000420119?content-type=application/json&all_levels=1
+Platform: timer mark   58.745  0.145   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   58.745  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   58.759  0.014   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000646334?content-type=application/json&all_levels=1
+Platform: timer mark   58.896  0.137   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   58.896  0.0     EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000646334
+Platform: timer mark   58.896  0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   58.896  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000646334?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark   59.037  0.141   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   59.037  0.0     EnsembleRestClient.getJSON2 ...done 
+No protein product found for ENST00000646334
+Platform: timer mark   59.054  0.017   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000646730?content-type=application/json&all_levels=1
+Platform: timer mark   59.499  0.445   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   59.499  0.0     EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000646730
+Platform: timer mark   59.5    0.001   EnsemblSeqProx.fetchSeq 
+Platform: timer mark   59.5    0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000646730?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark   59.659  0.159   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   59.659  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   59.659  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000494784?content-type=application/json&all_levels=1
+Platform: timer mark   59.803  0.144   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   59.804  0.001   EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   59.819  0.015   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000644650?content-type=application/json&all_levels=1
+Platform: timer mark   59.989  0.17    EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   59.989  0.0     EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000644650
+Platform: timer mark   59.989  0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   59.989  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000644650?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark   60.151  0.162   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   60.151  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   60.151  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000493783?content-type=application/json&all_levels=1
+Platform: timer mark   60.301  0.15    EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   60.301  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   60.316  0.015   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000647434?content-type=application/json&all_levels=1
+Platform: timer mark   60.469  0.153   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   60.469  0.0     EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000647434
+Platform: timer mark   60.47   0.001   EnsemblSeqProx.fetchSeq 
+Platform: timer mark   60.47   0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000647434?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark   60.615  0.145   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   60.615  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   60.615  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000495132?content-type=application/json&all_levels=1
+Platform: timer mark   60.765  0.15    EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   60.765  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   60.779  0.014   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000479537?content-type=application/json&all_levels=1
+Platform: timer mark   60.935  0.156   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   60.935  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   60.935  0.0     EnsemblSeqProx.fetchSeq 
+Adding protein product for ENST00000479537
+Platform: timer mark   60.935  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000479537?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark   61.352  0.417   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   61.353  0.001   EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   61.357  0.004   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000418033?content-type=application/json&all_levels=1
+Platform: timer mark   61.506  0.149   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   61.507  0.001   EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   61.519  0.012   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000645443?content-type=application/json&all_levels=1
+Platform: timer mark   61.706  0.187   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   61.706  0.0     EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000645443
+Platform: timer mark   61.706  0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   61.706  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000645443?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark   61.845  0.139   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   61.845  0.0     EnsembleRestClient.getJSON2 ...done 
+No protein product found for ENST00000645443
+Platform: timer mark   61.863  0.018   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000644905?content-type=application/json&all_levels=1
+Platform: timer mark   62.242  0.379   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   62.242  0.0     EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000644905
+Platform: timer mark   62.243  0.001   EnsemblSeqProx.fetchSeq 
+Platform: timer mark   62.243  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000644905?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark   62.382  0.139   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   62.382  0.0     EnsembleRestClient.getJSON2 ...done 
+No protein product found for ENST00000644905
+Platform: timer mark   62.398  0.016   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000642228?content-type=application/json&all_levels=1
+Platform: timer mark   62.792  0.394   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   62.792  0.0     EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000642228
+Platform: timer mark   62.793  0.001   EnsemblSeqProx.fetchSeq 
+Platform: timer mark   62.793  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000642228?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark   62.962  0.169   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   62.962  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   62.962  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000493678?content-type=application/json&all_levels=1
+Platform: timer mark   63.117  0.155   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   63.117  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   63.137  0.02    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000644969?content-type=application/json&all_levels=1
+Platform: timer mark   63.311  0.174   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   63.311  0.0     EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000644969
+Platform: timer mark   63.312  0.001   EnsemblSeqProx.fetchSeq 
+Platform: timer mark   63.312  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000644969?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark   63.467  0.155   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   63.467  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   63.467  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000496776?content-type=application/json&all_levels=1
+Platform: timer mark   63.622  0.155   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   63.622  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   63.641  0.019   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000644120?content-type=application/json&all_levels=1
+Platform: timer mark   63.79   0.149   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   63.79   0.0     EnsembleRestClient.getJSON2 ...done 
+Adding protein product for ENST00000644120
+Platform: timer mark   63.79   0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/ping?content-type=application/json
+Platform: timer mark   63.925  0.135   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   63.925  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   63.925  0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   63.925  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000644120?type=protein&Accept=application/json&content-type=application/json
+No protein product found for ENST00000644120
+Response code 400
+Platform: timer mark   64.069  0.144   EnsembleRestClient.getJSON1 parsing... 
+Platform: timer mark   64.069  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   64.112  0.043   EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000642875?content-type=application/json&all_levels=1
+Platform: timer mark   64.483  0.371   EnsembleRestClient.getJSON1 parsing... 
+Adding protein product for ENST00000642875
+Platform: timer mark   64.483  0.0     EnsembleRestClient.getJSON2 ...done 
+Platform: timer mark   64.483  0.0     EnsemblSeqProx.fetchSeq 
+Platform: timer mark   64.483  0.0     EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000642875?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark   64.626  0.143   EnsembleRestClient.getJSON1 parsing... 
+No protein product found for ENST00000642875
+Platform: timer mark   64.626  0.0     EnsembleRestClient.getJSON2 ...done 
diff --git a/optimization/timing-js-chrome-bh.txt b/optimization/timing-js-chrome-bh.txt
new file mode 100644 (file)
index 0000000..9766020
--- /dev/null
@@ -0,0 +1,253 @@
+Platform: timer mark    0.0    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/lookup/id/ENSG00000157764?content-type=application/json
+Platform: timer mark    0.575    0.575    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    0.579    0.004    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    0.585    0.006    EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/ping?content-type=application/json
+Platform: timer mark    0.799    0.214    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    0.8    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    0.8    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/rest?content-type=application/json
+Platform: timer mark    0.999    0.199    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    1.0    0.001    EnsembleRestClient.getJSON2 ...done
+EnsemblRestClient expected ENSEMBL REST version 7.0 but found 9.0, see https://github.com/Ensembl/ensembl-rest/wiki/Change-log
+Platform: timer mark    1.017    0.017    EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/data?content-type=application/json
+Platform: timer mark    1.198    0.181    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    1.198    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    1.199    0.001    EnsemblSeqProx.fetchSeq
+Platform: timer mark    1.2    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENSG00000157764?type=genomic&Accept=application/json&content-type=application/json&object_type=Gene
+Platform: timer mark    4.001    2.801    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    4.001    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    4.569    0.568    EnsembleRestClient.getJSON0 https://rest.ensembl.org/overlap/id/ENSG00000157764?content-type=application/json&object_type=Gene&feature=gene&feature=transcript&feature=exon&feature=cds&feature=variation
+Platform: timer mark    19.839    15.27    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    19.839    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    20.13    0.291    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSG00000157764?content-type=application/json&all_levels=1
+Platform: timer mark    20.898    0.768    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    20.899    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    71.77    50.871    EnsembleRestClient.getJSON0 https://rest.ensembl.org/lookup/id/ENSG00000157764?content-type=application/json&object_type=Gene
+Platform: timer mark    72.199    0.429    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    72.199    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    72.6    0.401    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000646891?content-type=application/json&all_levels=1
+Platform: timer mark    73.692    1.092    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    73.694    0.002    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000646891
+Platform: timer mark    73.797    0.103    EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/ping?content-type=application/json
+Platform: timer mark    74.009    0.212    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    74.009    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    74.01    0.001    EnsemblSeqProx.fetchSeq
+Platform: timer mark    74.011    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000646891?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    74.215    0.204    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    74.216    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    74.219    0.003    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000493543?content-type=application/json&all_levels=1
+Platform: timer mark    74.697    0.478    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    74.697    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    74.924    0.227    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000496384?content-type=application/json&all_levels=1
+Platform: timer mark    75.12    0.196    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    75.12    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000496384
+Platform: timer mark    75.144    0.024    EnsemblSeqProx.fetchSeq
+Platform: timer mark    75.145    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000496384?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    75.325    0.18    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    75.326    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    75.331    0.005    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000419060?content-type=application/json&all_levels=1
+Platform: timer mark    75.535    0.204    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    75.535    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    75.65    0.115    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000469930?content-type=application/json&all_levels=1
+Platform: timer mark    75.826    0.176    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    75.827    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000469930
+Platform: timer mark    75.831    0.004    EnsemblSeqProx.fetchSeq
+Platform: timer mark    75.832    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000469930?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    76.027    0.195    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    76.028    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    76.028    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000495858?content-type=application/json&all_levels=1
+Platform: timer mark    76.223    0.195    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    76.224    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    76.331    0.107    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000288602?content-type=application/json&all_levels=1
+Platform: timer mark    76.541    0.21    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    76.541    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000288602
+Platform: timer mark    76.55    0.009    EnsemblSeqProx.fetchSeq
+Platform: timer mark    76.55    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000288602?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    76.733    0.183    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    76.734    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    76.736    0.002    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000288602?content-type=application/json&all_levels=1
+Platform: timer mark    76.928    0.192    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    76.93    0.002    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    77.047    0.117    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000642272?content-type=application/json&all_levels=1
+Platform: timer mark    77.239    0.192    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    77.239    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000642272
+Platform: timer mark    77.246    0.007    EnsemblSeqProx.fetchSeq
+Platform: timer mark    77.247    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000642272?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    77.45    0.203    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    77.45    0.0    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000642272
+Platform: timer mark    77.551    0.101    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000643790?content-type=application/json&all_levels=1
+Platform: timer mark    77.947    0.396    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    77.948    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000643790
+Platform: timer mark    77.95    0.002    EnsemblSeqProx.fetchSeq
+Platform: timer mark    77.952    0.002    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000643790?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    78.148    0.196    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    78.149    0.001    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000643790
+Platform: timer mark    78.247    0.098    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000646427?content-type=application/json&all_levels=1
+Platform: timer mark    78.656    0.409    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    78.656    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000646427
+Platform: timer mark    78.662    0.006    EnsemblSeqProx.fetchSeq
+Platform: timer mark    78.664    0.002    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000646427?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    78.866    0.202    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    78.866    0.0    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000646427
+Platform: timer mark    78.966    0.1    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000642808?content-type=application/json&all_levels=1
+Platform: timer mark    79.365    0.399    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    79.366    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000642808
+Platform: timer mark    79.368    0.002    EnsemblSeqProx.fetchSeq
+Platform: timer mark    79.369    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000642808?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    79.554    0.185    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    79.555    0.001    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000642808
+Platform: timer mark    79.653    0.098    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000643356?content-type=application/json&all_levels=1
+Platform: timer mark    80.065    0.412    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    80.066    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000643356
+Platform: timer mark    80.069    0.003    EnsemblSeqProx.fetchSeq
+Platform: timer mark    80.07    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000643356?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    80.252    0.182    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    80.253    0.001    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000643356
+Platform: timer mark    80.354    0.101    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000497784?content-type=application/json&all_levels=1
+Platform: timer mark    80.761    0.407    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    80.762    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000497784
+Platform: timer mark    80.769    0.007    EnsemblSeqProx.fetchSeq
+Platform: timer mark    80.769    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000497784?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    80.964    0.195    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    80.966    0.002    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    80.967    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000420119?content-type=application/json&all_levels=1
+Platform: timer mark    81.159    0.192    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    81.16    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    81.266    0.106    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000646334?content-type=application/json&all_levels=1
+Platform: timer mark    81.464    0.198    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    81.465    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000646334
+Platform: timer mark    81.47    0.005    EnsemblSeqProx.fetchSeq
+Platform: timer mark    81.471    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000646334?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    81.664    0.193    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    81.665    0.001    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000646334
+Platform: timer mark    81.77    0.105    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000646730?content-type=application/json&all_levels=1
+Platform: timer mark    82.281    0.511    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    82.283    0.002    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000646730
+Platform: timer mark    82.29    0.007    EnsemblSeqProx.fetchSeq
+Platform: timer mark    82.291    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000646730?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    82.459    0.168    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    82.46    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    82.461    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000494784?content-type=application/json&all_levels=1
+Platform: timer mark    82.664    0.203    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    82.664    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    82.777    0.113    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000644650?content-type=application/json&all_levels=1
+Platform: timer mark    82.99    0.213    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    82.991    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000644650
+Platform: timer mark    82.996    0.005    EnsemblSeqProx.fetchSeq
+Platform: timer mark    82.997    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000644650?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    83.186    0.189    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    83.187    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    83.188    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000493783?content-type=application/json&all_levels=1
+Platform: timer mark    83.389    0.201    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    83.389    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    83.497    0.108    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000647434?content-type=application/json&all_levels=1
+Platform: timer mark    83.795    0.298    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    83.796    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000647434
+Platform: timer mark    83.802    0.006    EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/ping?content-type=application/json
+Platform: timer mark    83.993    0.191    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    83.994    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    83.995    0.001    EnsemblSeqProx.fetchSeq
+Platform: timer mark    83.996    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000647434?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    84.293    0.297    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    84.294    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    84.296    0.002    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000495132?content-type=application/json&all_levels=1
+Platform: timer mark    84.491    0.195    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    84.491    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    84.598    0.107    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000479537?content-type=application/json&all_levels=1
+Platform: timer mark    84.791    0.193    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    84.792    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000479537
+Platform: timer mark    84.797    0.005    EnsemblSeqProx.fetchSeq
+Platform: timer mark    84.797    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000479537?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    84.991    0.194    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    84.992    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    84.993    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000418033?content-type=application/json&all_levels=1
+Platform: timer mark    85.187    0.194    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    85.188    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    85.29    0.102    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000645443?content-type=application/json&all_levels=1
+Platform: timer mark    85.471    0.181    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    85.473    0.002    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000645443
+Platform: timer mark    85.478    0.005    EnsemblSeqProx.fetchSeq
+Platform: timer mark    85.48    0.002    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000645443?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    85.693    0.213    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    85.694    0.001    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000645443
+Platform: timer mark    85.804    0.11    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000644905?content-type=application/json&all_levels=1
+Platform: timer mark    86.175    0.371    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    86.176    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000644905
+Platform: timer mark    86.187    0.011    EnsemblSeqProx.fetchSeq
+Platform: timer mark    86.188    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000644905?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    86.389    0.201    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    86.389    0.0    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000644905
+Platform: timer mark    86.526    0.137    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000642228?content-type=application/json&all_levels=1
+Platform: timer mark    86.989    0.463    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    86.989    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000642228
+Platform: timer mark    86.998    0.009    EnsemblSeqProx.fetchSeq
+Platform: timer mark    86.998    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000642228?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    87.219    0.221    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    87.219    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    87.221    0.002    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000493678?content-type=application/json&all_levels=1
+Platform: timer mark    87.392    0.171    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    87.393    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    87.508    0.115    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000644969?content-type=application/json&all_levels=1
+Platform: timer mark    87.708    0.2    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    87.709    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000644969
+Platform: timer mark    87.718    0.009    EnsemblSeqProx.fetchSeq
+Platform: timer mark    87.719    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000644969?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    87.917    0.198    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    87.918    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    87.919    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000496776?content-type=application/json&all_levels=1
+Platform: timer mark    88.093    0.174    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    88.094    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    88.205    0.111    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000644120?content-type=application/json&all_levels=1
+Platform: timer mark    88.392    0.187    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    88.393    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000644120
+Platform: timer mark    88.402    0.009    EnsemblSeqProx.fetchSeq
+Platform: timer mark    88.403    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000644120?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    88.592    0.189    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    88.592    0.0    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000644120
+Platform: timer mark    88.698    0.106    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000642875?content-type=application/json&all_levels=1
+Platform: timer mark    89.091    0.393    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    89.092    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000642875
+Platform: timer mark    89.1    0.008    EnsemblSeqProx.fetchSeq
+Platform: timer mark    89.101    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000642875?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    89.293    0.192    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    89.293    0.0    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000642875
diff --git a/optimization/timing-js-firefox-bh.txt b/optimization/timing-js-firefox-bh.txt
new file mode 100644 (file)
index 0000000..02e3079
--- /dev/null
@@ -0,0 +1,253 @@
+Platform: timer mark    0.0    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/lookup/id/ENSG00000157764?content-type=application/json
+Platform: timer mark    0.494    0.494    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    0.497    0.003    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    0.504    0.007    EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/ping?content-type=application/json
+Platform: timer mark    0.644    0.14    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    0.644    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    0.646    0.002    EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/rest?content-type=application/json
+Platform: timer mark    0.79    0.144    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    0.791    0.001    EnsembleRestClient.getJSON2 ...done
+EnsemblRestClient expected ENSEMBL REST version 7.0 but found 9.0, see https://github.com/Ensembl/ensembl-rest/wiki/Change-log
+Platform: timer mark    0.807    0.016    EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/data?content-type=application/json
+Platform: timer mark    0.948    0.141    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    0.948    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    0.949    0.001    EnsemblSeqProx.fetchSeq
+Platform: timer mark    0.95    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENSG00000157764?type=genomic&Accept=application/json&content-type=application/json&object_type=Gene
+Platform: timer mark    2.818    1.868    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    2.819    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    3.466    0.647    EnsembleRestClient.getJSON0 https://rest.ensembl.org/overlap/id/ENSG00000157764?content-type=application/json&object_type=Gene&feature=gene&feature=transcript&feature=exon&feature=cds&feature=variation
+Platform: timer mark    35.082    31.616    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    35.082    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    35.602    0.52    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSG00000157764?content-type=application/json&all_levels=1
+Platform: timer mark    36.379    0.777    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    36.379    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    78.898    42.519    EnsembleRestClient.getJSON0 https://rest.ensembl.org/lookup/id/ENSG00000157764?content-type=application/json&object_type=Gene
+Platform: timer mark    79.373    0.475    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    79.373    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    79.937    0.564    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000646891?content-type=application/json&all_levels=1
+Platform: timer mark    81.009    1.072    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    81.01    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000646891
+Platform: timer mark    81.194    0.184    EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/ping?content-type=application/json
+Platform: timer mark    81.342    0.148    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    81.342    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    81.343    0.001    EnsemblSeqProx.fetchSeq
+Platform: timer mark    81.345    0.002    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000646891?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    81.698    0.353    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    81.699    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    81.702    0.003    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000493543?content-type=application/json&all_levels=1
+Platform: timer mark    82.213    0.511    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    82.213    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    82.757    0.544    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000496384?content-type=application/json&all_levels=1
+Platform: timer mark    83.001    0.244    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    83.002    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000496384
+Platform: timer mark    83.026    0.024    EnsemblSeqProx.fetchSeq
+Platform: timer mark    83.026    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000496384?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    83.204    0.178    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    83.204    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    83.207    0.003    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000419060?content-type=application/json&all_levels=1
+Platform: timer mark    83.359    0.152    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    83.359    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    83.727    0.368    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000469930?content-type=application/json&all_levels=1
+Platform: timer mark    83.89    0.163    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    83.89    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000469930
+Platform: timer mark    83.897    0.007    EnsemblSeqProx.fetchSeq
+Platform: timer mark    83.897    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000469930?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    84.061    0.164    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    84.062    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    84.063    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000495858?content-type=application/json&all_levels=1
+Platform: timer mark    84.311    0.248    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    84.311    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    84.667    0.356    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000288602?content-type=application/json&all_levels=1
+Platform: timer mark    84.911    0.244    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    84.912    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000288602
+Platform: timer mark    84.922    0.01    EnsemblSeqProx.fetchSeq
+Platform: timer mark    84.922    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000288602?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    85.109    0.187    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    85.11    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    85.115    0.005    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000288602?content-type=application/json&all_levels=1
+Platform: timer mark    85.266    0.151    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    85.267    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    85.64    0.373    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000642272?content-type=application/json&all_levels=1
+Platform: timer mark    85.78    0.14    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    85.78    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000642272
+Platform: timer mark    85.787    0.007    EnsemblSeqProx.fetchSeq
+Platform: timer mark    85.788    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000642272?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    85.966    0.178    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    85.967    0.001    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000642272
+Platform: timer mark    86.336    0.369    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000643790?content-type=application/json&all_levels=1
+Platform: timer mark    86.838    0.502    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    86.838    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000643790
+Platform: timer mark    86.842    0.004    EnsemblSeqProx.fetchSeq
+Platform: timer mark    86.843    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000643790?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    86.991    0.148    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    86.992    0.001    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000643790
+Platform: timer mark    87.335    0.343    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000646427?content-type=application/json&all_levels=1
+Platform: timer mark    87.803    0.468    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    87.804    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000646427
+Platform: timer mark    87.811    0.007    EnsemblSeqProx.fetchSeq
+Platform: timer mark    87.811    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000646427?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    87.999    0.188    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    87.999    0.0    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000646427
+Platform: timer mark    88.337    0.338    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000642808?content-type=application/json&all_levels=1
+Platform: timer mark    88.735    0.398    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    88.735    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000642808
+Platform: timer mark    88.739    0.004    EnsemblSeqProx.fetchSeq
+Platform: timer mark    88.74    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000642808?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    88.904    0.164    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    88.904    0.0    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000642808
+Platform: timer mark    89.263    0.359    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000643356?content-type=application/json&all_levels=1
+Platform: timer mark    89.649    0.386    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    89.65    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000643356
+Platform: timer mark    89.654    0.004    EnsemblSeqProx.fetchSeq
+Platform: timer mark    89.655    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000643356?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    89.842    0.187    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    89.842    0.0    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000643356
+Platform: timer mark    90.199    0.357    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000497784?content-type=application/json&all_levels=1
+Platform: timer mark    90.622    0.423    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    90.623    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000497784
+Platform: timer mark    90.63    0.007    EnsemblSeqProx.fetchSeq
+Platform: timer mark    90.632    0.002    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000497784?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    90.817    0.185    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    90.817    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    90.82    0.003    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000420119?content-type=application/json&all_levels=1
+Platform: timer mark    91.017    0.197    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    91.018    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    91.373    0.355    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000646334?content-type=application/json&all_levels=1
+Platform: timer mark    91.522    0.149    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    91.522    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000646334
+Platform: timer mark    91.529    0.007    EnsembleRestClient.getJSON0 https://rest.ensembl.org/info/ping?content-type=application/json
+Platform: timer mark    91.719    0.19    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    91.72    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    91.72    0.0    EnsemblSeqProx.fetchSeq
+Platform: timer mark    91.721    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000646334?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    91.92    0.199    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    91.92    0.0    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000646334
+Platform: timer mark    92.305    0.385    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000646730?content-type=application/json&all_levels=1
+Platform: timer mark    92.728    0.423    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    92.728    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000646730
+Platform: timer mark    92.74    0.012    EnsemblSeqProx.fetchSeq
+Platform: timer mark    92.741    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000646730?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    92.927    0.186    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    92.928    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    92.929    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000494784?content-type=application/json&all_levels=1
+Platform: timer mark    93.166    0.237    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    93.167    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    93.528    0.361    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000644650?content-type=application/json&all_levels=1
+Platform: timer mark    93.772    0.244    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    93.773    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000644650
+Platform: timer mark    93.781    0.008    EnsemblSeqProx.fetchSeq
+Platform: timer mark    93.782    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000644650?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    93.949    0.167    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    93.95    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    93.951    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000493783?content-type=application/json&all_levels=1
+Platform: timer mark    94.171    0.22    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    94.172    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    94.534    0.362    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000647434?content-type=application/json&all_levels=1
+Platform: timer mark    94.783    0.249    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    94.784    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000647434
+Platform: timer mark    94.79    0.006    EnsemblSeqProx.fetchSeq
+Platform: timer mark    94.791    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000647434?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    94.958    0.167    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    94.959    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    94.96    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000495132?content-type=application/json&all_levels=1
+Platform: timer mark    95.137    0.177    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    95.137    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    95.573    0.436    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000479537?content-type=application/json&all_levels=1
+Platform: timer mark    95.753    0.18    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    95.753    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000479537
+Platform: timer mark    95.759    0.006    EnsemblSeqProx.fetchSeq
+Platform: timer mark    95.76    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000479537?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    95.943    0.183    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    95.944    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    95.947    0.003    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000418033?content-type=application/json&all_levels=1
+Platform: timer mark    96.142    0.195    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    96.144    0.002    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    96.489    0.345    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000645443?content-type=application/json&all_levels=1
+Platform: timer mark    96.687    0.198    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    96.688    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000645443
+Platform: timer mark    96.694    0.006    EnsemblSeqProx.fetchSeq
+Platform: timer mark    96.696    0.002    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000645443?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    96.846    0.15    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    96.846    0.0    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000645443
+Platform: timer mark    97.211    0.365    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000644905?content-type=application/json&all_levels=1
+Platform: timer mark    97.686    0.475    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    97.686    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000644905
+Platform: timer mark    97.698    0.012    EnsemblSeqProx.fetchSeq
+Platform: timer mark    97.699    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000644905?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    97.849    0.15    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    97.85    0.001    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000644905
+Platform: timer mark    98.268    0.418    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000642228?content-type=application/json&all_levels=1
+Platform: timer mark    98.663    0.395    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    98.663    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000642228
+Platform: timer mark    98.672    0.009    EnsemblSeqProx.fetchSeq
+Platform: timer mark    98.672    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000642228?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    98.851    0.179    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    98.851    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    98.853    0.002    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000493678?content-type=application/json&all_levels=1
+Platform: timer mark    99.008    0.155    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    99.008    0.0    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    99.374    0.366    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000644969?content-type=application/json&all_levels=1
+Platform: timer mark    99.553    0.179    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    99.554    0.001    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000644969
+Platform: timer mark    99.565    0.011    EnsemblSeqProx.fetchSeq
+Platform: timer mark    99.565    0.0    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000644969?type=protein&Accept=application/json&content-type=application/json
+Platform: timer mark    99.752    0.187    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    99.753    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    99.757    0.004    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENSP00000496776?content-type=application/json&all_levels=1
+Platform: timer mark    99.915    0.158    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    99.916    0.001    EnsembleRestClient.getJSON2 ...done
+Platform: timer mark    100.28    0.364    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000644120?content-type=application/json&all_levels=1
+Platform: timer mark    100.454    0.174    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    100.456    0.002    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000644120
+Platform: timer mark    100.465    0.009    EnsemblSeqProx.fetchSeq
+Platform: timer mark    100.467    0.002    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000644120?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    100.608    0.141    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    100.609    0.001    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000644120
+Platform: timer mark    101.06    0.451    EnsembleRestClient.getJSON0 https://rest.ensembl.org/xrefs/id/ENST00000642875?content-type=application/json&all_levels=1
+Platform: timer mark    101.46    0.4    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    101.46    0.0    EnsembleRestClient.getJSON2 ...done
+Adding protein product for ENST00000642875
+Platform: timer mark    101.469    0.009    EnsemblSeqProx.fetchSeq
+Platform: timer mark    101.47    0.001    EnsembleRestClient.getJSON0 https://rest.ensembl.org/sequence/id/ENST00000642875?type=protein&Accept=application/json&content-type=application/json
+Response code 400
+Platform: timer mark    101.616    0.146    EnsembleRestClient.getJSON1 parsing...
+Platform: timer mark    101.616    0.0    EnsembleRestClient.getJSON2 ...done
+No protein product found for ENST00000642875
index b883409..abc7b7f 100644 (file)
@@ -26,7 +26,7 @@ SwingJS.getApplet('testApplet', Info)
 getClassList = function(){J2S._saveFile('_j2sclasslist.txt', Clazz.ClassFilesLoaded.sort().join('\n'))}
 </script>
 <div style="position:absolute;left:900px;top:30px;width:600px;height:300px;">
-<div id="sysoutdiv" style="border:1px solid green;width:100%;height:95%;overflow:auto"></div>
+<div id="sysoutdiv" contenteditable="true" style="border:1px solid green;width:100%;height:95%;overflow:auto"></div>
 This is System.out. <a href="javascript:testApplet._clearConsole()">clear it</a> <br>Add ?j2snocore to URL to see full class list; ?j2sdebug to use uncompressed j2s/core files <br><a href="javascript:getClassList()">get _j2sClassList.txt</a>
 </div>
 </body>
index 14096cf..4f8897a 100644 (file)
@@ -2320,10 +2320,14 @@ public class AlignmentUtils
       int phase = 0;
       try
       {
-        phase = Integer.parseInt(sf.getPhase());
+       String s = sf.getPhase();
+       if (s != null) 
+       {
+               phase = Integer.parseInt(s);
+       }
       } catch (NumberFormatException e)
       {
-        // ignore
+        // SwingJS -- need to avoid these.
       }
       /*
        * phase > 0 on first codon means 5' incomplete - skip to the start
index 9a45dda..6a0d67c 100644 (file)
@@ -35,10 +35,8 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
 /**
@@ -94,13 +92,9 @@ class EnsemblFeatures extends EnsemblRestClient
     // TODO: use a vararg String... for getSequenceRecords instead?
     List<String> queries = new ArrayList<>();
     queries.add(query);
-    BufferedReader fp = getSequenceReader(queries);
-    if (fp == null)
-    {
-      return null;
-    }
-
-    SequenceI seq = parseFeaturesJson(fp);
+    SequenceI seq = parseFeaturesJson(queries);
+    if (seq == null)
+       return null;
     return new Alignment(new SequenceI[] { seq });
   }
 
@@ -111,30 +105,34 @@ class EnsemblFeatures extends EnsemblRestClient
    * @param br
    * @return
    */
-  private SequenceI parseFeaturesJson(BufferedReader br)
+  @SuppressWarnings("unchecked")
+private SequenceI parseFeaturesJson(List<String> queries)
   {
+         
+         
     SequenceI seq = new Sequence("Dummy", "");
 
-    JSONParser jp = new JSONParser();
     try
     {
-      JSONArray responses = (JSONArray) jp.parse(br);
-      Iterator rvals = responses.iterator();
+       
+      Iterator<Object> rvals = (Iterator<Object>) getJSON(null, queries, -1, MODE_ITERATOR, null);
+      if (rvals == null)
+         return null;
       while (rvals.hasNext())
       {
         try
         {
-          JSONObject obj = (JSONObject) rvals.next();
+          Map<String, Object> obj = (Map<String, Object>) rvals.next();
           String type = obj.get("feature_type").toString();
           int start = Integer.parseInt(obj.get("start").toString());
           int end = Integer.parseInt(obj.get("end").toString());
           String source = obj.get("source").toString();
           String strand = obj.get("strand").toString();
           String alleles = JSONUtils
-                  .arrayToList((JSONArray) obj.get("alleles"));
+                  .arrayToStringList((List<Object>) obj.get("alleles"));
           String clinSig = JSONUtils
-                  .arrayToList(
-                          (JSONArray) obj.get("clinical_significance"));
+                  .arrayToStringList(
+                          (List<Object>) obj.get("clinical_significance"));
 
           /*
            * convert 'variation' to 'sequence_variant', and 'cds' to 'CDS'
@@ -169,20 +167,22 @@ class EnsemblFeatures extends EnsemblRestClient
       }
     } catch (ParseException | IOException e)
     {
+       e.printStackTrace();
       // ignore
     }
 
     return seq;
   }
 
-  /**
+  
+/**
    * Returns the first non-null attribute found (if any) as a string
    * 
    * @param obj
    * @param keys
    * @return
    */
-  protected String getFirstNotNull(JSONObject obj, String... keys)
+  protected String getFirstNotNull(Map<String, Object> obj, String... keys)
   {
     String desc = null;
 
@@ -209,7 +209,7 @@ class EnsemblFeatures extends EnsemblRestClient
    * @param obj
    * @param key
    */
-  protected void setFeatureAttribute(SequenceFeature sf, JSONObject obj,
+  protected void setFeatureAttribute(SequenceFeature sf, Map<String, Object> obj,
           String key)
   {
     Object object = obj.get(key);
index fa24f1e..97a8e74 100644 (file)
@@ -2,6 +2,7 @@ package jalview.ext.ensembl;
 
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefSource;
+import jalview.util.JSONUtils;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -13,8 +14,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.json.simple.JSONArray;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
 public class EnsemblInfo extends EnsemblRestClient
@@ -90,53 +89,16 @@ public class EnsemblInfo extends EnsemblRestClient
      * for convenience, pre-fill ensembl.org as the domain for "ENSEMBL"
      */
     divisions.put(DBRefSource.ENSEMBL.toUpperCase(), ensemblDomain);
-
-    BufferedReader br = null;
     try
     {
-      URL url = getDivisionsUrl(ensemblGenomesDomain);
-      if (url != null)
-      {
-        br = getHttpResponse(url, null);
-      }
-      parseResponse(br, ensemblGenomesDomain);
-    } catch (IOException e)
-    {
-      // ignore
-    } finally
-    {
-      if (br != null)
-      {
-        try
-        {
-          br.close();
-        } catch (IOException e)
-        {
-          // ignore
-        }
-      }
-    }
-  }
-
-  /**
-   * Parses the JSON response to /info/divisions, and add each to the lookup map
-   * 
-   * @param br
-   * @param domain
-   */
-  void parseResponse(BufferedReader br, String domain)
-  {
-    JSONParser jp = new JSONParser();
-
-    try
-    {
-      JSONArray parsed = (JSONArray) jp.parse(br);
-
-      Iterator rvals = parsed.iterator();
+      @SuppressWarnings("unchecked")
+         Iterator<Object> rvals = (Iterator<Object>) getJSON(getDivisionsUrl(ensemblGenomesDomain), null, -1, MODE_ITERATOR, null);
+      if (rvals == null)
+         return;
       while (rvals.hasNext())
       {
         String division = rvals.next().toString();
-        divisions.put(division.toUpperCase(), domain);
+        divisions.put(division.toUpperCase(), ensemblGenomesDomain);
       }
     } catch (IOException | ParseException | NumberFormatException e)
     {
index c6b794a..fc37b8a 100644 (file)
@@ -25,16 +25,14 @@ import jalview.datamodel.AlignmentI;
 import jalview.datamodel.GeneLociI;
 import jalview.util.MapList;
 
-import java.io.BufferedReader;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
 /**
@@ -151,7 +149,7 @@ public class EnsemblLookup extends EnsemblRestClient
    * @param br
    * @return
    */
-  protected String parseGeneId(JSONObject val)
+  protected String parseGeneId(Map<String, Object> val)
   {
     if (val == null)
     {
@@ -189,7 +187,7 @@ public class EnsemblLookup extends EnsemblRestClient
   public String getSpecies(String identifier)
   {
     String species = null;
-    JSONObject json = getResult(identifier, null);
+    Map<String, Object> json = getResult(identifier, null);
     if (json != null)
     {
       Object o = json.get(SPECIES);
@@ -202,7 +200,7 @@ public class EnsemblLookup extends EnsemblRestClient
   }
 
   /**
-   * Calls the /lookup/id rest service and returns the response as a JSONObject,
+   * Calls the /lookup/id rest service and returns the response as a Map<String, Object>,
    * or null if any error
    * 
    * @param identifier
@@ -210,37 +208,20 @@ public class EnsemblLookup extends EnsemblRestClient
    *          (optional)
    * @return
    */
-  protected JSONObject getResult(String identifier, String objectType)
+  @SuppressWarnings("unchecked")
+  protected Map<String, Object> getResult(String identifier, String objectType)
   {
     List<String> ids = Arrays.asList(new String[] { identifier });
 
-    BufferedReader br = null;
     try
     {
-      URL url = getUrl(identifier, objectType);
-
-      if (url != null)
-      {
-        br = getHttpResponse(url, ids);
-      }
-      return br == null ? null : (JSONObject) (new JSONParser().parse(br));
-    } catch (IOException | ParseException e)
+      return (Map<String, Object>) getJSON(getUrl(identifier, objectType), ids, -1, MODE_MAP, null);
+    } 
+    catch (IOException | ParseException e)
     {
       System.err.println("Error parsing " + identifier + " lookup response "
               + e.getMessage());
       return null;
-    } finally
-    {
-      if (br != null)
-      {
-        try
-        {
-          br.close();
-        } catch (IOException e)
-        {
-          // ignore
-        }
-      }
     }
   }
 
@@ -264,7 +245,7 @@ public class EnsemblLookup extends EnsemblRestClient
    * @param json
    * @return
    */
-  GeneLociI parseGeneLoci(JSONObject json)
+  GeneLociI parseGeneLoci(Map<String, Object> json)
   {
     if (json == null)
     {
index f01bd4f..add71b3 100644 (file)
@@ -3,6 +3,7 @@ package jalview.ext.ensembl;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefSource;
 import jalview.datamodel.GeneLociI;
+import jalview.util.JSONUtils;
 import jalview.util.MapList;
 
 import java.io.BufferedReader;
@@ -13,10 +14,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
 public class EnsemblMap extends EnsemblRestClient
@@ -119,30 +118,15 @@ public class EnsemblMap extends EnsemblRestClient
           String fromRef, String toRef, int[] queryRange)
   {
     URL url = null;
-    BufferedReader br = null;
-
     try
     {
       url = getAssemblyMapUrl(species, chromosome, fromRef, toRef, queryRange[0],
               queryRange[1]);
-      br = getHttpResponse(url, null);
-      return (parseAssemblyMappingResponse(br));
+      return (parseAssemblyMappingResponse(url));
     } catch (Throwable t)
     {
       System.out.println("Error calling " + url + ": " + t.getMessage());
       return null;
-    } finally
-    {
-      if (br != null)
-      {
-        try
-        {
-          br.close();
-        } catch (IOException e)
-        {
-          // ignore
-        }
-      }
     }
   }
 
@@ -161,22 +145,21 @@ public class EnsemblMap extends EnsemblRestClient
    * @param br
    * @return
    */
-  protected int[] parseAssemblyMappingResponse(BufferedReader br)
+  @SuppressWarnings("unchecked")
+  protected int[] parseAssemblyMappingResponse(URL url)
   {
     int[] result = null;
-    JSONParser jp = new JSONParser();
 
     try
     {
-      JSONObject parsed = (JSONObject) jp.parse(br);
-      JSONArray mappings = (JSONArray) parsed.get(MAPPINGS);
-
-      Iterator rvals = mappings.iterator();
+      Iterator<Object> rvals = (Iterator<Object>) getJSON(url, null, -1, MODE_ITERATOR, MAPPINGS);
+      if (rvals == null)
+         return null;
       while (rvals.hasNext())
       {
         // todo check for "mapped"
-        JSONObject val = (JSONObject) rvals.next();
-        JSONObject mapped = (JSONObject) val.get(MAPPED);
+        Map<String, Object> val = (Map<String, Object>) rvals.next();
+        Map<String, Object> mapped = (Map<String, Object>) val.get(MAPPED);
         int start = Integer.parseInt(mapped.get("start").toString());
         int end = Integer.parseInt(mapped.get("end").toString());
         String strand = mapped.get("strand").toString();
@@ -236,37 +219,19 @@ public class EnsemblMap extends EnsemblRestClient
           int end, String cdsOrCdna)
   {
     URL url = null;
-    BufferedReader br = null;
-
     try
     {
       String domain = new EnsemblInfo().getDomain(division);
       if (domain != null)
       {
         url = getIdMapUrl(domain, accession, start, end, cdsOrCdna);
-        br = getHttpResponse(url, null);
-        if (br != null)
-        {
-          return (parseIdMappingResponse(br, accession, domain));
-        }
+        return (parseIdMappingResponse(url, accession, domain));
       }
       return null;
     } catch (Throwable t)
     {
       System.out.println("Error calling " + url + ": " + t.getMessage());
       return null;
-    } finally
-    {
-      if (br != null)
-      {
-        try
-        {
-          br.close();
-        } catch (IOException e)
-        {
-          // ignore
-        }
-      }
     }
   }
 
@@ -312,17 +277,16 @@ public class EnsemblMap extends EnsemblRestClient
    * @param domain
    * @return
    */
-  GeneLociI parseIdMappingResponse(BufferedReader br, String accession,
+  @SuppressWarnings("unchecked")
+GeneLociI parseIdMappingResponse(URL url, String accession,
           String domain)
   {
-    JSONParser jp = new JSONParser();
 
     try
     {
-      JSONObject parsed = (JSONObject) jp.parse(br);
-      JSONArray mappings = (JSONArray) parsed.get(MAPPINGS);
-
-      Iterator rvals = mappings.iterator();
+      Iterator<Object> rvals = (Iterator<Object>) getJSON(url, null, -1, MODE_ITERATOR, MAPPINGS);
+      if (rvals == null)
+         return null;
       String assembly = null;
       String chromosome = null;
       int fromEnd = 0;
@@ -330,11 +294,11 @@ public class EnsemblMap extends EnsemblRestClient
 
       while (rvals.hasNext())
       {
-        JSONObject val = (JSONObject) rvals.next();
-        JSONObject original = (JSONObject) val.get("original");
+        Map<String, Object> val = (Map<String, Object>) rvals.next();
+        Map<String, Object> original = (Map<String, Object>) val.get("original");
         fromEnd = Integer.parseInt(original.get("end").toString());
 
-        JSONObject mapped = (JSONObject) val.get(MAPPED);
+        Map<String, Object> mapped = (Map<String, Object>) val.get(MAPPED);
         int start = Integer.parseInt(mapped.get("start").toString());
         int end = Integer.parseInt(mapped.get("end").toString());
         String ass = mapped.get("assembly_name").toString();
index 5ebfcbf..b3113f9 100644 (file)
@@ -21,7 +21,9 @@
 package jalview.ext.ensembl;
 
 import jalview.bin.Cache;
-import jalview.bin.Jalview;
+import jalview.javascript.json.JSON;
+import jalview.util.JSONUtils;
+import jalview.util.Platform;
 import jalview.util.StringUtils;
 
 import java.io.BufferedReader;
@@ -29,6 +31,7 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.Reader;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.ProtocolException;
@@ -39,9 +42,7 @@ import java.util.Map;
 
 import javax.ws.rs.HttpMethod;
 
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
 
 /**
  * Base class for Ensembl REST service clients
@@ -189,7 +190,8 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher
    * @see http://rest.ensembl.org/documentation/info/ping
    * @return
    */
-  boolean checkEnsembl()
+  @SuppressWarnings("unchecked")
+boolean checkEnsembl()
   {
     BufferedReader br = null;
     String pingUrl = getDomain() + "/info/ping" + CONTENT_TYPE_JSON;
@@ -197,20 +199,17 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher
     {
       // note this format works for both ensembl and ensemblgenomes
       // info/ping.json works for ensembl only (March 2016)
-      URL ping = new URL(pingUrl);
-
+       
+       
+       
+       
       /*
        * expect {"ping":1} if ok
        * if ping takes more than 2 seconds to respond, treat as if unavailable
        */
-      br = getHttpResponse(ping, null, 2 * 1000);
-      if (br == null)
-      {
-        // error reponse status
-        return false;
-      }
-      JSONParser jp = new JSONParser();
-      JSONObject val = (JSONObject) jp.parse(br);
+      Map<String, Object> val = (Map<String, Object>) getJSON(new URL(pingUrl), null, 2 * 1000, MODE_MAP, null);
+      if (val == null)
+         return false;
       String pingString = val.get("ping").toString();
       return pingString != null;
     } catch (Throwable t)
@@ -233,37 +232,41 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher
     return false;
   }
 
-  /**
-   * Returns a reader to a (Json) response from the Ensembl sequence endpoint.
-   * If the request failed the return value may be null.
-   * 
-   * @param ids
-   * @return
-   * @throws IOException
-   */
-  protected BufferedReader getSequenceReader(List<String> ids)
-          throws IOException
-  {
-    URL url = getUrl(ids);
-
-    BufferedReader reader = getHttpResponse(url, ids);
-    return reader;
-  }
-
-  /**
-   * Gets a reader to the HTTP response, using the default read timeout of 5
-   * minutes
-   * 
-   * @param url
-   * @param ids
-   * @return
-   * @throws IOException
-   */
-  protected BufferedReader getHttpResponse(URL url, List<String> ids)
-          throws IOException
-  {
-    return getHttpResponse(url, ids, DEFAULT_READ_TIMEOUT);
-  }
+  
+  protected final static int MODE_ARRAY    = 0;
+  protected final static int MODE_MAP      = 1;
+  protected final static int MODE_ITERATOR = 2;
+  
+//  /**
+//   * Returns a reader to a (Json) response from the Ensembl sequence endpoint.
+//   * If the request failed the return value may be null.
+//   * 
+//   * @param ids
+//   * @return
+//   * @throws IOException
+// * @throws ParseException 
+//   */
+//  protected Object getSequenceJSON(List<String> ids, int mode)
+//          throws IOException, ParseException
+//  {
+//    URL url = getUrl(ids);
+//    return getJSON(url, ids, -1, mode);
+//  }
+//
+//  /**
+//   * Gets a reader to the HTTP response, using the default read timeout of 5
+//   * minutes
+//   * 
+//   * @param url
+//   * @param ids
+//   * @return
+//   * @throws IOException
+//   */
+//  protected BufferedReader getHttpResponse(URL url, List<String> ids)
+//          throws IOException
+//  {
+//    return getHttpResponse(url, ids, DEFAULT_READ_TIMEOUT);
+//  }
 
   /**
    * Sends the HTTP request and gets the response as a reader. Returns null if
@@ -277,13 +280,19 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher
    * @return
    * @throws IOException
    */
-  protected BufferedReader getHttpResponse(URL url, List<String> ids,
+  private BufferedReader getHttpResponse(URL url, List<String> ids,
           int readTimeout) throws IOException
   {
+       if (readTimeout < 0)
+               readTimeout = DEFAULT_READ_TIMEOUT;
     int retriesLeft = MAX_RETRIES;
     HttpURLConnection connection = null;
     int responseCode = 0;
-
+        
+    if (Platform.isJS()) {
+         JSON.setAjax(url);
+    }
+        
     while (retriesLeft > 0)
     {
       connection = tryConnection(url, ids, readTimeout);
@@ -304,18 +313,21 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher
        * note: a GET request for an invalid id returns an error code e.g. 415
        * but POST request returns 200 and an empty Fasta response 
        */
-      System.err.println("Response code " + responseCode + " for " + url);
+      System.err.println("Response code " + responseCode);// + " for " + url);
       return null;
     }
 
     InputStream response = connection.getInputStream();
+    
+    if (Platform.isJS()) {
+       return JSON.getJSONReader(response);
+    }
 
     // System.out.println(getClass().getName() + " took "
     // + (System.currentTimeMillis() - now) + "ms to fetch");
 
-    BufferedReader reader = null;
-    reader = new BufferedReader(new InputStreamReader(response, "UTF-8"));
-    return reader;
+    return new BufferedReader(new InputStreamReader(response, "UTF-8"));
   }
 
   /**
@@ -330,6 +342,7 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher
           int readTimeout) throws IOException, ProtocolException
   {
     // System.out.println(System.currentTimeMillis() + " " + url);
+       
     HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 
     /*
@@ -466,26 +479,87 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher
     wr.close();
   }
 
+       /**
+        * Primary access point to parsed JSON data, including the call to retrieve and
+        * parsing.
+        * 
+        * @param url     request url; if null, getUrl(ids) will be used
+        * @param ids     optional; may be null
+        * @param msDelay -1 for default delay
+        * @param mode    map, array, or array iterator
+        * @param mapKey  an optional key for an outer map 
+        * @return                a Map, List, Iterator, or null
+        * @throws IOException
+        * @throws ParseException
+        * 
+        * @author Bob Hanson 2019
+        */
+  @SuppressWarnings("unchecked")
+  protected Object getJSON(URL url, List<String> ids, int msDelay, int mode, String mapKey) throws IOException, ParseException {
+
+       if (url == null)
+          url = getUrl(ids);
+       
+       Platform.timeCheck("EnsembleRestClient.getJSON0 " + url, Platform.TIME_MARK);
+       
+       Reader br = null;
+       try {
+      br = (url == null ? null : getHttpResponse(url, ids, msDelay));
+
+      Platform.timeCheck("EnsembleRestClient.getJSON1 parsing... ", Platform.TIME_MARK);
+       
+      Object ret = (br == null ? null : JSONUtils.parse(br));
+
+      Platform.timeCheck("EnsembleRestClient.getJSON2 ...done ", Platform.TIME_MARK);
+
+      if (ret != null && mapKey != null)
+           ret = ((Map<String, Object>) ret).get(mapKey);
+      if (ret == null) 
+      {
+        return null;
+      }
+      switch (mode) {
+      case MODE_ARRAY:
+      case MODE_MAP:
+       break;
+      case MODE_ITERATOR:
+       ret = ((List<Object>) ret).iterator();
+       break;
+      }
+      return ret;
+        
+    } finally
+    {
+      if (br != null)
+      {
+        try
+        {
+          br.close();
+        } catch (IOException e)
+        {
+        // ignore
+        }
+      }    
+    }
+  }
+
+
+
   /**
    * Fetches and checks Ensembl's REST version number
    * 
    * @return
    */
+  @SuppressWarnings("unchecked")
   private void checkEnsemblRestVersion()
   {
     EnsemblData info = domainData.get(getDomain());
 
-    JSONParser jp = new JSONParser();
-    URL url = null;
     try
     {
-      url = new URL(getDomain() + "/info/rest" + CONTENT_TYPE_JSON);
-      BufferedReader br = getHttpResponse(url, null);
-      if (br == null)
-      {
-        return;
-      }
-      JSONObject val = (JSONObject) jp.parse(br);
+      Map<String, Object> val = (Map<String, Object>) getJSON(new URL(getDomain() + "/info/rest" + CONTENT_TYPE_JSON), null, -1, MODE_MAP, null);
+      if (val == null)
+         return;
       String version = val.get("release").toString();
       String majorVersion = version.substring(0, version.indexOf("."));
       String expected = info.expectedRestVersion;
@@ -539,40 +613,21 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher
    * 
    * @return
    */
+  @SuppressWarnings("unchecked")
   private void checkEnsemblDataVersion()
   {
-    JSONParser jp = new JSONParser();
-    URL url = null;
-    BufferedReader br = null;
-
-    try
-    {
-      url = new URL(getDomain() + "/info/data" + CONTENT_TYPE_JSON);
-      br = getHttpResponse(url, null);
-      if (br != null)
-      {
-        JSONObject val = (JSONObject) jp.parse(br);
-        JSONArray versions = (JSONArray) val.get("releases");
-        domainData.get(getDomain()).dataVersion = versions.get(0)
-                .toString();
-      }
-    } catch (Throwable t)
-    {
-      System.err.println(
-              "Error checking Ensembl data version: " + t.getMessage());
-    } finally
-    {
-      if (br != null)
-      {
-        try
-        {
-          br.close();
-        } catch (IOException e)
-        {
-          // ignore
-        }
-      }
-    }
+    Map<String, Object> val;
+       try 
+       {
+         val = (Map<String, Object>) getJSON(
+                                 new URL(getDomain() + "/info/data" + CONTENT_TYPE_JSON), null, -1, MODE_MAP, null);
+         if (val == null)
+           return;
+         List<Object> versions = (List<Object>) val.get("releases");
+         domainData.get(getDomain()).dataVersion = versions.get(0).toString();
+       } catch (Throwable e) {//could be IOException | ParseException e) {
+         System.err.println("Error checking Ensembl data version: " + e.getMessage());
+       }
   }
 
   public String getEnsemblDataVersion()
index 6be0486..7bf2563 100644 (file)
@@ -40,8 +40,8 @@ import jalview.util.Comparison;
 import jalview.util.DBRefUtils;
 import jalview.util.IntRangeComparator;
 import jalview.util.MapList;
+import jalview.util.Platform;
 
-import java.io.BufferedReader;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -49,9 +49,8 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
 /**
@@ -258,6 +257,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
     String accId = querySeq.getName();
     try
     {
+      System.out.println("Adding protein product for " + accId);
       AlignmentI protein = new EnsemblProtein(getDomain())
               .getSequenceRecords(accId);
       if (protein == null || protein.getHeight() == 0)
@@ -387,13 +387,11 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
       inProgress = false;
       throw new JalviewException("ENSEMBL Rest API not available.");
     }
-    BufferedReader br = getSequenceReader(ids);
-    if (br == null)
-    {
-      return alignment;
-    }
+       Platform.timeCheck("EnsemblSeqProx.fetchSeq ", Platform.TIME_MARK);
 
-    List<SequenceI> seqs = parseSequenceJson(br);
+    List<SequenceI> seqs = parseSequenceJson(ids);
+    if (seqs == null)
+       return alignment;
 
     if (seqs.isEmpty())
     {
@@ -446,9 +444,9 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
    * @return a single jalview.datamodel.Sequence
    * @see http://rest.ensembl.org/documentation/info/sequence_id
    */
-  protected List<SequenceI> parseSequenceJson(BufferedReader br)
+  @SuppressWarnings("unchecked")
+  protected List<SequenceI> parseSequenceJson(List<String> ids)
   {
-    JSONParser jp = new JSONParser();
     List<SequenceI> result = new ArrayList<>();
     try
     {
@@ -456,7 +454,9 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
        * for now, assumes only one sequence returned; refactor if needed
        * in future to handle a JSONArray with more than one
        */
-      final JSONObject val = (JSONObject) jp.parse(br);
+      Map<String, Object> val = (Map<String, Object>) getJSON(null, ids, -1, MODE_MAP, null);
+      if (val == null)
+         return null;
       Object s = val.get("desc");
       String desc = s == null ? null : s.toString();
       s = val.get("id");
index 40d6cad..f731e94 100644 (file)
  */
 package jalview.ext.ensembl;
 
-import java.io.BufferedReader;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
 /**
@@ -56,39 +53,18 @@ public class EnsemblSymbol extends EnsemblXref
     super(domain, dbName, dbVersion);
   }
 
-  /**
-   * Returns the first "id" value in gene identifier format from the JSON
-   * response, or null if none found
-   * 
-   * @param br
-   * @return
-   * @throws IOException
-   */
-  protected String parseSymbolResponse(BufferedReader br) throws IOException
-  {
-    JSONParser jp = new JSONParser();
-    String result = null;
-    try
-    {
-      JSONArray responses = (JSONArray) jp.parse(br);
-      Iterator rvals = responses.iterator();
-      while (rvals.hasNext())
-      {
-        JSONObject val = (JSONObject) rvals.next();
-        String id = val.get(JSON_ID).toString();
-        String type = val.get(TYPE).toString();
-        if (id != null && GENE.equals(type))
-        {
-          result = id;
-          break;
-        }
-      }
-    } catch (ParseException e)
-    {
-      // ignore
-    }
-    return result;
-  }
+//  /**
+//   * Returns the first "id" value in gene identifier format from the JSON
+//   * response, or null if none found
+//   * 
+//   * @param br
+//   * @return
+//   * @throws IOException
+//   */
+//  @SuppressWarnings("unchecked")
+//protected String parseSymbolResponse(BufferedReader br) throws IOException
+//  {
+//  }
 
   /**
    * Constructs the URL for the REST symbol endpoint
@@ -129,6 +105,7 @@ public class EnsemblSymbol extends EnsemblXref
    * @param identifier
    * @return
    */
+  @SuppressWarnings("unchecked")
   public List<String> getGeneIds(String identifier)
   {
     List<String> result = new ArrayList<String>();
@@ -136,43 +113,43 @@ public class EnsemblSymbol extends EnsemblXref
     ids.add(identifier);
 
     String[] queries = identifier.split(getAccessionSeparator());
-    BufferedReader br = null;
     try
     {
       for (String query : queries)
       {
         for (Species taxon : Species.getModelOrganisms())
         {
-          URL url = getUrl(query, taxon, GENE);
-          if (url != null)
+          String geneId = null;///parseSymbolResponse(br);          
+          try
           {
-            br = getHttpResponse(url, ids);
-            if (br != null)
+                       Iterator<Object> rvals = (Iterator<Object>) getJSON(getUrl(query, taxon, GENE), ids, -1, MODE_ITERATOR, null);
+            if (rvals == null)
+               continue;
+            while (rvals.hasNext())
             {
-              String geneId = parseSymbolResponse(br);
-              if (geneId != null && !result.contains(geneId))
+              Map<String, Object> val = (Map<String, Object>) rvals.next();
+              String id = val.get(JSON_ID).toString();
+              String type = val.get(TYPE).toString();
+              if (id != null && GENE.equals(type))
               {
-                result.add(geneId);
+                geneId = id;
+                break;
               }
             }
+          } catch (ParseException e)
+          {
+            // ignore
+          }
+          
+          if (geneId != null && !result.contains(geneId))
+          {
+            result.add(geneId);
           }
         }
       }
     } catch (IOException e)
     {
       // ignore
-    } finally
-    {
-      if (br != null)
-      {
-        try
-        {
-          br.close();
-        } catch (IOException e)
-        {
-          // ignore
-        }
-      }
     }
     return result;
   }
index 77768a6..eedfe97 100644 (file)
@@ -23,6 +23,7 @@ package jalview.ext.ensembl;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefEntry;
 import jalview.util.DBRefUtils;
+import jalview.util.JSONUtils;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -31,10 +32,8 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
 /**
@@ -99,66 +98,19 @@ class EnsemblXref extends EnsemblRestClient
    *          an Ensembl stable identifier
    * @return
    */
+  @SuppressWarnings("unchecked")
   public List<DBRefEntry> getCrossReferences(String identifier)
   {
     List<DBRefEntry> result = new ArrayList<>();
     List<String> ids = new ArrayList<>();
     ids.add(identifier);
 
-    BufferedReader br = null;
     try
     {
-      URL url = getUrl(identifier);
-      if (url != null)
-      {
-        br = getHttpResponse(url, ids);
-        if (br != null)
-        {
-          result = parseResponse(br);
-        }
-      }
-    } catch (IOException e)
-    {
-      // ignore
-    } finally
-    {
-      if (br != null)
-      {
-        try
-        {
-          br.close();
-        } catch (IOException e)
-        {
-          // ignore
-        }
-      }
-    }
-
-    return result;
-  }
-
-  /**
-   * Parses "primary_id" and "dbname" values from the JSON response and
-   * constructs a DBRefEntry. Returns a list of the DBRefEntry created. Note we
-   * don't parse "synonyms" as they appear to be either redirected or obsolete
-   * in Uniprot.
-   * 
-   * @param br
-   * @return
-   * @throws IOException
-   */
-  protected List<DBRefEntry> parseResponse(BufferedReader br)
-          throws IOException
-  {
-    JSONParser jp = new JSONParser();
-    List<DBRefEntry> result = new ArrayList<>();
-    try
-    {
-      JSONArray responses = (JSONArray) jp.parse(br);
-      Iterator rvals = responses.iterator();
+      Iterator<Object> rvals = (Iterator<Object>) getJSON(getUrl(identifier), ids, -1, MODE_ITERATOR, null);
       while (rvals.hasNext())
       {
-        JSONObject val = (JSONObject) rvals.next();
+        Map<String, Object> val = (Map<String, Object>) rvals.next();
         String db = val.get("dbname").toString();
         String id = val.get("primary_id").toString();
         if (db != null && id != null
@@ -169,13 +121,30 @@ class EnsemblXref extends EnsemblRestClient
           result.add(dbref);
         }
       }
-    } catch (ParseException e)
+    } catch (ParseException | IOException e)
     {
       // ignore
     }
     return result;
   }
 
+//  /**
+//   * Parses "primary_id" and "dbname" values from the JSON response and
+//   * constructs a DBRefEntry. Returns a list of the DBRefEntry created. Note we
+//   * don't parse "synonyms" as they appear to be either redirected or obsolete
+//   * in Uniprot.
+//   * 
+//   * @param br
+//   * @return
+//   * @throws IOException
+//   */
+//  @SuppressWarnings("unchecked")
+//protected List<DBRefEntry> parseResponse(BufferedReader br)
+//          throws IOException
+//  {
+//    return result;
+//  }
+//
   private String xrefVersion = "ENSEMBL:0";
 
   /**
index d50ad87..3b7044b 100644 (file)
@@ -20,6 +20,7 @@
  */
 package jalview.ext.paradise;
 
+import jalview.util.JSONUtils;
 import jalview.util.MessageManager;
 import jalview.ws.HttpClientUtils;
 
@@ -32,11 +33,10 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.http.NameValuePair;
 import org.apache.http.message.BasicNameValuePair;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
 import org.json.simple.parser.ContentHandler;
 import org.json.simple.parser.ParseException;
 
@@ -151,14 +151,19 @@ public class Annotate3D
 
   }
 
+  /**
+   * @param respons
+   * @return
+   * @throws Exception
+   */
   public static Iterator<Reader> processJsonResponseFor(Reader respons)
           throws Exception
   {
-    org.json.simple.parser.JSONParser jp = new org.json.simple.parser.JSONParser();
+         // BH 2019 never called?
     try
     {
-      final JSONArray responses = (JSONArray) jp.parse(respons);
-      final Iterator rvals = responses.iterator();
+      @SuppressWarnings("unchecked")
+       final Iterator<Object> rvals = ((List<Object>) JSONUtils.parse(respons)).iterator();
       return new Iterator<Reader>()
       {
         @Override
@@ -167,10 +172,11 @@ public class Annotate3D
           return rvals.hasNext();
         }
 
-        @Override
+        @SuppressWarnings("unchecked")
+               @Override
         public Reader next()
         {
-          JSONObject val = (JSONObject) rvals.next();
+          Map<String, Object> val = (Map<String, Object>) rvals.next();
 
           Object sval = null;
           try
@@ -189,9 +195,7 @@ public class Annotate3D
 
             sval = "";
           }
-          return new StringReader((sval instanceof JSONObject)
-                  ? ((JSONObject) sval).toString()
-                  : sval.toString());
+          return new StringReader(sval.toString());
 
         }
 
index c0ca3a5..b4e5660 100644 (file)
@@ -28,6 +28,7 @@ import jalview.fts.api.FTSRestClientI;
 import jalview.fts.core.FTSRestClient;
 import jalview.fts.core.FTSRestRequest;
 import jalview.fts.core.FTSRestResponse;
+import jalview.util.JSONUtils;
 import jalview.util.MessageManager;
 
 import java.net.URI;
@@ -35,13 +36,11 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 import javax.ws.rs.core.MediaType;
 
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
 import com.sun.jersey.api.client.Client;
@@ -223,7 +222,8 @@ public class PDBFTSRestClient extends FTSRestClient
    *          the JSON string containing error message from the server
    * @return the processed error message from the JSON string
    */
-  public static String parseJsonExceptionString(String jsonErrorResponse)
+  @SuppressWarnings("unchecked")
+public static String parseJsonExceptionString(String jsonErrorResponse)
   {
     StringBuilder errorMessage = new StringBuilder(
             "\n============= PDB Rest Client RunTime error =============\n");
@@ -250,13 +250,12 @@ public class PDBFTSRestClient extends FTSRestClient
 //    
     try
     {
-      JSONParser jsonParser = new JSONParser();
-      JSONObject jsonObj = (JSONObject) jsonParser.parse(jsonErrorResponse);
-      JSONObject errorResponse = (JSONObject) jsonObj.get("error");
+      Map<String, Object> jsonObj = (Map<String, Object>) JSONUtils.parse(jsonErrorResponse);
+      Map<String, Object> errorResponse = (Map<String, Object>) jsonObj.get("error");
 
-      JSONObject responseHeader = (JSONObject) jsonObj
+      Map<String, Object> responseHeader = (Map<String, Object>) jsonObj
               .get("responseHeader");
-      JSONObject paramsObj = (JSONObject) responseHeader.get("params");
+      Map<String, Object> paramsObj = (Map<String, Object>) responseHeader.get("params");
       String status = responseHeader.get("status").toString();
       String message = errorResponse.get("msg").toString();
       String query = paramsObj.get("q").toString();
@@ -294,23 +293,20 @@ public class PDBFTSRestClient extends FTSRestClient
     List<FTSData> result = null;
     try
     {
-      JSONParser jsonParser = new JSONParser();
-      JSONObject jsonObj = (JSONObject) jsonParser
-              .parse(pdbJsonResponseString);
-
-      JSONObject pdbResponse = (JSONObject) jsonObj.get("response");
-      String queryTime = ((JSONObject) jsonObj.get("responseHeader"))
+      Map<String, Object> jsonObj = (Map<String, Object>) JSONUtils.parse(pdbJsonResponseString);
+      Map<String, Object> pdbResponse = (Map<String, Object>) jsonObj.get("response");
+      String queryTime = ((Map<String, Object>) jsonObj.get("responseHeader"))
               .get("QTime").toString();
       int numFound = Integer
               .valueOf(pdbResponse.get("numFound").toString());
       if (numFound > 0)
       {
         result = new ArrayList<FTSData>();
-        JSONArray docs = (JSONArray) pdbResponse.get("docs");
-        for (Iterator<JSONObject> docIter = docs.iterator(); docIter
+        List<Object> docs = (List<Object>) pdbResponse.get("docs");
+        for (Iterator<Object> docIter = docs.iterator(); docIter
                 .hasNext();)
         {
-          JSONObject doc = docIter.next();
+          Map<String, Object> doc = (Map<String, Object>) docIter.next();
           result.add(getFTSData(doc, pdbRestRequest));
         }
         searchResult.setNumberOfItemsFound(numFound);
@@ -324,7 +320,7 @@ public class PDBFTSRestClient extends FTSRestClient
     return searchResult;
   }
 
-  public static FTSData getFTSData(JSONObject pdbJsonDoc,
+  public static FTSData getFTSData(Map<String, Object> pdbJsonDoc,
           FTSRestRequest request)
   {
 
@@ -466,7 +462,8 @@ public class PDBFTSRestClient extends FTSRestClient
     return allDefaultDisplayedStructureDataColumns;
   }
   
-  public static void main(String[] args) {
+  @SuppressWarnings("unchecked")
+public static void main(String[] args) {
     
     
     // check for transpiler fix associated with JSONParser yylex.java use of charAt()
@@ -481,10 +478,9 @@ public class PDBFTSRestClient extends FTSRestClient
     int z = c ^ 5;
     String result = s +x + y + z;
     assert (result == "e103982102");
-    JSONParser jsonParser = new JSONParser();
     try
     {
-      JSONObject jsonObj = (JSONObject) jsonParser.parse("{\"a\":3}");
+      Map<String, Object> jsonObj = (Map<String, Object>) JSONUtils.parse("{\"a\":3}");
       System.out.println(jsonObj);
     } catch (ParseException e)
     {
index 144cdd0..f1b8025 100644 (file)
@@ -1748,7 +1748,7 @@ public class Desktop extends jalview.jbgui.GDesktop
       {
         File selectedFile = chooser.getSelectedFile();
         setProjectFile(selectedFile);
-        final String choice = selectedFile.getAbsolutePath();
+        String choice = selectedFile.getAbsolutePath();
         Cache.setProperty("LAST_DIRECTORY", selectedFile.getParent());
         new Thread(new Runnable()
         {
@@ -1762,7 +1762,7 @@ public class Desktop extends jalview.jbgui.GDesktop
               }
               else
               {
-                new jalview.project.Jalview2XML().loadJalviewAlign(choice);
+                new jalview.project.Jalview2XML().loadJalviewAlign(selectedFile);
               }
             } catch (OutOfMemoryError oom)
             {
index 0a66114..5e117ca 100644 (file)
@@ -824,7 +824,7 @@ public class SeqPanel extends JPanel
       mouseOverSequence(sequence, column, pos);
     }
 
-    tooltipText.setLength(6); // Cuts the buffer back to <html>
+    tooltipText.setLength(0);
 
     SequenceGroup[] groups = av.getAlignment().findAllGroups(sequence);
     if (groups != null)
@@ -860,7 +860,7 @@ public class SeqPanel extends JPanel
       seqARep.appendFeatures(tooltipText, pos, features,
               this.ap.getSeqPanel().seqCanvas.fr);
     }
-    if (tooltipText.length() == 6) // <html>
+    if (tooltipText.length() == 0) // <html>
     {
       setToolTipText(null);
       lastTooltip = null;
@@ -877,8 +877,7 @@ public class SeqPanel extends JPanel
       {
         formattedTooltipText = JvSwingUtils.wrapTooltip(true,
                 textString);
-        setToolTipText(formattedTooltipText);
-        
+        setToolTipText(formattedTooltipText);        
         lastTooltip = textString;
       }
     }
index 7071a9d..3f1b1a7 100644 (file)
@@ -53,6 +53,7 @@ import jalview.schemes.JalviewColourScheme;
 import jalview.schemes.ResidueColourScheme;
 import jalview.util.ColorUtils;
 import jalview.util.Format;
+import jalview.util.JSONUtils;
 import jalview.viewmodel.seqfeatures.FeaturesDisplayed;
 
 import java.awt.Color;
@@ -62,12 +63,9 @@ import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Vector;
 
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-
 public class JSONFile extends AlignFile implements ComplexAlignFile
 {
   private static String version = new BuildDetails().getVersion();
@@ -220,8 +218,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
           jsonAlignmentPojo.getSeqGroups().add(seqGrpPojo);
         }
       }
-      org.json.JSONObject generatedJSon = new org.json.JSONObject(
-              jsonAlignmentPojo);
+      org.json.JSONObject generatedJSon = new org.json.JSONObject(jsonAlignmentPojo);
       jsonOutput = generatedJSon.toString();
       return jsonOutput.replaceAll("xstart", "xStart").replaceAll("xend",
               "xEnd");
@@ -398,17 +395,15 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
   {
     try
     {
-      JSONParser jsonParser = new JSONParser();
-      JSONObject alignmentJsonObj = (JSONObject) jsonParser
-              .parse(jsonAlignmentString);
-      JSONArray seqJsonArray = (JSONArray) alignmentJsonObj.get("seqs");
-      JSONArray alAnnotJsonArray = (JSONArray) alignmentJsonObj
+      Map<String, Object> alignmentJsonObj = (Map<String, Object>) JSONUtils.parse(jsonAlignmentString);
+      List<Object> seqJsonArray = (List<Object>) alignmentJsonObj.get("seqs");
+      List<Object> alAnnotJsonArray = (List<Object>) alignmentJsonObj
               .get("alignAnnotation");
-      JSONArray jsonSeqArray = (JSONArray) alignmentJsonObj
+      List<Object> jsonSeqArray = (List<Object>) alignmentJsonObj
               .get("seqFeatures");
-      JSONArray seqGrpJsonArray = (JSONArray) alignmentJsonObj
+      List<Object> seqGrpJsonArray = (List<Object>) alignmentJsonObj
               .get("seqGroups");
-      JSONObject jvSettingsJsonObj = (JSONObject) alignmentJsonObj
+      Map<String, Object> jvSettingsJsonObj = (Map<String, Object>) alignmentJsonObj
               .get("appSettings");
 
       if (jvSettingsJsonObj != null)
@@ -424,10 +419,9 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
 
       hiddenSequences = new ArrayList<>();
       seqMap = new Hashtable<>();
-      for (Iterator<JSONObject> sequenceIter = seqJsonArray
-              .iterator(); sequenceIter.hasNext();)
+      for (Iterator<Object> sequenceIter = seqJsonArray.iterator(); sequenceIter.hasNext();)
       {
-        JSONObject sequence = sequenceIter.next();
+        Map<String, Object> sequence = (Map<String, Object>) sequenceIter.next();
         String sequcenceString = sequence.get("seq").toString();
         String sequenceName = sequence.get("name").toString();
         String seqUniqueId = sequence.get("id").toString();
@@ -445,10 +439,9 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
 
       parseFeatures(jsonSeqArray);
 
-      for (Iterator<JSONObject> seqGrpIter = seqGrpJsonArray
-              .iterator(); seqGrpIter.hasNext();)
+      for (Iterator<Object> seqGrpIter = seqGrpJsonArray.iterator(); seqGrpIter.hasNext();)
       {
-        JSONObject seqGrpObj = seqGrpIter.next();
+        Map<String, Object> seqGrpObj = (Map<String, Object>)seqGrpIter.next();
         String grpName = seqGrpObj.get("groupName").toString();
         String colourScheme = seqGrpObj.get("colourScheme").toString();
         String description = (seqGrpObj.get("description") == null) ? null
@@ -464,16 +457,15 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
         int startRes = Integer
                 .valueOf(seqGrpObj.get("startRes").toString());
         int endRes = Integer.valueOf(seqGrpObj.get("endRes").toString());
-        JSONArray sequenceRefs = (JSONArray) seqGrpObj.get("sequenceRefs");
+        List<Object> sequenceRefs = (List<Object>) seqGrpObj.get("sequenceRefs");
 
         ArrayList<SequenceI> grpSeqs = new ArrayList<>();
         if (sequenceRefs.size() > 0)
         {
-          Iterator<String> seqHashIter = sequenceRefs.iterator();
+          Iterator<Object> seqHashIter = sequenceRefs.iterator();
           while (seqHashIter.hasNext())
           {
-            String seqHash = seqHashIter.next();
-            Sequence sequence = seqMap.get(seqHash);
+            Sequence sequence = seqMap.get(seqHashIter.next());
             if (sequence != null)
             {
               grpSeqs.add(sequence);
@@ -490,17 +482,15 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
 
       }
 
-      for (Iterator<JSONObject> alAnnotIter = alAnnotJsonArray
-              .iterator(); alAnnotIter.hasNext();)
+      for (Iterator<Object> alAnnotIter = alAnnotJsonArray.iterator(); alAnnotIter.hasNext();)
       {
-        JSONObject alAnnot = alAnnotIter.next();
-        JSONArray annotJsonArray = (JSONArray) alAnnot.get("annotations");
+        Map<String, Object> alAnnot = (Map<String, Object>) alAnnotIter.next();
+        List<Object> annotJsonArray = (List<Object>) alAnnot.get("annotations");
         Annotation[] annotations = new Annotation[annotJsonArray.size()];
         int count = 0;
-        for (Iterator<JSONObject> annotIter = annotJsonArray
-                .iterator(); annotIter.hasNext();)
+        for (Iterator<Object> annotIter = annotJsonArray.iterator(); annotIter.hasNext();)
         {
-          JSONObject annot = annotIter.next();
+          Map<String, Object> annot = (Map<String, Object>) annotIter.next();
           if (annot == null)
           {
             annotations[count] = null;
@@ -536,7 +526,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
         alignAnnot.graph = (alAnnot.get("graphType") == null) ? 0
                 : Integer.valueOf(alAnnot.get("graphType").toString());
 
-        JSONObject diplaySettings = (JSONObject) alAnnot
+        Map<String, Object> diplaySettings = (Map<String, Object>) alAnnot
                 .get("annotationSettings");
         if (diplaySettings != null)
         {
@@ -604,7 +594,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
     return this;
   }
 
-  public void parseHiddenSeqRefsAsList(JSONObject jvSettingsJson)
+  public void parseHiddenSeqRefsAsList(Map<String, Object> jvSettingsJson)
   {
     hiddenSeqRefs = new ArrayList<>();
     String hiddenSeqs = (String) jvSettingsJson.get("hiddenSeqs");
@@ -618,7 +608,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
     }
   }
 
-  public void parseHiddenCols(JSONObject jvSettingsJson)
+  public void parseHiddenCols(Map<String, Object> jvSettingsJson)
   {
     String hiddenCols = (String) jvSettingsJson.get("hiddenCols");
     if (hiddenCols != null && !hiddenCols.isEmpty())
@@ -635,15 +625,15 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
   }
 
   @SuppressWarnings("unchecked")
-  private void parseFeatures(JSONArray jsonSeqFeatures)
+  private void parseFeatures(List<Object> jsonSeqFeatures)
   {
     if (jsonSeqFeatures != null)
     {
       displayedFeatures = new FeaturesDisplayed();
-      for (Iterator<JSONObject> seqFeatureItr = jsonSeqFeatures
+      for (Iterator<Object> seqFeatureItr = jsonSeqFeatures
               .iterator(); seqFeatureItr.hasNext();)
       {
-        JSONObject jsonFeature = seqFeatureItr.next();
+        Map<String, Object> jsonFeature = (Map<String, Object>) seqFeatureItr.next();
         Long begin = (Long) jsonFeature.get("xStart");
         Long end = (Long) jsonFeature.get("xEnd");
         String type = (String) jsonFeature.get("type");
@@ -665,14 +655,13 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
         SequenceFeature sequenceFeature = new SequenceFeature(type,
                 description, featureBegin, featureEnd, score, featureGrp);
 
-        JSONArray linksJsonArray = (JSONArray) jsonFeature.get("links");
+        List<Object> linksJsonArray = (List<Object>) jsonFeature.get("links");
         if (linksJsonArray != null && linksJsonArray.size() > 0)
         {
-          Iterator<String> linkList = linksJsonArray.iterator();
+          Iterator<Object> linkList = linksJsonArray.iterator();
           while (linkList.hasNext())
           {
-            String link = linkList.next();
-            sequenceFeature.addLink(link);
+            sequenceFeature.addLink((String) linkList.next());
           }
         }
 
diff --git a/src/jalview/javascript/json/JSON.java b/src/jalview/javascript/json/JSON.java
new file mode 100644 (file)
index 0000000..6cb7cb5
--- /dev/null
@@ -0,0 +1,255 @@
+package jalview.javascript.json;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * 
+ * A rudimentary JSON converter/iterator that uses the browser's native AJAX
+ * json data type delivery mechanism.
+ * 
+ * Arrays are delivered as ArrayList<Object> where Object may be Boolean,
+ * String, Long, Double, ArrayList, and "Map-like object".
+ * 
+ * For speed, the maps returned are just JavaScript maps with a few added
+ * methods for extracting data. [get(), contains(), probably should add keySet,
+ * valueSet, and entrySet].
+ * 
+ * @author hansonr Bob Hanson St. Olaf College 1/24/2019
+ *
+ */
+public class JSON {
+
+       /**
+        * A privately initialized class that allows us to do the object
+        * conversion from JavaScript to "Java" on the fly. 
+        * 
+        * @author hansonr
+        *
+        */
+       @SuppressWarnings("serial")
+       public static class JSONList extends ArrayList<Object>  {
+
+
+               static ListIterator iter;
+               
+               JSONList(Object[] a) {
+                       super();
+                       /**
+                        * @j2sNative
+                        * 
+                        * this.elementData = a;
+                        * this.size = a.length;
+                        */
+               }
+               
+               public Object get(int i) {
+                       Object o = null;
+                       /**
+                        * @j2sNative
+                        * 
+                        *  o = this.elementData[i]; 
+                        *  
+                        */
+                       return JSON.toObject(o);
+               }
+
+
+               @Override
+               public Iterator<Object> iterator() {
+                       if (iter == null)
+                               iter = new ListIterator();
+                       iter.pt = 0;
+                       iter.list = this;
+                       return iter;
+               }
+
+               
+               /**
+                * 
+                * @author hansonr
+                *
+                */
+               public static class ListIterator implements Iterator<Object> {
+
+                       ListIterator() {/* restricted */}
+                       
+                       public JSONList list;
+                       int pt = -1;
+
+                       @Override
+                       public boolean hasNext() {
+                               @SuppressWarnings("unused")
+                               boolean more;
+                               /**
+                                * @j2sNative
+                                * 
+                                * more = this.list && (this.pt < this.list.size);
+                                * if (!more) {
+                                *   this.list = null;
+                                *   this.pt = -1;
+                                * }
+                                * return more; 
+                                */
+                               {
+                               return pt < list.size();
+                               }
+                       }
+
+                       @Override
+                       public Object next() {
+                               Object o = null;
+                               /**
+                                * @j2sNative o = this.list.elementData[this.pt++];
+                                * 
+                                */
+                               
+                               return toObject(o);                             
+                       }
+               }
+       }
+
+       /**
+        * A simple encoding of sequential key/value pairs for a jQuery.ajax call. If
+        * the first key is "url" and the second is an object, then the ajax object is
+        * attached to that url as well, just for transport purposes within the system.
+        * 
+        * @param keyValues assumed to be simple String,Object pairs. String objects
+        *                  will be surrounded by double quotes.
+        */
+       public static Object setAjax(Object... keyValues) {
+               Object ajax = null;
+               /**
+                * @j2sNative ajax = {}; if (keyValues[0] == "url" && typeof keyValues[1] ==
+                *            "object") { ajax = keyValues[1].ajax || (keyValues[1].ajax = ajax); }
+                * 
+                *            for (var i = 0; i < keyValues.length;) { var key = keyValues[i++];
+                *            var val = keyValues[i++]; ajax[key] = val; }
+                */
+               return ajax;
+       }
+
+       public static void setAjax(URL url) {
+               setAjax("url", url, "dataType", "json", "async", Boolean.FALSE);        
+       }
+
+       public static BufferedReader getJSONReader(InputStream is) {
+               return new JSONReader(is);
+       }
+
+       public static class JSONReader extends BufferedReader {
+               Object data;
+
+               public JSONReader(InputStream in) {
+                       super((Reader) (Object) in);
+                       // could be buffered
+                       data = toObject(/** @j2sNative $in._ajaxData || $in.$in && $in.$in._ajaxData || */ null);
+                       
+               }
+
+               public JSONReader(Reader in) {
+                       super(in);
+                       // could be buffered
+                       data = toObject(/** @j2sNative $in._ajaxData || $in.$in && $in.$in._ajaxData || */ null);
+               }
+
+               public JSONReader(String json) {
+                       super((Reader) (Object) "");
+                       data = toObject(/** @j2sNative  swingjs.JSUtil.parseJSON$S(json)|| */null); 
+               }
+
+               @Override
+               public void close() {
+                       data = null;
+                       try {
+                               super.close();
+                       } catch (IOException e) {
+                               // ignore, especially if we set $in to a string!
+                       }
+               }
+       }
+
+       @SuppressWarnings("resource")
+       public static Object parse(String json) {
+               return new JSONReader(json).data;
+       }
+
+       public static Object parse(Reader br) {
+               return ((JSONReader) br).data;
+       }
+
+       /**
+        * Get an object in the JSON associative array.
+        * @param br
+        * @param key
+        * @return
+        */
+       @SuppressWarnings("unused")
+       public static Object toObject(Object o) {
+               if (o == null)
+                       return null;
+               String type = /** @j2sNative (typeof o) + */"";
+               switch (type) {
+               case "string":
+                       return o;
+               case "number":
+                       double n = 0;
+                       if (/** @j2sNative (n = o) == (n|0) || */false)
+                               return Long.valueOf((long) n);
+                       return Double.valueOf(n);
+               case "boolean":
+                       return Boolean.valueOf(/** @j2sNative !!o || */false);
+               case "object":
+                       boolean isArray =  /** @j2sNative o instanceof Array || */false;
+                       if (isArray) {
+                               return toList((Object[]) o);
+                       }
+                       return toMap(o);
+               default:
+                       return o;
+               }
+       }
+       
+       Object get(String key) {
+               /**
+                * @j2sNative
+                * 
+                *  return C$.toObject$O(this[key]);
+                */
+               {
+                       return null;
+               }
+       }
+       boolean contains(String key) {
+               /**
+                * @j2sNative
+                * 
+                *  return typeof this[key] != "undefined"
+                */
+               {
+                       return false;
+               }
+       }
+       
+       @SuppressWarnings("unchecked")
+       private static Hashtable<String, Object> toMap(Object map) {
+               /**
+                * @j2sNative
+                * map.get$O = C$.prototype.get$S;
+                * map.contains$O = C$.prototype.contains$S;
+                */                     
+               return (Hashtable<String, Object>) map;
+       }
+
+       private static List<Object> toList(Object[] a) {
+               return new JSONList(a);
+       }
+
+}
index 62fb20a..ad50305 100644 (file)
  */
 package jalview.json.binding.biojs;
 
+import jalview.util.JSONUtils;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
 public class BioJSRepositoryPojo
@@ -59,17 +60,16 @@ public class BioJSRepositoryPojo
   {
     Objects.requireNonNull(jsonString,
             "Supplied jsonString must not be null");
-    JSONParser jsonParser = new JSONParser();
-    JSONObject JsonObj = (JSONObject) jsonParser.parse(jsonString);
+    Map<String, Object> JsonObj = (Map<String, Object>) JSONUtils.parse(jsonString);
     this.description = (String) JsonObj.get("description");
     this.latestReleaseVersion = (String) JsonObj
             .get("latestReleaseVersion");
 
-    JSONArray repositoriesJsonArray = (JSONArray) JsonObj.get("releases");
-    for (Iterator<JSONObject> repoIter = repositoriesJsonArray
+    List<Object> repositoriesJsonArray = (List<Object>) JsonObj.get("releases");
+    for (Iterator<Object> repoIter = repositoriesJsonArray
             .iterator(); repoIter.hasNext();)
     {
-      JSONObject repoObj = repoIter.next();
+      Map<String, Object> repoObj = (Map<String, Object>) repoIter.next();
       BioJSReleasePojo repo = new BioJSReleasePojo();
       repo.setType((String) repoObj.get("type"));
       repo.setUrl((String) repoObj.get("url"));
index f32e590..0dab719 100644 (file)
@@ -25,20 +25,18 @@ import static jalview.util.UrlConstants.DB_ACCESSION;
 import static jalview.util.UrlConstants.DELIM;
 import static jalview.util.UrlConstants.SEP;
 
+import jalview.util.JSONUtils;
 import jalview.util.UrlLink;
 
-import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.StringTokenizer;
 
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
 /**
@@ -76,19 +74,20 @@ public class IdentifiersUrlProvider extends UrlProviderImpl
    *          name of identifiers.org download file
    * @return hashmap of identifiers.org data, keyed by MIRIAM id
    */
-  private HashMap<String, UrlLink> readIdentifiers(String idFileName)
+  @SuppressWarnings("unchecked")
+private HashMap<String, UrlLink> readIdentifiers(String idFileName)
   {
-    JSONParser parser = new JSONParser();
-
     // identifiers.org data
     HashMap<String, UrlLink> idData = new HashMap<String, UrlLink>();
 
     String errorMessage = null;
     try
     {
+       // NOTE: THIS WILL FAIL IN SWINGJS BECAUSE IT INVOLVES A FILE READER
+    
       FileReader reader = new FileReader(idFileName);
       String key = "";
-      JSONObject obj = (JSONObject) parser.parse(reader);
+      Map<String, Object> obj = (Map<String, Object>) JSONUtils.parse(reader);
       if (obj.containsKey(ID_ORG_KEY))
       {
         key = ID_ORG_KEY;
@@ -104,12 +103,12 @@ public class IdentifiersUrlProvider extends UrlProviderImpl
         return idData;
       }
 
-      JSONArray jsonarray = (JSONArray) obj.get(key);
+      List<Object> jsonarray = (List<Object>) obj.get(key);
 
       // loop over each entry in JSON array and build HashMap entry
       for (int i = 0; i < jsonarray.size(); i++)
       {
-        JSONObject item = (JSONObject) jsonarray.get(i);
+        Map<String, Object> item = (Map<String, Object>) jsonarray.get(i);
 
         String url = (String) item.get("url") + "/" + DELIM + DB_ACCESSION
                 + DELIM;
index cdfc88e..f91275d 100644 (file)
@@ -1,6 +1,14 @@
 package jalview.util;
 
-import org.json.simple.JSONArray;
+import jalview.javascript.json.JSON;
+
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.List;
+
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
 
 public class JSONUtils
 {
@@ -12,23 +20,68 @@ public class JSONUtils
    * @param jsonArray
    * @return
    */
-  public static String arrayToList(JSONArray jsonArray)
+  public static String arrayToStringList(List<Object> jsonArray)
   {
-    if (jsonArray == null)
+       int n;
+       
+    if (jsonArray == null || (n = jsonArray.size()) == 0)
     {
       return null;
     }
 
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0; i < jsonArray.size(); i++)
+    /**
+     * @j2sNative
+     * 
+     * return jsonArray.elementData.slice(0, n).join(",");
+     */
     {
-      if (i > 0)
-      {
-        sb.append(",");
-      }
-      sb.append(jsonArray.get(i).toString());
+           StringBuilder sb = new StringBuilder();
+           for (int i = 0; i < n; i++)
+           {
+             if (i > 0)
+             {
+               sb.append(",");
+             }
+             sb.append(jsonArray.get(i).toString());
+           }
+           return sb.toString();
     }
-    return sb.length() == 0 ? null : sb.toString();
+  }
+
+  /**
+   * The method all JSON parsing must go through for JavaScript. 
+   * @param r a BufferedReader or a javascript.json.JSON.JSONReader
+   * @return
+   * @throws IOException
+   * @throws ParseException
+   */
+  public static Object parse(Reader r) throws IOException, ParseException 
+  {
+      // Using a file reader is not currently supported in SwingJS JavaScript
+
+         if (r == null)
+                 return null;
+//       
+//             Platform.timeCheck("JSONUtils.parse0 ", Platform.TIME_MARK);
+
+       Object ret;    
+       if (Platform.isJS()) 
+       {
+         if (r instanceof FileReader) 
+         {
+           throw new IOException("StringJS does not support FileReader parsing for JSON -- but it could...");
+         }
+         return JSON.parse(r);
+       } else {
+        ret = new JSONParser().parse(r);
+       }
+//     Platform.timeCheck("JSONUtils.parse1 ", Platform.TIME_MARK);
+       return ret;
+  }
+
+  public static Object parse(String json) throws ParseException 
+  {
+       return (Platform.isJS() ? JSON.parse(json) : new JSONParser().parse(json));
   }
 
 }
index 0d7724b..1f03f88 100644 (file)
@@ -198,4 +198,26 @@ public class Platform
   {
        return !isMac();
   }
+  
+  public final static int TIME_RESET = 0;
+  public final static int TIME_MARK  = 1;
+  
+  public static long time, mark;
+  
+  public static void timeCheck(String msg, int mode) {
+         switch (mode) {
+         case TIME_RESET:
+                 time = mark = System.currentTimeMillis();
+                 System.err.println("Platform: timer reset\t\t\t" + msg);
+                 break;
+         case TIME_MARK:
+                 long t = System.currentTimeMillis();
+                 if (time == 0)
+                         time = mark = t;
+                 System.err.println("Platform: timer mark\t" + ((t - time)/1000f) + "\t" + ((t - mark)/1000f) + "\t" + msg);
+                 mark = t;
+                 break;
+         }
+  }
+   
 }
index 8dcf966..9189041 100644 (file)
Binary files a/swingjs/SwingJS-site.zip and b/swingjs/SwingJS-site.zip differ
index 6f1aad3..c5dae25 100644 (file)
@@ -1 +1 @@
-20190122081203 
+20190125031511 
index 8dcf966..9189041 100644 (file)
Binary files a/swingjs/ver/3.2.4/SwingJS-site.zip and b/swingjs/ver/3.2.4/SwingJS-site.zip differ
index 6f1aad3..c5dae25 100644 (file)
@@ -1 +1 @@
-20190122081203 
+20190125031511