View Javadoc
1   /*
2    * Copyright 2008 FatWire Corporation. All Rights Reserved.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *    http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package tools.gsf.facade.assetapi.asset;
18  
19  import COM.FutureTense.Interfaces.ICS;
20  import com.fatwire.assetapi.data.AssetId;
21  import com.fatwire.assetapi.query.Query;
22  import tools.gsf.facade.assetapi.AssetAccessTemplate;
23  import tools.gsf.facade.assetapi.AssetIdUtils;
24  import tools.gsf.facade.assetapi.AssetMapper;
25  import tools.gsf.facade.runtag.asset.AssetRelationTreeUtils;
26  
27  import java.util.Collection;
28  import java.util.Collections;
29  import java.util.LinkedList;
30  import java.util.List;
31  
32  /**
33   * @param <T> class to be returned based on asset mapper
34   * @author Dolf Dijkstra
35   */
36  public class MappedAssetAccessTemplate<T> extends AssetAccessTemplate {
37      protected final AssetMapper<T> mapper;
38      protected final ICS ics;
39  
40      /**
41       * @param ics    Content Server context object
42       * @param mapper asset mapper
43       */
44      public MappedAssetAccessTemplate(ICS ics, AssetMapper<T> mapper) {
45          super(ics);
46          this.ics = ics;
47          this.mapper = mapper;
48  
49      }
50  
51      /**
52       * @param id asset id
53       * @return the mapped object
54       */
55      public T read(final AssetId id) {
56          return this.readAsset(id, mapper);
57      }
58  
59      /**
60       * Reads the attributes of an asset.
61       *
62       * @param id         asset id
63       * @param attributes array of attribute names
64       * @return the mapped object
65       */
66      public T read(final AssetId id, final String... attributes) {
67          return this.readAsset(id, mapper, attributes);
68      }
69  
70      /**
71       * Reads the associated assets of an asset and returns them as a
72       * ScatteredAsset. This takes care of the asset read operation of the
73       * associated assets.
74       *
75       * @param id              asset id
76       * @param associationType associated type
77       * @return the assets from the associations.
78       */
79      public Collection<T> readAssociatedAssets(final AssetId id, final String associationType) {
80          final Collection<AssetId> list = readAssociatedAssetIds(id, associationType);
81          if (list == null || list.isEmpty()) {
82              return Collections.emptyList();
83          }
84          final List<T> l = new LinkedList<T>();
85          for (final AssetId child : list) {
86              l.add(read(child));
87          }
88          return l;
89  
90      }
91  
92      /**
93       * Reads the list of associated assets based on the current c and cid cs
94       * variables.
95       *
96       * @param associationType associated type
97       * @return the assets from the associations.
98       */
99      public Collection<AssetId> readAssociatedAssetIds(final String associationType) {
100         return readAssociatedAssetIds(currentId(), associationType);
101     }
102 
103     /**
104      * Read the assets that are parents of the current asset given the specified
105      * association name or names.  Note this can result in an unknown dependency
106      *
107      * @param id              the child asset
108      * @param associationName the association name or names to be used to filter parent query.
109      * @return collection of parents; never null.
110      */
111     public Collection<AssetId> readParentAssetIds(final AssetId id, final String... associationName) {
112         return AssetRelationTreeUtils.getParents(ics, id, associationName);
113     }
114 
115     /**
116      * Read the assets that are parents of the current asset given the specified
117      * association name or names.  Note this can result in an unknown dependency
118      *
119      * @param associationName the association name or names to be used to filter parent query.
120      * @return collection of parents; never null.
121      */
122     public Collection<AssetId> readParentAssetIds(final String... associationName) {
123         return readParentAssetIds(currentId(), associationName);
124     }
125 
126     /**
127      * Reads the associated assets of an asset and returns them as a
128      * ScatteredAsset. This takes care of the asset read operation of the
129      * associated assets. The returned ScatteredAssets are only loaded with the
130      * mentioned attributes.
131      *
132      * @param id              the parent asset
133      * @param associationType the name of the association or '-' for an unnamed
134      *                        association
135      * @param attributes      the list of attributes to load
136      * @return the assets from the associations.
137      */
138     public Collection<T> readAssociatedAssets(final AssetId id, final String associationType,
139                                               final String... attributes) {
140         final List<AssetId> list = this.readAsset(id).getAssociatedAssets(associationType);
141         if (list == null || list.isEmpty()) {
142             return Collections.emptyList();
143         }
144         final List<T> l = new LinkedList<T>();
145         for (final AssetId child : list) {
146             l.add(read(child, attributes));
147         }
148         return l;
149 
150     }
151 
152     /**
153      * Reads the asset attributes of the asset identified by the current c and
154      * cid variables on the ics scope.
155      *
156      * @return the mapped object
157      */
158     public T readCurrent() {
159         final AssetId id = currentId();
160         return this.read(id);
161     }
162 
163     public AssetId currentId() {
164         return AssetIdUtils.currentId(ics);
165     }
166 
167     /**
168      * Reads the mentioned asset attributes of the asset identified by the
169      * current c and cid variables on the ics scope.
170      *
171      * @param attributes array of attribute names
172      * @return the mapped object
173      */
174     public T readCurrent(final String... attributes) {
175         final AssetId id = currentId();
176         return this.readAsset(id, mapper, attributes);
177     }
178 
179     /**
180      * Queries the asset repository with the provided query.
181      *
182      * @param query query object
183      * @return Iterable of mapped objects
184      */
185     public Iterable<T> query(final Query query) {
186         return readAssets(query, mapper);
187     }
188 
189     /**
190      * Queries for a list of scattered assets.
191      * <p>
192      * Sample queries are:
193      * <ul>
194      * <li>name='foo'</li>
195      * <li>name = 'foo'</li>
196      * <li>name = foo</li>
197      * <li>name= 'foo bar'</li>
198      * <li>size=[1,2]</li>
199      * <li>size{10,250}</li>
200      * <li>name!='foo'</li>
201      * </ul>
202      *
203      * @param assetType string value for asset type
204      * @param subType   string value for sub-type
205      * @param query     query object
206      * @return a Iterable of mapped objects
207      */
208     public Iterable<T> query(final String assetType, final String subType, final String query) {
209         return query(assetType, subType, query, mapper);
210     }
211 
212     /**
213      * Queries for a list of scattered assets. Only the mentioned attributes are
214      * returned.
215      *
216      * @param assetType  string value of asset type
217      * @param subType    string value of subtype
218      * @param query      string value of query
219      * @param attributes string array of attributes
220      * @return a Iterable of mapped objects
221      */
222     public Iterable<T> query(final String assetType, final String subType, final String query,
223                              final String... attributes) {
224         return query(assetType, subType, query, mapper, attributes);
225     }
226 
227 }