Java tutorial
/* Copyright (C) 2006 NTT DATA Corporation This program 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, version 2. 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. */ package com.clustercontrol.jobmanagement.util; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.jface.dialogs.MessageDialog; import com.clustercontrol.fault.JobInvalid; import com.clustercontrol.jobmanagement.bean.JobConstant; import com.clustercontrol.jobmanagement.bean.JudgmentObjectConstant; import com.clustercontrol.util.HinemosMessage; import com.clustercontrol.util.Messages; import com.clustercontrol.ws.jobmanagement.InvalidRole_Exception; import com.clustercontrol.ws.jobmanagement.JobInfo; import com.clustercontrol.ws.jobmanagement.JobInvalid_Exception; import com.clustercontrol.ws.jobmanagement.JobObjectInfo; import com.clustercontrol.ws.jobmanagement.JobTreeItem; import com.clustercontrol.ws.jobmanagement.JobWaitRuleInfo; import com.clustercontrol.ws.jobmanagement.OtherUserGetLock_Exception; import com.clustercontrol.ws.jobmanagement.UpdateTimeNotLatest_Exception; /** * * * ?????<BR> * <li>?? * <li>?????????? * * @version 2.0.0 * @since 2.0.0 */ public class JobUtil { /** ?<BR> */ private static Log m_log = LogFactory.getLog(JobUtil.class); /** ??ID? */ private static final String COPY_OF = "Copy_Of_"; /** ???ID?(??) */ private static final String REFER_TO = "Refer_To_"; /** * ?????? * * @param original * @return ?????? */ private static JobTreeItem copy(JobTreeItem original) { JobTreeItem clone = null; if (original != null) { clone = JobTreeItemUtil.clone(original, null); // ??????createTime? clone.getData().setCreateTime(null); } return clone; } /** * @param original * @param top * @return ?????? */ public static JobTreeItem copy(JobTreeItem original, JobTreeItem top, String jobunitId, String ownerRoleId) { JobTreeItem clone = copy(original); clone.getData().setJobunitId(jobunitId); clone.getData().setOwnerRoleId(ownerRoleId); //ID??? clone = changeOwnerRoleId(clone, ownerRoleId); //ID? HashMap<String, String> jobIdMap = changeJobId(clone, top, clone); //??? modifyWaitRule(clone, jobIdMap); //????????????? if (original.getData().getType() == JobConstant.TYPE_JOBUNIT || !jobunitId.equals(original.getData().getJobunitId())) { modifyReferJob(clone); } //FIXME ID? return clone; } /** * ID???ID?? * * ?"COPY_OF_"?? * 1COPY_OF_(13)_job0001job0001???? * 2COPY_OF_job0001job0001???? * * @param jobId ??ID * @param keyword * @return */ private static String getBaseJobId(String jobId, String keyword) { // COPY_OF_(13)_job0001 ???? Pattern p_number = Pattern.compile(keyword + "\\[1-9][0-9]*\\_"); Matcher m_number = p_number.matcher(jobId); if (m_number.find()) { return jobId.substring(m_number.end()); } // COPY_OF_job0001 ???? Pattern p_org = Pattern.compile(keyword); Matcher m_org = p_org.matcher(jobId); if (m_org.find()) { return jobId.substring(m_org.end()); } // ????????????? return jobId; } /** * ID?<BR> * ???????<BR> * @param clone * @param ownerRoleId * @return */ private static JobTreeItem changeOwnerRoleId(JobTreeItem clone, String ownerRoleId) { //?JobTreeItem? List<JobTreeItem> childrens = clone.getChildren(); for (JobTreeItem children : new ArrayList<JobTreeItem>(childrens)) { children.getData().setOwnerRoleId(ownerRoleId); children = changeOwnerRoleId(children, ownerRoleId); } return clone; } /** * ID?<BR> * ???????<BR> * top?clone????ID?????<BR> * ID????????ID????ID? * * @param item ID? * @param top ID???? * @param clone ID???? */ private static HashMap<String, String> changeJobId(JobTreeItem item, JobTreeItem top, JobTreeItem clone) { if (item == null || top == null) return null; HashMap<String, String> jobIdMap = new HashMap<String, String>(); //ID JobInfo info = item.getData(); if (info != null) { int count = 0; String jobId = ""; jobId = info.getId(); String baseJobId = getBaseJobId(jobId, COPY_OF); while (true) { if (!findJobId(jobId, top) && !findJobId(jobId, clone)) { break; } if (count == 0) { jobId = COPY_OF; } else { jobId = COPY_OF + count + "_"; } jobId += baseJobId; count++; // ?999?? if (count == 1000) { break; } } //??ID? //key:??ID?value:?ID jobIdMap.put(info.getId(), jobId); info.setId(jobId); // ????ID?? if (info.getType() == JobConstant.TYPE_JOBUNIT) { info.setJobunitId(jobId.toString()); m_log.trace("changeJobId() setJobunitId = " + jobId.toString()); } //else { // info.setJobunitId(item.getParent().getData().getJobunitId()); //} } //?JobTreeItem? List<JobTreeItem> childrens = item.getChildren(); for (int i = 0; i < childrens.size(); i++) { childrens.get(i).getData().setJobunitId(info.getJobunitId()); m_log.trace("changeJobId() set childrens[i] " + info.getJobunitId()); jobIdMap.putAll(changeJobId(childrens.get(i), top, clone)); } return jobIdMap; } /** * ????<BR> * ???? * * @param item ??? */ private static void modifyWaitRule(JobTreeItem item, HashMap<String, String> jobIdMap) { if (item == null) return; JobInfo info = item.getData(); if (info != null) { //????????????ID?? //???????? //?????????????? JobWaitRuleInfo waitRule = info.getWaitRule(); if (waitRule != null && waitRule.getObject() != null) { ArrayList<JobObjectInfo> list = new ArrayList<JobObjectInfo>(); for (JobObjectInfo jobObjectInfo : waitRule.getObject()) { String jobId = jobIdMap.get(jobObjectInfo.getJobId()); if (jobId != null) { jobObjectInfo.setJobId(jobId); list.add(jobObjectInfo); } else if (jobObjectInfo.getType() == JudgmentObjectConstant.TYPE_TIME || jobObjectInfo.getType() == JudgmentObjectConstant.TYPE_START_MINUTE || jobObjectInfo.getType() == JudgmentObjectConstant.TYPE_JOB_PARAMETER) { list.add(jobObjectInfo); } } waitRule.getObject().clear(); waitRule.getObject().addAll(list); } } //?JobTreeItem? List<JobTreeItem> childrens = item.getChildren(); for (int i = 0; i < childrens.size(); i++) { modifyWaitRule(childrens.get(i), jobIdMap); } } /** * ?????<BR> * ?????? * * @param item ??? */ private static void modifyReferJob(JobTreeItem item) { JobInfo cloneInfo = item.getData(); if (cloneInfo.getType() == JobConstant.TYPE_REFERJOB || cloneInfo.getType() == JobConstant.TYPE_REFERJOBNET) { cloneInfo.setReferJobId(""); cloneInfo.setReferJobUnitId(""); } //?JobTreeItem? List<JobTreeItem> childrens = item.getChildren(); for (int i = 0; i < childrens.size(); i++) { modifyReferJob(childrens.get(i)); } } /** * ?ID????<BR> * ???? * * @param jobId ID * @param item * @return ID?????true????false */ public static boolean findJobId(String jobId, JobTreeItem item) { boolean find = false; //ID? JobInfo info = item.getData(); if (info != null) { if (jobId.compareTo(info.getId()) == 0) { find = true; return find; } } //?JobTreeItem? List<JobTreeItem> childrens = item.getChildren(); for (int i = 0; i < childrens.size(); i++) { find = findJobId(jobId, childrens.get(i)); if (find) { break; } } return find; } /** * ?ID????<BR> * * @param item * @param isTop ???? * @return ID??/?/???true????false * @throws JobInvalid */ public static void findDuplicateJobId(JobTreeItem item, boolean isTop) throws JobInvalid { m_log.debug("findDuplicateJobId() start : isTop = " + isTop); // ?top?????? if (!isTop) { // ?/?/?? if (item.getData() != null) { String jobId = item.getData().getId(); m_log.debug("findDuplicateJobId() jobId = " + jobId); List<JobTreeItem> children = item.getChildren(); for (JobTreeItem child : children) { m_log.debug("findDuplicateJobId() child = " + child.getData().getId()); // ????ID???? if (findJobId(jobId, child)) { // jobunitid?jobid????? m_log.debug("findDuplicateJobId() jobId is in child " + JobTreeItemUtil.getPath(child)); Object[] args = { jobId, child.getData().getJobunitId() }; throw new JobInvalid(Messages.getString("message.job.65", args)); } else { m_log.debug("findDuplicateJobId() jobId is not in child " + JobTreeItemUtil.getPath(child)); } } } } List<JobTreeItem> children = item.getChildren(); for (JobTreeItem child : children) { m_log.debug("findDuplicateJobId() call child " + child.getData().getId()); findDuplicateJobId(child, false); } m_log.debug("findDuplicateJobId() success!!"); } /** * ?ID????<BR> * * @param item * @return ID?????true????false * @throws JobInvalid */ public static void findDuplicateJobunitId(JobTreeItem item) throws JobInvalid { m_log.debug("findDuplicateJobunitId() start " + JobTreeItemUtil.getPath(item)); JobTreeItem top = item.getChildren().get(0); List<JobTreeItem> jobunits = top.getChildren(); HashSet<String> set = new HashSet<String>(); for (JobTreeItem jobunit : jobunits) { // ID String jobunitId = jobunit.getData().getJobunitId(); m_log.debug("findDuplicateJobunitId() jobunitId = " + jobunitId); if (set.contains(jobunitId)) { m_log.debug("findDuplicateJobunitId() hit " + jobunitId); Object[] args = { jobunitId }; throw new JobInvalid(Messages.getString("message.job.64", args)); } else { m_log.debug("findDuplicateJobunitId() add " + jobunitId + " to set"); set.add(jobunitId); } } m_log.debug("findDuplicateJobunitId() success!!"); } /** * ????? * * @param item * @return ?? */ public static JobTreeItem getTopJobTreeItem(JobTreeItem item) { if (item == null) return null; while (item.getParent() != null) { if (item.getParent().getData().getType() == JobConstant.TYPE_COMPOSITE) { item = item.getParent(); break; } else { item = item.getParent(); } } return item; } /** * ????? * * @param item * @return ?? */ public static JobTreeItem getTopJobUnitTreeItem(JobTreeItem item) { if (item == null) return null; while (item.getParent() != null) { m_log.trace("getTopJobUnitTreeItem() " + item.getParent().getData().getJobunitId() + "." + item.getParent().getData().getId()); if (item.getParent().getData().getType() == JobConstant.TYPE_JOBUNIT) { item = item.getParent(); break; } else if (item.getData().getType() == JobConstant.TYPE_JOBUNIT) { break; } else { item = item.getParent(); } } return item; } /** * ???ID??? * * @param item * @param jobId ID * @return ID??JobTreeItem */ public static JobTreeItem getJobTreeItem(JobTreeItem jobTreeItem, String jobId) { if (jobTreeItem == null || jobId == null || jobId.equals("")) { return null; } if (jobId.equals(jobTreeItem.getData().getId())) { return jobTreeItem; } // ?TreeItem? for (JobTreeItem childJobTreeItem : jobTreeItem.getChildren()) { JobTreeItem resultJobTreeItem = getJobTreeItem(childJobTreeItem, jobId); if (resultJobTreeItem != null) { return resultJobTreeItem; } } return null; } /** * ????? * * @param item ???? */ public static boolean checkWaitRule(JobTreeItem item) throws JobInvalid { boolean check = true; if (item == null) return check; if (item.getData() != null) { //ID? String jobId = item.getData().getId(); //???? JobWaitRuleInfo waitRule = item.getData().getWaitRule(); if (waitRule != null && waitRule.getObject() != null && waitRule.getObject().size() > 0) { Iterator<JobObjectInfo> itr = waitRule.getObject().iterator(); while (itr.hasNext()) { //? JobObjectInfo objectInfo = itr.next(); if (objectInfo.getType() != JudgmentObjectConstant.TYPE_TIME) { //?ID?????? boolean find = false; String targetJobId = objectInfo.getJobId(); List<JobTreeItem> childrens = item.getParent().getChildren(); for (int i = 0; i < childrens.size(); i++) { //ID? JobInfo childInfo = childrens.get(i).getData(); if (childInfo != null && !jobId.equals(childInfo.getId())) { if (targetJobId.compareTo(childInfo.getId()) == 0) { find = true; break; } } } if (!find) { String args[] = { jobId, targetJobId }; throw new JobInvalid(Messages.getString("message.job.59", args)); } } } } } //?JobTreeItem? List<JobTreeItem> childrens = item.getChildren(); for (int i = 0; i < childrens.size(); i++) { check = checkWaitRule(childrens.get(i)); if (!check) { break; } } return check; } /** * ???? * @param managerName * @param jobunitId * @param updateTime * @param forceFlag * @return * @throws OtherUserGetLock_Exception */ public static Integer getEditLock(String managerName, String jobunitId, Long updateTime, boolean forceFlag) throws OtherUserGetLock_Exception { try { JobEndpointWrapper wrapper = JobEndpointWrapper.getWrapper(managerName); return wrapper.getEditLock(jobunitId, updateTime, forceFlag); } catch (OtherUserGetLock_Exception e) { throw e; } catch (InvalidRole_Exception e) { MessageDialog.openInformation(null, Messages.getString("message"), Messages.getString("message.accesscontrol.16")); } catch (UpdateTimeNotLatest_Exception e) { // ????????? MessageDialog.openInformation(null, Messages.getString("message"), HinemosMessage.replace(e.getMessage())); } catch (JobInvalid_Exception e) { MessageDialog.openInformation(null, Messages.getString("message"), HinemosMessage.replace(e.getMessage())); } catch (Exception e) { m_log.warn("run(), " + e.getMessage(), e); MessageDialog.openError(null, Messages.getString("failed"), Messages.getString("message.hinemos.failure.unexpected") + ", " + HinemosMessage.replace(e.getMessage())); } return null; } /** * ID????<BR> * * @param item * @param jobunitID ID */ public static void setJobunitIdAll(JobTreeItem item, String jobunitId) { if (item == null) return; JobInfo jobInfo = item.getData(); if (jobInfo == null) return; if (jobInfo.getType() == JobConstant.TYPE_JOBUNIT) { jobunitId = jobInfo.getJobunitId(); } m_log.trace("setJobunitIdAll() : jobId = " + jobInfo.getId() + ", old jobunitId = " + jobInfo.getJobunitId() + ", new jobunitId = " + jobunitId); // ID? jobInfo.setJobunitId(jobunitId); // ??????ID? if (jobInfo.getType() == JobConstant.TYPE_REFERJOB || jobInfo.getType() == JobConstant.TYPE_REFERJOBNET) { jobInfo.setReferJobUnitId(jobunitId); } // ?????? for (JobTreeItem child : item.getChildren()) { setJobunitIdAll(child, jobunitId); } } /** * ID??<BR> * ID????????ID????ID? * ????????? * * @param jobInfo ID? * @param top ID???? */ public static void setReferJobId(JobInfo jobInfo, JobTreeItem top) { if (jobInfo == null || top == null) return; //ID int count = 0; String jobId = ""; jobId = jobInfo.getId(); String baseJobId = getBaseJobId(jobId, REFER_TO); while (true) { if (!JobUtil.findJobId(jobId, top)) { break; } if (count == 0) { jobId = REFER_TO; } else { jobId = REFER_TO + count + "_"; } jobId += baseJobId; count++; // ?999?? if (count == 1000) { break; } } jobInfo.setId(jobId); return; } /** * ???? * * @param item * @param jobList */ public static void getRegisteredJob(JobTreeItem item, List<JobInfo> jobList) { JobInfo info = item.getData(); if (info != null) { if (info.isRegisteredModule() == true) { jobList.add(info); } for (int i = 0; i < item.getChildren().size(); i++) { JobTreeItem children = item.getChildren().get(i); getRegisteredJob(children, jobList); } } return; } }