1 19 package de.webman.sync ; 20 21 import de.webman.util.registry.Manager; 22 import de.webman.util.registry.RegistryException; 23 import org.apache.log4j.*; 24 import java.io.File ; 25 import java.io.IOException ; 26 import java.io.BufferedInputStream ; 27 import java.io.FileInputStream ; 28 import java.util.List ; 29 import java.util.Iterator ; 30 import org.w3c.dom.Node ; 31 import org.w3c.dom.Document ; 32 import org.xml.sax.SAXException ; 33 import org.xml.sax.InputSource ; 34 import javax.xml.parsers.DocumentBuilderFactory ; 35 import javax.xml.parsers.DocumentBuilder ; 36 import javax.xml.parsers.ParserConfigurationException ; 37 import com.teamkonzept.webman.db.TKWebmanDBManager; 38 import java.sql.SQLException ; 39 import com.teamkonzept.lib.TKException; 40 import com.teamkonzept.webman.db.TKWebmanDBManager; 41 import com.teamkonzept.db.TKPrepQuery; 42 43 44 66 public class SyncMgr 67 implements Manager 68 { 69 70 73 private static Category cat = Category.getInstance(SyncMgr.class); 74 75 76 79 private ACLAdaptor adaptor = null; 80 81 84 private ACLAdaptorFactory adaptorfactory = null; 85 86 89 private List workers = null; 90 91 94 private boolean doSync = false; 95 96 99 private boolean syncOnStart = false; 100 101 104 private boolean inCycle = false; 105 106 107 112 SyncMgr(String basedir) 113 throws RegistryException 114 { 115 try { 116 cat.info("setup synchronization system"); 117 118 try { 119 File syncfile = new File (basedir, "WEB-INF/classes/sync.xml"); 120 readXMLStream(new BufferedInputStream (new FileInputStream (syncfile))); 121 } 122 catch (IOException ioe) { 123 cat.info ("no 'sync.xml' found"); 124 doSync = false; 125 } 126 127 128 if (doSync) { 129 try { 130 adaptorfactory.setProperty("basedir", basedir); 131 adaptor = adaptorfactory.newACLAdaptor(); 132 workers = (List )adaptor.getWorkers(); 133 134 if (syncOnStart) 135 sync(); 136 137 cat.info("synchronization system successfully started"); 138 } 139 catch (Exception ioe) { 140 throw new RegistryException(ioe); 141 } 142 } 143 else 144 cat.info("synchronization system disabled"); 145 } 146 catch (Exception e) { 147 e.printStackTrace(System.out); 148 } 149 150 } 151 152 153 158 private void sync () 159 throws SyncException 160 { 161 cat.debug("synchronize with ext. acl system"); 162 163 try 164 { 165 try { 166 TKWebmanDBManager.initConnection("/webmandb.ini", false); 167 TKPrepQuery.enableCleanup(); 168 } 169 catch (TKException e) { 170 throw new SyncException(e); 171 } 172 173 if (workers != null) { 174 for (Iterator it = workers.iterator(); it.hasNext(); ) { 175 Worker worker = (Worker)it.next(); 176 177 worker.run(adaptor); 178 } 179 } 180 } 181 finally 182 { 183 186 try { 187 TKWebmanDBManager.deregister(true); 188 } 189 catch (SQLException e) { 190 throw new SyncException(e); 191 } 192 } 193 } 194 195 196 205 public void runSynchronization() 206 throws SyncException, SyncBusyException 207 { 208 synchronized(this) { 209 if (inCycle) 210 throw new SyncBusyException(); 211 212 inCycle = true; 213 } 214 215 try { 216 sync(); 217 } 218 finally { 219 synchronized(this) { 220 inCycle = false; 221 } 222 } 223 } 224 225 226 229 233 private void readXMLStream(BufferedInputStream in) 234 throws IOException , RegistryException 235 { 236 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 237 factory.setNamespaceAware(false); 238 factory.setValidating(false); 239 240 Document doc = null; 241 try { 242 DocumentBuilder builder = factory.newDocumentBuilder(); 243 doc = builder.parse(new InputSource (in)); 244 } 245 catch (ParserConfigurationException pce) { 246 throw new RegistryException(pce); 247 } 248 catch (SAXException se) { 249 throw new RegistryException(se); 250 } 251 252 Node nd = doc.getDocumentElement(); 253 if (!("synchronization".equals(nd.getNodeName()))) 254 throw new RegistryException("bad root element '" + nd.getNodeName() + "'"); 255 256 for (Node c1 = nd.getFirstChild(); c1 != null; c1 = c1.getNextSibling()) { 257 if (c1.getNodeType() == Node.ELEMENT_NODE) { 258 if ("use-sync".equals(c1.getNodeName())) { 259 String val = getTextData(c1); 260 doSync = (val != null && "TRUE".equals(val.trim().toUpperCase())); 261 } 262 else if ("sync-factory".equals(c1.getNodeName())) { 263 if (doSync) { 264 try { 265 String factName = getTextData(c1); 266 if (factName != null) { 267 Class fact = Class.forName(factName.trim()); 268 269 adaptorfactory = (ACLAdaptorFactory)fact.newInstance(); 270 } 271 else { 272 adaptorfactory = null; 273 doSync = false; 274 } 275 } 276 catch (Exception e) { 277 cat.error("Can't setup ACL factory: " + e); 278 doSync = false; 279 throw new RegistryException(e); 280 } 281 } 282 } 283 else if ("sync-on-start".equals(c1.getNodeName())) { 284 if (doSync) { 285 String val = getTextData(c1); 286 syncOnStart = (val != null && "TRUE".equals(val.trim().toUpperCase())); 287 } 288 } 289 else 290 throw new RegistryException("unknown element: '" + c1.getNodeName() + "'"); 291 } 292 } 293 294 if (doSync && adaptorfactory == null) 295 throw new RegistryException("can't synchronize, missing sync-factory element"); 296 } 297 298 301 private String getTextData(Node cntx) { 302 cntx.normalize(); 303 304 for (Node n = cntx.getFirstChild(); n != null; n = n.getNextSibling()) { 305 if (n.getNodeType() == Node.TEXT_NODE) { 306 return n.getNodeValue(); 307 } 308 else if (n.getNodeType() == Node.CDATA_SECTION_NODE) { 309 return n.getNodeValue(); 310 } 311 } 312 return null; 313 } 314 315 } 316 | Popular Tags |