1
22
23 package com.liferay.portal.upgrade;
24
25 import com.liferay.portal.kernel.util.InstancePool;
26
27 import org.apache.commons.logging.Log;
28 import org.apache.commons.logging.LogFactory;
29
30
36 public abstract class SmartUpgradeSchema extends UpgradeProcess {
37
38 public void upgrade() throws UpgradeException {
39 String smartUpgradeSchemaImplClassName = this.getClass().getName();
40
41 if (_alreadyUpgraded) {
42 _log.info(
43 "Skipping " + smartUpgradeSchemaImplClassName +
44 " because it has already been executed");
45
46 return;
47 }
48
49 _alreadyUpgraded = true;
50
51 try {
52 upgradeOnce();
53
54 boolean doUpgrade = false;
55
56 for (int i = 0; i < _UPGRADE_PROGRESS_CLASSES.length; i++) {
57 String curUpgradeSchemaClassName =
58 _UPGRADE_PROGRESS_CLASSES[i].getName();
59
60 if (doUpgrade) {
61 SmartUpgradeSchema upgradeSchema =
62 (SmartUpgradeSchema)InstancePool.get(
63 curUpgradeSchemaClassName);
64
65 if (!upgradeSchema.isAlreadyUpgraded()) {
66 _log.info(
67 "Automatically executing " +
68 curUpgradeSchemaClassName);
69
70 upgradeSchema.setAlreadyUpgraded(true);
71
72 upgradeSchema.upgradeOnce();
73 }
74 }
75
76 if (smartUpgradeSchemaImplClassName.equals(
77 curUpgradeSchemaClassName)) {
78
79 doUpgrade = true;
80 }
81 }
82 }
83 catch (Exception e) {
84 throw new UpgradeException(e);
85 }
86 }
87
88 protected boolean isAlreadyUpgraded() {
89 return _alreadyUpgraded;
90 }
91
92 protected void setAlreadyUpgraded(boolean alreadyUpgraded) {
93 _alreadyUpgraded = alreadyUpgraded;
94 }
95
96 protected abstract void upgradeOnce() throws Exception;
97
98 private static final Class<?>[] _UPGRADE_PROGRESS_CLASSES = new Class[] {
99 com.liferay.portal.upgrade.v4_3_0.UpgradeSchema.class,
100 com.liferay.portal.upgrade.v4_3_1.UpgradeSchema.class,
101 com.liferay.portal.upgrade.v4_3_2.UpgradeSchema.class,
102 com.liferay.portal.upgrade.v4_3_3.UpgradeSchema.class,
103 com.liferay.portal.upgrade.v4_3_4.UpgradeSchema.class,
104 com.liferay.portal.upgrade.v4_4_0.UpgradeSchema.class,
105 com.liferay.portal.upgrade.v5_0_0.UpgradeSchema.class
106 };
107
108 private static Log _log = LogFactory.getLog(SmartUpgradeSchema.class);
109
110 private boolean _alreadyUpgraded;
111
112 }