public IFile getFile() {
   String fileName = unitName;
   if (!fileName.endsWith(".ceylon")) fileName += ".ceylon";
   IPath path = packageFragment.getPath().append(fileName);
   IProject project = sourceDir.getJavaProject().getProject();
   return project.getFile(path.makeRelativeTo(project.getFullPath()));
 }
 /* (non-Javadoc)
  * @see org.eclipse.cdt.debug.core.sourcelookup.IMappingSourceContainer#getCompilationPath(java.lang.String)
  */
 public IPath getCompilationPath(String sourceName) {
   IPath path = new Path(sourceName);
   IPath base = new Path(fDirectory.getPath());
   if (base.isPrefixOf(path)) {
     if (fSubfolders) {
       base = path.removeLastSegments(1);
     }
     return path.makeRelativeTo(base);
   }
   return null;
 }
 @Override
 protected void service(HttpServletRequest req, HttpServletResponse resp)
     throws ServletException, IOException {
   traceRequest(req);
   String pathInfoString = req.getPathInfo();
   String queryString = getQueryString(req);
   IPath pathInfo =
       new Path(
           null /*don't parse host:port as device*/,
           pathInfoString == null ? "" : pathInfoString); // $NON-NLS-1$
   if (pathInfo.segmentCount() > 0) {
     String hostedHost = pathInfo.segment(0);
     IHostedSite site = HostingActivator.getDefault().getHostingService().get(hostedHost);
     if (site != null) {
       IPath path = pathInfo.removeFirstSegments(1);
       IPath contextPath = new Path(req.getContextPath());
       IPath contextlessPath = path.makeRelativeTo(contextPath).makeAbsolute();
       URI[] mappedPaths;
       try {
         mappedPaths = getMapped(site, contextlessPath, queryString);
       } catch (URISyntaxException e) {
         handleException(
             resp,
             new ServerStatus(
                 IStatus.ERROR,
                 HttpServletResponse.SC_BAD_REQUEST,
                 "Could not create target URI	",
                 e));
         return;
       }
       if (mappedPaths != null) {
         serve(req, resp, site, mappedPaths);
       } else {
         handleException(
             resp,
             new ServerStatus(
                 IStatus.ERROR,
                 HttpServletResponse.SC_NOT_FOUND,
                 NLS.bind("No mappings matched {0}", path),
                 null));
       }
     } else {
       String msg = NLS.bind("Hosted site {0} is stopped", hostedHost);
       handleException(
           resp, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_NOT_FOUND, msg, null));
     }
   } else {
     super.doGet(req, resp);
   }
 }
  @SuppressWarnings("unused")
  private void copyProjectProperties(IProject project, IPath destinationPath) {
    final IFile source = project.getFile(PROJECT_PROPERTIES_FILE_NAME);
    if (!source.exists()) {
      assert false : PROJECT_PROPERTIES_COULD_NOT_BE_COPIED_COMMA__BECAUSE_IT_DOES_NOT_EXIST_;
      return;
    }

    final IFile destination =
        newProject.getFile(
            destinationPath
                .makeRelativeTo(newProject.getFullPath())
                .append(PROJECT_PROPERTIES_FILE_NAME));
    if (!destination.exists())
      try {
        System.out.println("source: " + source + " ; target: " + destination);
        source.copy(destination.getFullPath(), true, null);
      } catch (CoreException e) {
        e.printStackTrace();
      }
  }
  @Override
  public void processResourceDeltas(
      final IModuleResourceDelta[] deltas,
      ZipOutputStream zip,
      Map<ZipEntry, String> deleteEntries,
      final String deletePrefix,
      final String deltaPrefix,
      final boolean adjustGMTOffset)
      throws IOException, CoreException {
    for (final IModuleResourceDelta delta : deltas) {
      final int deltaKind = delta.getKind();
      final IResource deltaResource =
          (IResource) delta.getModuleResource().getAdapter(IResource.class);
      final IProject deltaProject = deltaResource.getProject();
      final ILiferayProject lrproject = LiferayCore.create(deltaProject);
      final IFolder webappRoot = lrproject.getDefaultDocrootFolder();
      final IPath deltaFullPath = deltaResource.getFullPath();

      boolean deltaZip = false;
      IPath deltaPath = null;

      if (webappRoot != null && webappRoot.exists()) {
        final IPath containerFullPath = webappRoot.getFullPath();

        if (containerFullPath.isPrefixOf(deltaFullPath)) {
          deltaZip = true;
          deltaPath = new Path(deltaPrefix + deltaFullPath.makeRelativeTo(containerFullPath));
        }
      }

      if (deltaZip == false && new Path("WEB-INF").isPrefixOf(delta.getModuleRelativePath())) {
        final List<IFolder> folders = CoreUtil.getSourceFolders(JavaCore.create(deltaProject));

        for (IFolder folder : folders) {
          final IPath folderPath = folder.getFullPath();

          if (folderPath.isPrefixOf(deltaFullPath)) {
            deltaZip = true;
            break;
          }
        }
      }

      if (deltaZip == false
          && (deltaKind == IModuleResourceDelta.ADDED
              || deltaKind == IModuleResourceDelta.CHANGED
              || deltaKind == IModuleResourceDelta.REMOVED)) {
        final IPath targetPath = JavaCore.create(deltaProject).getOutputLocation();

        deltaZip = true;
        deltaPath = new Path("WEB-INF/classes").append(deltaFullPath.makeRelativeTo(targetPath));
      }

      if (deltaZip) {
        if (deltaKind == IModuleResourceDelta.ADDED || deltaKind == IModuleResourceDelta.CHANGED) {
          addToZip(deltaPath, deltaResource, zip, adjustGMTOffset);
        } else if (deltaKind == IModuleResourceDelta.REMOVED) {
          addRemoveProps(deltaPath, deltaResource, zip, deleteEntries, deletePrefix);
        } else if (deltaKind == IModuleResourceDelta.NO_CHANGE) {
          final IModuleResourceDelta[] children = delta.getAffectedChildren();
          processResourceDeltas(
              children, zip, deleteEntries, deletePrefix, deltaPrefix, adjustGMTOffset);
        }
      }
    }
  }
  /**
   * Scan traceFolder for files that match the patterns specified in the template file. When there
   * is a match, the trace package element is used to determine the trace name and trace type.
   *
   * @param traceGroup The parent trace group element
   * @param parentElement The immediate parent trace group or folder element
   * @param traceFolder The folder to scan
   * @param recursionLevel The recursion level (needed to find directory traces under the
   *     traceFolder
   * @param monitor The progress monitor
   * @throws CoreException Thrown by the file system implementation
   * @throws InterruptedException Thrown if operation was cancelled
   */
  private void generateElementsFromArchive(
      final RemoteImportTraceGroupElement traceGroup,
      final TracePackageElement parentElement,
      final IFileStore traceFolder,
      final int recursionLevel,
      IProgressMonitor monitor)
      throws CoreException, InterruptedException {

    int localRecursionLevel = recursionLevel + 1;
    IFileStore[] sources = traceFolder.childStores(EFS.NONE, monitor);

    for (int i = 0; i < sources.length; i++) {
      ModalContext.checkCanceled(monitor);
      SubMonitor subMonitor = SubMonitor.convert(monitor, sources.length);

      IFileStore fileStore = sources[i];
      IPath fullArchivePath = TmfTraceCoreUtils.newSafePath(fileStore.toURI().getPath());

      IFileInfo sourceInfo = fileStore.fetchInfo();
      if (!sourceInfo.isDirectory()) {

        String rootPathString = traceGroup.getRootImportPath();
        IPath rootPath = TmfTraceCoreUtils.newSafePath(rootPathString);
        IPath relativeTracePath = Path.EMPTY;
        if (rootPath.isPrefixOf(fullArchivePath)) {
          relativeTracePath = fullArchivePath.makeRelativeTo(rootPath);
        }
        Entry<Pattern, TracePackageTraceElement> matchingTemplateEntry =
            getMatchingTemplateElement(relativeTracePath);
        if (matchingTemplateEntry != null) {
          TracePackageTraceElement matchingTemplateElement = matchingTemplateEntry.getValue();
          String traceType = matchingTemplateElement.getTraceType();

          // If a single file is part of a directory trace, use the parent directory instead
          TracePackageElement parent = parentElement;
          if (matchesDirectoryTrace(relativeTracePath, matchingTemplateEntry)) {
            fullArchivePath = fullArchivePath.removeLastSegments(1);
            fDirectoryTraces.add(fullArchivePath);
            fileStore = fileStore.getParent();
            parent = parentElement.getParent();
            // Let the auto-detection choose the best trace type
            traceType = null;
          } else if ((localRecursionLevel > 1) && (!traceGroup.isRecursive())) {
            // Don't consider file traces on level 2 if it's not recursive
            continue;
          }
          String traceName = fullArchivePath.lastSegment();
          String fileName = fileStore.getName();
          // create new elements to decouple from input elements
          TracePackageTraceElement traceElement =
              new TracePackageTraceElement(parent, traceName, traceType);
          RemoteImportTraceFilesElement tracePackageFilesElement =
              new RemoteImportTraceFilesElement(traceElement, fileName, fileStore);
          tracePackageFilesElement.setVisible(false);
        }
      } else {
        if (traceGroup.isRecursive() || localRecursionLevel < 2) {
          RemoteImportFolderElement folder =
              new RemoteImportFolderElement(parentElement, fileStore.getName());
          generateElementsFromArchive(
              traceGroup, folder, fileStore, localRecursionLevel, subMonitor);
        }
      }
    }
  }