illegal access to loading collection
mwalbrun Jan 14, 2008 12:31 PMHi all,
i have the following problem. I have an EJB 3.0 successfully running on windows. now i copied the project onto my mac with mac os x leopard and when i start it get the following exception
18:17:31,669 ERROR [LazyInitializationException] illegal access to loading collection org.hibernate.LazyInitializationException: illegal access to loading collection at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:341) at org.hibernate.collection.PersistentSet.add(PersistentSet.java:189) at de.optitool.domain.sys.Schedule.addEntry(Schedule.java:234) at de.optitool.domain.sys.ScheduleEntry.setSchedule(ScheduleEntry.java:316) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:42) at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337) at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200) at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3566) at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129) at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854) at org.hibernate.loader.Loader.doQuery(Loader.java:729) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) at org.hibernate.loader.Loader.doList(Loader.java:2220) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) at org.hibernate.loader.Loader.list(Loader.java:2099) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378) at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338) at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121) at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79) at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:64) at de.optitool.session.biz.tp.OrderSessionBean.test(OrderSessionBean.java:76) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112) at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166) at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor.invoke(ExtendedPersistenceContextPropagationInterceptor.java:57) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79) at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.stateful.StatefulInstanceInterceptor.invoke(StatefulInstanceInterceptor.java:83) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77) at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.stateful.StatefulContainer.dynamicInvoke(StatefulContainer.java:335) at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106) at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82) at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:769) at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:573) at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:373) at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:166) 18:17:44,151 ERROR [STDERR] javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Exception occurred inside setter of de.optitool.domain.sys.ScheduleEntry.schedule 18:17:44,153 ERROR [STDERR] at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:629) 18:17:44,155 ERROR [STDERR] at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:73) 18:17:44,156 ERROR [STDERR] at de.optitool.session.biz.tp.OrderSessionBean.test(OrderSessionBean.java:76) 18:17:44,157 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 18:17:44,158 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 18:17:44,159 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 18:17:44,159 ERROR [STDERR] at java.lang.reflect.Method.invoke(Method.java:585) 18:17:44,160 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112) 18:17:44,161 ERROR [STDERR] at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166) 18:17:44,162 ERROR [STDERR] at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63) 18:17:44,163 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,164 ERROR [STDERR] at org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor.invoke(ExtendedPersistenceContextPropagationInterceptor.java:57) 18:17:44,165 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,166 ERROR [STDERR] at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54) 18:17:44,166 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,167 ERROR [STDERR] at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47) 18:17:44,168 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,169 ERROR [STDERR] at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79) 18:17:44,169 ERROR [STDERR] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191) 18:17:44,170 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,171 ERROR [STDERR] at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95) 18:17:44,171 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,172 ERROR [STDERR] at org.jboss.ejb3.stateful.StatefulInstanceInterceptor.invoke(StatefulInstanceInterceptor.java:83) 18:17:44,173 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,174 ERROR [STDERR] at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77) 18:17:44,175 ERROR [STDERR] at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110) 18:17:44,175 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,176 ERROR [STDERR] at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46) 18:17:44,177 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,178 ERROR [STDERR] at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106) 18:17:44,178 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,179 ERROR [STDERR] at org.jboss.ejb3.stateful.StatefulContainer.dynamicInvoke(StatefulContainer.java:335) 18:17:44,180 ERROR [STDERR] at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106) 18:17:44,180 ERROR [STDERR] at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82) 18:17:44,181 ERROR [STDERR] at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:769) 18:17:44,182 ERROR [STDERR] at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:573) 18:17:44,183 ERROR [STDERR] at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:373) 18:17:44,183 ERROR [STDERR] at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:166) 18:17:44,184 ERROR [STDERR] Caused by: org.hibernate.PropertyAccessException: Exception occurred inside setter of de.optitool.domain.sys.ScheduleEntry.schedule 18:17:44,185 ERROR [STDERR] at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:65) 18:17:44,186 ERROR [STDERR] at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337) 18:17:44,187 ERROR [STDERR] at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200) 18:17:44,188 ERROR [STDERR] at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3566) 18:17:44,188 ERROR [STDERR] at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129) 18:17:44,189 ERROR [STDERR] at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854) 18:17:44,190 ERROR [STDERR] at org.hibernate.loader.Loader.doQuery(Loader.java:729) 18:17:44,190 ERROR [STDERR] at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) 18:17:44,191 ERROR [STDERR] at org.hibernate.loader.Loader.doList(Loader.java:2220) 18:17:44,192 ERROR [STDERR] at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) 18:17:44,192 ERROR [STDERR] at org.hibernate.loader.Loader.list(Loader.java:2099) 18:17:44,193 ERROR [STDERR] at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378) 18:17:44,194 ERROR [STDERR] at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338) 18:17:44,194 ERROR [STDERR] at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172) 18:17:44,195 ERROR [STDERR] at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121) 18:17:44,196 ERROR [STDERR] at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79) 18:17:44,196 ERROR [STDERR] at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:64) 18:17:44,197 ERROR [STDERR] ... 36 more 18:17:44,198 ERROR [STDERR] Caused by: java.lang.reflect.InvocationTargetException 18:17:44,198 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 18:17:44,199 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 18:17:44,200 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 18:17:44,200 ERROR [STDERR] at java.lang.reflect.Method.invoke(Method.java:585) 18:17:44,201 ERROR [STDERR] at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:42) 18:17:44,202 ERROR [STDERR] ... 52 more 18:17:44,202 ERROR [STDERR] Caused by: org.hibernate.LazyInitializationException: illegal access to loading collection 18:17:44,203 ERROR [STDERR] at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:341) 18:17:44,204 ERROR [STDERR] at org.hibernate.collection.PersistentSet.add(PersistentSet.java:189) 18:17:44,204 ERROR [STDERR] at de.optitool.domain.sys.Schedule.addEntry(Schedule.java:234) 18:17:44,205 ERROR [STDERR] at de.optitool.domain.sys.ScheduleEntry.setSchedule(ScheduleEntry.java:316) 18:17:44,206 ERROR [STDERR] ... 57 more
My two Entities are as follows...
package de.optitool.domain.sys;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Transient;
import javax.persistence.Version;
import de.optitool.common.exception.VetoException;
import de.optitool.common.sys.ISchedule;
import de.optitool.common.sys.IScheduleEntry;
import de.optitool.common.sys.ScheduleEntryEndComparator;
import de.optitool.common.sys.ScheduleEntryStartComparator;
@Entity
@Table(name="schedule")
public class Schedule implements java.io.Serializable, ISchedule {
private static final long serialVersionUID = 6197633623641866232L;
private int scheduleId;
private short jdoVersion;
private Set<ScheduleEntry> scheduleEntries = new HashSet<ScheduleEntry>();
public Schedule() {
}
public Schedule(Set<ScheduleEntry> scheduleEntries) {
this.scheduleEntries = scheduleEntries;
}
@TableGenerator(name="schedule",
table="jdo_keygen",
pkColumnName="table_name",
valueColumnName="last_used_id",
pkColumnValue="schedule",
allocationSize=10)
@Id
@GeneratedValue(strategy=GenerationType.TABLE, generator="schedule")
@Column(name="schedule_id", unique=true, nullable=false)
public int getScheduleId() {
return this.scheduleId;
}
protected void setScheduleId(int scheduleId) {
this.scheduleId = scheduleId;
}
@Version
@Column(name="jdo_version", nullable=false)
protected short getJdoVersion() {
return this.jdoVersion;
}
protected void setJdoVersion(short jdoVersion) {
this.jdoVersion = jdoVersion;
}
/**
* @see net.uniopt.sys.ISchedule#getEntries()
*/
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="schedule")
public Set<ScheduleEntry> getScheduleEntries() {
return this.scheduleEntries;
}
public void setScheduleEntries(Set<ScheduleEntry> scheduleEntries) {
this.scheduleEntries = scheduleEntries;
}
//Methods I do not know why they are in here
/**
* @param entry
*/
public void entryChanged (IScheduleEntry entry) {
// We do nothing here, at the moment.
// setStartEndTime();
}
/**
* @return First second that's contained by this schedule.
*/
@Transient
private Date calcStartTime() {
// Get the list of entries sorted ascending by their begin
List<IScheduleEntry> list = getEntries (new ScheduleEntryStartComparator());
if (list == null || list.isEmpty()) return null;
// Take the first one from the list
IScheduleEntry item = (IScheduleEntry)list.get (0);
Date d = item.getStartDate();
if (d == null) return null;
Calendar cres = Calendar.getInstance();
// Set the date part first
Calendar dc = Calendar.getInstance();
dc.setTime (d);
cres.set (Calendar.YEAR, dc.get (Calendar.YEAR));
cres.set (Calendar.MONTH, dc.get (Calendar.MONTH));
cres.set (Calendar.DATE, dc.get (Calendar.DATE));
// Ignore milliseconds
cres.set (Calendar.MILLISECOND, 0);
// Set the time part, if startTime of the entry is null we set it to 00:00:00
d = item.getStartTime();
if (d == null) {
cres.set (Calendar.MINUTE, 0);
cres.set (Calendar.SECOND, 0);
cres.set (Calendar.HOUR_OF_DAY, 0);
} else {
Calendar tc = Calendar.getInstance();
tc.setTime (d);
cres.set (Calendar.HOUR_OF_DAY, tc.get (Calendar.HOUR_OF_DAY));
cres.set (Calendar.MINUTE, tc.get (Calendar.MINUTE));
cres.set (Calendar.SECOND, tc.get (Calendar.SECOND));
}
return cres.getTime();
}
/**
* @return Last second that's contained by this schedule
*/
@Transient
private Date calcEndTime() {
// Get the list of entries sorted ascending by their end date
List<IScheduleEntry> list = getEntries (new ScheduleEntryEndComparator());
if (list == null || list.isEmpty()) return null;
// Take the last one from the list
IScheduleEntry item = (IScheduleEntry)list.get (list.size()-1);
Date d = item.getEndDate();
if (d == null) return null;
Calendar cres = Calendar.getInstance();
// Set the date part
Calendar dc = Calendar.getInstance();
dc.setTime (d);
cres.set (Calendar.YEAR, dc.get (Calendar.YEAR));
cres.set (Calendar.MONTH, dc.get (Calendar.MONTH));
cres.set (Calendar.DATE, dc.get (Calendar.DATE));
// Ignore milliseconds
cres.set (Calendar.MILLISECOND, 0);
// Set the time part, if endTime of entry is null we set it to 24:00:00
d = item.getEndTime();
if (d != null) {
Calendar tc = Calendar.getInstance();
tc.setTime (d);
cres.set (Calendar.HOUR_OF_DAY, tc.get (Calendar.HOUR_OF_DAY));
cres.set (Calendar.MINUTE, tc.get (Calendar.MINUTE));
cres.set (Calendar.SECOND, tc.get (Calendar.SECOND));
} else {
cres.set (Calendar.MINUTE, 0);
cres.set (Calendar.SECOND, 0);
cres.set (Calendar.HOUR_OF_DAY, 24);
}
return cres.getTime();
}
/**
* Create a Date object from the given date anyDate and
* initialize the time part with the given seconds of day.
* @param anyDate - date used to initialize the date part (y,m,d)
* @param second - second of the day, used to initialize the time part (h,m,s)
* @return - the date object just created
*/
@Transient
private Date generateTime (Date anyDate, int second) {
if (anyDate == null) anyDate = new Date(); // if no date given we take today.
Calendar calendar = Calendar.getInstance();
calendar.setTime (anyDate);
calendar.set (Calendar.HOUR_OF_DAY, second/3600);
second %= 3600;
calendar.set (Calendar.MINUTE, second/60);
second %= 60;
calendar.set (Calendar.SECOND, second);
return calendar.getTime();
}
/**
* @param entry
* @return
*/
@Transient
protected boolean isCompatible (ScheduleEntry entry) {
// TODO If this new entry completely overlaps another or another is completely overlapped
// TODO by the new one false is to be returned!
return true;
}
//Methods implemented by the Interface
@Transient
/**
* @see net.uniopt.sys.ISchedule#getEntries()
*/
public Set<IScheduleEntry> getEntries() {
Set<IScheduleEntry> set = new HashSet<IScheduleEntry>();
if (scheduleEntries != null && !scheduleEntries.isEmpty())
set.addAll (scheduleEntries);
return set;
}
/**
* @see net.uniopt.sys.ISchedule#addEntry(net.uniopt.sys.IScheduleEntry)
*/
@Transient
public boolean addEntry (IScheduleEntry entry) {
if (scheduleEntries == null)
scheduleEntries = new HashSet<ScheduleEntry>(17);
boolean added = entry instanceof ScheduleEntry ? scheduleEntries.add ((ScheduleEntry)entry) : false;
if (added)
entry.setSchedule (this);
return added;
}
/**
* Convinience method for {@link #createEntry(Date, int, Date, int, int)} with the note set to null
* and the all days of the week selected.
* @param startDate - Day the timeframe begins (time part is ignored).
* @param startSecond - Second of the day the timeframe begins (every day).
* @param endDate - Day the interval ends (time part is ignored).
* @param endSecond - Second of the day the timeframe ends every day.
* @param dowIndicator - a bitmap of day-of-the-week constants defined by the ISchedule interface.
* @return The new entry or null if it cannot be created or is not compatible.
* @throws VetoException
*
* @see net.uniopt.sys.ISchedule#createEntry(java.util.Date, int, java.util.Date, int)
*/
@Transient
public IScheduleEntry createEntry (Date startDate, int startSecond, Date endDate, int endSecond) throws VetoException {
return createEntry (startDate, startSecond, endDate, endSecond, ISchedule.ALLDAYS, null);
}
/**
* Convinience method for {@link #createEntry(Date, int, Date, int, int, String)} with the note set to null.
* @param startDate - Day the timeframe begins (time part is ignored).
* @param startSecond - Second of the day the timeframe begins (every day).
* @param endDate - Day the interval ends (time part is ignored).
* @param endSecond - Second of the day the timeframe ends every day.
* @param dowIndicator - a bitmap of day-of-the-week constants defined by the ISchedule interface.
* @return The new entry or null if it cannot be created or is not compatible.
* @throws VetoException
*
* @see net.uniopt.sys.ISchedule#createEntry(java.util.Date, int, java.util.Date, int, int)
*/
@Transient
public IScheduleEntry createEntry (Date startDate, int startSecond, Date endDate, int endSecond, int dowIndicator) throws VetoException {
return createEntry (startDate, startSecond, endDate, endSecond, dowIndicator, null);
}
/**
* Create a new entry (timeframe) within this schedule.
* If the new entry is not compatible with the existing ones null is returned.
* (e.g., it completely overlaps an older one or is completely overlapped by an older one)
* @param startDate - Day the timeframe begins (time part is ignored).
* @param startSecond - Second of the day the timeframe begins (every day).
* @param endDate - Day the interval ends (time part is ignored).
* @param endSecond - Second of the day the timeframe ends every day.
* @param dowIndicator - a bitmap of day-of-the-week constants defined by the ISchedule interface.
* @param note - An arbitrary annotation.
* @return The new entry or null if it cannot be created or is not compatible.
* @throws VetoException
*
* @see net.uniopt.sys.ISchedule#createEntry(java.util.Date, int, java.util.Date, int, int, java.lang.String)
*/
@Transient
public IScheduleEntry createEntry (Date startDate, int startSecond, Date endDate, int endSecond, int dowIndicator, String note) throws VetoException {
return createEntry (startDate,
generateTime (startDate, startSecond),
endDate,
generateTime (endDate, endSecond),
dowIndicator,
note
);
}
/**
* @throws VetoException
*
* @see net.uniopt.sys.ISchedule#createEntry(java.util.Date, java.lang.Integer, java.util.Date, java.lang.Integer, int, java.lang.String)
*/
@Transient
public IScheduleEntry createEntry (Date startDate, Integer startSecond, Date endDate, Integer endSecond, int dowIndicator, String note) throws VetoException {
int tStart = startSecond == null ? 0 : startSecond.intValue();
int tEnd = endSecond == null ? 86400 : endSecond.intValue();
ScheduleEntry entry = (ScheduleEntry)createEntry (startDate, tStart, endDate, tEnd, dowIndicator, note);
return entry;
}
/**
* Create a new entry (timeframe) within this schedule.
* If the new entry is not compatible with the existing ones null is returned.
* (e.g., it completely overlaps an older one or is completely overlapped by an older one)
* @param startDate - Day the timeframe begins (time part is ignored).
* @param startTime - Time of the day the timeframe begins (every day), i.e., the date-part is ignored
* @param endDate - Day the interval ends (time part is ignored).
* @param endTime - Time of the day the timeframe ends every day, i.e., the date-part is ignored
* @param dow - a bitmap of day-of-the-week constants defined by the ISchedule interface.
* @param note - An arbitrary annotation.
* @return The new entry or null if it cannot be created or is not compatible.
* @throws VetoException
*
* @see net.uniopt.sys.ISchedule#createEntry(java.util.Date, int, java.util.Date, int, int, java.lang.String)
*/
@Transient
public IScheduleEntry createEntry (Date startDate, Date startTime, Date endDate, Date endTime, int dow, String note) throws VetoException {
ScheduleEntry entry = new ScheduleEntry();
entry.setValues (startDate, startTime, endDate, endTime);
entry.setDow (dow);
entry.setNote (note);
if (isCompatible (entry)) {
entry.setSchedule (this);
addEntry (entry);
return entry;
}
return null;
}
/**
* @see net.uniopt.sys.ISchedule#getEarliest()
*/
@Transient
public IScheduleEntry getEarliest () {
List<IScheduleEntry> ents = new ArrayList<IScheduleEntry> (getEntries());
if (ents.isEmpty()) return null;
Collections.sort (ents, new ScheduleEntryStartComparator());
return ents.get(0);
}
/**
* @return The last moment managed by the schedule.
*
* @see net.uniopt.sys.ISchedule#getEndTime()
*/
@Transient
public Date getEndTime() {
return calcEndTime();
}
/**
* @see net.uniopt.sys.ISchedule#getEntries(java.util.Comparator)
*/
@Transient
public List<IScheduleEntry> getEntries (Comparator<IScheduleEntry> sortedBy) {
Set<IScheduleEntry> c = getEntries();
List<IScheduleEntry> sortedEntries = c == null ? new ArrayList<IScheduleEntry>() : new ArrayList<IScheduleEntry> (c);
if (sortedBy!=null) Collections.sort (sortedEntries, sortedBy);
return sortedEntries;
}
/**
* Returns all schedule entries (timeframes), that contain the given point in time.
* @param date - The date part of the point in time of interest
* @param minute - The minute of the day of the moment of interest.
* @return - All entries containing the given moment.
*
* @see net.uniopt.sys.ISchedule#getEntriesContaining(java.util.Date, int)
*/
@Transient
public List<IScheduleEntry> getEntriesContaining (Date date, int minute) {
ArrayList<IScheduleEntry> list = new ArrayList<IScheduleEntry>();
for (IScheduleEntry entry : getEntries()) {
if (entry instanceof ScheduleEntry && ((ScheduleEntry)entry).contains (date, minute))
list.add (entry);
}
return list;
}
/**
* @see net.uniopt.sys.ISchedule#getLatest()
*/
@Transient
public IScheduleEntry getLatest() {
List<IScheduleEntry> ents = new ArrayList<IScheduleEntry> (getEntries());
if (ents.isEmpty()) return null;
Collections.sort (ents, new ScheduleEntryEndComparator());
return ents.get(0);
}
/**
* @return The first moment that's part of the schedule.
*
* @see net.uniopt.sys.ISchedule#getStartTime()
*/
@Transient
public Date getStartTime() {
return calcStartTime();
}
/**
* @see net.uniopt.sys.ISchedule#isEmpty()
*/
@Transient
public boolean isEmpty() {
return (scheduleEntries == null || scheduleEntries.isEmpty());
}
/**
* @see net.uniopt.sys.ISchedule#removeAll()
*/
@Transient
public void removeAll() {
Collection<IScheduleEntry> c = getEntries();
if (c != null && !c.isEmpty()) {
Iterator<?> it = c.iterator();
while (it.hasNext()) removeEntry ((IScheduleEntry)it.next());
}
}
/**
* @see net.uniopt.sys.ISchedule#removeEntry(net.uniopt.sys.IScheduleEntry)
*/
@Transient
public boolean removeEntry (IScheduleEntry entry) {
boolean removed = (scheduleEntries == null ? false : scheduleEntries.remove (entry));
if (removed) entry.setSchedule (null);
return removed;
}
}package de.optitool.domain.sys;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Transient;
import javax.persistence.Version;
import de.optitool.common.exception.VetoException;
import de.optitool.common.sys.ISchedule;
import de.optitool.common.sys.IScheduleEntry;
import de.optitool.common.util.TimeUtil;
@Entity
@Table(name="schedule_entry")
public class ScheduleEntry implements java.io.Serializable, IScheduleEntry {
private static final long serialVersionUID = 6000616020745378569L;
private int scheduleEntryId;
private Schedule schedule;
private int down;
private Date endDate;
private Date endTime;
private Date startDate;
private Date startTime;
private boolean up;
private String note;
private short jdoVersion;
/** Days of the week this entry matters.*/
private int dow=Schedule.WORKINGDAYS;
public ScheduleEntry() {
}
public ScheduleEntry(Schedule schedule, int down, boolean up) {
this.schedule = schedule;
this.down = down;
this.up = up;
}
public ScheduleEntry(Schedule schedule, int down, Date endDate, Date endTime, Date startDate,
Date startTime, boolean up, String note) {
this.schedule = schedule;
this.down = down;
this.endDate = endDate;
this.endTime = endTime;
this.startDate = startDate;
this.startTime = startTime;
this.up = up;
this.note = note;
}
@TableGenerator(name="schedule_entry",
table="jdo_keygen",
pkColumnName="table_name",
valueColumnName="last_used_id",
pkColumnValue="schedule_entry",
allocationSize=10)
@Id
@GeneratedValue(strategy=GenerationType.TABLE, generator="schedule_entry")
@Column(name="schedule_entry_id", unique=true, nullable=false)
public int getScheduleEntryId() {
return this.scheduleEntryId;
}
protected void setScheduleEntryId(int scheduleEntryId) {
this.scheduleEntryId = scheduleEntryId;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="schedule_id", nullable=false)
public Schedule getSchedule() {
return this.schedule;
}
public void setSchedule(Schedule schedule) {
this.schedule = schedule;
}
@Column(name="dow", nullable=false)
public int getDown() {
return this.down;
}
public void setDown(int down) {
this.down = down;
}
@Column(name="end_date", length=19)
public Date getEndDate() {
return this.endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
@Column(name="end_time", length=19)
public Date getEndTime() {
return this.endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
@Column(name="start_date", length=19)
public Date getStartDate() {
return this.startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
@Column(name="start_time", length=19)
public Date getStartTime() {
return this.startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
@Column(name="u", nullable=false)
public boolean isUp() {
return this.up;
}
public void setUp(boolean up) {
this.up = up;
}
@Column(name="note")
public String getNote() {
return this.note;
}
public void setNote(String note) {
this.note = note;
}
@Version
@Column(name="jdo_version", nullable=false)
protected short getJdoVersion() {
return this.jdoVersion;
}
protected void setJdoVersion(short jdoVersion) {
this.jdoVersion = jdoVersion;
}
//Methods I do not know
/**
* Does this schedule entry (timeframe) contain the given point in time.
* @param date - The date part (year,month,day) of the point in time.
* @param minute - Minute of the day of the point in time.
* @return Whether this timeframe contains the given point in time.
*/
public boolean contains (Date date, int minute) {
if (startDate != null && date.before (startDate)) return false;
if (endDate != null && date.after (endDate)) return false;
Calendar c = Calendar.getInstance();
c.setTime (date);
if ((TimeUtil.encode (c.get (Calendar.DAY_OF_WEEK)) & dow) == 0) return false;
// If startTime is null it's assumed 0 a.m., so the given minute can't be before but still the same day
if (startTime != null) {
c.setTime (startTime);
int min = c.get (Calendar.HOUR_OF_DAY) * 60 + c.get (Calendar.MINUTE);
if (minute < min) return false;
}
// If endTime is null it's assumed midnight, so the given minute can't be after but still the same day
if (endTime != null) {
c.setTime (endTime);
int min = c.get (Calendar.HOUR_OF_DAY) * 60 + c.get (Calendar.MINUTE);
if (minute > min) return false;
}
return true;
}
/**
* Checks two given date/time pairs if they would make a valid ScheduleEntry.
* <br>
* The following criteria is checked:
* <ul>
* <li> if both date parts are given, the startDate/startTime must be before endDate/endTime </li>
* <li> if no date parts are given, startTime must be before endTime </li>
* <li> if only one date part is given, there is no further restriction on time parts.
* </ul>
*/
protected boolean isValidScheduleEntry (Date startDate, Date startTime, Date endDate, Date endTime) {
Date startDateTime = TimeUtil.combine (startDate, startTime);
Date endDateTime = TimeUtil.combine (endDate, endTime);
if ((startDateTime != null) && (endDateTime != null)) {
// both Date parts given, startDateTime must be before endDateTime
return (startDateTime.compareTo (endDateTime) <= 0);
} else if ((startDate == null) && (endDate == null)) {
if ((startTime != null) && (endTime != null)) {
// no Date parts given, startTime must be before endTime
Date startTimePart = TimeUtil.makeDate(null, startTime); // sets date part to 1.1.1970
Date endTimePart = TimeUtil.makeDate(null, endTime); // sets date part to 1.1.1970
return (startTimePart.compareTo (endTimePart) <= 0);
}
}
return true;
}
//Implemented by the interface
/**
* Compare this with another ScheduleEntry using the given Comparator
* @param entry
* @return 0 if equal, 1 if this is later, -1 if this is earlier
*
* @see net.uniopt.sys.IScheduleEntry#compareTo(net.uniopt.sys.IScheduleEntry, java.util.Comparator)
*/
@Transient
public int compareTo (IScheduleEntry entry, Comparator<IScheduleEntry> comparator) {
return comparator.compare (this, entry);
}
/**
* @see net.uniopt.sys.IScheduleEntry#getDow()
*/
@Transient
public int getDow() {
return dow;
}
/**
* @see net.uniopt.sys.IScheduleEntry#getEndDateTime()
*/
@Transient
public Date getEndDateTime () {
return TimeUtil.combine (getEndDate(), getEndTime());
}
/**
* @see net.uniopt.sys.IScheduleEntry#getStartDateTime()
*/
@Transient
public Date getStartDateTime () {
return TimeUtil.combine (getStartDate(), getStartTime());
}
/**
* @see net.uniopt.sys.IScheduleEntry#setDates(java.util.Date, java.util.Date)
*/
@Transient
public void setDates (Date startDate, Date endDate) throws VetoException {
setValues(startDate, this.startTime, endDate, this.endTime);
}
/**
* @see net.uniopt.sys.IScheduleEntry#setDow(int)
*/
@Transient
public void setDow (int i) {
if (dow != i) {
dow = i;
if( schedule != null ) schedule.entryChanged (this);
}
}
/**
* Sets the end date/time to the given values.
* If time is null, the value "23:59:59" is used.
*
* @see net.uniopt.sys.IScheduleEntry#setEnd(java.util.Date, java.util.Date)
*/
@Transient
public void setEnd (Date date, Date time) throws VetoException {
if (time == null) time = TimeUtil.makeTime(23,59,59);
if ( !isValidScheduleEntry( startDate, startTime, date, time ) )
{
throw new VetoException ("Schedule End cannot be before Schedule Begin.");
}
endDate = date;
endTime = time;
if( schedule != null ) schedule.entryChanged (this);
}
/**
* @see net.uniopt.sys.IScheduleEntry#setSchedule(net.uniopt.sys.ISchedule)
*/
@Transient
public void setSchedule (ISchedule other) {
if (other != null && !(other instanceof Schedule))
throw new RuntimeException ("Cannot set instance of \""+other.getClass().getName()+"\" as parent of a " + getClass().getName()+".");
if (other != schedule) {
if (schedule != null)
schedule.removeEntry (this);
schedule = (Schedule)other;
if (schedule != null)
schedule.addEntry (this);
}
}
/**
* Sets the start date/time to the given values.
* If time is null, the value "00:00:00" is used.
*
* @see net.uniopt.sys.IScheduleEntry#setStart(java.util.Date, java.util.Date)
*/
@Transient
public void setStart(Date date, Date time) throws VetoException {
if (time == null) time = TimeUtil.makeTime(0,0,0);
if ( !isValidScheduleEntry( date, time, endDate, endTime ) )
{
throw new VetoException ("Schedule End cannot be before Schedule Begin.");
}
startDate = date;
startTime = time;
if( schedule != null ) schedule.entryChanged (this);
}
/**
* @see net.uniopt.sys.IScheduleEntry#setTimes(java.util.Date, java.util.Date)
*/
@Transient
public void setTimes (Date startTime, Date endTime) throws VetoException {
setValues(this.startDate, startTime, this.endDate, endTime);
}
/**
* @see net.uniopt.sys.IScheduleEntry#setValues(java.util.Date, java.util.Date, java.util.Date, java.util.Date)
*/
@Transient
public void setValues (Date startDate, Date startTime, Date endDate, Date endTime) throws VetoException {
Date oldStartDate = this.startDate;
Date oldStartTime = this.startTime;
Date oldEndDate = this.endDate;
Date oldEndTime = this.endTime;
setEnd(null, null); // To bypass the validation
setStart(startDate, startTime); // should always work now.
try {
setEnd(endDate, endTime); // This time a validation is done.
} catch (VetoException xc) {
this.startDate = oldStartDate;
this.startTime = oldStartTime;
this.endDate = oldEndDate;
this.endTime = oldEndTime;
throw xc;
}
if( schedule != null ) schedule.entryChanged (this);
}
}
the method which invokes the loading looks like this
public void test () {
Query query = em.createQuery("SELECT s FROM Schedule s LEFT JOIN FETCH s.scheduleEntries ");
try {
Set<Tour> resultSet = new HashSet<Tour>(query.getResultList());
Iterator<?> iter = resultSet.iterator();
while (iter.hasNext()) {
Schedule schedule = (Schedule) iter.next();
System.out.println(schedule.getScheduleId() + " " + schedule.getScheduleEntries().size());
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
So I am really confused because it works on windows but not on my mac...
This can´t be the topic or?
Thanks for your help!
regards
markus