package org.eclipse.osbp.authentication.account.datamarts;

import com.vaadin.ui.Notification;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import org.eclipse.osbp.bpm.api.BPMTaskSummary;
import org.eclipse.osbp.core.api.persistence.IPersistenceService;
import org.eclipse.osbp.dsl.common.datatypes.IDto;
import org.eclipse.osbp.preferences.ProductConfiguration;
import org.eclipse.osbp.runtime.common.annotations.Datamart;
import org.eclipse.osbp.runtime.common.annotations.Dispose;
import org.eclipse.osbp.runtime.common.event.IDualData;
import org.eclipse.osbp.runtime.common.i18n.ITranslator;
import org.eclipse.osbp.ui.api.datamart.DatamartData;
import org.eclipse.osbp.ui.api.datamart.DatamartFilter;
import org.eclipse.osbp.ui.api.datamart.IDataMart.EType;
import org.eclipse.osbp.ui.api.datamart.IDatamartContainer;
import org.eclipse.osbp.user.User;
import org.eclipse.osbp.utils.vaadin.SimpleDateFormatter;
import org.eclipse.osbp.xtext.datamart.common.DatamartDtoMapper;
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedAxis;
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedMember;
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedPosition;
import org.eclipse.osbp.xtext.datamart.common.sql.FillerTextResultSet;
import org.eclipse.osbp.xtext.datamart.common.sql.FillerTextResultSetMetaData;
import org.eclipse.osbp.xtext.datamart.common.sql.SqlCellSet;
import org.eclipse.osbp.xtext.datamart.lib.AbstractDatamartService;
import org.eclipse.osbp.xtext.entitymock.common.filler.FillerTextProvider;
import org.olap4j.Axis;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;

@Datamart
@SuppressWarnings("all")
public class UserAccountDatamartContainer implements IDatamartContainer, Serializable {
  private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
  
  @Dispose
  private boolean disposed;
  
  public boolean isDisposed() {
    return this.disposed;
  }
  
  public void checkDisposed() {
    if (isDisposed()) {
    	throw new RuntimeException("Object already disposed: " + this);
    }
  }
  
  public void dispose() {
    if (isDisposed()) {
    	return;
    }
    propertyChangeSupport.firePropertyChange("disposed", this.disposed, this.disposed = true);
  }
  
  @Override
  public Object getIdValue() {
    return id;
  }
  
  private String userName;
  
  private String email;
  
  private String position;
  
  private String profileimage;
  
  private boolean notRegistered;
  
  private String id;
  
  public String getUserName() {
    return userName;
  }
  
  public void setUserName(final String userName) {
    propertyChangeSupport.firePropertyChange("userName", this.userName, this.userName = userName);
  }
  
  public String getEmail() {
    return email;
  }
  
  public void setEmail(final String email) {
    propertyChangeSupport.firePropertyChange("email", this.email, this.email = email);
  }
  
  public String getPosition() {
    return position;
  }
  
  public void setPosition(final String position) {
    propertyChangeSupport.firePropertyChange("position", this.position, this.position = position);
  }
  
  public String getProfileimage() {
    return profileimage;
  }
  
  public void setProfileimage(final String profileimage) {
    propertyChangeSupport.firePropertyChange("profileimage", this.profileimage, this.profileimage = profileimage);
  }
  
  public boolean getNotRegistered() {
    return notRegistered;
  }
  
  public void setNotRegistered(final boolean notRegistered) {
    propertyChangeSupport.firePropertyChange("notRegistered", this.notRegistered, this.notRegistered = notRegistered);
  }
  
  public String getId() {
    return id;
  }
  
  public void setId(final String id) {
    propertyChangeSupport.firePropertyChange("id", this.id, this.id = id);
  }
}
