001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * If you wish your version of this file to be governed by only the CDDL
025: * or only the GPL Version 2, indicate your decision by adding
026: * "[Contributor] elects to include this software in this distribution
027: * under the [CDDL or GPL Version 2] license." If you do not indicate a
028: * single choice of license, a recipient has the option to distribute
029: * your version of this file under either the CDDL, the GPL Version 2 or
030: * to extend the choice of license to its licensees as provided above.
031: * However, if you add GPL Version 2 code and therefore, elected the GPL
032: * Version 2 license, then the option applies only if the new code is
033: * made subject to such option by the copyright holder.
034: *
035: * Contributor(s):
036: *
037: * Portions Copyrighted 2008 Sun Microsystems, Inc.
038: */
039:
040: package org.netbeans.modules.websvc.saas.model;
041:
042: import java.io.IOException;
043: import java.util.List;
044: import java.util.ArrayList;
045: import java.util.Collections;
046: import org.netbeans.modules.websvc.saas.model.jaxb.Group;
047: import org.netbeans.modules.websvc.saas.model.jaxb.Method;
048: import org.netbeans.modules.websvc.saas.model.jaxb.SaasServices;
049: import org.netbeans.modules.websvc.saas.model.jaxb.SaasServices.Header;
050: import org.netbeans.modules.websvc.saas.model.jaxb.SaasMetadata;
051: import org.netbeans.modules.websvc.saas.model.jaxb.SaasMetadata.CodeGen;
052: import org.netbeans.modules.websvc.saas.util.SaasUtil;
053: import org.openide.filesystems.FileObject;
054: import org.openide.util.Exceptions;
055: import org.openide.util.RequestProcessor;
056:
057: /**
058: *
059: * @author nam
060: */
061: public class Saas {
062: public static final String PROP_PARENT_GROUP = "parentGroup";
063: public static final String PROP_STATE = "saasState";
064:
065: public static enum State {
066: UNINITIALIZED, INITIALIZING, RETRIEVED, READY
067:
068: }
069:
070: public static final String NS_SAAS = "http://xml.netbeans.org/websvc/saas/services/1.0";
071: public static final String NS_WSDL = "http://schemas.xmlsoap.org/wsdl/";
072: public static final String NS_WADL = "http://research.sun.com/wadl/2006/10";
073: //private static final String CUSTOM = "custom";
074:
075: protected final SaasServices delegate;
076: private SaasGroup parentGroup;
077: private SaasGroup topGroup;
078: private List<SaasMethod> saasMethods;
079:
080: private State state = State.UNINITIALIZED;
081: protected FileObject saasFolder; // userdir folder to store customization and consumer artifacts
082: private FileObject moduleJar; // NBM this saas was loaded from
083: private boolean userDefined = true;
084:
085: public Saas(SaasGroup parentGroup, SaasServices services) {
086: this .delegate = services;
087: this .parentGroup = parentGroup;
088: }
089:
090: public Saas(SaasGroup parent, String url, String displayName,
091: String packageName) {
092: delegate = new SaasServices();
093: delegate.setUrl(url);
094: delegate.setDisplayName(displayName);
095:
096: SaasMetadata m = delegate.getSaasMetadata();
097: if (m == null) {
098: m = new SaasMetadata();
099: this .getDelegate().setSaasMetadata(m);
100: }
101: CodeGen cg = m.getCodeGen();
102: if (cg == null) {
103: cg = new CodeGen();
104: m.setCodeGen(cg);
105: }
106: cg.setPackageName(packageName);
107: setParentGroup(parent);
108: computePathFromRoot();
109: }
110:
111: public SaasServices getDelegate() {
112: return delegate;
113: }
114:
115: public SaasGroup getParentGroup() {
116: return parentGroup;
117: }
118:
119: protected void setParentGroup(SaasGroup parentGroup) {
120: this .parentGroup = parentGroup;
121: }
122:
123: public SaasGroup getTopLevelGroup() {
124: return topGroup;
125: }
126:
127: public void setTopLevelGroup(SaasGroup topGroup) {
128: this .topGroup = topGroup;
129: }
130:
131: protected void computePathFromRoot() {
132: delegate.getSaasMetadata().setGroup(
133: parentGroup.getPathFromRoot());
134: }
135:
136: protected FileObject saasFile;
137:
138: public FileObject getSaasFile() throws IOException {
139: if (saasFile == null) {
140: FileObject folder = getSaasFolder();
141: String filename = folder.getName() + "-saas.xml"; //NOI18N
142: saasFile = folder.getFileObject(filename);
143: if (saasFile == null) {
144: saasFile = getSaasFolder().createData(filename);
145: }
146: }
147: return saasFile;
148: }
149:
150: public void save() {
151: try {
152: SaasUtil.saveSaas(this , getSaasFile());
153: } catch (Exception e) {
154: Exceptions.printStackTrace(e);
155: }
156: }
157:
158: public boolean isUserDefined() {
159: return userDefined;
160: }
161:
162: protected void setUserDefined(boolean v) {
163: if (userDefined) {
164: userDefined = v;
165: }
166: }
167:
168: public String getUrl() {
169: return delegate.getUrl();
170: }
171:
172: public State getState() {
173: return state;
174: }
175:
176: protected synchronized void setState(State v) {
177: State old = state;
178: state = v;
179: SaasServicesModel.getInstance().fireChange(PROP_STATE, this ,
180: old, state);
181: }
182:
183: /**
184: * Asynchronous call to transition Saas to READY state; mainly for UI usage
185: * Sub-class need to completely override as needed, without calling super().
186: */
187: public void toStateReady(boolean synchronous) {
188: if (synchronous) {
189: setState(state);
190: } else {
191: RequestProcessor.getDefault().post(new Runnable() {
192: public void run() {
193: setState(State.READY);
194: }
195: });
196: }
197: }
198:
199: public FileObject getModuleJar() {
200: return moduleJar;
201: }
202:
203: protected void setModuleJar(FileObject moduleJar) {
204: this .moduleJar = moduleJar;
205: }
206:
207: public SaasMetadata getSaasMetadata() {
208: return delegate.getSaasMetadata();
209: }
210:
211: public List<SaasMethod> getMethods() {
212: if (saasMethods == null) {
213: saasMethods = new ArrayList<SaasMethod>();
214: if (delegate.getMethods() != null
215: && delegate.getMethods().getMethod() != null) {
216: for (Method m : delegate.getMethods().getMethod()) {
217: saasMethods.add(createSaasMethod(m));
218: }
219: }
220: }
221: return Collections.unmodifiableList(saasMethods);
222: }
223:
224: protected SaasMethod createSaasMethod(Method method) {
225: return new SaasMethod(this , method);
226: }
227:
228: public Header getHeader() {
229: return delegate.getHeader();
230: }
231:
232: public String getDisplayName() {
233: return (String) delegate.getDisplayName();
234: }
235:
236: public String getDescription() {
237: return delegate.getDescription();
238: }
239:
240: public String getApiDoc() {
241: return delegate.getApiDoc();
242: }
243:
244: public FileObject getSaasFolder() {
245: return getSaasFolder(true);
246: }
247:
248: public FileObject getSaasFolder(boolean create) {
249: if (saasFolder == null) {
250: saasFolder = SaasServicesModel.getWebServiceHome()
251: .getFileObject(getDisplayName());
252: if (saasFolder == null && create) {
253: try {
254: saasFolder = SaasServicesModel.getWebServiceHome()
255: .createFolder(getDisplayName());
256: } catch (Exception ex) {
257: Exceptions.printStackTrace(ex);
258: }
259: }
260: }
261: return saasFolder;
262: }
263:
264: @Override
265: public String toString() {
266: return getDisplayName();
267: }
268:
269: protected void refresh() {
270: setState(State.INITIALIZING);
271: saasMethods = null;
272: }
273:
274: /**
275: * Get the URL class loader for the module defining this SaaS.
276: * @return URLClassLoader instance; or null if this SaaS does not come from an NBM
277: */
278: /*protected URLClassLoader getModuleLoader() {
279: if (loader == null) {
280: try {
281: loader = new URLClassLoader(new URL[] { new URL(moduleJar.getPath()) });
282: } catch (MalformedURLException ex) {
283: Exceptions.printStackTrace(ex);
284: }
285: }
286: return loader;
287: }*/
288: }
|