/* * 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.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.OrderBy; 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.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.core.views.IColumn; import org.eclipsetrader.core.views.IHolding; import org.eclipsetrader.core.views.IWatchList; import org.eclipsetrader.repository.hibernate.HibernateRepository; import org.eclipsetrader.repository.hibernate.internal.types.RepositoryFactoryType; import org.eclipsetrader.repository.hibernate.internal.types.WatchListColumn; import org.eclipsetrader.repository.hibernate.internal.types.WatchListHolding; import org.hibernate.Session; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Target; import org.hibernate.annotations.Type; @Entity @Table(name = "watchlists") public class WatchListStore implements IStore { @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") @Type(type = "string") @Target(RepositoryFactoryType.class) private IRepositoryElementFactory factory; @Column(name = "name") private String name; @OneToMany(mappedBy = "watchlist", cascade = CascadeType.ALL) @OrderBy("index") private List<WatchListColumn> columns = new ArrayList<WatchListColumn>(); @OneToMany(mappedBy = "watchlist", cascade = CascadeType.ALL) @OrderBy("index") private List<WatchListHolding> elements = new ArrayList<WatchListHolding>(); @Transient private HibernateRepository repository; public WatchListStore() { } public WatchListStore(HibernateRepository repository) { this.repository = repository; } 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_WATCHLIST_PART, id); } catch (URISyntaxException e) { } 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(); properties.setProperty(IPropertyConstants.ELEMENT_FACTORY, factory); properties.setProperty(IPropertyConstants.OBJECT_TYPE, IWatchList.class.getName()); properties.setProperty(IPropertyConstants.NAME, name); properties.setProperty(IPropertyConstants.COLUMNS, columns.toArray(new IColumn[columns.size()])); properties.setProperty(IPropertyConstants.HOLDINGS, elements.toArray(new IHolding[elements.size()])); 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.name = (String) properties.getProperty(IPropertyConstants.NAME); IColumn[] c = (IColumn[]) properties.getProperty(IPropertyConstants.COLUMNS); if (c != null) { for (WatchListColumn column : this.columns) { session.delete(column); } this.columns.clear(); for (int i = 0; i < c.length; i++) { this.columns.add(new WatchListColumn(c[i], this, i)); } } IHolding[] e = (IHolding[]) properties.getProperty(IPropertyConstants.HOLDINGS); if (e != null) { for (WatchListHolding holding : this.elements) { session.delete(holding); } this.elements.clear(); for (int i = 0; i < e.length; i++) { this.elements.add(new WatchListHolding(e[i], this, i)); } } 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 new IStore[0]; } /* (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; } }