001 /*************************************************************************************************** 002 * MODULE DESCRIPTION 003 **************************************************************************************************** 004 * 005 * NAME: KiuruSpace.java 006 * LANGUAGE: Java2 007 * DATE: 19.11.2002 008 * AUTHOR: Miika Nurminen, University of Jyväskylä 009 * 010 **************************************************************************************************** 011 * COPYRIGHT (C) KIURU -PROJECT GROUP 012 * Limited rights granted. Please refer to license 013 **************************************************************************************************** 014 * 015 **************************************************************************************************** 016 * UPDATES 017 **************************************************************************************************** 018 * 019 * 19.11.2002: Initial release / mn 020 * 25.4.2003: Enum test 021 * 022 ****************************************************************************************************/ 023 024 package kiurubeans; 025 026 import java.beans.*; 027 import kotkabeans.*; 028 import kolibribeans.*; 029 import java.lang.*; 030 import java.util.*; 031 import java.sql.*; 032 import javax.servlet.http.HttpServletRequest; 033 034 /** 035 * Representation of Space db entity. 036 * 037 * @author Miika Nurminen 038 */ 039 public class KiuruSpace extends EntityHandler { 040 041 // Attributes 042 043 /** Selects spacegroups for this space*/ 044 public static final int ADD_SPACEGROUP=5; 045 046 /** Confirms adding spacegroups to this space*/ 047 public static final int ADD_SPACEGROUP_CONFIRM=6; 048 049 /** 050 * List of available reservation mehtods. 051 * @deprecated timmi-material. 052 * This should be LinkedHashMap (not implemented in java 1.3.1 053 */ 054 private ArrayList reservationMethodList; 055 056 /** 057 * Space's name (or code) 058 */ 059 private String name = ""; 060 061 /** 062 * Space's size. Internally one of space's resources. 063 */ 064 private int size = 20; 065 066 /** 067 * Indicates is space is reserved by korppi and/or timmi (or any) 068 * @deprecated timmi-material 069 * reservationMethod should probably be deprecated. it's here for 070 * background compatibility. 071 */ 072 private String reservationMethod = ""; 073 074 /** 075 * Space's id. -1 indicates a new space. 076 */ 077 private int spaceId = -1; 078 079 /** 080 * Space's organisation id. ''Official space'' is defined by space 081 * that has organisationid<>NULL and <>0. 082 * required when updating space's responsible organisation 083 */ 084 private int organisationId = 0; 085 086 /** 087 * Space's type. Space types are defined as follows: 088 * <p> 089 * 0 - -- <br> 090 * 1 - Opetustila<br> 091 * 2 - Mikroluokka<br> 092 * 3 - Kokoustila<br> 093 * 4 - Työhuone<br> 094 * 5 - Yleistila<br> 095 * 6 - Oheisvarattava<br> 096 * 7 - Muu tila 097 * <p> 098 * These should be put in a separate enum structure. 099 */ 100 private int spaceType = 0; // 7 == muu tila 101 102 /** 103 * User's selected space groups to be joined to this space. 104 */ 105 private String[] selectedSpaceGroups = new String[0]; 106 107 108 // Constructors 109 110 /** Constructor for KiuruSpace. Does not read anything from db. 111 * @param id The spaceId for the space 112 * @param e Error objects. Possible error messages are delivered here. 113 */ 114 public KiuruSpace(int id,kotkabeans.Error e) { 115 setSpaceId(id); 116 setError(e); 117 } 118 119 /** Default constructor */ 120 public KiuruSpace() { 121 reservationMethodList = new ArrayList(); 122 reservationMethodList.add(new StringPair("Korppi","Varaus vain Korpin kautta")); 123 reservationMethodList.add(new StringPair("Timmi","Varaus Korpin ja Timmin kautta")); 124 reservationMethodList.add(new StringPair("Ei","Ei varauksia")); 125 } 126 127 // Access methods 128 129 /** 130 * Returns current max state value. Inherited classes may override this 131 * when new states are introduced. 132 * 133 * @return max state value 134 */ 135 protected int getMaxState() { 136 return 6; 137 } 138 139 /** Returns if entity is in a state of adding a new record. 140 * Implementation depends of a descendant class. 141 * @return true, if the space is in a state of adding a new record. 142 */ 143 public boolean getAddingNew() { 144 return (getSpaceId()==-1); 145 } 146 147 /** Returns the list of available reservation methods for spaces. The list contains 148 * methods written in Finnish. 149 * @return Arraylist that contains available reservation methods for spaces. 150 */ 151 public ArrayList getReservationMethodList() { 152 return this.reservationMethodList; 153 } 154 155 /** Returns the of the space 156 * @return The name of the space. 157 */ 158 public String getName() { 159 return this.name; 160 } 161 162 /** Sets the name of the space 163 * @param name Name of the space 164 */ 165 public void setName(String name) { 166 String s = KiuruString.sqlTrim(name); 167 if (s.length()==0) { 168 setOk(false); 169 addError("Nimi ei voi olla tyhjä!"); 170 return; 171 } 172 this.name = s; 173 } 174 175 /** Returns the size of the space as int number. 176 * @return The size of the space as int. 177 */ 178 public int getIntSize() { 179 return this.size; 180 } 181 182 // even if internally int, property must have string getters & setters 183 /** Returns the size of the space in String. String contains integer number. 184 * @return String that contains the size of the space. Size is integer number. 185 */ 186 public String getSize() { 187 return Integer.toString(this.size); 188 } 189 190 /** Sets the size of the space. 191 * @param size How many people are allowed to be in the space at the same time. 192 */ 193 public void setSize(int size) { 194 this.size = size; 195 } 196 197 /** Sets the size of the space. String must contain a non-negative integer 198 * number. 199 * @param size String that tells how many people are allowed to be in the space at the same 200 * time. String has to contain a non-negative integer number. 201 */ 202 public void setSize(String size) { 203 try { 204 this.size=Integer.parseInt(size); 205 } 206 catch (Exception e) { /*this.size=-1;*/ setOk(false); 207 addError("Virheellinen paikkamäärä!"); 208 } 209 } 210 211 /** Returns the name of the reservation method used for this space. 212 * @return The reservation method used for this space 213 */ 214 public String getReservationMethod() { 215 return this.reservationMethod; 216 } 217 218 /** Sets reservation method for this space. 219 * @param reservationMethod How is reservations supervised. Not really needed if we use only Korppi 220 */ 221 public void setReservationMethod(String reservationMethod) { 222 for (int i=0; i<reservationMethodList.size(); i++) { 223 if ( ( (StringPair)(reservationMethodList.get(i)) ).getKey().equals(reservationMethod) ) { 224 this.reservationMethod = reservationMethod; 225 return; 226 } 227 } 228 // reservationMethod was not found in the list => error 229 setOk(false); 230 addError("Virheellinen varaustapa!"); 231 } 232 233 /** Returns the spaceId of the current object. 234 * @return ID of space. 235 */ 236 public int getSpaceId() { 237 return this.spaceId; 238 } 239 240 /** Sets the id for the current space. Use with caution, 241 * this should be persistent for an objecct. -1 indicates a new record. 242 * @param id New spaceId 243 */ 244 public void setSpaceId(int id) { 245 this.spaceId=id; 246 // note: id -1 means new record! 247 } 248 249 /** Sets the spaceId for the current space. 250 * @param id String containing the new space id. id must be an integer. 251 */ 252 public void setSpaceId(String id) { 253 try { 254 setSpaceId(Integer.parseInt(id)); 255 } 256 catch (Exception e) { 257 setOk(false); 258 addError("Virheellinen salin ID-numero! "); 259 } 260 } 261 262 /** Organisation that "owns" the space. 263 * @param i Id of the organisation 264 */ 265 public void setOrganisationId(int i) { 266 this.organisationId=i; 267 } 268 269 /** Returns the organisation that "owns" this space. 270 * @return OrganisationId of the organisation 271 */ 272 public int getOrganisationId() { 273 return this.organisationId; 274 } 275 276 /** Returns the type of space. 277 * @return SpaceTypeId of the space. 278 */ 279 public int getType() {return spaceType;} 280 281 /** Sets the type of the space. 282 * @param spaceType spaceTypeId of the new type. 283 */ 284 public void setType(int spaceType) {this.spaceType=spaceType;} 285 286 287 /** Returns the selected spaceGroups. 288 * @return The spaceGroups the user has selected for this space. 289 */ 290 public String[] getSelectedSpaceGroups() { return selectedSpaceGroups; } 291 /** User wants to e.g. add this space into these spaceGroups 292 * @param s The string array containing the ids of the spaceGroups the user has selected. 293 */ 294 public void setSelectedSpaceGroups(String[] s) { selectedSpaceGroups=s; } 295 /** Sets the <i>i</i>th selected spacegroup 296 * @param i Which spaceGroup is going to be set 297 * @param s The id of the selected spaceGroup 298 */ 299 public void setSelectedSpaceGroups(int i,String s) { selectedSpaceGroups[i]=s; } 300 /** Returns the <i>i</i>th selected spaceGroup 301 * @return The id of the selected spaceGroup 302 * @param i Which spaceGroup is given 303 */ 304 public String getSelectedSpaceGroups(int i) { return selectedSpaceGroups[i]; } 305 306 307 /** Used with html forms. Changes bean state to AddNew. 308 * 'this' should be initialized! 309 * @param s We are not interested in the content of the string, 310 * because it can be translated. The most important thing is that it exists. 311 * @see EntityHandler#RESET_RECORD 312 */ 313 public void setSubmitAdd(String s) { 314 setEnumState(RESET_RECORD); 315 } 316 317 /** Used with html forms. Changes bean state to searchWithId, so 'this' can 318 * be modified. 319 * id property should be set before call to performAction 320 * @param s We are not interested in the content of the string, 321 * because it can be translated. The most important thing is that it exists. 322 * @see EntityHandler#GET_RECORD 323 */ 324 public void setSubmitModify(String s) { 325 setEnumState(GET_RECORD); 326 } 327 328 /** Used with html forms. Changes the internal state of the bean. 329 * @param s We are not interested in the content of the string, 330 * because it can be translated. The most important thing is that it exists. 331 * @see EntityHandler#POST_RECORD 332 */ 333 public void setSubmitPost(String s) { 334 setEnumState(POST_RECORD); 335 } 336 337 /** Used with html forms. Changes the internal state of the bean. 338 * @param s We are not interested in the content of the string, 339 * because it can be translated. The most important thing is that it exists. 340 * @see EntityHandler#DELETE_RECORD 341 */ 342 public void setSubmitDeleteRecord(String s) { 343 setEnumState(DELETE_RECORD); 344 } 345 346 347 /** Used with html forms. Changes the internal state of the bean. 348 * @param s We are not interested in the content of the string, 349 * because it can be translated. The most important thing is that it exists. 350 * @see #ADD_SPACEGROUP 351 */ 352 public void setSubmitAddSpaceGroup(String s) { 353 setEnumState(ADD_SPACEGROUP); 354 } 355 356 /** Used with html forms. Changes the internal state of the bean. 357 * @param s We are not interested in this, because it can be translated. The most important 358 * thing is that it exists. 359 * @see #ADD_SPACEGROUP_CONFIRM 360 */ 361 public void setSubmitAddSpaceGroupConfirm(String s) { 362 setEnumState(ADD_SPACEGROUP_CONFIRM); 363 } 364 365 366 367 // Operations 368 369 /** Clears field values. 370 * <p> 371 * Result should be equivalent to constructing a new object. 372 * Nothing is saved to database. 373 */ 374 public void resetRecord() { 375 setSelectedSpaceGroups(null); 376 this.name=""; // setting name would cause an exception 377 setSize(20); 378 setReservationMethod("Korppi"); 379 setSpaceId(-1); // implicit addingnew 380 setType(0); 381 } 382 383 384 /** Performs action based on actionType (eg. addNew, modify, post, delete). 385 * Inherited classes may override this method to introduce custom actions. 386 * @throws Exception If something went wrong in the actual actions performed. 387 */ 388 protected void defaultAction() throws java.lang.Exception { 389 switch (getEnumState()) { 390 case ADD_SPACEGROUP_CONFIRM: 391 addSpaceGroups(); 392 break; 393 default: 394 super.defaultAction(); // post & others 395 break; 396 } 397 } 398 399 400 401 /** Gets the data for the space from the database according to the spaceId. 402 * @throws Exception If database handling was not successful 403 */ 404 public void assignSpaceFromDataBase() throws Exception { 405 if (getAddingNew()) { // this might be generalized 406 throw new IllegalStateException("Cannot get a nonexistent record!"); 407 } 408 assignSpaceFromDataBase(getSpaceId()); 409 } 410 411 412 /** Gets the data for the KiuruSpace from database using existing connection. 413 * @param db Database connection 414 * @param aid spaceId of the wanted space. 415 * @throws Exception If something went wrong during the database query. 416 */ 417 public void assignSpaceFromDataBase(DB db, int aid) throws Exception { 418 RS2 rs; 419 setSelectedSpaceGroups(null); 420 421 rs = new RS2(db.executeQuery("select deleted,code,spaceid,organisationid,spacetypeid from space where spaceid='"+aid+"' and deleted='false'")); 422 if (!SimpleDb.checkIfEditable(rs)) 423 return; 424 setSpaceId(rs.getInt("spaceid")); 425 setName(rs.getString("code")); 426 setType(rs.getInt("spacetypeid")); 427 setOrganisationId(rs.getInt("organisationid")); 428 429 // setting reservation method 430 rs.getInt("organisationid"); 431 if (rs.wasNull()) 432 setReservationMethod("Ei"); 433 else { 434 rs = new RS2(db.executeQuery("select deleted, spaceid from spaceparameter "+ 435 "where deleted=false and spaceid="+getSpaceId()+" "+ 436 "and spaceparametertypeid=1")); 437 // timmispaceid 438 if (rs.count()>0) 439 setReservationMethod("Timmi"); 440 else 441 setReservationMethod("Korppi"); 442 } 443 444 // setting resources 445 rs = new RS2(db.executeQuery("select value from spaceresource "+ 446 "where spaceid="+getSpaceId()+" and resourceid=1 and deleted='false'")); 447 // number_of_seats 448 if (rs.next()) { 449 try { 450 setSize(Integer.parseInt(rs.getString("value"))); 451 } 452 catch (ClassCastException c) { 453 setSize(0); 454 } 455 } 456 } 457 458 /** Gets the data for the kiuruSpace from database. Opens a new database connection. 459 * @param aid The spaceId of wanted space. 460 * @throws Exception If something went wrong during database handling. 461 */ 462 public void assignSpaceFromDataBase(int aid) throws Exception { 463 DB db=new DB("Space-beania"); 464 db.connect(); 465 try { 466 assignSpaceFromDataBase(db,aid); 467 } 468 finally { 469 db.disconnect(); 470 } 471 } 472 473 /** Creates a new kiuruSpace object and gets data from database for newly created 474 * kiuruSpace. 475 * @param aid spaceId of the wanted space. 476 * @throws Exception If something went wrong during database handling. 477 * @return KiuruSpace object. 478 */ 479 public static KiuruSpace getSpaceFromDataBase(int aid) throws Exception { 480 KiuruSpace result = new KiuruSpace(); 481 result.assignSpaceFromDataBase(aid); 482 return result; 483 } 484 485 /** Creates a new kiuruSpace object and gets data from database for newly created 486 * kiuruSpace. Uses existing database connection. 487 * @param db Database connection. 488 * @param aid spaceId of the wanted space. 489 * @throws Exception If something went wrong during database handling. 490 * @return KiuruSpace object. 491 */ 492 public static KiuruSpace getSpaceFromDataBase(DB db,int aid) throws Exception { 493 KiuruSpace result = new KiuruSpace(); 494 result.assignSpaceFromDataBase(db,aid); 495 return result; 496 } 497 498 499 /** Tells if data in the object has changed compared with data stored in the database. 500 * @param db open db to be used. 501 * @throws Exception Database handling was not ok. 502 * @return True if the data of the object matches with the data stored in the database. 503 */ 504 private boolean dataChanged(DB db) throws Exception { 505 if (getAddingNew()) { 506 throw new IllegalStateException("Cannot check whether a new record is changed!"); 507 } 508 if (equals(KiuruSpace.getSpaceFromDataBase(db,getSpaceId()))) { // if objects are not equal, data is changed. 509 addError("Tietoja ei ole muutettu!"); 510 return false; 511 } 512 return true; 513 } 514 515 /** Stores the data of the object into the database 516 * @throws Exception Saving into the database was not ok. 517 */ 518 public void putSpaceToDataBase() throws Exception { 519 DB db=new DB("Updating space"); 520 db.connect(); 521 boolean addNew=false; 522 try { 523 if (getAddingNew()) { // create new 524 addNew=true; 525 BookTime b = new BookTime(); 526 setSpaceId(b.insertPlace(getName())); 527 } 528 else { // update 529 if (!dataChanged(db)) { 530 db.disconnect(); 531 return; // no changes, we can exit 532 } 533 534 db.executeUpdate("update space set code='"+getName()+"' "+ 535 "where deleted='false' and spaceid="+getSpaceId()); 536 } 537 String org=null; 538 if (getOrganisationId()!=0) org=Integer.toString(getOrganisationId()); 539 String typ=null; 540 if (getType()!=0) typ=Integer.toString(getType()); 541 db.executeUpdate("update space set organisationid="+org+", spacetypeid="+typ+" where deleted=false and spaceid="+getSpaceId()); 542 543 // add TIMMI handling here! 544 if (getReservationMethod().equals("Ei")) { 545 db.executeUpdate("update space set organisationid=null"+ 546 " where deleted='false' and spaceid='"+getSpaceId()+"'"); 547 } 548 else { 549 db.executeUpdate("update space set organisationid='"+getOrganisationId()+ 550 "' where deleted='false' and spaceid='"+getSpaceId()+"'"); 551 } 552 553 RS2 rs = new RS2(db.executeQuery("select spaceid,resourceid from spaceresource "+ 554 "where spaceid="+getSpaceId()+" and resourceid=1 and deleted='false'")); 555 // #_of_seats 556 if (rs.next()) { 557 db.executeUpdate("update spaceresource set value='"+getSize()+"' "+ 558 "where spaceid="+getSpaceId()+" and resourceid=1 and deleted='false'"); 559 // #_of_seats 560 } 561 else { 562 db.executeUpdate("insert into spaceresource (deleted,spaceid,resourceid,value) " 563 +"values ('false',"+getSpaceId()+",1,'"+getSize()+"')"); 564 // number of seats 565 } 566 } 567 finally { 568 db.disconnect(); 569 } 570 if (addNew) 571 addNotice("Lisätty sali "+getName()+"."); 572 else 573 addNotice("Salin "+getName()+" tiedot päivitetty!"); 574 } 575 576 /** 577 * Deletes current space & relations to resource, spacegroup & event. NOTE! There may be other relations to Space! 578 * Deletion is NOT SAFE! It should be used with extreme caution. 579 * Does NOT check if there are active events for a particular space! 580 */ 581 public void deleteRecord() { 582 if (getUser()==null) { 583 throw new IllegalArgumentException("User must be assigned!"); 584 } 585 if (!getUser().hasAdminRight()) { 586 addError("Sinulla ei ole oikeutta salin poistamiseen!"); 587 return; 588 } 589 590 StatementContainer[] sc = new StatementContainer[4]; 591 sc[0]=new StatementContainer("update space set deleted=true where spaceid = ?"); 592 sc[1]=new StatementContainer("update spacegroupspace set deleted=true where spaceid = ?"); 593 sc[2]=new StatementContainer("update spaceresource set deleted=true where spaceid = ?"); 594 sc[3]=new StatementContainer("update eventspace set deleted=true where spaceid = ?"); 595 for (int i=0; i<4; i++) 596 sc[i].addStatement(new IntItem(getSpaceId())); 597 598 599 if (SimpleDb.executeTransaction(sc, "Space.deleteRecord db")) { 600 addNotice("Sali "+getName()+" poistettu!"); 601 } 602 else { 603 addError("Virhe salia "+getName()+" poistettaessa. Mitään ei poistettu."); 604 } 605 606 } 607 608 609 /** 610 * Adds current space to selected space groups. 611 * 612 * @throws Exception if there is a problem with db connection. 613 */ 614 public void addSpaceGroups() throws java.lang.Exception { 615 if (getSelectedSpaceGroups().length==0) { 616 addError("Liitettäviä saliryhmiä ei valittu!"); 617 return; 618 } 619 // this should be replaced with a single container with varying parameters! 620 StatementContainer[] sc = new StatementContainer[getSelectedSpaceGroups().length]; 621 622 String insertStr = "insert into spacegroupspace (deleted,spaceid,spacegroupid) values (false,"+getSpaceId()+",?)"; 623 String updateStr = "update spacegroupspace set deleted=false where spaceid="+getSpaceId()+" and spacegroupid=?"; 624 DB db = new DB("Space.addSpaceGroups prepare db"); 625 try { 626 db.connect(); 627 628 // checking if spacegroups exist 629 StringPair[] sp = new StringPair[2]; 630 sp[0] = new StringPair("spaceid", Integer.toString(getSpaceId())); 631 sp[1] = new StringPair("spacegroupid"); 632 for (int i=0; i<getSelectedSpaceGroups().length; i++) { 633 sp[1].setValue(getSelectedSpaceGroups(i)); 634 if (SimpleDb.recordExists(db,"SpaceGroupSpace",sp)) 635 sc[i]=new StatementContainer(updateStr); 636 else 637 sc[i]=new StatementContainer(insertStr); 638 639 sc[i].addStatement(new IntItem((Integer.parseInt(getSelectedSpaceGroups(i))))); 640 } 641 642 } finally { 643 db.disconnect(); 644 } 645 646 if (SimpleDb.executeTransaction(sc, "Space.addSpaceGroups db")) { 647 addNotice("Sali liitetty saliryhmiin!"); 648 } 649 else { 650 addError("Virhe saliryhmiä liitettäessä. Mitään ei lisätty."); 651 } 652 if (getSelectedSpaceGroups().length==0) { 653 addError("Liitettäviä saliryhmiä ei valittu!"); 654 return; 655 } 656 } 657 658 /** Returns all spacegrouptypes from database. 659 * @return RS2 containing <CODE>name</CODE> and <CODE>spacetypeid</CODE> of the 660 * spacegrouptypes. 661 * @throws Exception Database handling was not ok. 662 */ 663 public static RS2 getSpaceTypes() throws Exception { 664 // note! the result should be customized according to user's access rights 665 return SimpleDb.simpleQuery("Getting SpaceTypes","select name,spacetypeid from spacetype where deleted='false' order by spacetypeid"); 666 } 667 668 /** Checks if given user has rights to make reservations to given space. 669 * @param spaceID spaceId of the space where user wants to make reservations. 670 * @param user User who is making the reservation. 671 * @throws Exception Database query was not ok. 672 * @return True if user is allowed to make reservations to given space. 673 */ 674 public static boolean checkUserRights(int spaceID,User user) throws Exception { 675 if (user==null) return false; 676 if (user.hasAdminRight()) return true; 677 boolean access=false; 678 DB db=new DB("checkUserRights"); 679 try { 680 db.connect(); 681 ResultSet rs = db.executeQuery( 682 "select space.spaceid from space,spacegroupspace,spacegroupperson "+ 683 "where spacegroupspace.spaceid=space.spaceid "+ 684 "and spacegroupspace.spacegroupid=spacegroup.spacegroupid "+ 685 "and spacegroupperson.spacegroupid=spacegroup.spacegroupid "+ 686 "and spacegroupperson.personid="+user.getPersonID()+ 687 " and space.spaceid="+spaceID+" and spacegroup.spacegrouptypeid<5 "+ 688 "and spacegroupperson.accesslevel>0 and space.deleted='false' "+ 689 "and spacegroupspace.deleted='false' and spacegroupperson.deleted='false';"); 690 if (rs.next()) {access=true;} 691 } 692 finally { 693 db.disconnect(); 694 } 695 return access; 696 } 697 698 /** Checks if given user has rights to make reservation requests to given space. 699 * @return True if user is allowed to make reservation requests to given space. 700 * @param spaceId spaceId of the space where user wants to make reservations. 701 * @param user User who is making the reservation request. 702 * @throws Exception Database query was not ok. 703 */ 704 public static boolean checkReservationRequestRight(int spaceId, User user) throws java.lang.Exception { 705 if (user==null) return false; 706 if (user.hasAdminRight()) return true; 707 StringBuffer sb = new StringBuffer(200); 708 StringPair[] tables = { 709 new StringPair("s","space"), 710 new StringPair("sg","spacegroup"), 711 new StringPair("sgs","spacegroupspace") 712 }; 713 sb.append("select distinct s.spaceid, sg.accessrightlevelid"); 714 sb.append(SimpleDb.addSqlFrom(tables)); 715 sb.append("where sgs.spaceid=s.spaceid "); 716 sb.append("and sgs.spacegroupid=sg.spacegroupid "); 717 sb.append(" and space.spaceid="+spaceId+" and spacegroup.spacegrouptypeid<5 "); 718 sb.append("and sg.accessrightlevelid<="+user.getAccessRightLevelID()); 719 sb.append(SimpleDb.addSqlDeleted(tables)); 720 RS2 rs = SimpleDb.simpleQuery("KiuruSpace.checkReservationRequestRight", sb.toString()); 721 return (rs.next()); 722 } 723 724 /** Tells if current KiuruSpace object is equivalent with another object. 725 * @param o Object that we are comparing our KiuruSpace object with. 726 * @return True if objects are identical. 727 */ 728 public boolean equals(Object o) { 729 if (o instanceof KiuruSpace) { 730 KiuruSpace k = (KiuruSpace)(o); 731 if (getAddingNew() || k.getAddingNew()) 732 return false; // new entities cannot be equal 733 734 return ( 735 (getSpaceId() == k.getSpaceId()) && 736 (getName().equals(k.getName())) && 737 (getOrganisationId() == k.getOrganisationId()) && 738 (getIntSize() == k.getIntSize()) && 739 (getType() == k.getType()) 740 ); 741 } 742 return false; 743 } 744 745 /** Implementation of modify rights checking. 746 * Currently unofficial (non-organisation-related) spaces may by modified by 747 * anybody. Other spaces may be modified by secretary. 748 * @return true is user can modify entity. 749 * @see EntityHandler#hasModifyRight() 750 */ 751 protected boolean doCheckModifyRight() { 752 if (getOrganisationId()==0) return true; // 0 is assumed to be equal to null. 753 return (getUser().getAccessRightLevelID() >= UseModule.ACCESS_RIGHT_LEVEL_SECRETARY); 754 } 755 756 757 /** Implementation of parameter clearing. 758 * @see EntityHandler#clearEmptyParameters(HttpServletRequest) 759 * @param request <CODE>request</CODE>-object from the JSP-page. 760 */ 761 protected void doClearEmptyParameters(HttpServletRequest request) { 762 if (KiuruString.isEmpty(request.getParameter("name"))) setName(""); 763 } 764 765 /** Retrieves record from database according to current Id field(s) 766 * value(s). 767 * <p> 768 * Id field(s) are defined in descendant classes. Method implements 769 * also user rights check, eg. if user has no right to retrieve 770 * the record, empty object is returned instead. 771 * 772 * @throws Exception if there is a problem with DB connection 773 */ 774 public void getRecord() throws Exception { 775 assignSpaceFromDataBase(); 776 } 777 778 /** Saves record to database. 779 * <p> 780 * If field values are not valid, sets Ok property to false. 781 * 782 * @throws Exception if there is a problem with DB connection 783 */ 784 public void postRecord() throws Exception { 785 putSpaceToDataBase(); 786 } 787 788 /** Default implementation of clearing action state. Descendant classes may 789 * override this. 790 * @see EntityHandler#resetActionState(HttpServletRequest) 791 * @param request The request-object of the JSP. 792 */ 793 protected void doClearActionState(javax.servlet.http.HttpServletRequest request) { 794 if ((getEnumState()==KiuruHandler.NO_ACTION) && (!KiuruString.isEmpty(request.getParameter("spaceId")))) 795 setEnumState(GET_RECORD); // if modifyrecord is not in URL, this simulates it. 796 else super.doClearActionState(request); 797 } 798 799 } 800 /*************************************************************************************************** 801 * COPYRIGHT (C) KIURU -PROJECT GROUP 802 * Limited rights granted. Please refer to license. 803 **************************************************************************************************/