This commit is contained in:
Devin148
2012-12-20 14:42:31 -05:00
11 changed files with 174 additions and 349 deletions
@@ -52,6 +52,7 @@ public final class DataContentTopComponent extends TopComponent implements DataC
private boolean isDefault;
// Different DataContentViewers
private List<UpdateWrapper> viewers = new ArrayList<UpdateWrapper>();
// contains a list of the undocked TCs
private static ArrayList<DataContentTopComponent> newWindowList = new ArrayList<DataContentTopComponent>();
private static final String PREFERRED_ID = "DataContentTopComponent";
@@ -291,34 +292,22 @@ public final class DataContentTopComponent extends TopComponent implements DataC
*/
public void setupTabs(Node selectedNode) {
int currTabIndex = dataContentTabbedPane.getSelectedIndex();
int totalTabs = dataContentTabbedPane.getTabCount();
int maxPreferred = 0;
int indexOfPreferred = 0;
for (int i = 0; i < totalTabs; ++i) {
UpdateWrapper dcv = viewers.get(i);
dcv.resetComponent();
if (totalTabs > 0) { // make sure there are tabs to reset
for (int i = 0; i < totalTabs; i++) {
UpdateWrapper dcv = viewers.get(i);
dcv.resetComponent();
// disable an unsupported tab (ex: picture viewer)
boolean dcvSupported = dcv.isSupported(selectedNode);
if (! dcvSupported) {
dataContentTabbedPane.setEnabledAt(i, false);
} else {
dataContentTabbedPane.setEnabledAt(i, true);
int currentPreferred = dcv.isPreferred(selectedNode, dcvSupported);
if (currentPreferred > maxPreferred) {
indexOfPreferred = i;
maxPreferred = currentPreferred;
}
}
// disable an unsupported tab (ex: picture viewer)
boolean dcvSupported = dcv.isSupported(selectedNode);
if (!dcvSupported) {
dataContentTabbedPane.setEnabledAt(i, false);
} else {
dataContentTabbedPane.setEnabledAt(i, true);
}
// set the display of the tab
dataContentTabbedPane.setSelectedIndex(indexOfPreferred);
viewers.get(indexOfPreferred).setNode(selectedNode);
}
viewers.get(currTabIndex).setNode(selectedNode);
}
/**
@@ -25,6 +25,7 @@ import java.util.concurrent.CancellationException;
import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.BoxLayout;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
@@ -59,6 +60,7 @@ public class DataContentViewerMedia extends javax.swing.JPanel implements DataCo
private long durationMillis = 0;
private boolean autoTracking = false; // true if the slider is moving automatically
private final Object playbinLock = new Object(); // lock for synchronization of playbin2 player
private VideoProgressWorker videoProgressWorker;
/**
* Creates new form DataContentViewerVideo
@@ -186,6 +188,12 @@ public class DataContentViewerMedia extends javax.swing.JPanel implements DataCo
if (selectedNode == null) {
return;
}
// get rid of any existing videoProgressWorker thread
if (videoProgressWorker != null) {
videoProgressWorker.cancel(true);
videoProgressWorker = null;
}
File file = selectedNode.getLookup().lookup(File.class);
if (file == null) {
@@ -303,15 +311,19 @@ public class DataContentViewerMedia extends javax.swing.JPanel implements DataCo
}
private void reset() {
// reset the progress label text on the event dispatch thread
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
progressLabel.setText(" ");
}
});
synchronized (playbinLock) {
if (playbin2 != null) {
if (playbin2.isPlaying()) {
playbin2.stop();
}
playbin2.setState(State.NULL);
// try {
// Thread.sleep(20); // gstreamer needs to catch up
// } catch (InterruptedException ex) { }
if (playbin2.getState().equals(State.NULL)) {
playbin2.dispose();
}
@@ -397,8 +409,6 @@ public class DataContentViewerMedia extends javax.swing.JPanel implements DataCo
this.jFile = jFile;
}
;
@Override
protected Object doInBackground() throws Exception {
success = false;
@@ -444,7 +454,7 @@ public class DataContentViewerMedia extends javax.swing.JPanel implements DataCo
progressLabel.setText("Error buffering file");
return;
}
ClockTime dur = null;
ClockTime dur = null;
synchronized (playbinLock) {
playbin2.play(); // must play, then pause and get state to get duration.
playbin2.pause();
@@ -454,73 +464,97 @@ public class DataContentViewerMedia extends javax.swing.JPanel implements DataCo
duration = dur.toString();
durationMillis = dur.toMillis();
progressSlider.setMaximum((int) durationMillis);
progressSlider.setMinimum(0);
final String finalDuration;
if (duration.length() == 8 && duration.substring(0, 3).equals("00:")) {
finalDuration = duration.substring(3);
progressLabel.setText("00:00/" + duration);
} else {
finalDuration = duration;
progressLabel.setText("00:00:00/" + duration);
}
synchronized (playbinLock) {
playbin2.play();
}
pauseButton.setText("||");
new Thread(new Runnable() {
private boolean isPlayBinReady() {
synchronized (playbinLock) {
return playbin2 != null && !playbin2.getState().equals(State.NULL);
}
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
long positionMillis = 0;
while (positionMillis < durationMillis
&& isPlayBinReady() ) {
ClockTime pos = null;
synchronized (playbinLock) {
pos = playbin2.queryPosition();
}
position = pos.toString();
positionMillis = pos.toMillis();
if (position.length() == 8) {
position = position.substring(3);
}
progressLabel.setText(position + "/" + finalDuration);
autoTracking = true;
progressSlider.setValue((int) positionMillis);
autoTracking = false;
try {
Thread.sleep(20);
} catch (InterruptedException ex) {
}
}
if (finalDuration.length() == 5) {
progressLabel.setText("00:00/" + finalDuration);
progressSlider.setMaximum((int) durationMillis);
progressSlider.setMinimum(0);
final String finalDuration;
if (duration.length() == 8 && duration.substring(0, 3).equals("00:")) {
finalDuration = duration.substring(3);
progressLabel.setText("00:00/" + duration);
} else {
progressLabel.setText("00:00:00/" + finalDuration);
finalDuration = duration;
progressLabel.setText("00:00:00/" + duration);
}
// If it reached the end
if (progressSlider.getValue() == progressSlider.getMaximum()) {
restartVideo();
}
}
public void restartVideo() {
synchronized (playbinLock) {
if (playbin2 != null) {
playbin2.stop();
playbin2.setState(State.READY); // ready to be played again
}
playbin2.play();
}
pauseButton.setText("►");
progressSlider.setValue(0);
pauseButton.setText("||");
videoProgressWorker = new VideoProgressWorker();
videoProgressWorker.execute();
}
}).start();
});
}
}
private class VideoProgressWorker extends SwingWorker<Object, Object> {
private boolean isPlayBinReady() {
synchronized (playbinLock) {
return playbin2 != null && !playbin2.getState().equals(State.NULL);
}
}
public void restartVideo() {
synchronized (playbinLock) {
if (playbin2 != null) {
playbin2.stop();
playbin2.setState(State.READY); // ready to be played again
}
}
pauseButton.setText("►");
progressSlider.setValue(0);
}
@Override
protected Object doInBackground() throws Exception {
long positionMillis = 0;
String finalDuration = "";
while (positionMillis < durationMillis
&& isPlayBinReady() && !isCancelled()) {
ClockTime pos = null;
synchronized (playbinLock) {
pos = playbin2.queryPosition();
}
String position = pos.toString();
positionMillis = pos.toMillis();
if (position.length() == 8) {
position = position.substring(3);
}
String duration = playbin2.queryDuration().toString();
if (duration.length() == 8 && duration.substring(0, 3).equals("00:")) {
finalDuration = duration.substring(3);
progressLabel.setText("00:00/" + duration);
} else {
finalDuration = duration;
progressLabel.setText("00:00:00/" + duration);
}
progressLabel.setText(position + "/" + finalDuration);
autoTracking = true;
progressSlider.setValue((int) positionMillis);
autoTracking = false;
try {
Thread.sleep(20);
} catch (InterruptedException ex) {
throw ex;
}
}
if (finalDuration.length() == 5) {
progressLabel.setText("00:00/" + finalDuration);
} else {
progressLabel.setText("00:00:00/" + finalDuration);
}
// If it reached the end
if (progressSlider.getValue() == progressSlider.getMaximum()) {
restartVideo();
}
return null;
}
}
}
@@ -1,45 +0,0 @@
<?xml version="1.1" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
</AuxValues>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="picViewerScrollPanel" alignment="0" pref="589" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="picViewerScrollPanel" alignment="0" pref="382" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Container class="javax.swing.JScrollPane" name="picViewerScrollPanel">
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="picLabel">
<Properties>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="DataContentViewerPicture.picLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="horizontalTextPosition" type="int" value="0"/>
</Properties>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Form>
@@ -1,193 +0,0 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2011 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.corecomponents;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Image;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import org.openide.nodes.Node;
import org.openide.util.lookup.ServiceProvider;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer;
import org.sleuthkit.datamodel.Content;
import org.sleuthkit.datamodel.File;
import org.sleuthkit.datamodel.FsContent;
import org.sleuthkit.datamodel.TskException;
/**
* File content viewer capable of displaying some image formats.
*/
//@ServiceProvider(service = DataContentViewer.class)
public class DataContentViewerPicture extends javax.swing.JPanel implements DataContentViewer {
// for error handling
private JPanel caller;
private String className = this.getClass().toString();
/** Creates new form DataContentViewerPicture */
public DataContentViewerPicture() {
initComponents();
this.resetComponent();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
picViewerScrollPanel = new javax.swing.JScrollPane();
picLabel = new javax.swing.JLabel();
picLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
picLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerPicture.class, "DataContentViewerPicture.picLabel.text")); // NOI18N
picLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
picViewerScrollPanel.setViewportView(picLabel);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(picViewerScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 589, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(picViewerScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel picLabel;
private javax.swing.JScrollPane picViewerScrollPanel;
// End of variables declaration//GEN-END:variables
@Override
public void setNode(Node selectedNode) {
// change the cursor to "waiting cursor" for this operation
this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
try {
if (selectedNode != null) {
try {
// read the byte of the image file
Content content = selectedNode.getLookup().lookup(Content.class);
byte[] dataSource = new byte[(int) content.getSize()];
int bytesRead = content.read(dataSource, 0, content.getSize());
// create the input stream for the content
if (bytesRead > 0) {
InputStream is = new ByteArrayInputStream(dataSource);
Image image = ImageIO.read(is); // create the image
if (image!= null)
this.picLabel.setIcon(new javax.swing.ImageIcon(image)); // show the file
}
} catch (TskException ex) {
// TODO: maybe make errors bubble
Logger.getLogger(this.className).log(Level.WARNING, "Error while trying to display the picture content.", ex);
} catch (Exception ex) {
Logger.getLogger(this.className).log(Level.WARNING, "Error while trying to display the picture content.", ex);
}
}
} finally {
this.setCursor(null);
}
}
@Override
public String getTitle() {
return "Picture View";
}
@Override
public String getToolTip() {
return "Displays supported image files.";
}
@Override
public DataContentViewer getInstance() {
return new DataContentViewerPicture();
}
@Override
public void resetComponent() {
this.picLabel.setText("");
//this.picLabel.setIcon(null);
}
@Override
public boolean isSupported(Node node) {
if (node != null) {
// Note: only supports JPG, GIF, and PNG for now
/*return node.getDisplayName().toLowerCase().endsWith(".jpg")
|| node.getDisplayName().toLowerCase().endsWith(".jpeg")
|| node.getDisplayName().toLowerCase().endsWith(".jpe")
|| node.getDisplayName().toLowerCase().endsWith(".jfif")
|| node.getDisplayName().toLowerCase().endsWith(".gif")
|| node.getDisplayName().toLowerCase().endsWith(".bmp")
|| //node.getDisplayName().toLowerCase().endsWith(".tif") ||
//node.getDisplayName().toLowerCase().endsWith(".tiff") ||
//node.getDisplayName().toLowerCase().endsWith(".tga") ||
node.getDisplayName().toLowerCase().endsWith(".png");*/
File file = node.getLookup().lookup(File.class);
if (file != null) {
return file.getSize() > 0
&& (file.getName().toLowerCase().endsWith(".jpg")
|| file.getName().toLowerCase().endsWith(".jpeg")
|| file.getName().toLowerCase().endsWith(".jpe")
|| file.getName().toLowerCase().endsWith(".jfif")
|| file.getName().toLowerCase().endsWith(".gif")
|| file.getName().toLowerCase().endsWith(".bmp")
|| //node.getName().toLowerCase().endsWith(".tif") ||
//node.getName().toLowerCase().endsWith(".tiff") ||
//node.getName().toLowerCase().endsWith(".tga") ||
file.getName().toLowerCase().endsWith(".png"));
} else {
return false;
}
} else {
return false;
}
}
@Override
public int isPreferred(Node node, boolean isSupported) {
if(isSupported) {
return 1;
} else {
return 0;
}
}
@Override
public Component getComponent() {
return this;
}
}
@@ -482,7 +482,7 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC
@Override
public int isPreferred(Node node, boolean isSupported) {
if(node != null && isSupported){
return 2;
return 1;
} else {
return 0;
}
@@ -814,8 +814,7 @@ public class IngestManager {
final AbstractFile fileToProcess = fileTask.file;
//logger.log(Level.INFO, "NEXT FILE: " + fileToProcess.getName());
logger.log(Level.INFO, "IngestManager: Processing: {0}", fileToProcess.getName());
progress.progress(fileToProcess.getName(), processedFiles);
for (IngestModuleAbstractFile module : fileTask.scheduledTask.modules) {
@@ -857,7 +856,7 @@ public class IngestManager {
//--totalEnqueuedFiles;
} //end of this AbstractFile
logger.log(Level.INFO, "Done background processing");
logger.log(Level.INFO, "IngestManager: Finished processing files");
return null;
}
@@ -663,21 +663,31 @@ class IngestScheduler {
enum Priority {
LOW, MEDIUM, HIGH
LAST, LOW, MEDIUM, HIGH
};
static final List<Pattern> LAST_PRI_PATHS = new ArrayList<Pattern>();
static final List<Pattern> LOW_PRI_PATHS = new ArrayList<Pattern>();
static final List<Pattern> MEDIUM_PRI_PATHS = new ArrayList<Pattern>();
static final List<Pattern> HIGH_PRI_PATHS = new ArrayList<Pattern>();
/* prioritize root directory folders based on the assumption that we are
* looking for user content. Other types of investigations may want different
* priorities. */
static {
// these files have no structure, so they go last
LAST_PRI_PATHS.add(Pattern.compile("^\\$Unalloc", Pattern.CASE_INSENSITIVE));
LAST_PRI_PATHS.add(Pattern.compile("^pagefile", Pattern.CASE_INSENSITIVE));
LAST_PRI_PATHS.add(Pattern.compile("^hiberfil", Pattern.CASE_INSENSITIVE));
// orphan files are often corrupt and windows does not typically have
// user content, so put them towards the bottom
LOW_PRI_PATHS.add(Pattern.compile("^\\$OrphanFiles", Pattern.CASE_INSENSITIVE));
LOW_PRI_PATHS.add(Pattern.compile("^Windows", Pattern.CASE_INSENSITIVE));
// all other files go into the medium category too
MEDIUM_PRI_PATHS.add(Pattern.compile("^Program Files", Pattern.CASE_INSENSITIVE));
MEDIUM_PRI_PATHS.add(Pattern.compile("^\\$OrphanFiles", Pattern.CASE_INSENSITIVE));
MEDIUM_PRI_PATHS.add(Pattern.compile("^\\$Unalloc", Pattern.CASE_INSENSITIVE));
MEDIUM_PRI_PATHS.add(Pattern.compile("^pagefile", Pattern.CASE_INSENSITIVE));
MEDIUM_PRI_PATHS.add(Pattern.compile("^hiberfil", Pattern.CASE_INSENSITIVE));
// user content is top priority
HIGH_PRI_PATHS.add(Pattern.compile("^Users", Pattern.CASE_INSENSITIVE));
HIGH_PRI_PATHS.add(Pattern.compile("^Documents and Settings", Pattern.CASE_INSENSITIVE));
HIGH_PRI_PATHS.add(Pattern.compile("^home", Pattern.CASE_INSENSITIVE));
@@ -685,10 +695,10 @@ class IngestScheduler {
}
static AbstractFilePriotity.Priority getPriority(final AbstractFile abstractFile) {
if (!abstractFile.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.FS)) {
//if (!abstractFile.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.FS)) {
//non-fs files, such as representing unalloc space
return AbstractFilePriotity.Priority.MEDIUM;
}
//return AbstractFilePriotity.Priority.MEDIUM;
//}
final String path = abstractFile.getName();
if (path == null) {
@@ -715,6 +725,13 @@ class IngestScheduler {
return AbstractFilePriotity.Priority.LOW;
}
}
for (Pattern p : LAST_PRI_PATHS) {
Matcher m = p.matcher(path);
if (m.find()) {
return AbstractFilePriotity.Priority.LAST;
}
}
//default is medium
return AbstractFilePriotity.Priority.MEDIUM;
@@ -28,7 +28,7 @@ enum IndexStatus {
/**
* The index and database both exist, and the index is older.
*/
INDEX_OUTDATED("Index is older than database"),
INDEX_OUTDATED("WARNING: Index is older than database"),
/**
* The index and database both exist, and the index is not older.
*/
@@ -40,11 +40,11 @@ enum IndexStatus {
/**
* The database exists but the index does not.
*/
NO_INDEX("Index does not exist"),
NO_INDEX("ERROR: Index does not exist"),
/**
* Neither the index nor the database exists.
*/
NONE("No index or database"),
NONE("ERROR: No index or database"),
/**
* The index is currently being generated
*/
+1 -1
View File
@@ -47,7 +47,7 @@ JRE (Java Runtime Environment) 1.6, 32 bit
- Web page: http://www.oracle.com/technetwork/java/index.html
- License: http://www.oracle.com/technetwork/java/javase/terms/license/index.html
Netbeans 7.0.1 RCP platform and .jar files bundled with the platform
Netbeans 7.2.1 RCP platform and .jar files bundled with the platform
- Web page: http://netbeans.org/features/platform/
- License:
http://services.netbeans.org/downloads/licence/nb-7.0-final-2011-04-20-license.txt
@@ -179,7 +179,7 @@ public class Chrome extends Extract implements IngestModuleImage {
break;
}
try {
final JsonParser parser = new JsonParser();
final JsonParser parser = new JsonParser();
JsonElement jsonElement = parser.parse(new FileReader(temps));
JsonObject jElement = jsonElement.getAsJsonObject();
JsonObject jRoot = jElement.get("roots").getAsJsonObject();
@@ -188,9 +188,33 @@ public class Chrome extends Extract implements IngestModuleImage {
for (JsonElement result : jBookmarkArray) {
try {
JsonObject address = result.getAsJsonObject();
String url = address.get("url").getAsString();
String name = address.get("name").getAsString();
Long date = address.get("date_added").getAsLong();
if (address == null) {
continue;
}
JsonElement urlEl = address.get("url");
String url = null;
if (urlEl != null) {
url = urlEl.getAsString();
}
else {
url = "";
}
String name = null;
JsonElement nameEl = address.get("name");
if (nameEl != null) {
name = nameEl.getAsString();
}
else {
name = "";
}
Long date = null;
JsonElement dateEl = address.get("date_added");
if (dateEl != null) {
date = dateEl.getAsLong();
}
else {
date = Long.valueOf(0);
}
String domain = Util.extractDomain(url);
BlackboardArtifact bbart = bookmarkFiles.get(j).newArtifact(ARTIFACT_TYPE.TSK_WEB_BOOKMARK);
Collection<BlackboardAttribute> bbattributes = new ArrayList<BlackboardAttribute>();
+1 -1
View File
@@ -7,7 +7,7 @@
<import file="nbproject/build-impl.xml"/>
<property name="netbeans-plat-version" value="7.2" />
<property name="netbeans-plat-version" value="7.2.1" />
<property name="nbplatform.active.dir" value="${basedir}/netbeans-plat/${netbeans-plat-version}" />
<condition property="os.family" value="unix">