• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Prevent NEW in D2W?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Prevent NEW in D2W?


  • Subject: Re: Prevent NEW in D2W?
  • From: Q <email@hidden>
  • Date: Wed, 31 Aug 2011 10:03:02 +1000


On 30/08/2011, at 3:44 PM, David Avendasora wrote:


On Aug 29, 2011, at 11:43 PM, Markus Ruggiero wrote:

Thanks Ramsey,

This is a completely standalone table with no relationships that contains one record with a couple attributes that define the configuration of the app. I was so deep into doing everything without programming that I missed the obvious. Your answer triggered the following solution: Having a simple page with a message and only a CANCEL button for the Create* pageConfiguration should solve my problem.

Beware. That solution only prevents creating new instances of your class when the creation is called using D2W, and then only for ways of creating it that match your rule. Any other code can still very simply call:

EOUtillities. createAndInsertInstance(editingContext, "MySingleton")

and get a new instance.

At a minimum, you should override all the easy ways to create a new instance in the class to simply return the Singleton instead of actually creating a new one.

I think a better solution (off the top of my head, not tested, Chuck will probably say it's all wrong, yadda, yadda) would be:

Close, not Chuck. :)


public class MySingletonEO {

   private static MySingletonEO singleton = null;

   public MySingletonEO() {
     // Don't call super() so this will stop instantiation. 
     // Not sure what EOF will do, probably die horribly, 
     // but really, that's okay, right?!
   }

Bug #1: This doesn't work. The java compiler always inserts an implicit super() call, if no such constructor exists in the parent the class will not compile. The only thing you can do to prevent instantiation is to throw an exception in the constructor or make the constructor private.

   public static MySingletonEO initialize(EOEditingContext editingContext) {
      if(singleton == null) {
          singleton  = EOUtilities.faultWithPrimaryKeyValue(editingContext, 
                                                           MySingletonEO.ENTITY_NAME,
                                                           Integer.valueOf(123456789)));
      }
      return singleton;
   }
}

Bug #2: This is a race condition. This method is not synchronised, so you could end up returning more than one "singleton" instance in a threaded environment.
Bug #3: If this method is called more than once the returned EO may not have been inserted into the provided editing context creating the potential for changes to be lost if saveChanges is called on the wrong ec.

Thanks Ramsey, it is not the first time that your input has helped me further.💐

Funny, now you'll probably be saying "Thanks Dave, it's not the first time your input has completely screwed me over."

Dave

Attachment: smime.p7s
Description: S/MIME cryptographic signature

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: Prevent NEW in D2W?
      • From: Chuck Hill <email@hidden>
References: 
 >Prevent NEW in D2W? (From: Markus Ruggiero <email@hidden>)
 >Re: Prevent NEW in D2W? (From: Ramsey Gurley <email@hidden>)
 >Re: Prevent NEW in D2W? (From: Markus Ruggiero <email@hidden>)
 >Re: Prevent NEW in D2W? (From: David Avendasora <email@hidden>)

  • Prev by Date: Passing parameters to Jasper Reports
  • Next by Date: Re: Prevent NEW in D2W?
  • Previous by thread: Re: Prevent NEW in D2W?
  • Next by thread: Re: Prevent NEW in D2W?
  • Index(es):
    • Date
    • Thread