/*
* 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.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.Version;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipsetrader.core.IScript;
import org.eclipsetrader.core.ats.IScriptStrategy;
import org.eclipsetrader.core.feed.TimeSpan;
import org.eclipsetrader.core.instruments.ISecurity;
import org.eclipsetrader.core.repositories.IPropertyConstants;
import org.eclipsetrader.core.repositories.IRepository;
import org.eclipsetrader.core.repositories.IRepositoryElementFactory;
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.RepositoryFactoryType;
import org.hibernate.Session;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Target;
@Entity
@Table(name = "strategies")
public class StrategyScriptStore implements IStore {
public static final String K_INCLUDE = "include";
public static final String K_INSTRUMENT = "instrument";
public static final String K_BARS = "bars";
@Id
@Column(name = "id", length = 32)
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
@Version
@Column(name = "version")
@SuppressWarnings("unused")
private Integer version;
@Column(name = "factory")
@Target(RepositoryFactoryType.class)
private IRepositoryElementFactory factory;
@Column(name = "type")
private String type;
@Column(name = "language")
private String language;
@Column(name = "name", unique = true)
private String name;
@Lob
private String text;
@Transient
TimeSpan[] barsData;
@Transient
ISecurity[] instrumentsData;
@Transient
IScript[] includesData;
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
List<StrategyScriptProperties> properties = new ArrayList<StrategyScriptProperties>();
@Transient
private HibernateRepository repository;
public StrategyScriptStore() {
}
public StrategyScriptStore(HibernateRepository repository) {
this.repository = repository;
}
public String getId() {
return id;
}
public void setRepository(HibernateRepository repository) {
this.repository = repository;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.repositories.IStore#toURI()
*/
@Override
public URI toURI() {
try {
return new URI(repository.getSchema(), HibernateRepository.URI_STRATEGY_PART, id);
} catch (URISyntaxException e) {
e.printStackTrace();
}
return null;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.repositories.IStore#fetchProperties(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public IStoreProperties fetchProperties(IProgressMonitor monitor) {
StoreProperties properties = new StoreProperties();
if (factory != null) {
properties.setProperty(IPropertyConstants.ELEMENT_FACTORY, factory);
}
properties.setProperty(IPropertyConstants.OBJECT_TYPE, type == null ? ISecurity.class.getName() : type);
properties.setProperty(IScriptStrategy.PROP_NAME, name);
properties.setProperty(IScriptStrategy.PROP_LANGUAGE, language);
properties.setProperty(IScriptStrategy.PROP_TEXT, text);
if (includesData == null) {
List<IScript> l = new ArrayList<IScript>();
for (StrategyScriptProperties prop : this.properties) {
if (K_INCLUDE.equals(prop.getName()) && IScript.class.getName().equals(prop.getType())) {
l.add((IScript) StrategyScriptProperties.convert(prop));
}
}
includesData = l.toArray(new IScript[l.size()]);
}
properties.setProperty(IScriptStrategy.PROP_INCLUDES, includesData);
if (instrumentsData == null) {
List<ISecurity> l = new ArrayList<ISecurity>();
for (StrategyScriptProperties prop : this.properties) {
if (K_INSTRUMENT.equals(prop.getName()) && ISecurity.class.getName().equals(prop.getType())) {
l.add((ISecurity) StrategyScriptProperties.convert(prop));
}
}
instrumentsData = l.toArray(new ISecurity[l.size()]);
}
properties.setProperty(IScriptStrategy.PROP_INSTRUMENTS, instrumentsData);
if (barsData == null) {
List<TimeSpan> l = new ArrayList<TimeSpan>();
for (StrategyScriptProperties prop : this.properties) {
if (K_BARS.equals(prop.getName()) && TimeSpan.class.getName().equals(prop.getType())) {
l.add((TimeSpan) StrategyScriptProperties.convert(prop));
}
}
barsData = l.toArray(new TimeSpan[l.size()]);
}
properties.setProperty(IScriptStrategy.PROP_BARS_TIMESPAN, barsData);
return properties;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.repositories.IStore#putProperties(org.eclipsetrader.core.repositories.IStoreProperties, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void putProperties(IStoreProperties properties, IProgressMonitor monitor) {
Session session = repository.getSession();
this.factory = (IRepositoryElementFactory) properties.getProperty(IPropertyConstants.ELEMENT_FACTORY);
this.type = (String) properties.getProperty(IPropertyConstants.OBJECT_TYPE);
this.name = (String) properties.getProperty(IScriptStrategy.PROP_NAME);
this.language = (String) properties.getProperty(IScriptStrategy.PROP_LANGUAGE);
this.text = (String) properties.getProperty(IScriptStrategy.PROP_TEXT);
this.includesData = (IScript[]) properties.getProperty(IScriptStrategy.PROP_INCLUDES);
this.instrumentsData = (ISecurity[]) properties.getProperty(IScriptStrategy.PROP_INSTRUMENTS);
this.barsData = (TimeSpan[]) properties.getProperty(IScriptStrategy.PROP_BARS_TIMESPAN);
List<StrategyScriptProperties> list = new ArrayList<StrategyScriptProperties>();
if (this.includesData != null) {
for (int i = 0; i < this.includesData.length; i++) {
list.add(StrategyScriptProperties.create(K_INCLUDE, this.includesData[i]));
}
}
if (this.instrumentsData != null) {
for (int i = 0; i < this.instrumentsData.length; i++) {
list.add(StrategyScriptProperties.create(K_INSTRUMENT, this.instrumentsData[i]));
}
}
if (this.barsData != null) {
for (int i = 0; i < this.barsData.length; i++) {
list.add(StrategyScriptProperties.create(K_BARS, this.barsData[i]));
}
}
for (StrategyScriptProperties prop : list) {
if (!this.properties.contains(prop)) {
this.properties.add(prop);
}
}
for (Iterator<StrategyScriptProperties> iter = this.properties.iterator(); iter.hasNext();) {
if (!list.contains(iter.next())) {
iter.remove();
}
}
session.save(this);
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.repositories.IStore#delete(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void delete(IProgressMonitor monitor) throws CoreException {
Session session = repository.getSession();
session.delete(this);
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.repositories.IStore#fetchChilds(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public IStore[] fetchChilds(IProgressMonitor monitor) {
return null;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.repositories.IStore#createChild()
*/
@Override
public IStore createChild() {
return null;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.repositories.IStore#getRepository()
*/
@Override
@Transient
public IRepository getRepository() {
return repository;
}
}