1 20 21 package com.methodhead.shim; 22 23 import com.methodhead.aikp.AutoIntKeyPersistable; 24 25 import org.apache.commons.beanutils.DynaClass; 26 import org.apache.commons.beanutils.DynaProperty; 27 import org.apache.commons.beanutils.BasicDynaClass; 28 import java.util.Map ; 29 import java.util.HashMap ; 30 import java.util.List ; 31 import java.util.Iterator ; 32 import java.util.Collections ; 33 import com.methodhead.persistable.Persistable; 34 import com.methodhead.persistable.PersistableException; 35 import com.methodhead.persistable.Key; 36 import com.methodhead.sitecontext.SiteContextCapable; 37 import com.methodhead.sitecontext.SiteContext; 38 import org.apache.commons.lang.StringUtils; 39 40 41 55 public class Page 56 extends 57 AutoIntKeyPersistable 58 implements 59 SiteContextCapable, 60 Comparable { 61 62 private static DynaClass dynaClass_ = null; 63 private static DynaClass panelDynaClass_ = null; 64 65 static { 66 DynaProperty[] dynaProperties = 67 new DynaProperty[] { 68 new DynaProperty( "id", Integer .class ), 69 new DynaProperty( "sitecontext_id", Integer .class ), 70 new DynaProperty( "title", String .class ), 71 new DynaProperty( "alttitle", String .class ), 72 new DynaProperty( "aliasname", String .class ), 73 new DynaProperty( "template", String .class ), 74 new DynaProperty( "hidden", Boolean .class ), 75 new DynaProperty( "metadescription", String .class ), 76 new DynaProperty( "metakeywords", String .class ) 77 }; 78 79 dynaClass_ = 80 new BasicDynaClass( 81 "shim_page", Page.class, dynaProperties ); 82 83 dynaProperties = 84 new DynaProperty[] { 85 new DynaProperty( "page_id", Integer .class ), 86 new DynaProperty( "name", String .class ), 87 new DynaProperty( "module", String .class ) 88 }; 89 90 panelDynaClass_ = 91 new BasicDynaClass( 92 "shim_panel", Persistable.class, dynaProperties ); 93 } 94 95 97 public Page() { 98 super( dynaClass_ ); 99 init(); 100 } 101 102 public Page( DynaClass dynaClass ) { 103 super( dynaClass ); 104 init(); 105 } 106 107 109 111 113 protected void init() { 114 setInt( "id", 0 ); 115 setInt( "sitecontext_id", 0 ); 116 setString( "title", "" ); 117 setString( "alttitle", "" ); 118 setString( "aliasname", "" ); 119 setString( "template", "" ); 120 setBoolean( "hidden", false ); 121 setString( "metadescription", "" ); 122 setString( "metakeywords", "" ); 123 } 124 125 public String toString() { 126 return getString( "title" ); 127 } 128 129 public int compareTo( 130 Object o ) { 131 132 if ( o == null ) 133 return 1; 134 135 if ( !Page.class.isInstance( o ) ) 136 return 1; 137 138 Page p = ( Page )o; 139 140 return 141 getString( "title" ).toLowerCase().compareTo( 142 p.getString( "title" ).toLowerCase() ); 143 } 144 145 149 public SiteContext getSiteContext() { 150 if ( siteContext_ == null ) 151 throw new ShimException( "Site context has not been set." ); 152 153 return siteContext_; 154 } 155 156 159 public void setSiteContext( 160 SiteContext siteContext ) { 161 162 siteContext_ = siteContext; 163 } 164 165 171 protected void setDefaultAliasName() { 172 173 String title = getString( "title" ); 174 175 if ( StringUtils.isBlank( title ) ) 179 throw new ShimException( 180 "Can't set default alias name for empty title." ); 181 182 String alias = title.toLowerCase(); 186 187 StringBuffer buf = new StringBuffer (); 191 192 for ( int i = 0; i < alias.length(); i++ ) { 193 char c = alias.charAt( i ); 194 195 if ( Character.isLetterOrDigit( c ) ) 196 buf.append( c ); 197 } 198 199 alias = buf.toString(); 200 201 Page p = new Page(); 205 p.setSiteContext( getSiteContext() ); 206 207 try { 208 p.loadForAlias( alias ); 209 210 if ( p.getInt( "id" ) != getInt( "id" ) ) { 214 215 String tmp = alias; 219 for ( int i = 2; true; i++ ) { 220 alias = tmp + i; 221 222 try { 223 p.loadForAlias( alias ); 224 } 225 catch ( PersistableException e ) { 226 break; 227 } 228 } 229 } 230 } 231 catch ( PersistableException e ) { 232 } 236 237 setString( "aliasname", alias ); 238 } 239 240 243 public void addPanel( 244 Panel panel ) { 245 246 if ( panels_.containsKey( panel.getName() ) ) 247 throw new ShimException( 248 "Page already has panel \"" + panel.getName() + "\"" ); 249 250 panels_.put( panel.getName(), panel ); 251 } 252 253 256 private void deletePanels() { 257 Persistable.deleteAll( 258 panelDynaClass_, "page_id=" + getInt( "id" ) ); 259 } 260 261 264 private void savePanels() { 265 Persistable p = new Persistable( panelDynaClass_ ); 266 p.setInt( "page_id", getInt( "id" ) ); 267 268 for ( Iterator iter = panels_.values().iterator(); iter.hasNext(); ) { 269 Panel panel = ( Panel )iter.next(); 270 p.set( "name", panel.getName() ); 271 p.set( "module", panel.getModuleClass() ); 272 p.saveNew(); 273 } 274 } 275 276 279 private void loadPanels() { 280 panels_.clear(); 281 282 List l = 283 Persistable.loadAll( 284 panelDynaClass_, "page_id=" + getInt( "id" ), "name" ); 285 286 for ( Iterator iter = l.iterator(); iter.hasNext(); ) { 287 Persistable p = ( Persistable )iter.next(); 288 Panel panel = new Panel(); 289 panel.setName( p.getString( "name" ) ); 290 panel.setModuleClass( p.getString( "module" ) ); 291 panels_.put( panel.getName(), panel ); 292 } 293 } 294 295 299 private void initPanels() { 300 for ( Iterator iter = panels_.values().iterator(); iter.hasNext(); ) { 301 Panel panel = ( Panel )iter.next(); 302 303 Module module = null; 304 try { 305 module = 306 ( Module )Class.forName( panel.getModuleClass() ).newInstance(); 307 } 308 catch ( Exception e ) { 309 throw new ShimException( 310 "Unexpected exception while instantiating module \"" + 311 panel.getModuleClass() + "\":" + e.toString() ); 312 } 313 314 module.init( this, panel.getName() ); 315 316 panel.setModule( module ); 317 } 318 } 319 320 public void saveNew() { 321 322 setInt( "sitecontext_id", getSiteContext().getInt( "id" ) ); 323 324 super.saveNew(); 328 savePanels(); 329 } 330 331 public void load( 332 Key key ) { 333 334 super.load( 339 key.getWhereClause() + " AND sitecontext_id=" + 340 getSiteContext().getInt( "id" ) ); 341 342 loadPanels(); 343 } 344 345 public void save() { 346 super.save(); 347 deletePanels(); 348 savePanels(); 349 } 350 351 356 public void delete() { 357 358 for ( Iterator iter = getPanels().values().iterator(); iter.hasNext(); ) { 359 Panel panel = ( Panel )iter.next(); 360 panel.getModule().destroy(); 361 } 362 363 deletePanels(); 364 super.delete(); 365 } 366 367 371 public void loadFull( 372 Key key ) { 373 374 load( key ); 375 initPanels(); 376 } 377 378 383 public void loadFullForAlias( 384 String alias ) { 385 386 loadForAlias( alias ); 387 initPanels(); 388 } 389 390 393 public List loadAll() { 394 List l = loadAll( 395 dynaClass_, 396 "sitecontext_id=" + getSiteContext().getInt( "id" ), 397 "title" ); 398 399 for ( Iterator iter = l.iterator(); iter.hasNext(); ) { 403 Page p = ( Page )iter.next(); 404 p.setSiteContext( getSiteContext() ); 405 } 406 407 Collections.sort( l ); 411 412 return l; 413 } 414 415 419 public void loadForAlias( 420 String alias ) { 421 422 super.load( 423 "sitecontext_id=" + getSiteContext().getInt( "id" ) + " AND aliasname=" + 424 getSqlLiteral( alias ) ); 425 426 loadPanels(); 427 } 428 429 432 public Page copy() { 433 434 Page copy = new Page(); 435 436 copy.setSiteContext( getSiteContext() ); 437 copy.setString( "title", getString( "title" ) ); 438 copy.setString( "alttitle", getString( "alttitle" ) ); 439 copy.setDefaultAliasName(); 440 copy.setString( "template", getString( "template" ) ); 441 copy.setBoolean( "hidden", getBoolean( "hidden" ) ); 442 copy.setString( "metadescription", getString( "metadescription" ) ); 443 copy.setString( "metakeywords", getString( "metakeywords" ) ); 444 445 for ( Iterator iter = getPanels().values().iterator(); iter.hasNext(); ) { 446 Panel panel = ( Panel )iter.next(); 447 copy.addPanel( ( Panel )panel.clone() ); 448 } 449 450 copy.saveNew(); 451 452 for ( Iterator iter = getPanels().values().iterator(); iter.hasNext(); ) { 453 Panel panel = ( Panel )iter.next(); 454 panel.getModule().copyTo( copy ); 455 } 456 457 return copy; 458 } 459 460 462 465 public Map getPanels() { 466 return panels_; 467 } 468 469 471 protected Map panels_ = new HashMap (); 472 473 protected SiteContext siteContext_ = null; 474 } 475 | Popular Tags |