KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > nightlabs > ipanema > accounting > ProductInfo


1 /*
2  * Created on 28.10.2004
3  */

4 package com.nightlabs.ipanema.accounting;
5
6 import java.io.Serializable JavaDoc;
7 import java.util.Collection JavaDoc;
8 import java.util.HashMap JavaDoc;
9 import java.util.HashSet JavaDoc;
10 import java.util.Map JavaDoc;
11 import java.util.Set JavaDoc;
12
13 import com.nightlabs.inheritance.FieldInheriter;
14 import com.nightlabs.inheritance.FieldMetaData;
15 import com.nightlabs.inheritance.Inheritable;
16 import com.nightlabs.ipanema.store.Product;
17
18 /**
19  * This object represents the com.nightlabs.store.Product in the accounting system. There's one
20  * ProductInfo instance for each Product instance. The ProductInfo objects form an inheritence tree
21  * analogue to the one of the Products.
22  *
23  * @author Marco Schulze - marco at nightlabs dot de
24  *
25  * @jdo.persistence-capable
26  * identity-type = "application"
27  * objectid-class = "com.nightlabs.ipanema.accounting.id.ProductInfoID"
28  * detachable = "true"
29  *
30  * @jdo.inheritance strategy = "new-table"
31  */

32 public class ProductInfo implements Inheritable, Serializable JavaDoc
33 {
34     /**
35      * @jdo.field primary-key="true"
36      * @jdo.column length="100"
37      */

38     private String JavaDoc organisationID;
39
40     /**
41      * @jdo.field primary-key="true"
42      * @jdo.column length="100"
43      */

44     private String JavaDoc productID;
45
46     /**
47      * @jdo.field persistence-modifier="persistent"
48      */

49     private Product product;
50
51     /**
52      * @jdo.field persistence-modifier="persistent"
53      */

54     private ProductInfo extendedProductInfo;
55
56     /**
57      * @jdo.field persistence-modifier="persistent"
58      */

59     private PriceConfig priceConfig = null;
60
61     /**
62      * This Map stores all <tt>ProductInfo</tt> s analog to the <tt>packagedProducts</tt>
63      * in <tt>Product</tt>.
64      * <p>
65      * key: String productPK<br/>
66      * value: ProductInfo productInfo
67      *
68      * @jdo.field
69      * persistence-modifier="persistent"
70      * collection-type="map"
71      * key-type="java.lang.String"
72      * value-type="ProductInfo"
73      *
74      * @jdo.join
75      */

76     private Map JavaDoc packagedProductInfos = new HashMap JavaDoc();
77
78 // TODO We need to store the purchase prices for our products somehow.
79
// private PurchasePriceConfig purchasePriceConfig;
80

81     /**
82      * key: String fieldName<br/>
83      * value: ProductInfoFieldMetaData fieldMetaData
84      *
85      * @jdo.field
86      * persistence-modifier="persistent"
87      * collection-type="map"
88      * key-type="java.lang.String"
89      * value-type="ProductInfoFieldMetaData"
90      * dependent="true"
91      * mapped-by="productInfo"
92      *
93      * @jdo.map-vendor-extension vendor-name="jpox" key="key-field" value="fieldName"
94      * @jdo.map-vendor-extension vendor-name="jpox" key="key-length" value="max 100"
95      */

96     protected Map JavaDoc fieldMetaDataMap = new HashMap JavaDoc();
97
98     protected ProductInfo() { }
99     public ProductInfo(Product product, ProductInfo extendedProductInfo)
100     {
101         if (product == null)
102             throw new NullPointerException JavaDoc("product must not be null!");
103         this.organisationID = product.getOrganisationID();
104         this.productID = product.getProductID();
105         this.product = product;
106         setExtendedProductInfo(extendedProductInfo);
107     }
108
109     /**
110      * This is the factory that should be used to create a ProductInfo for a child of this
111      * ProductInfo.
112      *
113      * @jdo.field persistence-modifier="persistent"
114      */

115     private ProductInfoFactory productInfoFactory;
116
117     /**
118      * @return Returns the organisationID.
119      */

120     public String JavaDoc getOrganisationID()
121     {
122         return organisationID;
123     }
124     /**
125      * @return Returns the productID.
126      */

127     public String JavaDoc getProductID()
128     {
129         return productID;
130     }
131     /**
132      * @return Returns the extendedProductInfo.
133      */

134     public ProductInfo getExtendedProductInfo()
135     {
136         return extendedProductInfo;
137     }
138     /**
139      * @param extendedProductInfo The extendedProductInfo to set.
140      */

141     protected void setExtendedProductInfo(ProductInfo extendedProductInfo)
142     {
143         if (extendedProductInfo != null) {
144             if (!(extendedProductInfo.getClass().isInstance(this)))
145                 throw new IllegalArgumentException JavaDoc("This productInfo (\""+this.getPrimaryKey()+"\") is of type " + this.getClass().getName() + " and cannot extend the productInfo \""+extendedProductInfo.getPrimaryKey()+"\" which is of type "+extendedProductInfo.getClass().getName());
146         }
147
148         this.extendedProductInfo = extendedProductInfo;
149     }
150
151     public void addPackagedProductInfo(ProductInfo productInfo)
152     {
153         packagedProductInfos.put(productInfo.getPrimaryKey(), productInfo);
154     }
155     public Collection JavaDoc getPackagedProductInfos()
156     {
157         return packagedProductInfos.values();
158     }
159     public ProductInfo getPackagedProductInfo(String JavaDoc productPK, boolean throwExceptionIfNotExistent)
160     {
161         ProductInfo res = (ProductInfo)packagedProductInfos.get(productPK);
162         if (res == null && throwExceptionIfNotExistent)
163             throw new IllegalArgumentException JavaDoc("No packaged ProductInfo existing with productPK=\""+productPK+"\"!");
164         return res;
165     }
166     public ProductInfo getPackagedProductInfo(String JavaDoc organisationID, String JavaDoc productID, boolean throwExceptionIfNotExistent)
167     {
168         ProductInfo res = (ProductInfo)packagedProductInfos.get(getPrimaryKey(organisationID, productID));
169         if (res == null && throwExceptionIfNotExistent)
170             throw new IllegalArgumentException JavaDoc("No packaged ProductInfo existing with organisationID=\""+organisationID+"\", productID=\""+productID+"\"!");
171         return res;
172     }
173     /**
174      * Removes a packaged product from this package.
175      * @param organisationID
176      * @param productID
177      */

178     public void removePackagedProductInfo(String JavaDoc organisationID, String JavaDoc productID)
179     {
180         packagedProductInfos.remove(getPrimaryKey(organisationID, productID));
181     }
182
183     public static String JavaDoc getPrimaryKey(String JavaDoc organisationID, String JavaDoc productID)
184     {
185         return organisationID + '/' + productID;
186     }
187     public String JavaDoc getPrimaryKey()
188     {
189         return organisationID + '/' + productID;
190     }
191     
192     /**
193      * Every ProductInfo belongs to exactly one Product. This method should never return null.
194      *
195      * @return Returns the product.
196      */

197     public Product getProduct()
198     {
199         return product;
200     }
201
202     /**
203      * @return Returns the priceConfig.
204      */

205     public PriceConfig getPriceConfig()
206     {
207         return priceConfig;
208     }
209     /**
210      * @param priceConfig The priceConfig to set.
211      */

212     public void setPriceConfig(PriceConfig priceConfig)
213     {
214         this.priceConfig = priceConfig;
215     }
216
217     /**
218      * @return Returns the productInfoFactory.
219      */

220     public ProductInfoFactory getProductInfoFactory()
221     {
222         return productInfoFactory;
223     }
224     /**
225      * @param productInfoFactory The productInfoFactory to set.
226      */

227     public void setProductInfoFactory(ProductInfoFactory productInfoFactory)
228     {
229         this.productInfoFactory = productInfoFactory;
230     }
231
232     /////// begin implementation of com.nightlabs.inheritance.Inheritable ////////
233
private static Set JavaDoc nonInheritableFields = new HashSet JavaDoc();
234     
235     /**
236      * @see com.nightlabs.inheritance.Inheritable#getFieldMetaData(java.lang.String)
237      */

238     public FieldMetaData getFieldMetaData(String JavaDoc fieldName)
239     {
240         if (fieldName.startsWith("jdo"))
241             return null;
242         
243         synchronized (nonInheritableFields) {
244             if (nonInheritableFields.isEmpty()) {
245                 nonInheritableFields.add("organisationID");
246                 nonInheritableFields.add("productID");
247                 nonInheritableFields.add("extendedProduct");
248                 nonInheritableFields.add("nature");
249                 nonInheritableFields.add("fieldMetaDataMap");
250                 nonInheritableFields.add("names");
251             }
252             if (nonInheritableFields.contains(fieldName))
253                 return null;
254         }
255
256         ProductInfoFieldMetaData fmd = (ProductInfoFieldMetaData)fieldMetaDataMap.get(fieldName);
257         if (fmd == null) {
258             if ("properties".equals(fieldName) || "packagedProducts".equals(fieldName))
259                 fmd = new MapFieldMetaData(this, fieldName);
260             else
261                 fmd = new ProductInfoFieldMetaData(this, fieldName);
262
263             fieldMetaDataMap.put(fieldName, fmd);
264         } // if (fmd == null) {
265

266         return fmd;
267     }
268     /**
269      * @see com.nightlabs.inheritance.Inheritable#getFieldInheriter(java.lang.String)
270      */

271     public FieldInheriter getFieldInheriter(String JavaDoc fieldName)
272     {
273         // TODO Auto-generated method stub
274
return null;
275     }
276     /////// end implementation of com.nightlabs.inheritance.Inheritable ////////
277
}
278
Popular Tags