/* * Copyright (c) 2004-2011 Marco Maccaferri and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Marco Maccaferri - initial API and implementation */ package org.eclipsetrader.repository.hibernate.internal.stores; import java.net.URI; import java.net.URISyntaxException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.persistence.Column; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipsetrader.core.feed.IHistory; import org.eclipsetrader.core.feed.IOHLC; import org.eclipsetrader.core.feed.TimeSpan; import org.eclipsetrader.core.instruments.ISecurity; import org.eclipsetrader.core.repositories.IPropertyConstants; import org.eclipsetrader.core.repositories.IStore; import org.eclipsetrader.core.repositories.IStoreProperties; import org.eclipsetrader.core.repositories.StoreProperties; import org.eclipsetrader.repository.hibernate.HibernateRepository; import org.eclipsetrader.repository.hibernate.internal.types.HistoryData; import org.hibernate.Session; @Entity @DiscriminatorValue("day") public class IntradayHistoryStore extends HistoryStore { @Column(name = "date") @Temporal(TemporalType.DATE) private Date date; @Transient Map<TimeSpan, IOHLC[]> bars = new HashMap<TimeSpan, IOHLC[]>(); public IntradayHistoryStore() { } public IntradayHistoryStore(ISecurity security, HibernateRepository repository) { super(security, repository); } public IntradayHistoryStore(ISecurity security, Date date, HibernateRepository repository) { super(security, repository); this.date = date; } /* (non-Javadoc) * @see org.eclipsetrader.repository.hibernate.internal.stores.HistoryStore#fetchProperties(org.eclipse.core.runtime.IProgressMonitor) */ @Override public IStoreProperties fetchProperties(IProgressMonitor monitor) { StoreProperties properties = new StoreProperties() { @Override public String[] getPropertyNames() { fillHistory(); Set<String> s = new HashSet<String>(Arrays.asList(super.getPropertyNames())); for (TimeSpan timeSpan : bars.keySet()) { s.add(timeSpan.toString()); } return s.toArray(new String[s.size()]); } @Override public Object getProperty(String name) { Object o = super.getProperty(name); if (o != null) { return o; } TimeSpan timeSpan = TimeSpan.fromString(name); if (timeSpan != null) { fillHistory(); return bars.get(timeSpan); } return null; } }; properties.setProperty(IPropertyConstants.OBJECT_TYPE, IHistory.class.getName()); properties.setProperty(IPropertyConstants.SECURITY, security); properties.setProperty(IPropertyConstants.BARS_DATE, date); return properties; } protected void fillHistory() { if (bars.size() == 0) { Map<TimeSpan, List<HistoryData>> map = new HashMap<TimeSpan, List<HistoryData>>(); for (HistoryData ohlc : data) { List<HistoryData> h = map.get(ohlc.getTimeSpan()); if (h == null) { h = new ArrayList<HistoryData>(2048); map.put(ohlc.getTimeSpan(), h); } h.add(ohlc); } for (TimeSpan timeSpan : map.keySet()) { List<HistoryData> h = map.get(timeSpan); this.bars.put(timeSpan, h.toArray(new IOHLC[h.size()])); } } } /* (non-Javadoc) * @see org.eclipsetrader.repository.hibernate.internal.stores.HistoryStore#putProperties(org.eclipsetrader.core.repositories.IStoreProperties, org.eclipse.core.runtime.IProgressMonitor) */ @Override public void putProperties(IStoreProperties properties, IProgressMonitor monitor) { Session session = repository.getSession(); this.security = (ISecurity) properties.getProperty(IPropertyConstants.SECURITY); this.date = (Date) properties.getProperty(IPropertyConstants.BARS_DATE); List<HistoryData> h = new ArrayList<HistoryData>(2048); for (String name : properties.getPropertyNames()) { TimeSpan timeSpan = TimeSpan.fromString(name); if (timeSpan != null) { IOHLC[] ohlc = (IOHLC[]) properties.getProperty(name); for (int i = 0; i < ohlc.length; i++) { h.add(new HistoryData(this, ohlc[i], timeSpan)); } } } for (HistoryData ohlc : h) { if (!this.data.contains(ohlc)) { this.data.add(ohlc); } } for (Iterator<HistoryData> iter = this.data.iterator(); iter.hasNext();) { if (!h.contains(iter.next())) { iter.remove(); } } this.bars.clear(); fillHistory(); session.save(this); } /* (non-Javadoc) * @see org.eclipsetrader.repository.hibernate.internal.stores.HistoryStore#createChild() */ @Override public IStore createChild() { return null; } /* (non-Javadoc) * @see org.eclipsetrader.repository.hibernate.internal.stores.HistoryStore#toURI() */ @Override public URI toURI() { try { return new URI(repository.getSchema(), HibernateRepository.URI_SECURITY_HISTORY_PART + "/" + new SimpleDateFormat("yyyyMMdd").format(date), id); } catch (URISyntaxException e) { e.printStackTrace(); } return null; } }