visualweb.websvcmgr/test/unit/src/org/netbeans/modules/websvc/manager/test/SetupUtil.java
author Jesse Glick <jglick@netbeans.org>
Wed, 23 Mar 2011 16:50:27 -0400
changeset 3213 c85dcf71e424
permissions -rw-r--r--
Tests at least should compile now.
jglick@3213
     1
/*
jglick@3213
     2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
jglick@3213
     3
 *
jglick@3213
     4
 * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
jglick@3213
     5
 *
jglick@3213
     6
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
jglick@3213
     7
 * Other names may be trademarks of their respective owners.
jglick@3213
     8
 *
jglick@3213
     9
 * The contents of this file are subject to the terms of either the GNU
jglick@3213
    10
 * General Public License Version 2 only ("GPL") or the Common
jglick@3213
    11
 * Development and Distribution License("CDDL") (collectively, the
jglick@3213
    12
 * "License"). You may not use this file except in compliance with the
jglick@3213
    13
 * License. You can obtain a copy of the License at
jglick@3213
    14
 * http://www.netbeans.org/cddl-gplv2.html
jglick@3213
    15
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
jglick@3213
    16
 * specific language governing permissions and limitations under the
jglick@3213
    17
 * License.  When distributing the software, include this License Header
jglick@3213
    18
 * Notice in each file and include the License file at
jglick@3213
    19
 * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
jglick@3213
    20
 * particular file as subject to the "Classpath" exception as provided
jglick@3213
    21
 * by Oracle in the GPL Version 2 section of the License file that
jglick@3213
    22
 * accompanied this code. If applicable, add the following below the
jglick@3213
    23
 * License Header, with the fields enclosed by brackets [] replaced by
jglick@3213
    24
 * your own identifying information:
jglick@3213
    25
 * "Portions Copyrighted [year] [name of copyright owner]"
jglick@3213
    26
 * 
jglick@3213
    27
 * Contributor(s):
jglick@3213
    28
 * 
jglick@3213
    29
 * Portions Copyrighted 2007 Sun Microsystems, Inc.
jglick@3213
    30
 */
jglick@3213
    31
jglick@3213
    32
package org.netbeans.modules.websvc.manager.test;
jglick@3213
    33
jglick@3213
    34
import java.io.File;
jglick@3213
    35
import java.io.FileFilter;
jglick@3213
    36
import java.io.FileInputStream;
jglick@3213
    37
import java.io.FileOutputStream;
jglick@3213
    38
import java.io.IOException;
jglick@3213
    39
import java.io.InputStream;
jglick@3213
    40
import java.net.URL;
jglick@3213
    41
import java.nio.channels.FileChannel;
jglick@3213
    42
import java.util.ArrayList;
jglick@3213
    43
import java.util.List;
jglick@3213
    44
import java.util.Properties;
jglick@3213
    45
import java.util.jar.Manifest;
jglick@3213
    46
import org.netbeans.junit.MockServices;
jglick@3213
    47
import org.netbeans.modules.websvc.manager.WebServiceManager;
jglick@3213
    48
import org.openide.DialogDisplayer;
jglick@3213
    49
import org.openide.filesystems.FileSystem;
jglick@3213
    50
import org.openide.filesystems.FileUtil;
jglick@3213
    51
import org.openide.filesystems.LocalFileSystem;
jglick@3213
    52
import org.openide.filesystems.MultiFileSystem;
jglick@3213
    53
import org.openide.filesystems.Repository;
jglick@3213
    54
import org.openide.filesystems.XMLFileSystem;
jglick@3213
    55
import org.openide.modules.InstalledFileLocator;
jglick@3213
    56
import org.openide.util.Lookup;
jglick@3213
    57
import org.openide.util.LookupEvent;
jglick@3213
    58
import org.openide.util.LookupListener;
jglick@3213
    59
import org.openide.util.NbCollections;
jglick@3213
    60
jglick@3213
    61
/**
jglick@3213
    62
 *
jglick@3213
    63
 * @author quynguyen
jglick@3213
    64
 */
jglick@3213
    65
public class SetupUtil {
jglick@3213
    66
    private static final String WORKDIR_SPACES = "user directory";
jglick@3213
    67
    private static final String WORKDIR = "userdirectory";
jglick@3213
    68
    private static final String TEST_WSDL = "/org/netbeans/modules/websvc/manager/resources/uszip-asmx-catalog/www.webservicemart.com/uszip.asmx.wsdl";
jglick@3213
    69
    private static final String TEST_CATALOG = "/org/netbeans/modules/websvc/manager/resources/uszip-asmx-catalog/catalog.xml";
jglick@3213
    70
    private static final String CATALOG_FILE = "uszip-asmx-catalog/catalog.xml";
jglick@3213
    71
    private static final String WSDL_FILE = "uszip-asmx-catalog/www.webservicemart.com/uszip.asmx.wsdl";
jglick@3213
    72
    
jglick@3213
    73
    private static final String ENDORSED_REF = "modules/ext/jaxws21/api/jaxws-api.jar";
jglick@3213
    74
    private static final String JAXWS_LIB_PROPERTY = "libs.jaxws21.classpath";
jglick@3213
    75
    
jglick@3213
    76
    public static SetupData commonSetUp(File workingDir) throws Exception {
jglick@3213
    77
        SetupData data = new SetupData();
jglick@3213
    78
        
jglick@3213
    79
        File userDir = new File(workingDir.getParentFile(),
jglick@3213
    80
                System.getProperty("os.name").startsWith("Windows") ? WORKDIR_SPACES : WORKDIR);
jglick@3213
    81
        System.getProperties().setProperty("netbeans.user", userDir.getAbsolutePath());
jglick@3213
    82
        
jglick@3213
    83
        File websvcHome = new File(WebServiceManager.WEBSVC_HOME);
jglick@3213
    84
        data.setWebsvcHome(websvcHome);
jglick@3213
    85
        
jglick@3213
    86
        File websvcUserDir = new File(WebServiceManager.WEBSVC_HOME);
jglick@3213
    87
        websvcUserDir.mkdirs();
jglick@3213
    88
        
jglick@3213
    89
        File wsdlFile = new File(websvcUserDir, WSDL_FILE);
jglick@3213
    90
        File catalogFile = new File(websvcUserDir, CATALOG_FILE);
jglick@3213
    91
jglick@3213
    92
        retrieveURL(wsdlFile, SetupUtil.class.getResource(TEST_WSDL));
jglick@3213
    93
        retrieveURL(catalogFile, SetupUtil.class.getResource(TEST_CATALOG));
jglick@3213
    94
        
jglick@3213
    95
        copy(wsdlFile, workingDir);
jglick@3213
    96
        
jglick@3213
    97
        data.setLocalWsdlFile(wsdlFile);
jglick@3213
    98
        data.setLocalCatalogFile(catalogFile);
jglick@3213
    99
        data.setLocalOriginalWsdl(new File(workingDir, wsdlFile.getName()));
jglick@3213
   100
        
jglick@3213
   101
        MainFS fs = new MainFS();
jglick@3213
   102
        fs.setConfigRootDir(websvcHome.getParentFile());
jglick@3213
   103
        TestRepository.defaultFileSystem = fs;
jglick@3213
   104
        
jglick@3213
   105
        MockServices.setServices(DialogDisplayerNotifier.class, InstalledFileLocatorImpl.class, TestRepository.class);
jglick@3213
   106
        
jglick@3213
   107
        InstalledFileLocatorImpl locator = (InstalledFileLocatorImpl)Lookup.getDefault().lookup(InstalledFileLocator.class);
jglick@3213
   108
        locator.setUserConfigRoot(websvcHome.getParentFile());
jglick@3213
   109
        
jglick@3213
   110
        File targetBuildProperties = new File(websvcUserDir.getParentFile().getParentFile(), "build.properties");
jglick@3213
   111
        generatePropertiesFile(targetBuildProperties);
jglick@3213
   112
        
jglick@3213
   113
        return data;
jglick@3213
   114
    }
jglick@3213
   115
jglick@3213
   116
    public static void commonTearDown() throws Exception {
jglick@3213
   117
        DialogDisplayer dd = DialogDisplayer.getDefault();
jglick@3213
   118
        if (dd instanceof DialogDisplayerNotifier) {
jglick@3213
   119
            ((DialogDisplayerNotifier)dd).removeAllListeners();
jglick@3213
   120
        }
jglick@3213
   121
        
jglick@3213
   122
        MockServices.setServices();
jglick@3213
   123
    }
jglick@3213
   124
    
jglick@3213
   125
    public static void copy(File src, File target) throws Exception {        
jglick@3213
   126
        if (src.isFile()) {
jglick@3213
   127
            File targetFile = new File(target, src.getName());
jglick@3213
   128
            
jglick@3213
   129
            FileInputStream is = new FileInputStream(src);
jglick@3213
   130
            FileOutputStream os = new FileOutputStream(targetFile);
jglick@3213
   131
            
jglick@3213
   132
            FileChannel inputChannel = is.getChannel();
jglick@3213
   133
            FileChannel outputChannel = os.getChannel();
jglick@3213
   134
            
jglick@3213
   135
            inputChannel.transferTo(0, inputChannel.size(), outputChannel);
jglick@3213
   136
            inputChannel.close();
jglick@3213
   137
            outputChannel.close();
jglick@3213
   138
        }else {
jglick@3213
   139
            File newDir = new File(target, src.getName());
jglick@3213
   140
            newDir.mkdirs();
jglick@3213
   141
            
jglick@3213
   142
            File[] dirFiles = src.listFiles();
jglick@3213
   143
            if (dirFiles != null) {
jglick@3213
   144
                for (int i = 0; i < dirFiles.length; i++) {
jglick@3213
   145
                    copy(dirFiles[i], newDir);
jglick@3213
   146
                }
jglick@3213
   147
            }
jglick@3213
   148
        }
jglick@3213
   149
    }
jglick@3213
   150
    
jglick@3213
   151
    public static void retrieveURL(File targetFile, URL url) throws IOException {
jglick@3213
   152
        targetFile.getParentFile().mkdirs();
jglick@3213
   153
        FileOutputStream fos = new FileOutputStream(targetFile);
jglick@3213
   154
        byte[] readBuffer = new byte[1024];
jglick@3213
   155
        
jglick@3213
   156
        InputStream is = url.openStream();
jglick@3213
   157
        int bytesRead = 0;
jglick@3213
   158
        while ( (bytesRead = is.read(readBuffer, 0, 1024)) > 0) {
jglick@3213
   159
            fos.write(readBuffer, 0, bytesRead);
jglick@3213
   160
        }
jglick@3213
   161
        fos.flush();
jglick@3213
   162
        fos.close();
jglick@3213
   163
        is.close();
jglick@3213
   164
    }
jglick@3213
   165
    
jglick@3213
   166
    private static void generatePropertiesFile(File target) throws IOException {
jglick@3213
   167
        String separator = System.getProperty("path.separator");
jglick@3213
   168
        File apiBase = InstalledFileLocator.getDefault().locate(ENDORSED_REF, null, true).getParentFile();
jglick@3213
   169
        File jaxWsBase = apiBase.getParentFile();
jglick@3213
   170
        
jglick@3213
   171
        FileFilter jarFilter = new FileFilter() {
jglick@3213
   172
            public boolean accept(File pathname) {
jglick@3213
   173
                return pathname.isFile() && pathname.getName().endsWith(".jar");
jglick@3213
   174
            }
jglick@3213
   175
        };
jglick@3213
   176
        
jglick@3213
   177
        File[] apiJars = apiBase.listFiles(jarFilter);
jglick@3213
   178
        File[] implJars = jaxWsBase.listFiles(jarFilter);
jglick@3213
   179
        
jglick@3213
   180
        Properties result = new Properties();
jglick@3213
   181
        StringBuffer classpath = new StringBuffer();
jglick@3213
   182
        
jglick@3213
   183
        for (int i = 0; i < apiJars.length; i++) {
jglick@3213
   184
            String pathElement = apiJars[i].getAbsolutePath() + separator;
jglick@3213
   185
            classpath.append(pathElement);
jglick@3213
   186
        }
jglick@3213
   187
        
jglick@3213
   188
        for (int i = 0; i < implJars.length; i++) {
jglick@3213
   189
            classpath.append(implJars[i].getAbsolutePath());
jglick@3213
   190
            if (i != implJars.length - 1) {
jglick@3213
   191
                classpath.append(separator);
jglick@3213
   192
            }
jglick@3213
   193
        }
jglick@3213
   194
        
jglick@3213
   195
        result.setProperty(JAXWS_LIB_PROPERTY, classpath.toString());
jglick@3213
   196
        
jglick@3213
   197
        FileOutputStream fos = new FileOutputStream(target);
jglick@3213
   198
        result.store(fos, "build.properties file");
jglick@3213
   199
    }
jglick@3213
   200
    
jglick@3213
   201
    public static final class TestRepository extends Repository {
jglick@3213
   202
        static FileSystem defaultFileSystem = null;
jglick@3213
   203
        
jglick@3213
   204
        public TestRepository() {
jglick@3213
   205
            super(defaultFileSystem);
jglick@3213
   206
        }
jglick@3213
   207
    }
jglick@3213
   208
    
jglick@3213
   209
    // Taken from org.openide.filesystems.ExternalUtil to allow layer files to be
jglick@3213
   210
    // loaded into the default filesystem (since core/startup is in the classpath
jglick@3213
   211
    // and registers a default Repository that we do not want)
jglick@3213
   212
    public static final class MainFS extends MultiFileSystem implements LookupListener {
jglick@3213
   213
        private final Lookup.Result<FileSystem> ALL = Lookup.getDefault().lookupResult(FileSystem.class);
jglick@3213
   214
        private final FileSystem MEMORY = FileUtil.createMemoryFileSystem();
jglick@3213
   215
        private final XMLFileSystem layers = new XMLFileSystem();
jglick@3213
   216
        
jglick@3213
   217
        private final LocalFileSystem configRoot = new LocalFileSystem();
jglick@3213
   218
        
jglick@3213
   219
        public void setConfigRootDir(File root) throws Exception {
jglick@3213
   220
            configRoot.setRootDirectory(root);
jglick@3213
   221
        }
jglick@3213
   222
        
jglick@3213
   223
        public MainFS() {
jglick@3213
   224
            ALL.addLookupListener(this);
jglick@3213
   225
            
jglick@3213
   226
            List<URL> layerUrls = new ArrayList<URL>();
jglick@3213
   227
            ClassLoader l = Thread.currentThread().getContextClassLoader();
jglick@3213
   228
            try {
jglick@3213
   229
                for (URL manifest : NbCollections.iterable(l.getResources("META-INF/MANIFEST.MF"))) { // NOI18N
jglick@3213
   230
                    InputStream is = manifest.openStream();
jglick@3213
   231
                    try {
jglick@3213
   232
                        Manifest mani = new Manifest(is);
jglick@3213
   233
                        String layerLoc = mani.getMainAttributes().getValue("OpenIDE-Module-Layer"); // NOI18N
jglick@3213
   234
                        if (layerLoc != null) {
jglick@3213
   235
                            URL layer = l.getResource(layerLoc);
jglick@3213
   236
                            if (layer != null) {
jglick@3213
   237
                                layerUrls.add(layer);
jglick@3213
   238
                            }
jglick@3213
   239
                        }
jglick@3213
   240
                    } finally {
jglick@3213
   241
                        is.close();
jglick@3213
   242
                    }
jglick@3213
   243
                }
jglick@3213
   244
                layers.setXmlUrls(layerUrls.toArray(new URL[layerUrls.size()]));
jglick@3213
   245
            } catch (Exception x) {
jglick@3213
   246
            }
jglick@3213
   247
            resultChanged(null); // run after add listener - see PN1 in #26338
jglick@3213
   248
        }
jglick@3213
   249
        
jglick@3213
   250
        private FileSystem[] computeDelegates() {
jglick@3213
   251
            List<FileSystem> arr = new ArrayList<FileSystem>();
jglick@3213
   252
            arr.add(MEMORY);
jglick@3213
   253
            arr.add(layers);
jglick@3213
   254
            arr.add(configRoot);
jglick@3213
   255
            arr.addAll(ALL.allInstances());
jglick@3213
   256
            return arr.toArray(new FileSystem[0]);
jglick@3213
   257
        }
jglick@3213
   258
    
jglick@3213
   259
        public void resultChanged(LookupEvent ev) {
jglick@3213
   260
            setDelegates(computeDelegates());
jglick@3213
   261
        }
jglick@3213
   262
    }
jglick@3213
   263
    
jglick@3213
   264
    
jglick@3213
   265
}