diff --git a/server/src/com/cloud/async/AsyncJobManagerImpl.java b/server/src/com/cloud/async/AsyncJobManagerImpl.java index 734f5bd03a8..6535875e695 100644 --- a/server/src/com/cloud/async/AsyncJobManagerImpl.java +++ b/server/src/com/cloud/async/AsyncJobManagerImpl.java @@ -1,17 +1,23 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by the License. -// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.async; +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.async; + import java.io.File; import java.io.FileInputStream; import java.lang.reflect.Type; @@ -68,182 +74,182 @@ import com.cloud.utils.mgmt.JmxUtil; import com.cloud.utils.net.MacAddress; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; - -@Local(value={AsyncJobManager.class}) -public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListener { - public static final Logger s_logger = Logger.getLogger(AsyncJobManagerImpl.class.getName()); + +@Local(value={AsyncJobManager.class}) +public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListener { + public static final Logger s_logger = Logger.getLogger(AsyncJobManagerImpl.class.getName()); private static final int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION = 3; // 3 seconds - - private static final int MAX_ONETIME_SCHEDULE_SIZE = 50; + + private static final int MAX_ONETIME_SCHEDULE_SIZE = 50; private static final int HEARTBEAT_INTERVAL = 2000; private static final int GC_INTERVAL = 10000; // 10 seconds - - private String _name; - - private AsyncJobExecutorContext _context; - private SyncQueueManager _queueMgr; + + private String _name; + + private AsyncJobExecutorContext _context; + private SyncQueueManager _queueMgr; private ClusterManager _clusterMgr; - private AccountManager _accountMgr; + private AccountManager _accountMgr; private AccountDao _accountDao; private AsyncJobDao _jobDao; private long _jobExpireSeconds = 86400; // 1 day private long _jobCancelThresholdSeconds = 3600; // 1 hour - private ApiDispatcher _dispatcher; - - private final ScheduledExecutorService _heartbeatScheduler = - Executors.newScheduledThreadPool(1, new NamedThreadFactory("AsyncJobMgr-Heartbeat")); - private ExecutorService _executor; - - @Override - public AsyncJobExecutorContext getExecutorContext() { - return _context; - } - - @Override - public AsyncJobVO getAsyncJob(long jobId) { - return _jobDao.findById(jobId); - } - - @Override - public AsyncJobVO findInstancePendingAsyncJob(String instanceType, long instanceId) { - return _jobDao.findInstancePendingAsyncJob(instanceType, instanceId); + private ApiDispatcher _dispatcher; + + private final ScheduledExecutorService _heartbeatScheduler = + Executors.newScheduledThreadPool(1, new NamedThreadFactory("AsyncJobMgr-Heartbeat")); + private ExecutorService _executor; + + @Override + public AsyncJobExecutorContext getExecutorContext() { + return _context; + } + + @Override + public AsyncJobVO getAsyncJob(long jobId) { + return _jobDao.findById(jobId); + } + + @Override + public AsyncJobVO findInstancePendingAsyncJob(String instanceType, long instanceId) { + return _jobDao.findInstancePendingAsyncJob(instanceType, instanceId); } @Override public List findInstancePendingAsyncJobs(AsyncJob.Type instanceType, Long accountId) { return _jobDao.findInstancePendingAsyncJobs(instanceType, accountId); - } - - @Override - public long submitAsyncJob(AsyncJobVO job) { - return submitAsyncJob(job, false); - } + } + + @Override + public long submitAsyncJob(AsyncJobVO job) { + return submitAsyncJob(job, false); + } - @Override @DB + @Override @DB public long submitAsyncJob(AsyncJobVO job, boolean scheduleJobExecutionInContext) { - Transaction txt = Transaction.currentTxn(); - try { - txt.start(); + Transaction txt = Transaction.currentTxn(); + try { + txt.start(); job.setInitMsid(getMsid()); - _jobDao.persist(job); - txt.commit(); + _jobDao.persist(job); + txt.commit(); // no sync source originally - job.setSyncSource(null); + job.setSyncSource(null); scheduleExecution(job, scheduleJobExecutionInContext); if(s_logger.isDebugEnabled()) { s_logger.debug("submit async job-" + job.getId() + ", details: " + job.toString()); } - return job.getId(); + return job.getId(); } catch(Exception e) { txt.rollback(); String errMsg = "Unable to schedule async job for command " + job.getCmd() + ", unexpected exception."; s_logger.warn(errMsg, e); throw new CloudRuntimeException(errMsg); - } - } - - @Override @DB - public void completeAsyncJob(long jobId, int jobStatus, int resultCode, Object resultObject) { + } + } + + @Override @DB + public void completeAsyncJob(long jobId, int jobStatus, int resultCode, Object resultObject) { if(s_logger.isDebugEnabled()) { - s_logger.debug("Complete async job-" + jobId + ", jobStatus: " + jobStatus + + s_logger.debug("Complete async job-" + jobId + ", jobStatus: " + jobStatus + ", resultCode: " + resultCode + ", result: " + resultObject); - } - - Transaction txt = Transaction.currentTxn(); - try { - txt.start(); - AsyncJobVO job = _jobDao.findById(jobId); - if(job == null) { + } + + Transaction txt = Transaction.currentTxn(); + try { + txt.start(); + AsyncJobVO job = _jobDao.findById(jobId); + if(job == null) { if(s_logger.isDebugEnabled()) { - s_logger.debug("job-" + jobId + " no longer exists, we just log completion info here. " + jobStatus + + s_logger.debug("job-" + jobId + " no longer exists, we just log completion info here. " + jobStatus + ", resultCode: " + resultCode + ", result: " + resultObject); - } - - txt.rollback(); - return; - } + } + + txt.rollback(); + return; + } - job.setCompleteMsid(getMsid()); - job.setStatus(jobStatus); - job.setResultCode(resultCode); + job.setCompleteMsid(getMsid()); + job.setStatus(jobStatus); + job.setResultCode(resultCode); - // reset attached object - job.setInstanceType(null); - job.setInstanceId(null); + // reset attached object + job.setInstanceType(null); + job.setInstanceId(null); if (resultObject != null) { job.setResult(ApiSerializerHelper.toSerializedStringOld(resultObject)); - } + } - job.setLastUpdated(DateUtil.currentGMTTime()); - _jobDao.update(jobId, job); - txt.commit(); - } catch(Exception e) { - s_logger.error("Unexpected exception while completing async job-" + jobId, e); - txt.rollback(); - } - } + job.setLastUpdated(DateUtil.currentGMTTime()); + _jobDao.update(jobId, job); + txt.commit(); + } catch(Exception e) { + s_logger.error("Unexpected exception while completing async job-" + jobId, e); + txt.rollback(); + } + } - @Override @DB - public void updateAsyncJobStatus(long jobId, int processStatus, Object resultObject) { + @Override @DB + public void updateAsyncJobStatus(long jobId, int processStatus, Object resultObject) { if(s_logger.isDebugEnabled()) { - s_logger.debug("Update async-job progress, job-" + jobId + ", processStatus: " + processStatus + + s_logger.debug("Update async-job progress, job-" + jobId + ", processStatus: " + processStatus + ", result: " + resultObject); - } - - Transaction txt = Transaction.currentTxn(); - try { - txt.start(); - AsyncJobVO job = _jobDao.findById(jobId); - if(job == null) { + } + + Transaction txt = Transaction.currentTxn(); + try { + txt.start(); + AsyncJobVO job = _jobDao.findById(jobId); + if(job == null) { if(s_logger.isDebugEnabled()) { s_logger.debug("job-" + jobId + " no longer exists, we just log progress info here. progress status: " + processStatus); - } - - txt.rollback(); - return; - } - - job.setProcessStatus(processStatus); + } + + txt.rollback(); + return; + } + + job.setProcessStatus(processStatus); if(resultObject != null) { job.setResult(ApiSerializerHelper.toSerializedStringOld(resultObject)); - } - job.setLastUpdated(DateUtil.currentGMTTime()); - _jobDao.update(jobId, job); - txt.commit(); - } catch(Exception e) { - s_logger.error("Unexpected exception while updating async job-" + jobId + " status: ", e); - txt.rollback(); - } - } + } + job.setLastUpdated(DateUtil.currentGMTTime()); + _jobDao.update(jobId, job); + txt.commit(); + } catch(Exception e) { + s_logger.error("Unexpected exception while updating async job-" + jobId + " status: ", e); + txt.rollback(); + } + } - @Override @DB - public void updateAsyncJobAttachment(long jobId, String instanceType, Long instanceId) { + @Override @DB + public void updateAsyncJobAttachment(long jobId, String instanceType, Long instanceId) { if(s_logger.isDebugEnabled()) { - s_logger.debug("Update async-job attachment, job-" + jobId + ", instanceType: " + instanceType + + s_logger.debug("Update async-job attachment, job-" + jobId + ", instanceType: " + instanceType + ", instanceId: " + instanceId); - } - - Transaction txt = Transaction.currentTxn(); - try { - txt.start(); + } + + Transaction txt = Transaction.currentTxn(); + try { + txt.start(); - AsyncJobVO job = _jobDao.createForUpdate(); - //job.setInstanceType(instanceType); - job.setInstanceId(instanceId); - job.setLastUpdated(DateUtil.currentGMTTime()); - _jobDao.update(jobId, job); + AsyncJobVO job = _jobDao.createForUpdate(); + //job.setInstanceType(instanceType); + job.setInstanceId(instanceId); + job.setLastUpdated(DateUtil.currentGMTTime()); + _jobDao.update(jobId, job); - txt.commit(); - } catch(Exception e) { - s_logger.error("Unexpected exception while updating async job-" + jobId + " attachment: ", e); - txt.rollback(); - } - } + txt.commit(); + } catch(Exception e) { + s_logger.error("Unexpected exception while updating async job-" + jobId + " attachment: ", e); + txt.rollback(); + } + } - @Override - public void syncAsyncJobExecution(AsyncJob job, String syncObjType, long syncObjId) { + @Override + public void syncAsyncJobExecution(AsyncJob job, String syncObjType, long syncObjId) { // This method is re-entrant. If an API developer wants to synchronized on an object, e.g. the router, // when executing business logic, they will call this method (actually a method in BaseAsyncCmd that calls this). // This method will get called every time their business logic executes. The first time it exectues for a job @@ -309,60 +315,60 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe return _jobDao.findById(cmd.getId()); } - @Override @DB - public AsyncJobResult queryAsyncJobResult(long jobId) { + @Override @DB + public AsyncJobResult queryAsyncJobResult(long jobId) { if(s_logger.isTraceEnabled()) { s_logger.trace("Query async-job status, job-" + jobId); - } - - Transaction txt = Transaction.currentTxn(); - AsyncJobResult jobResult = new AsyncJobResult(jobId); - - try { - txt.start(); - AsyncJobVO job = _jobDao.findById(jobId); - if(job != null) { - jobResult.setCmdOriginator(job.getCmdOriginator()); - jobResult.setJobStatus(job.getStatus()); - jobResult.setProcessStatus(job.getProcessStatus()); - jobResult.setResult(job.getResult()); + } + + Transaction txt = Transaction.currentTxn(); + AsyncJobResult jobResult = new AsyncJobResult(jobId); + + try { + txt.start(); + AsyncJobVO job = _jobDao.findById(jobId); + if(job != null) { + jobResult.setCmdOriginator(job.getCmdOriginator()); + jobResult.setJobStatus(job.getStatus()); + jobResult.setProcessStatus(job.getProcessStatus()); + jobResult.setResult(job.getResult()); jobResult.setResultCode(job.getResultCode()); - jobResult.setUuid(job.getUuid()); - - if(job.getStatus() == AsyncJobResult.STATUS_SUCCEEDED || - job.getStatus() == AsyncJobResult.STATUS_FAILED) { - + jobResult.setUuid(job.getUuid()); + + if(job.getStatus() == AsyncJobResult.STATUS_SUCCEEDED || + job.getStatus() == AsyncJobResult.STATUS_FAILED) { + if(s_logger.isDebugEnabled()) { s_logger.debug("Async job-" + jobId + " completed"); - } - } else { - job.setLastPolled(DateUtil.currentGMTTime()); - _jobDao.update(jobId, job); - } - } else { + } + } else { + job.setLastPolled(DateUtil.currentGMTTime()); + _jobDao.update(jobId, job); + } + } else { if(s_logger.isDebugEnabled()) { s_logger.debug("Async job-" + jobId + " does not exist, invalid job id?"); - } - - jobResult.setJobStatus(AsyncJobResult.STATUS_FAILED); - jobResult.setResult("job-" + jobId + " does not exist"); - } - txt.commit(); - } catch(Exception e) { - s_logger.error("Unexpected exception while querying async job-" + jobId + " status: ", e); - - jobResult.setJobStatus(AsyncJobResult.STATUS_FAILED); - jobResult.setResult("Exception: " + e.toString()); - txt.rollback(); - } - + } + + jobResult.setJobStatus(AsyncJobResult.STATUS_FAILED); + jobResult.setResult("job-" + jobId + " does not exist"); + } + txt.commit(); + } catch(Exception e) { + s_logger.error("Unexpected exception while querying async job-" + jobId + " status: ", e); + + jobResult.setJobStatus(AsyncJobResult.STATUS_FAILED); + jobResult.setResult("Exception: " + e.toString()); + txt.rollback(); + } + if(s_logger.isTraceEnabled()) { s_logger.trace("Job status: " + jobResult.toString()); - } - - return jobResult; + } + + return jobResult; } - + private void scheduleExecution(final AsyncJobVO job) { scheduleExecution(job, false); } @@ -500,7 +506,7 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe } }; } - + private void executeQueueItem(SyncQueueItemVO item, boolean fromPreviousSession) { AsyncJobVO job = _jobDao.findById(item.getContentId()); if (job != null) { @@ -530,61 +536,61 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe } } - @Override - public void releaseSyncSource(AsyncJobExecutor executor) { - if(executor.getSyncSource() != null) { + @Override + public void releaseSyncSource(AsyncJobExecutor executor) { + if(executor.getSyncSource() != null) { if(s_logger.isDebugEnabled()) { - s_logger.debug("Release sync source for job-" + executor.getJob().getId() + " sync source: " - + executor.getSyncSource().getContentType() + "-" + s_logger.debug("Release sync source for job-" + executor.getJob().getId() + " sync source: " + + executor.getSyncSource().getContentType() + "-" + executor.getSyncSource().getContentId()); - } - - _queueMgr.purgeItem(executor.getSyncSource().getId()); - checkQueue(executor.getSyncSource().getQueueId()); - } - } - - private void checkQueue(long queueId) { - while(true) { - try { - SyncQueueItemVO item = _queueMgr.dequeueFromOne(queueId, getMsid()); - if(item != null) { + } + + _queueMgr.purgeItem(executor.getSyncSource().getId()); + checkQueue(executor.getSyncSource().getQueueId()); + } + } + + private void checkQueue(long queueId) { + while(true) { + try { + SyncQueueItemVO item = _queueMgr.dequeueFromOne(queueId, getMsid()); + if(item != null) { if(s_logger.isDebugEnabled()) { s_logger.debug("Executing sync queue item: " + item.toString()); - } - - executeQueueItem(item, false); - } else { - break; - } - } catch(Throwable e) { - s_logger.error("Unexpected exception when kicking sync queue-" + queueId, e); - break; - } - } - } - - private Runnable getHeartbeatTask() { - return new Runnable() { + } + + executeQueueItem(item, false); + } else { + break; + } + } catch(Throwable e) { + s_logger.error("Unexpected exception when kicking sync queue-" + queueId, e); + break; + } + } + } + + private Runnable getHeartbeatTask() { + return new Runnable() { @Override - public void run() { + public void run() { try { - List l = _queueMgr.dequeueFromAny(getMsid(), MAX_ONETIME_SCHEDULE_SIZE); - if(l != null && l.size() > 0) { - for(SyncQueueItemVO item: l) { + List l = _queueMgr.dequeueFromAny(getMsid(), MAX_ONETIME_SCHEDULE_SIZE); + if(l != null && l.size() > 0) { + for(SyncQueueItemVO item: l) { if(s_logger.isDebugEnabled()) { s_logger.debug("Execute sync-queue item: " + item.toString()); } executeQueueItem(item, false); - } - } - } catch(Throwable e) { - s_logger.error("Unexpected exception when trying to execute queue item, ", e); + } + } + } catch(Throwable e) { + s_logger.error("Unexpected exception when trying to execute queue item, ", e); } finally { StackMaid.current().exitCleanup(); - } - } - }; + } + } + }; } @DB @@ -643,14 +649,14 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe } }; } - - private long getMsid() { + + private long getMsid() { if(_clusterMgr != null) { return _clusterMgr.getManagementNodeId(); - } - - return MacAddress.getMacAddress().toLong(); - } + } + + return MacAddress.getMacAddress().toLong(); + } private void cleanupPendingJobs(List l) { if(l != null && l.size() > 0) { @@ -670,13 +676,13 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe _queueMgr.purgeItem(item.getId()); } } - } + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + _name = name; - @Override - public boolean configure(String name, Map params) throws ConfigurationException { - _name = name; - - ComponentLocator locator = ComponentLocator.getCurrentLocator(); + ComponentLocator locator = ComponentLocator.getCurrentLocator(); ConfigurationDao configDao = locator.getDao(ConfigurationDao.class); if (configDao == null) { @@ -694,25 +700,25 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe _accountDao = locator.getDao(AccountDao.class); if (_accountDao == null) { throw new ConfigurationException("Unable to get " + AccountDao.class.getName()); - } - _jobDao = locator.getDao(AsyncJobDao.class); - if (_jobDao == null) { - throw new ConfigurationException("Unable to get " - + AsyncJobDao.class.getName()); - } - - _context = locator.getManager(AsyncJobExecutorContext.class); - if (_context == null) { - throw new ConfigurationException("Unable to get " - + AsyncJobExecutorContext.class.getName()); - } - - _queueMgr = locator.getManager(SyncQueueManager.class); - if(_queueMgr == null) { - throw new ConfigurationException("Unable to get " - + SyncQueueManager.class.getName()); - } - + } + _jobDao = locator.getDao(AsyncJobDao.class); + if (_jobDao == null) { + throw new ConfigurationException("Unable to get " + + AsyncJobDao.class.getName()); + } + + _context = locator.getManager(AsyncJobExecutorContext.class); + if (_context == null) { + throw new ConfigurationException("Unable to get " + + AsyncJobExecutorContext.class.getName()); + } + + _queueMgr = locator.getManager(SyncQueueManager.class); + if(_queueMgr == null) { + throw new ConfigurationException("Unable to get " + + SyncQueueManager.class.getName()); + } + _clusterMgr = locator.getManager(ClusterManager.class); _accountMgr = locator.getManager(AccountManager.class); @@ -735,7 +741,7 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe throw new ConfigurationException("Unable to load db.properties to configure AsyncJobManagerImpl"); } - return true; + return true; } @Override @@ -765,10 +771,10 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe @Override public void onManagementNodeIsolated() { } - - @Override + + @Override public boolean start() { - try { + try { List l = _queueMgr.getActiveQueueItems(getMsid(), false); cleanupPendingJobs(l); _queueMgr.resetQueueProcess(getMsid()); @@ -776,13 +782,13 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe } catch(Throwable e) { s_logger.error("Unexpected exception " + e.getMessage(), e); } - - _heartbeatScheduler.scheduleAtFixedRate(getHeartbeatTask(), HEARTBEAT_INTERVAL, + + _heartbeatScheduler.scheduleAtFixedRate(getHeartbeatTask(), HEARTBEAT_INTERVAL, HEARTBEAT_INTERVAL, TimeUnit.MILLISECONDS); _heartbeatScheduler.scheduleAtFixedRate(getGCTask(), GC_INTERVAL, GC_INTERVAL, TimeUnit.MILLISECONDS); - - return true; + + return true; } private static ExceptionResponse getResetResultResponse(String errorMessage) { @@ -794,17 +800,17 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe private static String getSerializedErrorMessage(String errorMessage) { return ApiSerializerHelper.toSerializedStringOld(getResetResultResponse(errorMessage)); - } - - @Override - public boolean stop() { - _heartbeatScheduler.shutdown(); - _executor.shutdown(); - return true; - } - - @Override - public String getName() { - return _name; - } -} + } + + @Override + public boolean stop() { + _heartbeatScheduler.shutdown(); + _executor.shutdown(); + return true; + } + + @Override + public String getName() { + return _name; + } +} diff --git a/utils/src/com/cloud/utils/db/GenericDaoBase.java b/utils/src/com/cloud/utils/db/GenericDaoBase.java index d6bd327c21f..c2fe8bdd6ac 100755 --- a/utils/src/com/cloud/utils/db/GenericDaoBase.java +++ b/utils/src/com/cloud/utils/db/GenericDaoBase.java @@ -169,11 +169,11 @@ public abstract class GenericDaoBase implements Gene factory.setCallback(0, builder); return builder; } - + public final Map getAllAttributes() { return _allAttributes; } - + @SuppressWarnings("unchecked") protected GenericDaoBase() { Type t = getClass().getGenericSuperclass(); @@ -182,8 +182,8 @@ public abstract class GenericDaoBase implements Gene } else if (((Class)t).getGenericSuperclass() instanceof ParameterizedType) { _entityBeanType = (Class)((ParameterizedType)((Class)t).getGenericSuperclass()).getActualTypeArguments()[0]; } else { - _entityBeanType = (Class)((ParameterizedType) - ( (Class)((Class)t).getGenericSuperclass()).getGenericSuperclass()).getActualTypeArguments()[0]; + _entityBeanType = (Class)((ParameterizedType) + ( (Class)((Class)t).getGenericSuperclass()).getGenericSuperclass()).getActualTypeArguments()[0]; } s_daoMaps.put(_entityBeanType, this); @@ -298,7 +298,7 @@ public abstract class GenericDaoBase implements Gene return s_seqFetcher.getRandomNextSequence(clazz, tg); } - + @Override @DB(txn=false) public List lockRows(final SearchCriteria sc, final Filter filter, final boolean exclusive) { return search(sc, filter, exclusive, false); @@ -338,8 +338,9 @@ public abstract class GenericDaoBase implements Gene return searchIncludingRemoved(sc, filter, lock, cache, false) ; } + @Override public List searchIncludingRemoved(SearchCriteria sc, final Filter filter, final Boolean lock, - final boolean cache, final boolean enable_query_cache) { + final boolean cache, final boolean enable_query_cache) { String clause = sc != null ? sc.getWhereClause() : null; if (clause != null && clause.length() == 0) { clause = null; @@ -368,7 +369,7 @@ public abstract class GenericDaoBase implements Gene } final String sql = str.toString(); - + PreparedStatement pstmt = null; final List result = new ArrayList(); try { @@ -494,11 +495,11 @@ public abstract class GenericDaoBase implements Gene byte[] bytes = rs.getBytes(index); if(bytes != null) { try { - if(field.getAnnotation(Column.class).encryptable()){ - field.set(entity, DBEncryptionUtil.decrypt(new String(bytes, "UTF-8"))); - } else { - field.set(entity, new String(bytes, "UTF-8")); - } + if(field.getAnnotation(Column.class).encryptable()){ + field.set(entity, DBEncryptionUtil.decrypt(new String(bytes, "UTF-8"))); + } else { + field.set(entity, new String(bytes, "UTF-8")); + } } catch (IllegalArgumentException e) { assert(false); throw new CloudRuntimeException("IllegalArgumentException when converting UTF-8 data"); @@ -749,7 +750,7 @@ public abstract class GenericDaoBase implements Gene sc.addAnd(_idAttributes.get(_table)[0], SearchCriteria.Op.EQ, id); Transaction txn = Transaction.currentTxn(); txn.start(); - + try { if (ub.getCollectionChanges() != null) { insertElementCollection(entity, _idAttributes.get(_table)[0], id, ub.getCollectionChanges()); @@ -757,11 +758,11 @@ public abstract class GenericDaoBase implements Gene } catch (SQLException e) { throw new CloudRuntimeException("Unable to persist element collection", e); } - + int rowsUpdated = update(ub, sc, null); - + txn.commit(); - + return rowsUpdated; } @@ -846,7 +847,7 @@ public abstract class GenericDaoBase implements Gene assert results.size() <= 1 : "Didn't the limiting worked?"; return results.size() == 0 ? null : results.get(0); } - + @Override @DB(txn=false) public T findOneBy(final SearchCriteria sc) { @@ -855,7 +856,7 @@ public abstract class GenericDaoBase implements Gene } return findOneIncludingRemovedBy(sc); } - + @DB(txn=false) protected List listBy(final SearchCriteria sc, final Filter filter) { if (_removed != null) { @@ -881,7 +882,7 @@ public abstract class GenericDaoBase implements Gene protected List listIncludingRemovedBy(final SearchCriteria sc, final Filter filter, final boolean enable_query_cache) { return searchIncludingRemoved(sc, filter, null, false, enable_query_cache); } - + @DB(txn=false) protected List listIncludingRemovedBy(final SearchCriteria sc, final Filter filter) { return searchIncludingRemoved(sc, filter, null, false); @@ -1150,7 +1151,7 @@ public abstract class GenericDaoBase implements Gene return sql; } - + @DB(txn=false) protected StringBuilder createPartialSelectSql(SearchCriteria sc, final boolean whereClause) { StringBuilder sql = new StringBuilder(_partialSelectSql.first()); @@ -1209,7 +1210,7 @@ public abstract class GenericDaoBase implements Gene public List search(final SearchCriteria sc, final Filter filter, final boolean enable_query_cache) { return search(sc, filter, null, false, enable_query_cache); } - + @Override @DB(txn=false) public boolean update(ID id, T entity) { assert Enhancer.isEnhanced(entity.getClass()) : "Entity is not generated by this dao"; @@ -1284,7 +1285,7 @@ public abstract class GenericDaoBase implements Gene } } } - + if (_ecAttributes != null && _ecAttributes.size() > 0) { HashMap ecAttributes = new HashMap(); for (Attribute attr : _ecAttributes) { @@ -1293,7 +1294,7 @@ public abstract class GenericDaoBase implements Gene ecAttributes.put(attr, ec); } } - + insertElementCollection(entity, _idAttributes.get(_table)[0], id, ecAttributes); } txn.commit(); @@ -1318,7 +1319,7 @@ public abstract class GenericDaoBase implements Gene for (Map.Entry entry : ecAttributes.entrySet()) { Attribute attr = entry.getKey(); Object obj = entry.getValue(); - + EcInfo ec = (EcInfo)attr.attache; Enumeration en = null; if (ec.rawClass == null) { @@ -1329,7 +1330,7 @@ public abstract class GenericDaoBase implements Gene PreparedStatement pstmt = txn.prepareAutoCloseStatement(ec.clearSql); prepareAttribute(1, pstmt, idAttribute, id); pstmt.executeUpdate(); - + while (en.hasMoreElements()) { pstmt = txn.prepareAutoCloseStatement(ec.insertSql); if (ec.targetClass == Date.class) { @@ -1389,11 +1390,11 @@ public abstract class GenericDaoBase implements Gene // to support generic localization, utilize MySql UTF-8 support if (length < str.length()) { try { - if (attr.is(Attribute.Flag.Encrypted)){ - pstmt.setBytes(j, DBEncryptionUtil.encrypt(str.substring(0, column.length())).getBytes("UTF-8")); - } else { - pstmt.setBytes(j, str.substring(0, column.length()).getBytes("UTF-8")); - } + if (attr.is(Attribute.Flag.Encrypted)){ + pstmt.setBytes(j, DBEncryptionUtil.encrypt(str.substring(0, column.length())).getBytes("UTF-8")); + } else { + pstmt.setBytes(j, str.substring(0, column.length()).getBytes("UTF-8")); + } } catch (UnsupportedEncodingException e) { // no-way it can't support UTF-8 encoding assert(false); @@ -1401,11 +1402,11 @@ public abstract class GenericDaoBase implements Gene } } else { try { - if (attr.is(Attribute.Flag.Encrypted)){ - pstmt.setBytes(j, DBEncryptionUtil.encrypt(str).getBytes("UTF-8")); - } else { - pstmt.setBytes(j, str.getBytes("UTF-8")); - } + if (attr.is(Attribute.Flag.Encrypted)){ + pstmt.setBytes(j, DBEncryptionUtil.encrypt(str).getBytes("UTF-8")); + } else { + pstmt.setBytes(j, str.getBytes("UTF-8")); + } } catch (UnsupportedEncodingException e) { // no-way it can't support UTF-8 encoding assert(false); @@ -1499,6 +1500,28 @@ public abstract class GenericDaoBase implements Gene return entity; } + @DB(txn=false) + protected T toVO(ResultSet result, boolean cache) throws SQLException { + T entity; + try { + entity = _entityBeanType.newInstance(); + } catch (InstantiationException e1) { + throw new CloudRuntimeException("Unable to instantiate entity", e1); + } catch (IllegalAccessException e1) { + throw new CloudRuntimeException("Illegal Access", e1); + } + toEntityBean(result, entity); + if (cache && _cache != null) { + try { + _cache.put(new Element(_idField.get(entity), entity)); + } catch (final Exception e) { + s_logger.debug("Can't put it in the cache", e); + } + } + + return entity; + } + @DB(txn=false) protected void toEntityBean(final ResultSet result, final T entity) throws SQLException { ResultSetMetaData meta = result.getMetaData(); @@ -1550,7 +1573,7 @@ public abstract class GenericDaoBase implements Gene } else { assert (false) : "You'll need to add more classeses"; } - + if (ec.rawClass == null) { Object[] array = (Object[])Array.newInstance(ec.targetClass); lst.toArray(array); @@ -1722,22 +1745,22 @@ public abstract class GenericDaoBase implements Gene SearchBuilder builder = createSearchBuilder(); return builder.create(); } - + @Override @DB(txn=false) public SearchCriteria2 createSearchCriteria2(Class resultType) { - final T entity = (T)_searchEnhancer.create(); - final Factory factory = (Factory)entity; - SearchCriteria2 sc = new SearchCriteria2(entity, resultType, _allAttributes, this); - factory.setCallback(0, sc); - return sc; + final T entity = (T)_searchEnhancer.create(); + final Factory factory = (Factory)entity; + SearchCriteria2 sc = new SearchCriteria2(entity, resultType, _allAttributes, this); + factory.setCallback(0, sc); + return sc; } - + @Override @DB(txn=false) public SearchCriteria2 createSearchCriteria2() { - final T entity = (T)_searchEnhancer.create(); - final Factory factory = (Factory)entity; - SearchCriteria2 sc = new SearchCriteria2(entity, (Class)entity.getClass(), _allAttributes, this); - factory.setCallback(0, sc); - return sc; + final T entity = (T)_searchEnhancer.create(); + final Factory factory = (Factory)entity; + SearchCriteria2 sc = new SearchCriteria2(entity, entity.getClass(), _allAttributes, this); + factory.setCallback(0, sc); + return sc; } }