1 31 32 package org.opencms.module; 33 34 import org.opencms.configuration.CmsConfigurationException; 35 import org.opencms.configuration.CmsModuleConfiguration; 36 import org.opencms.file.CmsObject; 37 import org.opencms.file.CmsProject; 38 import org.opencms.i18n.CmsMessageContainer; 39 import org.opencms.importexport.CmsExport; 40 import org.opencms.importexport.CmsImport; 41 import org.opencms.importexport.CmsImportExportException; 42 import org.opencms.importexport.CmsImportExportManager; 43 import org.opencms.importexport.I_CmsImportExportHandler; 44 import org.opencms.main.CmsException; 45 import org.opencms.main.CmsLog; 46 import org.opencms.main.OpenCms; 47 import org.opencms.report.CmsHtmlReport; 48 import org.opencms.report.I_CmsReport; 49 import org.opencms.security.CmsRole; 50 import org.opencms.security.CmsRoleViolationException; 51 import org.opencms.security.CmsSecurityException; 52 import org.opencms.xml.CmsXmlErrorHandler; 53 import org.opencms.xml.CmsXmlException; 54 55 import java.io.File ; 56 import java.io.FileInputStream ; 57 import java.io.IOException ; 58 import java.io.InputStream ; 59 import java.util.Arrays ; 60 import java.util.Collections ; 61 import java.util.Iterator ; 62 import java.util.List ; 63 import java.util.zip.ZipEntry ; 64 import java.util.zip.ZipFile ; 65 66 import org.apache.commons.digester.Digester; 67 import org.apache.commons.logging.Log; 68 69 import org.dom4j.Document; 70 import org.dom4j.Element; 71 import org.xml.sax.SAXException ; 72 73 82 public class CmsModuleImportExportHandler implements I_CmsImportExportHandler { 83 84 85 private static final Log LOG = CmsLog.getLog(CmsModuleImportExportHandler.class); 86 87 88 private List m_additionalResources; 89 90 91 private String m_description; 92 93 94 private String m_fileName; 95 96 97 private CmsModule m_importedModule; 98 99 100 private String m_moduleName; 101 102 105 public CmsModuleImportExportHandler() { 106 107 super(); 108 m_description = org.opencms.importexport.Messages.get().getBundle().key( 109 org.opencms.importexport.Messages.GUI_CMSIMPORTHANDLER_DEFAULT_DESC_0); 110 } 111 112 119 public static CmsModule readModuleFromImport(String importResource) throws CmsConfigurationException { 120 121 Digester digester = new Digester(); 123 digester.setUseContextClassLoader(true); 124 digester.setValidating(false); 125 digester.setRuleNamespaceURI(null); 126 digester.setErrorHandler(new CmsXmlErrorHandler()); 127 128 CmsModuleImportExportHandler handler = new CmsModuleImportExportHandler(); 130 digester.push(handler); 131 132 CmsModuleXmlHandler.addXmlDigesterRules(digester); 133 134 InputStream stream = null; 135 ZipFile importZip = null; 136 137 try { 138 139 File file = new File (importResource); 140 if (file.isFile()) { 141 importZip = new ZipFile (importResource); 142 ZipEntry entry = importZip.getEntry(CmsImportExportManager.EXPORT_MANIFEST); 143 if (entry != null) { 144 stream = importZip.getInputStream(entry); 145 } else { 146 CmsMessageContainer message = Messages.get().container( 147 Messages.ERR_NO_MANIFEST_MODULE_IMPORT_1, 148 importResource); 149 LOG.error(message.key()); 150 throw new CmsConfigurationException(message); 151 } 152 } else if (file.isDirectory()) { 153 file = new File (file, CmsImportExportManager.EXPORT_MANIFEST); 154 stream = new FileInputStream (file); 155 } 156 157 digester.parse(stream); 159 160 } catch (IOException e) { 161 CmsMessageContainer message = Messages.get().container(Messages.ERR_IO_MODULE_IMPORT_1, importResource); 162 LOG.error(message.key(), e); 163 throw new CmsConfigurationException(message, e); 164 } catch (SAXException e) { 165 CmsMessageContainer message = Messages.get().container(Messages.ERR_SAX_MODULE_IMPORT_1, importResource); 166 LOG.error(message.key(), e); 167 throw new CmsConfigurationException(message, e); 168 } finally { 169 try { 170 if (importZip != null) { 171 importZip.close(); 172 } 173 if (stream != null) { 174 stream.close(); 175 } 176 } catch (Exception e) { 177 } 179 } 180 181 CmsModule importedModule = handler.getModule(); 182 183 if (importedModule == null) { 185 throw new CmsConfigurationException(Messages.get().container( 186 Messages.ERR_IMPORT_MOD_ALREADY_INSTALLED_1, 187 importResource)); 188 } 189 190 return importedModule; 191 } 192 193 196 public void exportData(CmsObject cms, I_CmsReport report) 197 throws CmsConfigurationException, CmsImportExportException, CmsRoleViolationException { 198 199 cms.checkRole(CmsRole.MODULE_MANAGER); 201 202 report.print(Messages.get().container(Messages.RPT_EXPORT_MODULE_BEGIN_0), I_CmsReport.FORMAT_HEADLINE); 203 if (report instanceof CmsHtmlReport) { 204 report.print(org.opencms.report.Messages.get().container( 205 org.opencms.report.Messages.RPT_ARGUMENT_1, 206 "<i>" + getModuleName() + "</i>")); 207 208 } else { 209 report.print(org.opencms.report.Messages.get().container( 210 org.opencms.report.Messages.RPT_ARGUMENT_1, 211 getModuleName())); 212 } 213 report.print(org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_DOTS_0)); 214 215 if (!OpenCms.getModuleManager().hasModule(getModuleName())) { 216 throw new CmsConfigurationException(Messages.get().container( 218 Messages.ERR_NO_MOD_FOR_EXPORT_1, 219 getModuleName())); 220 } 221 222 CmsModule module = OpenCms.getModuleManager().getModule(getModuleName()); 224 if (!module.getVersion().isUpdated()) { 225 module.getVersion().increment(); 227 OpenCms.writeConfiguration(CmsModuleConfiguration.class); 229 } 230 module.getVersion().setUpdated(false); 232 Element moduleElement = CmsModuleXmlHandler.generateXml(module); 233 234 new CmsExport(cms, getFileName(), getAdditionalResources(), true, true, moduleElement, false, 0, report, true); 236 237 report.println(Messages.get().container(Messages.RPT_EXPORT_MODULE_END_0), I_CmsReport.FORMAT_HEADLINE); 238 } 239 240 245 public List getAdditionalResources() { 246 247 return m_additionalResources; 248 } 249 250 253 public String getDescription() { 254 255 return m_description; 256 } 257 258 263 public String getFileName() { 264 265 return m_fileName; 266 } 267 268 273 public String getModuleName() { 274 275 return m_moduleName; 276 } 277 278 283 public List getResourcesAsList() { 284 285 return m_additionalResources; 286 } 287 288 291 public synchronized void importData(CmsObject cms, String importFile, String importPath, I_CmsReport report) 292 throws CmsXmlException, CmsImportExportException, CmsRoleViolationException, CmsException { 293 294 CmsProject previousProject = cms.getRequestContext().currentProject(); 295 try { 296 297 importFile = importFile.replace('\\', '/'); 298 String moduleZipName = importFile.substring(importFile.lastIndexOf('/') + 1); 299 String modulePackageName; 300 301 if (moduleZipName.toLowerCase().endsWith(".zip")) { 302 modulePackageName = moduleZipName.substring(0, moduleZipName.lastIndexOf('.')); 303 int pos = modulePackageName.lastIndexOf('_'); 304 if (pos > 0) { 305 modulePackageName = modulePackageName.substring(0, pos); 306 } 307 } else { 308 modulePackageName = moduleZipName; 309 } 310 311 CmsProject importProject = null; 312 313 try { 314 cms.getRequestContext().saveSiteRoot(); 315 cms.getRequestContext().setSiteRoot("/"); 316 317 try { 318 importProject = cms.readProject(Messages.get().getBundle(cms.getRequestContext().getLocale()).key( 320 Messages.GUI_IMPORT_MODULE_PROJECT_NAME_1, 321 new Object [] {modulePackageName})); 322 } catch (CmsException e) { 323 importProject = cms.createProject( 325 Messages.get().getBundle(cms.getRequestContext().getLocale()).key( 326 Messages.GUI_IMPORT_MODULE_PROJECT_NAME_1, 327 new Object [] {modulePackageName}), 328 Messages.get().getBundle(cms.getRequestContext().getLocale()).key( 329 Messages.GUI_IMPORT_MODULE_PROJECT_DESC_1, 330 new Object [] {modulePackageName}), 331 OpenCms.getDefaultUsers().getGroupAdministrators(), 332 OpenCms.getDefaultUsers().getGroupAdministrators(), 333 CmsProject.PROJECT_TYPE_TEMPORARY); 334 } 335 336 cms.getRequestContext().setCurrentProject(importProject); 337 338 cms.copyResourceToProject("/"); 340 } finally { 341 cms.getRequestContext().restoreSiteRoot(); 342 } 343 344 report.print(Messages.get().container(Messages.RPT_IMPORT_MODULE_BEGIN_0), I_CmsReport.FORMAT_HEADLINE); 345 if (report instanceof CmsHtmlReport) { 346 report.print(org.opencms.report.Messages.get().container( 347 org.opencms.report.Messages.RPT_ARGUMENT_1, 348 "<i>" + modulePackageName + "</i>")); 349 } else { 350 report.print(org.opencms.report.Messages.get().container( 351 org.opencms.report.Messages.RPT_ARGUMENT_1, 352 modulePackageName)); 353 } 354 report.print(org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_DOTS_0)); 355 356 importModule(cms, importFile, report); 357 358 report.println(Messages.get().container(Messages.RPT_PUBLISH_PROJECT_BEGIN_0), I_CmsReport.FORMAT_HEADLINE); 359 cms.unlockProject(importProject.getId()); 361 cms.publishProject(report); 362 363 report.println(Messages.get().container(Messages.RPT_PUBLISH_PROJECT_END_0), I_CmsReport.FORMAT_HEADLINE); 364 report.println(Messages.get().container(Messages.RPT_IMPORT_MODULE_END_0), I_CmsReport.FORMAT_HEADLINE); 365 } finally { 366 cms.getRequestContext().setCurrentProject(previousProject); 367 } 368 } 369 370 373 public boolean matches(Document manifest) { 374 375 Element rootElement = manifest.getRootElement(); 376 377 boolean hasModuleNode = (rootElement.selectNodes("./module/name").size() > 0); 378 return (hasModuleNode); 379 } 380 381 386 public void setAdditionalResources(String [] resources) { 387 388 m_additionalResources = Arrays.asList(resources); 389 } 390 391 394 public void setDescription(String description) { 395 396 m_description = description; 397 } 398 399 404 public void setFileName(String fileName) { 405 406 m_fileName = fileName; 407 } 408 409 414 public void setModule(CmsModuleXmlHandler moduleHandler) { 415 416 m_importedModule = moduleHandler.getModule(); 417 } 418 419 424 public void setModuleName(String moduleName) { 425 426 m_moduleName = moduleName; 427 } 428 429 432 protected void finalize() throws Throwable { 433 434 try { 435 if (m_additionalResources != null) { 436 m_additionalResources.clear(); 437 } 438 m_additionalResources = null; 439 } catch (Exception e) { 440 } finally { 442 super.finalize(); 443 } 444 } 445 446 451 private CmsModule getModule() { 452 453 return m_importedModule; 454 } 455 456 467 private synchronized void importModule(CmsObject cms, String importResource, I_CmsReport report) 468 throws CmsSecurityException, CmsConfigurationException, CmsException { 469 470 cms.checkRole(CmsRole.MODULE_MANAGER); 472 473 CmsModule importedModule = readModuleFromImport(importResource); 475 476 if (OpenCms.getModuleManager().hasModule(importedModule.getName())) { 478 throw new CmsConfigurationException(Messages.get().container( 479 Messages.ERR_MOD_ALREADY_INSTALLED_1, 480 importedModule.getName())); 481 } 482 483 List dependencies = OpenCms.getModuleManager().checkDependencies( 485 importedModule, 486 CmsModuleManager.DEPENDENCY_MODE_IMPORT); 487 if (dependencies.size() > 0) { 488 StringBuffer missingModules = new StringBuffer (); 490 Iterator it = dependencies.iterator(); 491 while (it.hasNext()) { 492 CmsModuleDependency dependency = (CmsModuleDependency)it.next(); 493 missingModules.append(" ").append(dependency.getName()).append(", Version ").append( 494 dependency.getVersion()).append("\r\n"); 495 } 496 throw new CmsConfigurationException(Messages.get().container( 497 Messages.ERR_MOD_DEPENDENCY_INFO_2, 498 importedModule.getName() + ", Version " + importedModule.getVersion(), 499 missingModules)); 500 } 501 502 OpenCms.getModuleManager().addModule(cms, importedModule); 504 505 if (importedModule.getResourceTypes() != Collections.EMPTY_LIST) { 507 OpenCms.getResourceManager().initialize(cms); 508 } 509 if (importedModule.getExplorerTypes() != Collections.EMPTY_LIST) { 511 OpenCms.getWorkplaceManager().addExplorerTypeSettings(importedModule); 512 } 513 514 CmsImport cmsImport = new CmsImport(cms, importResource, "/", report); 516 cmsImport.importResources(); 517 } 518 } | Popular Tags |